[sheepdog] [PATCH] sheep: propagate deletion information via SD_OP_GET_VDI_COPIES

Hitoshi Mitake mitake.hitoshi at lab.ntt.co.jp
Wed Nov 26 08:53:53 CET 2014


The commit f68feab7edc0de introduced significant optimization for dog
vdi list. But the deleted vid bitmap cannot be copied to newly joining
sheep. This patch let new sheeps copy the information via
SD_OP_GET_VDI_COPIES during joining process.

Cc: Masaki Saeki <saeki.masaki at po.ntts.co.jp>
Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
 include/internal_proto.h |  1 +
 sheep/group.c            |  2 ++
 sheep/ops.c              |  4 +++-
 sheep/sheep_priv.h       |  1 +
 sheep/vdi.c              | 18 ++++++++++++++++++
 5 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/include/internal_proto.h b/include/internal_proto.h
index faed3f6..ad2f3ed 100644
--- a/include/internal_proto.h
+++ b/include/internal_proto.h
@@ -353,6 +353,7 @@ struct vdi_state {
 	uint32_t vid;
 	uint8_t nr_copies;
 	uint8_t snapshot;
+	uint8_t deleted;
 	uint8_t copy_policy;
 
 	uint32_t lock_state;
diff --git a/sheep/group.c b/sheep/group.c
index a45904e..2b98a9b 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -507,6 +507,8 @@ retry:
 	count = rsp->data_length / sizeof(*vs);
 	for (i = 0; i < count; i++) {
 		atomic_set_bit(vs[i].vid, sys->vdi_inuse);
+		if (vs[i].deleted)
+			atomic_set_bit(vs[i].vid, sys->vdi_deleted);
 		add_vdi_state(vs[i].vid, vs[i].nr_copies, vs[i].snapshot,
 			      vs[i].copy_policy);
 	}
diff --git a/sheep/ops.c b/sheep/ops.c
index 4b54780..e645e04 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -188,8 +188,10 @@ static int post_cluster_del_vdi(const struct sd_req *req, struct sd_rsp *rsp,
 	struct cache_deletion_work *dw;
 	int ret = rsp->result;
 
-	if (ret == SD_RES_SUCCESS)
+	if (ret == SD_RES_SUCCESS) {
 		atomic_set_bit(vid, sys->vdi_deleted);
+		vdi_mark_deleted(vid);
+	}
 
 	if (!sys->enable_object_cache)
 		return ret;
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 3e6adc2..5fc6b90 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -333,6 +333,7 @@ int vdi_exist(uint32_t vid);
 int vdi_create(const struct vdi_iocb *iocb, uint32_t *new_vid);
 int vdi_snapshot(const struct vdi_iocb *iocb, uint32_t *new_vid);
 int vdi_delete(const struct vdi_iocb *iocb, struct request *req);
+void vdi_mark_deleted(uint32_t vid);
 int vdi_lookup(const struct vdi_iocb *iocb, struct vdi_info *info);
 void clean_vdi_state(void);
 int sd_delete_vdi(const char *name);
diff --git a/sheep/vdi.c b/sheep/vdi.c
index b03421a..1c8fb36 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -15,6 +15,7 @@ struct vdi_state_entry {
 	uint32_t vid;
 	unsigned int nr_copies;
 	bool snapshot;
+	bool deleted;
 	uint8_t copy_policy;
 	struct rb_node node;
 
@@ -248,6 +249,7 @@ static struct vdi_state *fill_vdi_state_list_with_alloc(int *result_nr)
 		vs[i].vid = entry->vid;
 		vs[i].nr_copies = entry->nr_copies;
 		vs[i].snapshot = entry->snapshot;
+		vs[i].deleted = entry->deleted;
 		vs[i].copy_policy = entry->copy_policy;
 		vs[i].lock_state = entry->lock_state;
 		vs[i].lock_owner = entry->owner;
@@ -1576,6 +1578,22 @@ out:
 	return ret;
 }
 
+void vdi_mark_deleted(uint32_t vid)
+{
+	struct vdi_state_entry *entry;
+
+	sd_write_lock(&vdi_state_lock);
+	entry = vdi_state_search(&vdi_state_root, vid);
+	if (!entry) {
+		sd_err("VID: %"PRIx32" not found", vid);
+		goto out;
+	}
+
+	entry->deleted = true;
+out:
+	sd_rw_unlock(&vdi_state_lock);
+}
+
 /* Calculate a vdi attribute id from sheepdog_vdi_attr. */
 static uint32_t hash_vdi_attr(const struct sheepdog_vdi_attr *attr)
 {
-- 
1.8.3.2




More information about the sheepdog mailing list