glusterd: add volinfo to the list data structure in an order

Currently volinfo is added at the end of the list while creating a volume.
On gluster restart, readdir will not provide the ordered list and the data
is populated in the same order as readdir.

Solution is to insert the volinfo to the list in an order

Change-Id: I1716ac6abbd7dd301a7125425fc413c6833f7a48
BUG: 1039912
Signed-off-by: Vijaykumar M <vmallika@redhat.com>
Reviewed-on: http://review.gluster.org/6472
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Kaushal M <kaushal@redhat.com>
This commit is contained in:
Vijaykumar M 2014-01-03 12:11:19 +05:30 committed by Anand Avati
parent 8b5b2bfcda
commit 1e26f070bb
5 changed files with 34 additions and 3 deletions

View File

@ -45,6 +45,21 @@ list_add_tail (struct list_head *new, struct list_head *head)
}
static inline void
list_add_order (struct list_head *new, struct list_head *head,
int (*compare)(struct list_head *, struct list_head *))
{
struct list_head *pos = head->next;
while ( pos != head ) {
if (compare(new, pos) <= 0)
break;
pos = pos->next;
}
list_add_tail(new, pos);
}
static inline void
list_del (struct list_head *old)
{

View File

@ -2085,7 +2085,8 @@ glusterd_store_retrieve_volume (char *volname)
goto out;
list_add_tail (&volinfo->vol_list, &priv->volumes);
list_add_order (&volinfo->vol_list, &priv->volumes,
glusterd_compare_volume_name);
out:
gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret);

View File

@ -3529,7 +3529,8 @@ glusterd_import_friend_volume (dict_t *vols, size_t count)
if (ret)
goto out;
list_add_tail (&new_volinfo->vol_list, &priv->volumes);
list_add_order (&new_volinfo->vol_list, &priv->volumes,
glusterd_compare_volume_name);
out:
gf_log ("", GF_LOG_DEBUG, "Returning with ret: %d", ret);
return ret;
@ -9337,3 +9338,13 @@ glusterd_rpc_clnt_unref (glusterd_conf_t *conf, rpc_clnt_t *rpc)
return ret;
}
int32_t
glusterd_compare_volume_name(struct list_head *list1, struct list_head *list2)
{
glusterd_volinfo_t *volinfo1 = NULL;
glusterd_volinfo_t *volinfo2 = NULL;
volinfo1 = list_entry(list1, glusterd_volinfo_t, vol_list);
volinfo2 = list_entry(list2, glusterd_volinfo_t, vol_list);
return strcmp(volinfo1->volname, volinfo2->volname);
}

View File

@ -644,4 +644,7 @@ gd_stop_rebalance_process (glusterd_volinfo_t *volinfo);
rpc_clnt_t *
glusterd_rpc_clnt_unref (glusterd_conf_t *conf, rpc_clnt_t *rpc);
int32_t
glusterd_compare_volume_name(struct list_head *, struct list_head *);
#endif

View File

@ -1708,7 +1708,8 @@ glusterd_op_create_volume (dict_t *dict, char **op_errstr)
}
volinfo->rebal.defrag_status = 0;
list_add_tail (&volinfo->vol_list, &priv->volumes);
list_add_order (&volinfo->vol_list, &priv->volumes,
glusterd_compare_volume_name);
vol_added = _gf_true;
out: