When a node leaves from sheepdog cluster, it should be removed from a list of participants of shared VDI.
Signed-off-by: Hitoshi Mitake <mitake.hito...@lab.ntt.co.jp> --- sheep/group.c | 2 ++ sheep/sheep_priv.h | 1 + sheep/vdi.c | 23 +++++++++++++++++++---- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/sheep/group.c b/sheep/group.c index 39309eb..cdd44d4 100644 --- a/sheep/group.c +++ b/sheep/group.c @@ -1159,6 +1159,8 @@ main_fn void sd_leave_handler(const struct sd_node *left, put_vnode_info(old_vnode_info); sockfd_cache_del_node(&left->nid); + + remove_node_from_participants(&left->nid); } static void update_node_size(struct sd_node *node) diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h index 94a3a4f..26465ab 100644 --- a/sheep/sheep_priv.h +++ b/sheep/sheep_priv.h @@ -352,6 +352,7 @@ void validate_myself(uint32_t vid); void invalidate_other_nodes(uint32_t vid); int inode_coherence_update(uint32_t vid, bool validate, const struct node_id *sender); +void remove_node_from_participants(const struct node_id *left); extern int ec_max_data_strip; diff --git a/sheep/vdi.c b/sheep/vdi.c index b8212d9..8872f91 100644 --- a/sheep/vdi.c +++ b/sheep/vdi.c @@ -386,7 +386,7 @@ static bool add_new_participant(struct vdi_state_entry *entry, } static void del_participant(struct vdi_state_entry *entry, - const struct node_id *owner) + const struct node_id *owner, bool err_msg) { int idx = -1; @@ -400,7 +400,10 @@ static void del_participant(struct vdi_state_entry *entry, } if (idx == -1) { - sd_err("unknown participants: %s", node_id_to_str(owner)); + if (err_msg) + sd_err("unknown participants: %s", + node_id_to_str(owner)); + return; } @@ -515,7 +518,7 @@ bool vdi_unlock(uint32_t vid, const struct node_id *owner, int type) sd_alert("leaving from unlocked VDI: %"PRIx32, vid); break; case LOCK_STATE_SHARED: - del_participant(entry, owner); + del_participant(entry, owner, true); ret = true; break; case LOCK_STATE_LOCKED: @@ -572,7 +575,7 @@ static void apply_vdi_lock_state_shared(uint32_t vid, bool lock, if (lock) add_new_participant(entry, locker); else - del_participant(entry, locker); + del_participant(entry, locker, true); out: sd_rw_unlock(&vdi_state_lock); @@ -813,6 +816,18 @@ main_fn int inode_coherence_update(uint32_t vid, bool validate, return SD_RES_SUCCESS; } +main_fn void remove_node_from_participants(const struct node_id *left) +{ + struct vdi_state_entry *entry; + + sd_write_lock(&vdi_state_lock); + rb_for_each_entry(entry, &vdi_state_root, node) { + del_participant(entry, left, false); + } + sd_rw_unlock(&vdi_state_lock); + +} + static struct sd_inode *alloc_inode(const struct vdi_iocb *iocb, uint32_t new_snapid, uint32_t new_vid, uint32_t *data_vdi_id, -- 1.8.3.2 -- sheepdog mailing list sheepdog@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog