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

Hitoshi Mitake mitake.hitoshi at gmail.com
Wed Nov 26 17:32:52 CET 2014


At Wed, 26 Nov 2014 19:18:46 +0900,
Saeki Masaki wrote:
> 
> Hi, Mitake-san.
> 
> Thank you to improve the process that did not have enough of consideration.
> 
> I tried the check this patch, and node additional test.
> it's very desirable results were obtained.
> and patch looks good to me.
> 
> Then I'll shows the results.
> 
> tested procedure is below.
> #sorry for has become a different test condition,
> #but I think that it is sufficient conditions for.
> 
> 1. create 1000 snapshot
> 2. delete  999 snapshot
> 
> 3. add new node at -p 7003
>   # sheep -p 7003 -z 3 /var/lib/sheepdog/data3
> ( wait for complete recovery )
> 
> 4. test vdi list to original node
>   # dog vdi list -p 7000 -T
> ===> [test-case-1]
> 5. test vdi list to additional node
>   # dog vdi list -p 7003 -T
> ===> [test-case-2]
> 
> before patch applied
> [test-case-1]  Elapsed time: 0.083 seconds
> [test-case-2] Elapsed time: 1.134 seconds
> 
> after patch applied
> [test-case-1]  Elapsed time: 0.070seconds
> [test-case-2]  Elapsed time: 0.167 seconds
> 
> Reviewed-by: Masaki Saeki <saeki.masaki at po.ntts.co.jp>
> Tested-by: Masaki Saeki <saeki.masaki at po.ntts.co.jp>

Thanks for your review and evaluation. Applied this patch.

Thanks,
Hitoshi

> 
> Best regards,
> Saeki.
> (2014/11/26 16:54), Hitoshi Mitake wrote:
> > At Wed, 26 Nov 2014 16:53:53 +0900,
> > Hitoshi Mitake wrote:
> >>
> >> 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(-)
> >
> > Saeki-san, could you test and review the patch if you have time?
> >
> > Thanks,
> > Hitoshi
> >
> >>
> >> 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