qemu always sends requests to a local dog so and he forwards them. So no need to require qemu to set epoch field.
Signed-off-by: FUJITA Tomonori <[email protected]> --- collie/collie.h | 1 + collie/group.c | 13 +++++++++++++ collie/store.c | 17 +++++++++-------- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/collie/collie.h b/collie/collie.h index f25857a..183f771 100644 --- a/collie/collie.h +++ b/collie/collie.h @@ -66,6 +66,7 @@ struct cluster_info { uint32_t epoch; struct list_head node_list; + int node_list_idx; struct list_head vm_list; struct list_head pending_list; diff --git a/collie/group.c b/collie/group.c index 716f52c..e763d52 100644 --- a/collie/group.c +++ b/collie/group.c @@ -723,6 +723,19 @@ int build_node_list(struct list_head *node_list, return nr; } +static void update_node_list_idx(struct cluster_info *ci, + struct sheepdog_node_list_entry *e, int nr) +{ + int i; + + for (i = 0; i < nr; i++) { + if (e->id == ci->this_node.id) { + ci->node_list_idx = i; + break; + } + } +} + struct cluster_info *create_cluster(int port) { int fd, ret; diff --git a/collie/store.c b/collie/store.c index 5462d49..e280e10 100644 --- a/collie/store.c +++ b/collie/store.c @@ -209,7 +209,7 @@ static int read_from_other_sheeps(struct cluster_info *cluster, } static int store_queue_request_local(struct cluster_info *cluster, - struct request *req, char *buf); + struct request *req, char *buf, uint32_t epoch); static int forward_obj_req(struct cluster_info *cluster, struct request *req, char *buf) @@ -243,8 +243,9 @@ again: /* TODO: we can do better; we need to chech this first */ if (e[n].id == cluster->this_node.id) { - store_queue_request_local(cluster, req, buf); + ret = store_queue_request_local(cluster, req, buf, cluster->epoch); memcpy(rsp, &req->rp, sizeof(*rsp)); + rsp->result = ret; goto done; } @@ -263,6 +264,7 @@ again: } hdr2.flags |= SD_FLAG_CMD_FORWARD; + hdr2.epoch = cluster->epoch; ret = exec_req(fd, (struct sd_req *)&hdr2, req->data, &wlen, &rlen); @@ -392,7 +394,7 @@ int update_epoch_store(struct cluster_info *ci, uint32_t epoch) } static int store_queue_request_local(struct cluster_info *cluster, - struct request *req, char *buf) + struct request *req, char *buf, uint32_t epoch) { int fd = -1, copies; int ret = SD_RES_SUCCESS; @@ -400,7 +402,6 @@ static int store_queue_request_local(struct cluster_info *cluster, struct sd_obj_rsp *rsp = (struct sd_obj_rsp *)&req->rp; uint64_t oid = hdr->oid; uint32_t opcode = hdr->opcode; - uint32_t req_epoch = hdr->epoch; char path[1024]; switch (opcode) { @@ -409,9 +410,9 @@ static int store_queue_request_local(struct cluster_info *cluster, case SD_OP_READ_OBJ: case SD_OP_SYNC_OBJ: if (opcode == SD_OP_CREATE_AND_WRITE_OBJ) - fd = ob_open(req_epoch, oid, O_CREAT, &ret); + fd = ob_open(epoch, oid, O_CREAT, &ret); else - fd = ob_open(req_epoch, oid, 0, &ret); + fd = ob_open(epoch, oid, 0, &ret); if (fd < 0) goto out; @@ -544,7 +545,7 @@ void store_queue_request(struct work *work, int idx) goto out; } - if (opcode != SD_OP_GET_NODE_LIST) { + if (hdr->flags & SD_FLAG_CMD_FORWARD) { ret = check_epoch(cluster, req); if (ret != SD_RES_SUCCESS) goto out; @@ -565,7 +566,7 @@ void store_queue_request(struct work *work, int idx) goto out; } - ret = store_queue_request_local(cluster, req, buf); + ret = store_queue_request_local(cluster, req, buf, epoch); out: if (ret != SD_RES_SUCCESS) { dprintf("failed, %d, %x, %" PRIx64" , %u, %u\n", -- 1.5.6.5 -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
