[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:54:43 CET 2014
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