[sheepdog] [PATCH v1 1/4] sheep/http: add nolock version for some functions

Robin Dong robin.k.dong at gmail.com
Fri Feb 21 07:47:30 CET 2014


From: Robin Dong <sanbai at taobao.com>

Add nolock version for onode_create(), onode_lookup(), onode_delete_object()
---
 sheep/http/kv.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 66 insertions(+), 12 deletions(-)

diff --git a/sheep/http/kv.c b/sheep/http/kv.c
index ac9decb..4ac69fc 100644
--- a/sheep/http/kv.c
+++ b/sheep/http/kv.c
@@ -779,7 +779,7 @@ out:
 	return ret;
 }
 
-static int onode_create(struct kv_onode *onode, uint32_t bucket_vid)
+static int onode_create_nolock(struct kv_onode *onode, uint32_t bucket_vid)
 {
 	struct sd_inode *inode = xmalloc(sizeof(struct sd_inode));
 	uint32_t tmp_vid, idx;
@@ -787,7 +787,6 @@ static int onode_create(struct kv_onode *onode, uint32_t bucket_vid)
 	int ret;
 	bool create = true;
 
-	sys->cdrv->lock(bucket_vid);
 	ret = sd_read_object(vid_to_vdi_oid(bucket_vid), (char *)inode,
 			       sizeof(*inode), 0);
 	if (ret != SD_RES_SUCCESS) {
@@ -822,21 +821,33 @@ create:
 	ret = onode_do_create(onode, inode, idx, create);
 out:
 	free(inode);
+	return ret;
+}
+
+static int onode_create(struct kv_onode *onode, uint32_t bucket_vid)
+{
+	int ret;
+
+	sys->cdrv->lock(bucket_vid);
+	ret = onode_create_nolock(onode, bucket_vid);
 	sys->cdrv->unlock(bucket_vid);
+
 	return ret;
 }
 
-static int onode_free_data(struct kv_onode *onode)
+static int onode_free_data(struct kv_onode *onode, int lock)
 {
 	uint32_t data_vid = onode->data_vid;
 	int ret = SD_RES_SUCCESS;
 
 	/* it don't need to free data for inlined onode */
 	if (!onode->inlined) {
-		sys->cdrv->lock(data_vid);
+		if (lock)
+			sys->cdrv->lock(data_vid);
 		ret = oalloc_free(data_vid, onode->o_extent[0].start,
 				  onode->o_extent[0].count);
-		sys->cdrv->unlock(data_vid);
+		if (lock)
+			sys->cdrv->unlock(data_vid);
 		if (ret != SD_RES_SUCCESS)
 			sd_err("failed to free %s", onode->name);
 	}
@@ -901,14 +912,14 @@ out:
  *
  * [ sheep, dog, wolve, '\0', fish, {unallocated}, tiger, ]
  */
-static int onode_lookup(struct kv_onode *onode, uint32_t ovid, const char *name)
+static int onode_lookup_nolock(struct kv_onode *onode, uint32_t ovid,
+			       const char *name)
 {
 	struct sd_inode *inode = xmalloc(sizeof(struct sd_inode));
 	uint32_t tmp_vid, idx;
 	uint64_t hval, i;
 	int ret;
 
-	sys->cdrv->lock(ovid);
 	ret = sd_read_object(vid_to_vdi_oid(ovid), (char *)inode,
 			     sizeof(*inode), 0);
 	if (ret != SD_RES_SUCCESS) {
@@ -941,7 +952,17 @@ static int onode_lookup(struct kv_onode *onode, uint32_t ovid, const char *name)
 	}
 out:
 	free(inode);
+	return ret;
+}
+
+static int onode_lookup(struct kv_onode *onode, uint32_t ovid, const char *name)
+{
+	int ret;
+
+	sys->cdrv->lock(ovid);
+	ret = onode_lookup_nolock(onode, ovid, name);
 	sys->cdrv->unlock(ovid);
+
 	return ret;
 }
 
@@ -990,7 +1011,7 @@ static int onode_read_data(struct kv_onode *onode, struct http_request *req)
  *
  * XXX: GC the orphans
  */
-static int onode_delete(struct kv_onode *onode)
+static int onode_delete(struct kv_onode *onode, int lock)
 {
 	char name[SD_MAX_OBJECT_NAME] = {};
 	int ret;
@@ -1001,7 +1022,7 @@ static int onode_delete(struct kv_onode *onode)
 		return ret;
 	}
 
-	ret = onode_free_data(onode);
+	ret = onode_free_data(onode, lock);
 	if (ret != SD_RES_SUCCESS)
 		sd_err("failed to free data for %s", onode->name);
 
@@ -1057,14 +1078,14 @@ int kv_create_object(struct http_request *req, const char *account,
 	ret = onode_create(onode, bucket_vid);
 	if (ret != SD_RES_SUCCESS) {
 		sd_err("failed to create onode for %s", name);
-		onode_free_data(onode);
+		onode_free_data(onode, 1);
 		goto out;
 	}
 
 	ret = bnode_update(account, bucket, req->data_length, true);
 	if (ret != SD_RES_SUCCESS) {
 		sd_err("failed to update bucket for %s", name);
-		onode_delete(onode);
+		onode_delete(onode, 1);
 		goto out;
 	}
 out:
@@ -1098,6 +1119,39 @@ out:
 	return ret;
 }
 
+static int kv_delete_object_nolock(const char *account, const char *bucket,
+				   const char *name)
+{
+	char vdi_name[SD_MAX_VDI_LEN];
+	uint32_t bucket_vid;
+	struct kv_onode *onode = NULL;
+	int ret;
+
+	snprintf(vdi_name, SD_MAX_VDI_LEN, "%s/%s", account, bucket);
+	ret = sd_lookup_vdi(vdi_name, &bucket_vid);
+	if (ret != SD_RES_SUCCESS)
+		return ret;
+
+	onode = xzalloc(sizeof(*onode));
+	ret = onode_lookup_nolock(onode, bucket_vid, name);
+	if (ret != SD_RES_SUCCESS)
+		goto out;
+
+	ret = onode_delete(onode, 0);
+	if (ret != SD_RES_SUCCESS) {
+		sd_err("failed to delete bnode for %s", name);
+		goto out;
+	}
+	ret = bnode_update(account, bucket, onode->size, false);
+	if (ret != SD_RES_SUCCESS) {
+		sd_err("failed to update bnode for %s", name);
+		goto out;
+	}
+out:
+	free(onode);
+	return ret;
+}
+
 int kv_delete_object(const char *account, const char *bucket, const char *name)
 {
 	char vdi_name[SD_MAX_VDI_LEN];
@@ -1115,7 +1169,7 @@ int kv_delete_object(const char *account, const char *bucket, const char *name)
 	if (ret != SD_RES_SUCCESS)
 		goto out;
 
-	ret = onode_delete(onode);
+	ret = onode_delete(onode, 1);
 	if (ret != SD_RES_SUCCESS) {
 		sd_err("failed to delete bnode for %s", name);
 		goto out;
-- 
1.7.12.4




More information about the sheepdog mailing list