diff options
Diffstat (limited to 'src/server/job.c')
-rw-r--r-- | src/server/job.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/server/job.c b/src/server/job.c index 8753c2c..b50a7f3 100644 --- a/src/server/job.c +++ b/src/server/job.c @@ -1,10 +1,13 @@ #include "job.h" +#include "utils.h" #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <pthread.h> +#include <sys/socket.h> +#include <glib/gslist.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 @@ -26,10 +29,13 @@ typedef struct // "/dev/dnbdXX" == 11 bytes per device + nullchar = 12 static device_t *devices = NULL; static int num_devices = 0; - static char keep_running = TRUE; +// Private functions static char* get_free_device(); +static void query_servers(); + +// void* dnbd3_job_thread(void *data) { @@ -38,7 +44,7 @@ void* dnbd3_job_thread(void *data) char dev[DEV_STRLEN]; for (i = 0; i < MAX_NUM_DEVICES_TO_CHECK; ++i) { - sprintf(dev, "/dev/dnbd%d", i); + snprintf(dev, DEV_STRLEN, "/dev/dnbd%d", i); if (access(dev, W_OK | R_OK)) // Need RW access to device to read and do ioctl continue; ++num_devices; @@ -49,7 +55,7 @@ void* dnbd3_job_thread(void *data) for (i = 0, j = 0; i < MAX_NUM_DEVICES_TO_CHECK; ++i) { memset(dev, 0, DEV_STRLEN); - sprintf(dev, "/dev/dnbd%d", i); + snprintf(dev, DEV_STRLEN, "/dev/dnbd%d", i); if (access(dev, W_OK | R_OK)) continue; if (j >= num_devices) // More available devices during second iteration? :-( @@ -60,14 +66,26 @@ void* dnbd3_job_thread(void *data) } } // + time_t next_delete_invocation = 0; + // // Job/Watchdog mainloop while (keep_running) { + const time_t starttime = time(NULL); + // // TODO: Update image atime - // TODO: Handle image deletion + // Call image deletion function if last call is more than 5 minutes ago + if (starttime < next_delete_invocation) + { + next_delete_invocation = starttime + 300; + dnbd3_exec_delete(TRUE); + } // TODO: Replicate proxied images (limited bandwidth) - // TODO: Query other servers for new images/status/... + // Query other servers for new images/status/... + query_servers(); // TODO: Switch server of dnbd device based on more sophisticated inputs than just rtt + // Calc sleep timeout for next iteration + sleep(30 - (time(NULL) - starttime)); // Sleep 30 seconds, but account for the time it took to execute the loop } // free(devices); @@ -81,6 +99,17 @@ void dnbd3_job_shutdown() keep_running = FALSE; } +static void query_servers() +{ + struct timeval client_timeout; + client_timeout.tv_sec = 0; + client_timeout.tv_usec = 500 * 1000; + int client_sock; + // Apply read/write timeout + setsockopt(client_sock, SOL_SOCKET, SO_RCVTIMEO, &client_timeout, sizeof(client_timeout)); + setsockopt(client_sock, SOL_SOCKET, SO_SNDTIMEO, &client_timeout, sizeof(client_timeout)); +} + /** * Get full name of an available dnbd3 device, eg. /dev/dnbd4 * Returned buffer is owned by this module, do not modify or free! |