[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