diff options
author | sr | 2012-09-01 19:39:46 +0200 |
---|---|---|
committer | sr | 2012-09-01 19:39:46 +0200 |
commit | 2e134d706657da9bc7ae4c668dfe0150bd8cdb00 (patch) | |
tree | fbbdff09d2fbcb99fe50b24bcb0e90d19e76ec48 | |
parent | fix complile error (diff) | |
download | dnbd3-2e134d706657da9bc7ae4c668dfe0150bd8cdb00.tar.gz dnbd3-2e134d706657da9bc7ae4c668dfe0150bd8cdb00.tar.xz dnbd3-2e134d706657da9bc7ae4c668dfe0150bd8cdb00.zip |
[SERVER] Create skeleton of upcoming watchdog/job executor
-rw-r--r-- | src/server/job.c | 101 | ||||
-rw-r--r-- | src/server/job.h | 6 |
2 files changed, 107 insertions, 0 deletions
diff --git a/src/server/job.c b/src/server/job.c new file mode 100644 index 0000000..8753c2c --- /dev/null +++ b/src/server/job.c @@ -0,0 +1,101 @@ +#include "job.h" +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <pthread.h> + +#define DEV_STRLEN 12 // INCLUDING NULLCHAR (increase to 13 if you need more than 100 (0-99) devices) +#define MAX_NUM_DEVICES_TO_CHECK 100 + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +typedef struct +{ + char available; + char name[DEV_STRLEN]; +} device_t; + +// "/dev/dnbdXX" == 11 bytes per device + nullchar = 12 +static device_t *devices = NULL; +static int num_devices = 0; + +static char keep_running = TRUE; + +static char* get_free_device(); + +void* dnbd3_job_thread(void *data) +{ + int i, j; + // Determine number of available dnbd3 devices, which are needed for proxy mode + char dev[DEV_STRLEN]; + for (i = 0; i < MAX_NUM_DEVICES_TO_CHECK; ++i) + { + sprintf(dev, "/dev/dnbd%d", i); + if (access(dev, W_OK | R_OK)) // Need RW access to device to read and do ioctl + continue; + ++num_devices; + } + if (num_devices > 0) + { + devices = calloc(num_devices, sizeof(*devices)); + for (i = 0, j = 0; i < MAX_NUM_DEVICES_TO_CHECK; ++i) + { + memset(dev, 0, DEV_STRLEN); + sprintf(dev, "/dev/dnbd%d", i); + if (access(dev, W_OK | R_OK)) + continue; + if (j >= num_devices) // More available devices during second iteration? :-( + break; + memcpy(devices[j].name, dev, DEV_STRLEN); + devices[j].available = TRUE; + ++j; + } + } + // + // Job/Watchdog mainloop + while (keep_running) + { + // TODO: Update image atime + // TODO: Handle image deletion + // TODO: Replicate proxied images (limited bandwidth) + // TODO: Query other servers for new images/status/... + // TODO: Switch server of dnbd device based on more sophisticated inputs than just rtt + } + // + free(devices); + devices = NULL; + pthread_exit(NULL); + return NULL; +} + +void dnbd3_job_shutdown() +{ + keep_running = FALSE; +} + +/** + * Get full name of an available dnbd3 device, eg. /dev/dnbd4 + * Returned buffer is owned by this module, do not modify or free! + */ +static char* get_free_device() +{ + if (devices == NULL) + return NULL; + int i; + for (i = 0; i < num_devices; ++i) + { + if (!devices[i].available) + continue; + // TODO: Check sysfs if device is maybe already connected + return devices[i].name; + } + return NULL; +} diff --git a/src/server/job.h b/src/server/job.h new file mode 100644 index 0000000..87be5d5 --- /dev/null +++ b/src/server/job.h @@ -0,0 +1,6 @@ +#ifndef JOB_H_ +#define JOB_H_ + +void* dnbd3_job_thread(void *data); + +#endif |