This supports reading node list information at the requested epoch. Start up routines use this feature. Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> --- collie/collie.h | 4 ++++ collie/net.c | 1 + collie/store.c | 40 ++++++++++++++++++++++++++++++++++++++++ include/sheepdog_proto.h | 1 + 4 files changed, 46 insertions(+), 0 deletions(-) diff --git a/collie/collie.h b/collie/collie.h index 88bc8be..968925e 100644 --- a/collie/collie.h +++ b/collie/collie.h @@ -98,6 +98,8 @@ void so_queue_request(struct work *work, int idx); void store_queue_request(struct work *work, int idx); int get_epoch_list(uint32_t *epoch_list, int *size); +int read_epoch(int epoch, uint32_t *is_updated, uint64_t *ctime, uint64_t *hval, + struct sheepdog_node_list_entry *entries, int *nr_entries); void epoch_queue_request(struct work *work, int idx); void cluster_queue_request(struct work *work, int idx); @@ -113,6 +115,8 @@ int epoch_log_write(uint32_t epoch, char *buf, int len); int epoch_log_read(uint32_t epoch, char *buf, int len); int set_epoch_updated(uint32_t epoch, uint32_t val); uint32_t is_epoch_updated(uint32_t epoch); +uint64_t epoch_hash_val(uint32_t epoch, uint64_t ctime, + struct sheepdog_node_list_entry *entries, int len); int set_cluster_ctime(uint64_t ctime); uint64_t get_cluster_ctime(void); diff --git a/collie/net.c b/collie/net.c index 70082ad..6e2fe67 100644 --- a/collie/net.c +++ b/collie/net.c @@ -50,6 +50,7 @@ static void queue_request(struct request *req) req->work.fn = store_queue_request; break; case SD_OP_GET_EPOCH_LIST: + case SD_OP_READ_EPOCH: req->work.fn = epoch_queue_request; break; case SD_OP_GET_NODE_LIST: diff --git a/collie/store.c b/collie/store.c index 6bc3229..59f5476 100644 --- a/collie/store.c +++ b/collie/store.c @@ -1108,6 +1108,17 @@ uint32_t is_epoch_updated(uint32_t epoch) return val; } +uint64_t epoch_hash_val(uint32_t epoch, uint64_t ctime, + struct sheepdog_node_list_entry *entries, int len) +{ + int64_t hval; + hval = fnv_64a_buf(&epoch, sizeof(epoch), FNV1A_64_INIT); + hval = fnv_64a_buf(&ctime, sizeof(ctime), hval); + hval = fnv_64a_buf(entries, sizeof(*entries) * len, hval); + + return hval; +} + int set_cluster_ctime(uint64_t ctime) { int fd, ret; @@ -1667,6 +1678,27 @@ int get_epoch_list(uint32_t *epoch_list, int *size) return SD_RES_SUCCESS; } +int read_epoch(int epoch, uint32_t *is_updated, uint64_t *ctime, uint64_t *hval, + struct sheepdog_node_list_entry *entries, int *nr_entries) +{ + int ret; + + ret = epoch_log_read(epoch, (char *)entries, + *nr_entries * sizeof(*entries)); + if (ret == -1) { + eprintf("failed to read epoch %d\n", epoch); + *nr_entries = 0; + return SD_RES_EIO; + } + *nr_entries = ret / sizeof(*entries); + + *is_updated = is_epoch_updated(epoch); + *ctime = get_cluster_ctime(); + *hval = epoch_hash_val(epoch, *ctime, entries, *nr_entries); + + return SD_RES_SUCCESS; +} + void epoch_queue_request(struct work *work, int idx) { struct request *req = container_of(work, struct request, work); @@ -1674,6 +1706,7 @@ void epoch_queue_request(struct work *work, int idx) struct sd_epoch_req *hdr = (struct sd_epoch_req *)&req->rq; struct sd_epoch_rsp *rsp = (struct sd_epoch_rsp *)&req->rp; uint32_t opcode = hdr->opcode; + struct sheepdog_node_list_entry *entries; switch (opcode) { case SD_OP_GET_EPOCH_LIST: @@ -1681,6 +1714,13 @@ void epoch_queue_request(struct work *work, int idx) ret = get_epoch_list(req->data, &n); rsp->data_length = n * sizeof(uint32_t); break; + case SD_OP_READ_EPOCH: + entries = req->data; + n = hdr->data_length / sizeof(*entries); + ret = read_epoch(hdr->request_epoch, &rsp->is_updated, &rsp->ctime, + &rsp->hval, entries, &n); + rsp->data_length = n * sizeof(*entries); + break; } if (ret != SD_RES_SUCCESS) { dprintf("failed, %d, %x, %x\n", idx, opcode, ret); diff --git a/include/sheepdog_proto.h b/include/sheepdog_proto.h index 64d0016..c1197fb 100644 --- a/include/sheepdog_proto.h +++ b/include/sheepdog_proto.h @@ -37,6 +37,7 @@ #define SD_OP_SHUTDOWN 0x24 #define SD_OP_GET_EPOCH_LIST 0x25 +#define SD_OP_READ_EPOCH 0x26 #define SD_OP_DEBUG_INC_NVER 0xA0 #define SD_OP_DEBUG_SET_NODE 0xA1 -- 1.5.6.5 |