Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp> --- collie/collie.h | 2 +- collie/store.c | 32 ++++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/collie/collie.h b/collie/collie.h index 5bdbe3c..0980ebc 100644 --- a/collie/collie.h +++ b/collie/collie.h @@ -63,7 +63,7 @@ struct cluster_info { uint32_t this_pid; struct sheepdog_node_list_entry this_node; - uint64_t epoch; + uint32_t epoch; struct list_head node_list; struct list_head vm_list; diff --git a/collie/store.c b/collie/store.c index 6b66a92..30bb115 100644 --- a/collie/store.c +++ b/collie/store.c @@ -132,6 +132,26 @@ static int read_from_other_sheeps(struct cluster_info *cluster, return ret; } +static int check_epoch(struct cluster_info *cluster, struct request *req) +{ + struct sd_req *hdr = (struct sd_req *)&req->rq; + uint32_t req_epoch = hdr->epoch; + uint32_t opcode = hdr->opcode; + int ret = SD_RES_SUCCESS; + + if (before(req_epoch, cluster->epoch)) { + ret = SD_RES_OLD_NODE_VER; + eprintf("old node version %u %u, %x\n", + cluster->epoch, req_epoch, opcode); + } else if (after(req_epoch, cluster->epoch)) { + ret = SD_RES_NEW_NODE_VER; + eprintf("new node version %u %u %x\n", + cluster->epoch, req_epoch, opcode); + } + + return ret; +} + void store_queue_request(struct work *work, int idx) { struct request *req = container_of(work, struct request, work); @@ -163,17 +183,9 @@ void store_queue_request(struct work *work, int idx) } if (opcode != SD_OP_GET_NODE_LIST) { - if (before(req_epoch, epoch)) { - ret = SD_RES_OLD_NODE_VER; - eprintf("old node version %u %u, %x %" PRIx64 "\n", - epoch, req_epoch, opcode, oid); + ret = check_epoch(cluster, req); + if (ret != SD_RES_SUCCESS) goto out; - } else if (after(req_epoch, epoch)) { - ret = SD_RES_NEW_NODE_VER; - eprintf("new node version %u %u %x %" PRIx64 "\n", - epoch, req_epoch, opcode, oid); - goto out; - } } switch (opcode) { -- 1.5.6.5 |