[sheepdog] [PATCH] object cache: try to start reclaim when collie resets the max cache size

levin li levin108 at gmail.com
Mon Jul 30 11:34:01 CEST 2012


From: levin li <xingke.lwp at taobao.com>


Signed-off-by: levin li <xingke.lwp at taobao.com>
---
 sheep/object_cache.c |   28 ++++++++++++++++++++--------
 sheep/ops.c          |    2 ++
 sheep/sheep_priv.h   |    1 +
 3 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/sheep/object_cache.c b/sheep/object_cache.c
index 1febea9..2e48f2e 100644
--- a/sheep/object_cache.c
+++ b/sheep/object_cache.c
@@ -622,6 +622,25 @@ static void update_cache_entry(struct object_cache *oc, uint32_t idx,
 	pthread_rwlock_unlock(&oc->lock);
 }
 
+void object_cache_try_to_reclaim(void)
+{
+	struct work *work;
+
+	if (!sys->cache_size)
+		return;
+
+	if (uatomic_read(&sys_cache.cache_size) < sys->cache_size)
+		return;
+
+	if (cache_in_reclaim(1))
+		return;
+
+	work = xzalloc(sizeof(struct work));
+	work->fn = reclaim_work;
+	work->done = reclaim_done;
+	queue_work(sys->reclaim_wqueue, work);
+}
+
 static void add_to_object_cache(struct object_cache *oc, uint32_t idx)
 {
 	struct object_cache_entry *entry, *old;
@@ -653,14 +672,7 @@ static void add_to_object_cache(struct object_cache *oc, uint32_t idx)
 	}
 	pthread_rwlock_unlock(&oc->lock);
 
-	if (sys->cache_size &&
-	    uatomic_read(&sys_cache.cache_size) > sys->cache_size &&
-	    !cache_in_reclaim(1)) {
-		struct work *work = xzalloc(sizeof(struct work));
-		work->fn = reclaim_work;
-		work->done = reclaim_done;
-		queue_work(sys->reclaim_wqueue, work);
-	}
+	object_cache_try_to_reclaim();
 }
 
 static int object_cache_lookup(struct object_cache *oc, uint32_t idx,
diff --git a/sheep/ops.c b/sheep/ops.c
index 2869504..6c92575 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -509,6 +509,8 @@ static int local_set_cache_size(const struct sd_req *req, struct sd_rsp *rsp,
 	uatomic_set(&sys->cache_size, cache_size);
 	dprintf("Max cache size set to %dM\n", cache_size);
 
+	object_cache_try_to_reclaim();
+
 	return SD_RES_SUCCESS;
 }
 
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 2090d67..c4225ea 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -335,6 +335,7 @@ int peer_remove_obj(struct request *req);
 int bypass_object_cache(struct request *req);
 int object_is_cached(uint64_t oid);
 
+void object_cache_try_to_reclaim(void);
 int object_cache_handle_request(struct request *req);
 int object_cache_write(uint64_t oid, char *data, unsigned int datalen,
 		       uint64_t offset, uint16_t flags, int create);
-- 
1.7.1




More information about the sheepdog mailing list