summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorSimon Rettberg2020-03-03 15:48:26 +0100
committerSimon Rettberg2020-03-03 15:48:26 +0100
commitf9468ef42cb5e2b1779c3309b2bbbe2495418787 (patch)
treef43a86d182f5994cfdbffb2ccdc636b5cb309fa9 /src/server
parent[SERVER] Also add a flag for uplink queue overload (diff)
downloaddnbd3-f9468ef42cb5e2b1779c3309b2bbbe2495418787.tar.gz
dnbd3-f9468ef42cb5e2b1779c3309b2bbbe2495418787.tar.xz
dnbd3-f9468ef42cb5e2b1779c3309b2bbbe2495418787.zip
[SERVER] Expose image->problem bools as bitmask in RPC json data
Diffstat (limited to 'src/server')
-rw-r--r--src/server/globals.h4
-rw-r--r--src/server/image.c13
2 files changed, 13 insertions, 4 deletions
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 ) );
}