[sheepdog] [PATCH v2 7/6] object cache: clean up object_cache_pull()

Liu Yuan namei.unix at gmail.com
Tue Jan 22 03:56:30 CET 2013


From: Liu Yuan <tailai.ly at taobao.com>

Also Set cache high watermark as 90% to be large cache friendly.

Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
 sheep/object_cache.c |   71 +++++++++++++++++++++++---------------------------
 1 file changed, 33 insertions(+), 38 deletions(-)

diff --git a/sheep/object_cache.c b/sheep/object_cache.c
index a4b06e2..82759be 100644
--- a/sheep/object_cache.c
+++ b/sheep/object_cache.c
@@ -22,7 +22,6 @@
 #include <sys/file.h>
 #include <dirent.h>
 #include <urcu/uatomic.h>
-#include <urcu/rculist.h>
 
 #include "sheep_priv.h"
 #include "util.h"
@@ -414,7 +413,12 @@ out:
  *  - skip the dirty object if it is not in push(writeback) phase.
  *  - wait on the dirty object if it is in push phase.
  */
-#define HIGH_WATERMARK (sys->object_cache_size * 8 / 10)
+
+/*
+ * 90% is targeted for a large cache quota such as 200G, then we have 20G
+ * buffer which is large enough to prevent cache overrun.
+ */
+#define HIGH_WATERMARK (sys->object_cache_size * 9 / 10)
 static void do_reclaim_object(struct object_cache *oc)
 {
 	struct object_cache_entry *entry, *t;
@@ -717,54 +721,45 @@ static int object_cache_pull(struct object_cache *oc, uint32_t idx)
 	struct sd_req hdr;
 	struct sd_rsp *rsp = (struct sd_rsp *)&hdr;
 	int ret = SD_RES_NO_MEM;
-	uint64_t oid;
-	uint32_t data_length;
+	uint64_t oid = idx_to_oid(oc->vid, idx);
+	uint32_t data_length = get_objsize(oid);
 	void *buf;
 
-	if (idx_has_vdi_bit(idx)) {
-		oid = vid_to_vdi_oid(oc->vid);
-		data_length = SD_INODE_SIZE;
-	} else {
-		oid = vid_to_data_oid(oc->vid, idx);
-		data_length = SD_DATA_OBJ_SIZE;
-	}
-
 	buf = valloc(data_length);
-	if (buf == NULL) {
-		eprintf("failed to allocate memory\n");
-		goto out;
-	}
+	if (!buf)
+		panic("%m\n");
 
 	sd_init_req(&hdr, SD_OP_READ_OBJ);
 	hdr.data_length = data_length;
 	hdr.obj.oid = oid;
 	hdr.obj.offset = 0;
 	ret = exec_local_req(&hdr, buf);
+	if (ret != SD_RES_SUCCESS)
+		goto err;
 
-	if (ret == SD_RES_SUCCESS) {
-		dprintf("oid %"PRIx64" pulled successfully\n", oid);
-
-		ret = create_cache_object(oc, idx, buf, rsp->data_length,
-					  rsp->obj.offset, data_length);
-		/*
-		 * We try to delay reclaim objects to avoid object ping-pong
-		 * because the pulled object is clean and likely to be reclaimed
-		 * in a cache over high watermark. We can't simply pass without
-		 * waking up reclaimer because the cache is easy to be filled
-		 * full with a read storm.
-		 */
-		switch (ret) {
-		case SD_RES_SUCCESS:
-			add_to_lru_cache(oc, idx, false);
-			object_cache_try_to_reclaim(1);
-			break;
-		case SD_RES_OID_EXIST:
-			ret = SD_RES_SUCCESS;
-			break;
-		}
+	dprintf("oid %"PRIx64" pulled successfully\n", oid);
+	ret = create_cache_object(oc, idx, buf, rsp->data_length,
+				  rsp->obj.offset, data_length);
+	/*
+	 * We try to delay reclaim objects to avoid object ping-pong
+	 * because the pulled object is clean and likely to be reclaimed
+	 * in a cache over high watermark. We can't simply pass without
+	 * waking up reclaimer because the cache is easy to be filled
+	 * full with a read storm.
+	 */
+	switch (ret) {
+	case SD_RES_SUCCESS:
+		add_to_lru_cache(oc, idx, false);
+		object_cache_try_to_reclaim(1);
+		break;
+	case SD_RES_OID_EXIST:
+		ret = SD_RES_SUCCESS;
+		break;
+	default:
+		break;
 	}
+err:
 	free(buf);
-out:
 	return ret;
 }
 
-- 
1.7.9.5




More information about the sheepdog mailing list