This is used to get cluster information and current epoch. Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> --- collie/group.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ collie/net.c | 2 + include/sheepdog_proto.h | 1 + 3 files changed, 56 insertions(+), 0 deletions(-) diff --git a/collie/group.c b/collie/group.c index 7dbbe9e..676ddbb 100644 --- a/collie/group.c +++ b/collie/group.c @@ -352,6 +352,51 @@ static struct epoch_tree *find_start_epoch(struct tree_vertex *root) return tree; } +struct start_epoch_info { + int nr_logs; + struct epoch_log *logs; +}; + +static int __get_start_epochs(struct tree_vertex *vertex, int depth, + struct start_epoch_info *sei) +{ + struct epoch_tree *tree; + struct tree_vertex *v; + int i; + + tree = container_of(vertex, struct epoch_tree, vertex); + if (tree->updated) { + for (i = 0; i < sei->nr_logs; i++) { + v = vertex; + while (v->id) { + if (v->id == sei->logs[i].hval) + goto out; + v = tree_parent(v); + } + } + sei->nr_logs++; + out: + sei->logs[i].ctime = tree->ctime; + sei->logs[i].hval = vertex->id; + sei->logs[i].epoch = tree->epoch; + sei->logs[i].nr_nodes = tree->nr_nodes; + memcpy(sei->logs[i].nodes, tree->nodes, sizeof(tree->nodes[0]) * tree->nr_nodes); + } + return 0; +} + +static int get_start_epochs(struct tree_vertex *root, struct epoch_log *logs) +{ + struct start_epoch_info sei; + + sei.nr_logs = 0; + sei.logs = logs; + + tree_walk(root, (tree_vertex_func_t)__get_start_epochs, &sei); + + return sei.nr_logs; +} + static int __check_enough_epochs(struct tree_vertex *vertex, int depth, void *data) { struct epoch_tree *tree; @@ -806,6 +851,12 @@ static void vdi_op(struct vdi_op_message *msg) break; case SD_OP_SHUTDOWN: break; + case SD_OP_STAT_CLUSTER: + rsp->rsvd = sys->status; + rsp->data_length = get_start_epochs(&sys->epoch_tree_root, (struct epoch_log *)msg->data); + rsp->data_length *= sizeof(struct epoch_log); + rsp->result = SD_RES_SUCCESS; + break; default: ret = SD_RES_SYSTEM_ERROR; eprintf("opcode %d is not implemented\n", hdr->opcode); @@ -867,6 +918,8 @@ static void vdi_op_done(struct vdi_op_message *msg) case SD_OP_SHUTDOWN: sys->status = SD_STATUS_SHUTDOWN; break; + case SD_OP_STAT_CLUSTER: + break; default: eprintf("unknown operation %d\n", hdr->opcode); ret = SD_RES_UNKNOWN; diff --git a/collie/net.c b/collie/net.c index 6e2fe67..9a942c4 100644 --- a/collie/net.c +++ b/collie/net.c @@ -29,6 +29,7 @@ static void __done(struct work *work, int idx) case SD_OP_GET_VDI_INFO: case SD_OP_MAKE_FS: case SD_OP_SHUTDOWN: + case SD_OP_STAT_CLUSTER: /* request is forwarded to cpg group */ return; } @@ -62,6 +63,7 @@ static void queue_request(struct request *req) case SD_OP_GET_VDI_INFO: case SD_OP_MAKE_FS: case SD_OP_SHUTDOWN: + case SD_OP_STAT_CLUSTER: req->work.fn = cluster_queue_request; break; case SD_OP_SO: diff --git a/include/sheepdog_proto.h b/include/sheepdog_proto.h index e835f68..540bbdb 100644 --- a/include/sheepdog_proto.h +++ b/include/sheepdog_proto.h @@ -58,6 +58,7 @@ #define SD_OP_SO_STAT 0x65 #define SD_OP_STAT_SHEEP 0xB0 +#define SD_OP_STAT_CLUSTER 0xB1 #define SD_FLAG_CMD_WRITE 0x01 #define SD_FLAG_CMD_COW 0x02 -- 1.5.6.5 |