summaryrefslogtreecommitdiffstats
path: root/src/server/server.c
diff options
context:
space:
mode:
authorsr2012-08-31 22:30:52 +0200
committersr2012-08-31 22:30:52 +0200
commit51cc7103be13a9cb756d6a89d7e3306d4ef517ed (patch)
tree1ab6468b3ae4550a389b1b78d63bfece8975c036 /src/server/server.c
parentlast minute messup fixed (diff)
downloaddnbd3-51cc7103be13a9cb756d6a89d7e3306d4ef517ed.tar.gz
dnbd3-51cc7103be13a9cb756d6a89d7e3306d4ef517ed.tar.xz
dnbd3-51cc7103be13a9cb756d6a89d7e3306d4ef517ed.zip
[SERVER] Added soft and hard timeouts for image deletion: reject any new clients for an image where the soft timeout has been reached, kill all clients for an image where the hard timeout has been reached and remove it from the server. Check for the hard timeout every five minutes
[SERVER] Re-Implement image deletion to work with image names instead of vids [SERVER] Add helper functions to simplify dealing with libxml2
Diffstat (limited to 'src/server/server.c')
-rw-r--r--src/server/server.c31
1 files changed, 21 insertions, 10 deletions
diff --git a/src/server/server.c b/src/server/server.c
index 8981d77..28da0ae 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -36,7 +36,7 @@
#include "ipc.h"
#include "memlog.h"
-int _sock;
+static int sock;
#ifdef _DEBUG
int _fake_delay = 0;
#endif
@@ -45,6 +45,7 @@ pthread_spinlock_t _spinlock;
GSList *_dnbd3_clients = NULL;
char *_config_file_name = DEFAULT_SERVER_CONFIG_FILE;
char *_local_namespace = NULL;
+char *_ipc_password = NULL;
GSList *_dnbd3_images = NULL; // of dnbd3_image_t
void dnbd3_print_help(char* argv_0)
@@ -75,7 +76,8 @@ void dnbd3_cleanup()
int fd;
memlogf("INFO: Cleanup...\n");
- close(_sock);
+ close(sock);
+ sock = -1;
dnbd3_ipc_shutdown();
@@ -108,11 +110,12 @@ void dnbd3_cleanup()
close(fd);
}
- free(image->name);
- g_free(image->file);
- g_free(image->cache_file);
- free(image->cache_map);
- g_free(image);
+ free(image->cache_map);
+ free(image->config_group);
+ free(image->low_name);
+ free(image->file);
+ free(image->cache_file);
+ g_free(image);
}
g_slist_free(_dnbd3_images);
@@ -202,12 +205,13 @@ int main(int argc, char* argv[])
signal(SIGINT, dnbd3_handle_sigterm);
// setup network
- _sock = dnbd3_setup_socket();
- if (_sock < 0)
+ sock = dnbd3_setup_socket();
+ if (sock < 0)
exit(EXIT_FAILURE);
struct sockaddr_in client;
unsigned int len = sizeof(client);
int fd;
+ time_t next_delete_invocation = 0;
struct timeval timeout;
timeout.tv_sec = SOCKET_TIMEOUT_SERVER;
timeout.tv_usec = 0;
@@ -221,7 +225,7 @@ int main(int argc, char* argv[])
// main loop
while (1)
{
- fd = accept(_sock, (struct sockaddr*) &client, &len);
+ fd = accept(sock, (struct sockaddr*) &client, &len);
if (fd < 0)
{
memlogf("[ERROR] Accept failure");
@@ -263,6 +267,13 @@ int main(int argc, char* argv[])
continue;
}
pthread_detach(dnbd3_client->thread);
+ // Call image deletion function if last call is more than 5 minutes ago
+ const time_t now = time(NULL);
+ if (now < next_delete_invocation)
+ {
+ next_delete_invocation = now + 300;
+ dnbd3_exec_delete(TRUE);
+ }
}
dnbd3_cleanup();