[Sheepdog] [PATCH 3/7] sheep: limit the number of object maps

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Thu Aug 4 10:40:57 CEST 2011


The object map is used when checking the consistency of data objects.
This patch limits the number of the maps and save the consumption of a
memory.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 sheep/sdnet.c      |   17 ++++++++++++++---
 sheep/sheep_priv.h |    2 ++
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/sheep/sdnet.c b/sheep/sdnet.c
index 7c588cb..a40694d 100644
--- a/sheep/sdnet.c
+++ b/sheep/sdnet.c
@@ -143,11 +143,15 @@ static void __done(struct work *work, int idx)
 		} else if (req->rp.result == SD_RES_SUCCESS && req->check_consistency) {
 			struct sd_obj_req *obj_hdr = (struct sd_obj_req *)&req->rq;
 			uint32_t vdi_id = oid_to_vid(obj_hdr->oid);
-			struct data_object_bmap *bmap;
+			struct data_object_bmap *bmap, *n;
+			int nr_bmaps = 0;
 
-			list_for_each_entry(bmap, &sys->consistent_obj_list, list) {
+			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(obj_hdr->oid), bmap->dobjs);
+					list_del(&bmap->list);
+					list_add_tail(&bmap->list, &sys->consistent_obj_list);
 					goto done;
 				}
 			}
@@ -158,8 +162,15 @@ static void __done(struct work *work, int idx)
 			}
 			dprintf("allocate a new object map\n");
 			bmap->vdi_id = vdi_id;
-			list_add(&bmap->list, &sys->consistent_obj_list);
+			list_add_tail(&bmap->list, &sys->consistent_obj_list);
 			set_bit(data_oid_to_idx(obj_hdr->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);
+			}
 		} else if (is_access_local(req->entry, req->nr_vnodes,
 					   ((struct sd_obj_req *)&req->rq)->oid, copies) &&
 			   req->rp.result == SD_RES_EIO) {
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 67c651b..74741fa 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -90,6 +90,8 @@ struct request {
 	struct work work;
 };
 
+#define MAX_DATA_OBJECT_BMAPS 64
+
 struct data_object_bmap {
 	uint32_t vdi_id;
 	DECLARE_BITMAP(dobjs, MAX_DATA_OBJS);
-- 
1.7.2.5




More information about the sheepdog mailing list