From f9468ef42cb5e2b1779c3309b2bbbe2495418787 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 3 Mar 2020 15:48:26 +0100 Subject: [SERVER] Expose image->problem bools as bitmask in RPC json data --- src/server/globals.h | 4 ++-- src/server/image.c | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) (limited to 'src/server') diff --git a/src/server/globals.h b/src/server/globals.h index 0bd6e47..5de4180 100644 --- a/src/server/globals.h +++ b/src/server/globals.h @@ -137,10 +137,10 @@ struct _dnbd3_image atomic_int users; // clients currently using this image. XXX Lock on imageListLock when modifying and checking whether the image should be freed. Reading it elsewhere is fine without the lock. int id; // Unique ID of this image. Only unique in the context of this running instance of DNBD3-Server struct { - atomic_bool uplink; // No uplink connected - atomic_bool write; // Error writing to file atomic_bool read; // Error reading from file + atomic_bool write; // Error writing to file atomic_bool changed; // File disappeared or changed, thorough check required if it seems to be back + atomic_bool uplink; // No uplink connected atomic_bool queue; // Too many requests waiting on uplink } problem; uint16_t rid; // revision of image diff --git a/src/server/image.c b/src/server/image.c index 1ce1574..a6aec82 100644 --- a/src/server/image.c +++ b/src/server/image.c @@ -1576,14 +1576,23 @@ json_t* image_getListAsJson() ref_put( &uplink->reference ); } - jsonImage = json_pack( "{sisssisisisisI}", + int problems = 0; +#define addproblem(name,val) if (image->problem.name) problems |= (1 << val) + addproblem(read, 0); + addproblem(write, 1); + addproblem(changed, 2); + addproblem(uplink, 3); + addproblem(queue, 4); + + jsonImage = json_pack( "{sisssisisisisIsi}", "id", image->id, // id, name, rid never change, so access them without locking "name", image->name, "rid", (int) image->rid, "users", image->users, "complete", completeness, "idle", idleTime, - "size", (json_int_t)image->virtualFilesize ); + "size", (json_int_t)image->virtualFilesize, + "problems", problems ); if ( bytesReceived != 0 ) { json_object_set_new( jsonImage, "bytesReceived", json_integer( (json_int_t) bytesReceived ) ); } -- cgit v1.2.3-55-g7522