summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohann Latocha2012-02-11 01:34:07 +0100
committerJohann Latocha2012-02-11 01:34:07 +0100
commit73e227959e02c3484085ce05c466a3ea0f3e5065 (patch)
treeb588d5dfb6d2645c721a6dbfe414a21119d4116e /src
parent[SERVER] Config reload fixed (diff)
downloaddnbd3-73e227959e02c3484085ce05c466a3ea0f3e5065.tar.gz
dnbd3-73e227959e02c3484085ce05c466a3ea0f3e5065.tar.xz
dnbd3-73e227959e02c3484085ce05c466a3ea0f3e5065.zip
[SERVER] Spinlocks to freeze threads while reloading config
Diffstat (limited to 'src')
-rw-r--r--src/server/ipc.c2
-rw-r--r--src/server/net.c11
-rw-r--r--src/server/server.c3
-rw-r--r--src/server/server.h2
-rw-r--r--src/server/utils.c9
5 files changed, 15 insertions, 12 deletions
diff --git a/src/server/ipc.c b/src/server/ipc.c
index 4adbb7e..1ae401b 100644
--- a/src/server/ipc.c
+++ b/src/server/ipc.c
@@ -88,9 +88,7 @@ void* dnbd3_ipc_receive()
case IPC_RELOAD:
printf("INFO: Reloading configuration...\n");
- pthread_spin_lock(&_spinlock);
dnbd3_reload_config(_config_file_name);
- pthread_spin_unlock(&_spinlock);
break;
case IPC_INFO:
diff --git a/src/server/net.c b/src/server/net.c
index e4be703..ab01f70 100644
--- a/src/server/net.c
+++ b/src/server/net.c
@@ -41,7 +41,6 @@ void *dnbd3_handle_query(void *dnbd3_client)
dnbd3_reply_t reply;
int image_file = -1;
- dnbd3_image_t *image;
struct in_addr server;
int i = 0;
@@ -52,10 +51,6 @@ void *dnbd3_handle_query(void *dnbd3_client)
reply.error = 0;
memcpy(reply.handle, request.handle, sizeof(request.handle));
- // TODO: lock CMD_GET_SERVERS and CMD_GET_SIZE because of reloading cfg...
- // pthread_spin_lock(&_spinlock);
- // pthread_spin_unlock(&_spinlock);
-
switch (request.cmd)
{
case CMD_GET_SERVERS:
@@ -67,6 +62,7 @@ void *dnbd3_handle_query(void *dnbd3_client)
continue;
}
+ pthread_spin_lock(&client->spinlock);
if (client->image->num_servers < MAX_NUMBER_SERVERS)
reply.size = client->image->num_servers * sizeof(struct in_addr);
else
@@ -79,10 +75,13 @@ void *dnbd3_handle_query(void *dnbd3_client)
inet_aton(client->image->servers[i], &server);
send(client->sock, (char *) &server, sizeof(struct in_addr), 0);
}
+ pthread_spin_unlock(&client->spinlock);
continue;
case CMD_GET_SIZE:
- image = dnbd3_get_image(request.vid, request.rid);
+ pthread_spin_lock(&client->spinlock);
+ dnbd3_image_t *image = dnbd3_get_image(request.vid, request.rid);
+ pthread_spin_unlock(&client->spinlock);
if(!image)
{ // image not found, send error
diff --git a/src/server/server.c b/src/server/server.c
index 786cc40..6fdedf0 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -37,7 +37,6 @@
int _sock;
GSList *_dnbd3_clients = NULL;
-pthread_spinlock_t _spinlock;
char *_config_file_name = DEFAULT_SERVER_CONFIG_FILE;
dnbd3_image_t *_images;
size_t _num_images = 0;
@@ -137,7 +136,6 @@ int main(int argc, char* argv[])
daemon(1, 0);
// load config file
- pthread_spin_init(&_spinlock, PTHREAD_PROCESS_PRIVATE);
dnbd3_load_config(_config_file_name);
// setup signal handler
@@ -178,6 +176,7 @@ int main(int argc, char* argv[])
pthread_t thread;
dnbd3_client_t *dnbd3_client = (dnbd3_client_t *) malloc(sizeof(dnbd3_client_t));
+ pthread_spin_init(&dnbd3_client->spinlock, PTHREAD_PROCESS_PRIVATE);
strcpy(dnbd3_client->ip, inet_ntoa(client.sin_addr));
dnbd3_client->sock = fd;
dnbd3_client->thread = &thread;
diff --git a/src/server/server.h b/src/server/server.h
index 02da005..de9eccb 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -44,10 +44,10 @@ typedef struct
char ip[16];
pthread_t *thread;
dnbd3_image_t *image;
+ pthread_spinlock_t spinlock;
} dnbd3_client_t;
extern GSList *_dnbd3_clients;
-extern pthread_spinlock_t _spinlock;
extern char *_config_file_name;
extern dnbd3_image_t *_images;
extern size_t _num_images;
diff --git a/src/server/utils.c b/src/server/utils.c
index 3091b2f..be0b584 100644
--- a/src/server/utils.c
+++ b/src/server/utils.c
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <fcntl.h>
#include <sys/stat.h>
+#include <pthread.h>
#include "server.h"
#include "utils.h"
@@ -72,15 +73,21 @@ void dnbd3_load_config(char *file)
void dnbd3_reload_config(char* config_file_name)
{
- _num_images = 0;
GSList *iterator = NULL;
for (iterator = _dnbd3_clients; iterator; iterator = iterator->next)
{
dnbd3_client_t *client = iterator->data;
+ pthread_spin_lock(&client->spinlock);
client->image = NULL;
}
+ _num_images = 0;
free(_images);
dnbd3_load_config(config_file_name);
+ for (iterator = _dnbd3_clients; iterator; iterator = iterator->next)
+ {
+ dnbd3_client_t *client = iterator->data;
+ pthread_spin_unlock(&client->spinlock);
+ }
}
dnbd3_image_t* dnbd3_get_image(int vid, int rid)