summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsr2012-09-01 19:39:46 +0200
committersr2012-09-01 19:39:46 +0200
commit2e134d706657da9bc7ae4c668dfe0150bd8cdb00 (patch)
treefbbdff09d2fbcb99fe50b24bcb0e90d19e76ec48
parentfix complile error (diff)
downloaddnbd3-2e134d706657da9bc7ae4c668dfe0150bd8cdb00.tar.gz
dnbd3-2e134d706657da9bc7ae4c668dfe0150bd8cdb00.tar.xz
dnbd3-2e134d706657da9bc7ae4c668dfe0150bd8cdb00.zip
[SERVER] Create skeleton of upcoming watchdog/job executor
-rw-r--r--src/server/job.c101
-rw-r--r--src/server/job.h6
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