[Sheepdog] [PATCH 09/14] check epoch when the request causes local access
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Sat May 14 09:03:54 CEST 2011
Even though SD_FLAG_CMD_DIRECT is not set, local accesses could happen
if the target object is in the local node.
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
sheep/group.c | 10 ++++++++--
sheep/sdnet.c | 7 +++++--
sheep/sheep_priv.h | 2 ++
3 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/sheep/group.c b/sheep/group.c
index 2826db3..28d211f 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -1342,7 +1342,10 @@ do_retry:
sys->nr_outstanding_io++;
- if (req->rq.flags & SD_FLAG_CMD_DIRECT) {
+ if (is_access_local(req->entry, req->nr_vnodes,
+ ((struct sd_obj_req *)&req->rq)->oid, sys->nr_sobjs) ||
+ is_access_local(req->entry, req->nr_vnodes,
+ ((struct sd_obj_req *)&req->rq)->cow_oid, sys->nr_sobjs)) {
int ret = check_epoch(req);
if (ret != SD_RES_SUCCESS) {
req->rp.result = ret;
@@ -1350,7 +1353,10 @@ do_retry:
list_add_tail(&req->r_wlist, &failed_req_list);
continue;
}
- } else if (req->rq.opcode == SD_OP_READ_OBJ) {
+ }
+
+ if (!(req->rq.flags & SD_FLAG_CMD_DIRECT) &&
+ req->rq.opcode == SD_OP_READ_OBJ) {
struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
uint32_t vdi_id = oid_to_vid(hdr->oid);
struct data_object_bmap *bmap;
diff --git a/sheep/sdnet.c b/sheep/sdnet.c
index d37e75f..1b1b7cc 100644
--- a/sheep/sdnet.c
+++ b/sheep/sdnet.c
@@ -51,11 +51,14 @@ void resume_pending_requests(void)
start_cpg_event_work();
}
-static int is_access_local(struct sheepdog_vnode_list_entry *e, int nr_nodes,
- uint64_t oid, int copies)
+int is_access_local(struct sheepdog_vnode_list_entry *e, int nr_nodes,
+ uint64_t oid, int copies)
{
int i, n;
+ if (oid == 0)
+ return 0;
+
for (i = 0; i < copies; i++) {
n = obj_to_sheep(e, nr_nodes, oid, i);
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 13a5ce2..82840de 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -166,6 +166,8 @@ void setup_ordered_sd_vnode_list(struct request *req);
void get_ordered_sd_vnode_list(struct sheepdog_vnode_list_entry *entries,
int *nr_vnodes, int *nr_nodes);
int is_access_to_busy_objects(uint64_t oid);
+int is_access_local(struct sheepdog_vnode_list_entry *e, int nr_nodes,
+ uint64_t oid, int copies);
void resume_pending_requests(void);
--
1.5.6.5
More information about the sheepdog
mailing list