[sheepdog] [PATCH 1/2] sheep: remove fix_object_consistency()
Liu Yuan
namei.unix at gmail.com
Wed Jun 20 12:16:01 CEST 2012
From: Liu Yuan <tailai.ly at taobao.com>
Jun 08 14:32:42 queue_request(387) 1
Jun 08 14:32:42 do_io_request(105) 1, dc4435000011be , 2
Jun 08 14:32:42 do_local_io(52) 1, dc4435000011be , 2
Jun 08 14:32:42 client_rx_handler(588) connection from: 10.0.1.62:48551
Jun 08 14:32:42 queue_request(387) 1
Jun 08 14:32:42 do_io_request(105) 1, dc4435000011be , 2
Jun 08 14:32:42 do_local_io(52) 1, dc4435000011be , 2
Jun 08 14:32:42 client_rx_handler(588) connection from: 10.0.1.62:48552
Jun 08 14:32:42 queue_request(387) 1
Jun 08 14:32:42 do_io_request(105) 1, dc4435000011be , 2
Jun 08 14:32:42 do_local_io(52) 1, dc4435000011be , 2
Jun 08 14:32:42 client_rx_handler(588) connection from: 10.0.1.62:48549
Jun 08 14:32:42 queue_request(387) 1
Jun 08 14:32:42 do_io_request(105) 1, dc4435000011be , 2
Jun 08 14:32:42 client_rx_handler(588) connection from: 10.0.1.62:48550
Jun 08 14:32:42 do_local_io(52) 1, dc4435000011be , 2
Jun 08 14:32:42 queue_request(387) 2
Jun 08 14:32:42 do_io_request(105) 2, dc4435000011be , 2
Jun 08 14:32:42 do_local_io(52) 2, dc4435000011be , 2
Jun 08 14:32:42 do_io_request(111) failed: 2, dc4435000011be , 2, 3
Jun 08 14:32:42 io_op_done(119) leaving sheepdog cluster
Jun 08 14:32:42 client_rx_handler(588) connection from: 10.0.1.62:48551
fix_object_consistency() might be called in multiple threads and cause
trouble.
So we'd remove it from the sheep core and add a manual check&repair in collie.
Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
sheep/gateway.c | 70 ------------------------------------------------
sheep/group.c | 1 -
sheep/sdnet.c | 75 ----------------------------------------------------
sheep/sheep_priv.h | 2 --
4 files changed, 148 deletions(-)
diff --git a/sheep/gateway.c b/sheep/gateway.c
index e92f3ed..42f028a 100644
--- a/sheep/gateway.c
+++ b/sheep/gateway.c
@@ -208,69 +208,6 @@ err:
return ret;
}
-static int fix_object_consistency(struct request *req)
-{
- int ret = SD_RES_NO_MEM;
- unsigned int data_length;
- struct sd_req *hdr = &req->rq;
- struct sd_req req_bak;
- struct sd_rsp rsp_bak;
- void *data = req->data, *buf;
- uint64_t oid = hdr->obj.oid;
- int old_opcode = hdr->opcode;
-
- memcpy(&req_bak, &req->rq, sizeof(req_bak));
- memcpy(&rsp_bak, &req->rp, sizeof(rsp_bak));
-
- if (is_vdi_obj(oid))
- data_length = SD_INODE_SIZE;
- else if (is_vdi_attr_obj(oid))
- data_length = SD_ATTR_OBJ_SIZE;
- else
- data_length = SD_DATA_OBJ_SIZE;
-
- buf = valloc(data_length);
- if (buf == NULL) {
- eprintf("failed to allocate memory\n");
- goto out;
- }
- memset(buf, 0, data_length);
-
-
- hdr->data_length = data_length;
- hdr->opcode = SD_OP_READ_OBJ;
- hdr->flags = 0;
- hdr->obj.offset = 0;
-
- req->data = buf;
- req->op = get_sd_op(SD_OP_READ_OBJ);
-
- ret = forward_read_obj_req(req);
- if (ret != SD_RES_SUCCESS) {
- eprintf("failed to read object %x\n", ret);
- goto out;
- }
-
- hdr->opcode = SD_OP_CREATE_AND_WRITE_OBJ;
- hdr->flags = SD_FLAG_CMD_WRITE;
- hdr->obj.oid = oid;
- req->op = get_sd_op(hdr->opcode);
- ret = forward_write_obj_req(req);
- if (ret != SD_RES_SUCCESS) {
- eprintf("failed to write object %x\n", ret);
- goto out;
- }
-out:
- free(buf);
- req->data = data;
- req->op = get_sd_op(old_opcode);
-
- memcpy(&req->rq, &req_bak, sizeof(req_bak));
- memcpy(&req->rp, &rsp_bak, sizeof(rsp_bak));
-
- return ret;
-}
-
void do_gateway_request(struct work *work)
{
struct request *req = container_of(work, struct request, work);
@@ -280,12 +217,6 @@ void do_gateway_request(struct work *work)
req->rq.opcode, req->rq.obj.oid, req->rq.epoch);
if (!sys->enable_write_cache || bypass_object_cache(req)) {
- /* fix object consistency when we read the object for the first time */
- if (req->check_consistency) {
- ret = fix_object_consistency(req);
- if (ret != SD_RES_SUCCESS)
- goto out;
- }
if (req->rq.flags & SD_FLAG_CMD_WRITE)
ret = forward_write_obj_req(req);
else
@@ -294,7 +225,6 @@ void do_gateway_request(struct work *work)
ret = object_cache_handle_request(req);
}
-out:
if (ret != SD_RES_SUCCESS)
dprintf("failed: %x, %" PRIx64" , %u, %"PRIx32"\n",
req->rq.opcode, req->rq.obj.oid, req->rq.epoch, ret);
diff --git a/sheep/group.c b/sheep/group.c
index 8fd2bf5..6721025 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -1160,7 +1160,6 @@ int create_cluster(int port, int64_t zone, int nr_vnodes,
INIT_LIST_HEAD(&sys->failed_nodes);
INIT_LIST_HEAD(&sys->delayed_nodes);
- INIT_LIST_HEAD(&sys->consistent_obj_list);
INIT_LIST_HEAD(&sys->blocking_conn_list);
INIT_LIST_HEAD(&sys->wait_rw_queue);
diff --git a/sheep/sdnet.c b/sheep/sdnet.c
index f7eb6c8..34d65cf 100644
--- a/sheep/sdnet.c
+++ b/sheep/sdnet.c
@@ -39,76 +39,6 @@ static int is_access_local(struct request *req, uint64_t oid)
return 0;
}
-static int need_consistency_check(struct request *req)
-{
- struct sd_req *hdr = &req->rq;
-
- if (hdr->opcode != SD_OP_READ_OBJ)
- /* consistency is fixed when clients read data for the
- * first time */
- return 0;
-
- if (hdr->flags & SD_FLAG_CMD_WEAK_CONSISTENCY)
- return 0;
-
- if (is_vdi_obj(hdr->obj.oid))
- /* only check consistency for data objects */
- return 0;
-
- return 1;
-}
-
-static inline void set_consistency_check(struct request *req)
-{
- uint32_t vdi_id = oid_to_vid(req->rq.obj.oid);
- uint32_t idx = data_oid_to_idx(req->rq.obj.oid);
- struct data_object_bmap *bmap;
-
- req->check_consistency = 1;
- list_for_each_entry(bmap, &sys->consistent_obj_list, list) {
- if (bmap->vdi_id == vdi_id) {
- if (test_bit(idx, bmap->dobjs))
- req->check_consistency = 0;
- break;
- }
- }
-}
-
-static void check_object_consistency(struct sd_req *hdr)
-{
- uint32_t vdi_id = oid_to_vid(hdr->obj.oid);
- struct data_object_bmap *bmap, *n;
- int nr_bmaps = 0;
-
- list_for_each_entry_safe(bmap, n, &sys->consistent_obj_list, list) {
- nr_bmaps++;
- if (bmap->vdi_id == vdi_id) {
- set_bit(data_oid_to_idx(hdr->obj.oid), bmap->dobjs);
- list_move_tail(&bmap->list, &sys->consistent_obj_list);
- return;
- }
- }
-
- bmap = zalloc(sizeof(*bmap));
- if (bmap == NULL) {
- eprintf("failed to allocate memory\n");
- return;
- }
-
- dprintf("allocating a new object map\n");
-
- bmap->vdi_id = vdi_id;
- list_add_tail(&bmap->list, &sys->consistent_obj_list);
- set_bit(data_oid_to_idx(hdr->obj.oid), bmap->dobjs);
- if (nr_bmaps >= MAX_DATA_OBJECT_BMAPS) {
- /* the first entry is the least recently used one */
- bmap = list_first_entry(&sys->consistent_obj_list,
- struct data_object_bmap, list);
- list_del(&bmap->list);
- free(bmap);
- }
-}
-
static void io_op_done(struct work *work)
{
struct request *req = container_of(work, struct request, work);
@@ -154,8 +84,6 @@ static void gateway_op_done(struct work *work)
}
break;
case SD_RES_SUCCESS:
- if (req->check_consistency && is_data_obj(hdr->obj.oid))
- check_object_consistency(hdr);
break;
}
@@ -356,9 +284,6 @@ static void queue_gateway_request(struct request *req)
if (request_in_recovery(req))
return;
- if (need_consistency_check(req))
- set_consistency_check(req);
-
queue_work:
req->work.fn = do_gateway_request;
req->work.done = gateway_op_done;
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 7a86533..9b6344b 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -76,7 +76,6 @@ struct request {
uint64_t local_oid;
struct vnode_info *vnodes;
- int check_consistency;
struct work work;
};
@@ -125,7 +124,6 @@ struct cluster_info {
DECLARE_BITMAP(vdi_inuse, SD_NR_VDIS);
- struct list_head consistent_obj_list;
struct list_head blocking_conn_list;
int nr_copies;
--
1.7.10.2
More information about the sheepdog
mailing list