From d3ee0d21a16b6e696297b8e1f0c4ad8abdecca37 Mon Sep 17 00:00:00 2001 From: Stephan Schwaer Date: Tue, 5 May 2015 18:18:32 +0200 Subject: [Server] Added statistics of images and uptime to json. --- src/server/image.c | 25 ++++++++++++------------- src/server/image.h | 4 +++- src/server/net.c | 13 +++---------- src/server/net.h | 2 -- src/server/rpc.c | 24 ++++++++++++++---------- src/server/server.c | 1 - src/server/uplink.c | 12 +++--------- src/server/uplink.h | 2 -- 8 files changed, 35 insertions(+), 48 deletions(-) diff --git a/src/server/image.c b/src/server/image.c index f552843..920f15d 100644 --- a/src/server/image.c +++ b/src/server/image.c @@ -1133,31 +1133,30 @@ bool image_generateCrcFile(char *image) return true; } -void image_printAll() +json_t* image_fillJson() { - int i, percent, pending, j; + json_t *imagesJson = json_array(); + json_t *image; + + int i; char buffer[100] = { 0 }; spin_lock( &_images_lock ); for (i = 0; i < _num_images; ++i) { if ( _images[i] == NULL ) continue; spin_lock( &_images[i]->lock ); - logadd( LOG_DEBUG1, "Image: %s", _images[i]->lower_name ); - percent = image_getCompletenessEstimate( _images[i] ); - logadd( LOG_DEBUG1, " |- Complete: %d%%", percent ); + image = json_pack( "{sssIsI}", "image", _images[i]->lower_name, "users", (json_int_t) _images[i]->users, + "complete", (json_int_t) image_getCompletenessEstimate( _images[i] ) ); if ( _images[i]->uplink != NULL ) { host_to_string( &_images[i]->uplink->currentServer, buffer, sizeof(buffer) ); - pending = 0; - spin_lock( &_images[i]->uplink->queueLock ); - for (j = 0; j < _images[i]->uplink->queueLen; ++j) { - if ( _images[i]->uplink->queue[j].status != ULR_FREE ) pending++; - } - spin_unlock( &_images[i]->uplink->queueLock ); - logadd( LOG_DEBUG1, " |- Uplink: %s -- %d pending requests", buffer, pending ); + json_object_set_new( image, "uplinkServer", json_string( buffer ) ); + json_object_set_new( image, "receivedBytes", json_integer( (json_int_t) _images[i]->uplink->bytesReceived ) ); } - logadd( LOG_DEBUG1, " `- Users: %d\n", _images[i]->users ); + json_array_append_new( imagesJson, image ); + spin_unlock( &_images[i]->lock ); } spin_unlock( &_images_lock ); + return imagesJson; } /** diff --git a/src/server/image.h b/src/server/image.h index aca3788..c7e2b6f 100644 --- a/src/server/image.h +++ b/src/server/image.h @@ -1,6 +1,8 @@ #ifndef _IMAGE_H_ #define _IMAGE_H_ +#include + #include "../config.h" #include "globals.h" @@ -38,7 +40,7 @@ bool image_create(char *image, int revision, uint64_t size); bool image_generateCrcFile(char *image); -void image_printAll(); +json_t* image_fillJson(); int image_getCompletenessEstimate(const dnbd3_image_t * const image); diff --git a/src/server/net.c b/src/server/net.c index dc53701..9dc1442 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -124,14 +124,6 @@ uint64_t net_getTotalBytesSent() return tmp; } -void net_addTotalBytesSent(uint64_t sentBytes) -{ - spin_lock( &statisticsSentLock ); - totalBytesSent += sentBytes; - spin_unlock( &statisticsSentLock ); - return; -} - void net_init() { spin_init( &statisticsSentLock, PTHREAD_PROCESS_PRIVATE ); @@ -206,7 +198,6 @@ void *net_client_handler(void *dnbd3_client) } } else if ( strncmp( (char*)&request, "GET ", 4 ) == 0 || strncmp( (char*)&request, "POST ", 5 ) == 0 ) { rpc_sendStatsJson( client->sock ); - logadd( LOG_INFO, "Sending statistics." ); } if ( bOk ) { @@ -388,7 +379,9 @@ set_name: ; } exit_client_cleanup: ; dnbd3_removeClient( client ); - net_addTotalBytesSent( client->bytesSent ); // Add the amount of bytes sent by the client to the statistics of the server. + spin_lock( &statisticsSentLock ); + totalBytesSent += client->bytesSent;// Add the amount of bytes sent by the client to the statistics of the server. + spin_unlock( &statisticsSentLock ); client = dnbd3_freeClient( client ); return NULL ; } diff --git a/src/server/net.h b/src/server/net.h index e8bef34..4624141 100644 --- a/src/server/net.h +++ b/src/server/net.h @@ -25,8 +25,6 @@ void net_init(); uint64_t net_getTotalBytesSent(); -void net_addTotalBytesSent(uint64_t sentBytes); - void *net_client_handler(void *client_socket); #endif /* NET_H_ */ diff --git a/src/server/rpc.c b/src/server/rpc.c index ae01a0e..af3507c 100644 --- a/src/server/rpc.c +++ b/src/server/rpc.c @@ -1,7 +1,3 @@ -#include -#include -#include - #include "rpc.h" #include "server.h" #include "net.h" @@ -9,6 +5,12 @@ #include "log.h" #include "locks.h" #include "helper.h" +#include "image.h" + +#include +#include +#include +#include static void clientsToJson(json_t *jsonClients); @@ -16,12 +18,16 @@ void rpc_sendStatsJson(int sock) { uint64_t receivedBytes = uplink_getTotalBytesReceived(); uint64_t sentBytes = net_getTotalBytesSent(); + int uptime = dnbd3_serverUptime(); json_t *jsonClients = json_array(); clientsToJson( jsonClients ); - json_t *statisticsJson = json_pack( "{sisi}", "receivedBytes", (json_int_t) receivedBytes, "sentBytes", (json_int_t) sentBytes ); - json_object_set( statisticsJson, "clients", jsonClients ); + + json_t *statisticsJson = json_pack( "{sIsI}", "receivedBytes", (json_int_t) receivedBytes, "sentBytes", (json_int_t) sentBytes ); + json_object_set_new( statisticsJson, "clients", jsonClients ); + json_object_set_new( statisticsJson, "images", image_fillJson() ); + json_object_set_new( statisticsJson, "uptime", json_integer( uptime ) ); char *jsonString = json_dumps( statisticsJson, 0 ); char buffer[500]; @@ -30,7 +36,6 @@ void rpc_sendStatsJson(int sock) write( sock, buffer, strlen( buffer ) ); write( sock, jsonString, strlen( jsonString ) ); json_decref( statisticsJson ); - json_decref( jsonClients ); free( jsonString ); } @@ -46,9 +51,8 @@ static void clientsToJson(json_t *jsonClients) spin_lock( &_clients[i]->lock ); host_to_string( &_clients[i]->host, clientName, sizeof(clientName) ); imageName =_clients[i]->image != NULL ? _clients[i]->image->lower_name : "NULL"; - clientStats = json_pack( "{sssssi}", "client", clientName, "image", imageName , "bytesSent", (json_int_t) _clients[i]->bytesSent ); - json_array_append( jsonClients, clientStats ); - json_decref( clientStats ); + clientStats = json_pack( "{sssssI}", "client", clientName, "image", imageName , "bytesSent", (json_int_t)_clients[i]->bytesSent ); + json_array_append_new( jsonClients, clientStats ); spin_unlock( &_clients[i]->lock ); } spin_unlock( &_clients_lock ); diff --git a/src/server/server.c b/src/server/server.c index a5bfc3e..6a317fe 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -59,7 +59,6 @@ static bool sigReload = false, sigLogCycle = false; static bool dnbd3_addClient(dnbd3_client_t *client); static void dnbd3_handleSignal(int signum); -static void dnbd3_printClients(); /** * Print help text for usage instructions diff --git a/src/server/uplink.c b/src/server/uplink.c index d76f030..e1c776b 100644 --- a/src/server/uplink.c +++ b/src/server/uplink.c @@ -48,14 +48,6 @@ uint64_t uplink_getTotalBytesReceived() return tmp; } -void uplink_addTotalBytesReceived(int receivedBytes) -{ - spin_lock( &statisticsReceivedLock ); - totalBytesReceived += receivedBytes; - spin_unlock( &statisticsReceivedLock ); - return; -} - /** * Create and initialize an uplink instance for the given * image. Uplinks run in their own thread. @@ -452,7 +444,9 @@ static void* uplink_mainloop(void *data) spin_destroy( &link->queueLock ); free( link->recvBuffer ); link->recvBuffer = NULL; - uplink_addTotalBytesReceived( link->bytesReceived ); + spin_lock( &statisticsReceivedLock ); + totalBytesReceived += link->bytesReceived; + spin_unlock( &statisticsReceivedLock ); free( link ); return NULL ; } diff --git a/src/server/uplink.h b/src/server/uplink.h index c0a68de..43c068f 100644 --- a/src/server/uplink.h +++ b/src/server/uplink.h @@ -8,8 +8,6 @@ void uplink_globalsInit(); uint64_t uplink_getTotalBytesReceived(); -void uplink_addTotalBytesReceived(int receivedBytes); - bool uplink_init(dnbd3_image_t *image, int sock, dnbd3_host_t *host); void uplink_removeClient(dnbd3_connection_t *uplink, dnbd3_client_t *client); -- cgit v1.2.3-55-g7522