From 79bb581eb0373c717d1ce95e817fd7411b07ff92 Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Fri, 10 Feb 2012 23:47:32 +0100 Subject: [SERVER] Config reload fixed --- src/server/ipc.c | 10 +--------- src/server/net.c | 45 +++++++++++++++++++++++++++++---------------- src/server/server.c | 6 ++---- src/server/utils.c | 8 +++++++- 4 files changed, 39 insertions(+), 30 deletions(-) (limited to 'src/server') diff --git a/src/server/ipc.c b/src/server/ipc.c index b5651ac..4adbb7e 100644 --- a/src/server/ipc.c +++ b/src/server/ipc.c @@ -67,8 +67,7 @@ void* dnbd3_ipc_receive() while (1) { - int cmd; - int num = 0; + int cmd, num = 0; char buf[4096]; // Accept connection @@ -114,9 +113,7 @@ void* dnbd3_ipc_receive() break; } - } - close(server_sock); } @@ -131,7 +128,6 @@ void dnbd3_ipc_send(int cmd) perror("ERROR: IPC socket"); exit(EXIT_FAILURE); } - server.sun_family = AF_UNIX; strcpy(server.sun_path, UNIX_SOCKET); @@ -158,15 +154,12 @@ void dnbd3_ipc_send(int cmd) case IPC_INFO: send(client_sock, &cmd, sizeof(int), MSG_WAITALL); recv(client_sock, &num, sizeof(int), MSG_WAITALL); - printf("INFO: Number clients connected: %i\n", num); - for (i = 0; i < num; i++) { if (recv(client_sock, &buf, sizeof(buf), MSG_WAITALL) > 0) printf("INFO: %s", buf); } - break; default: @@ -174,6 +167,5 @@ void dnbd3_ipc_send(int cmd) break; } - close(client_sock); } diff --git a/src/server/net.c b/src/server/net.c index 4f2ddfa..e4be703 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -41,6 +41,7 @@ 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; @@ -48,13 +49,24 @@ void *dnbd3_handle_query(void *dnbd3_client) while (recv(client->sock, &request, sizeof(dnbd3_request_t), MSG_WAITALL) > 0) { reply.cmd = request.cmd; + 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: + if(!client->image) + { // configuration was reloaded, send error + reply.size = 0; + reply.error = ERROR_RELOAD; + send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0); + continue; + } + if (client->image->num_servers < MAX_NUMBER_SERVERS) reply.size = client->image->num_servers * sizeof(struct in_addr); else @@ -67,30 +79,30 @@ void *dnbd3_handle_query(void *dnbd3_client) inet_aton(client->image->servers[i], &server); send(client->sock, (char *) &server, sizeof(struct in_addr), 0); } - break; + continue; case CMD_GET_SIZE: - pthread_spin_lock(&_spinlock); // because of reloading config - dnbd3_image_t *image = dnbd3_get_image(request.vid, request.rid); - pthread_spin_unlock(&_spinlock); - if (image) - { - image_file = open(image->file, O_RDONLY); - reply.size = sizeof(uint64_t); - client->image = image; - } - else - { + image = dnbd3_get_image(request.vid, request.rid); + + if(!image) + { // image not found, send error printf("ERROR: Client requested an unknown image id.\n"); reply.size = 0; + reply.error = ERROR_SIZE; + send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0); + continue; } + + image_file = open(image->file, O_RDONLY); + reply.size = sizeof(uint64_t); + client->image = image; send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0); send(client->sock, &image->filesize, sizeof(uint64_t), 0); - break; + continue; case CMD_GET_BLOCK: if (image_file < 0) - break; + continue; reply.size = request.size; send(client->sock, (char *) &reply, sizeof(dnbd3_reply_t), 0); @@ -98,11 +110,12 @@ void *dnbd3_handle_query(void *dnbd3_client) if (sendfile(client->sock, image_file, (off_t *) &request.offset, request.size) < 0) printf("ERROR: sendfile returned -1\n"); - break; + continue; default: printf("ERROR: Unknown command\n"); - break; + continue; + } } diff --git a/src/server/server.c b/src/server/server.c index a767ed6..786cc40 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -110,10 +110,8 @@ int main(int argc, char* argv[]) demonize = 0; break; case 'r': - printf("ERROR: Buggy, do not use...\n"); - // FIXME: segfault in dnbd3_handle_query because of free(_images) - // printf("INFO: Reloading configuration file...\n"); - // dnbd3_ipc_send(IPC_RELOAD); + printf("INFO: Reloading configuration file...\n"); + dnbd3_ipc_send(IPC_RELOAD); return EXIT_SUCCESS; case 's': printf("INFO: Stopping running server...\n"); diff --git a/src/server/utils.c b/src/server/utils.c index 3a9215e..3091b2f 100644 --- a/src/server/utils.c +++ b/src/server/utils.c @@ -72,8 +72,14 @@ void dnbd3_load_config(char *file) void dnbd3_reload_config(char* config_file_name) { - free(_images); _num_images = 0; + GSList *iterator = NULL; + for (iterator = _dnbd3_clients; iterator; iterator = iterator->next) + { + dnbd3_client_t *client = iterator->data; + client->image = NULL; + } + free(_images); dnbd3_load_config(config_file_name); } -- cgit v1.2.3-55-g7522