diff options
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 10 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 1 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-helper.c | 12 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-mem-types.h | 1 |
4 files changed, 20 insertions, 4 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 8fa93fa076b..cd2985002b2 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -4992,6 +4992,11 @@ dht_init_subvolumes (xlator_t *this, dht_conf_t *conf) return -1; } + conf->subvol_up_time = GF_CALLOC (cnt, sizeof (time_t), + gf_dht_mt_subvol_time); + if (!conf->subvol_up_time) { + return -1; + } return 0; } @@ -5008,7 +5013,7 @@ dht_notify (xlator_t *this, int event, void *data, ...) int had_heard_from_all = 0; int have_heard_from_all = 0; - + struct timeval time = {0,}; conf = this->private; if (!conf) @@ -5042,10 +5047,12 @@ dht_notify (xlator_t *this, int event, void *data, ...) break; } + gettimeofday (&time, NULL); LOCK (&conf->subvolume_lock); { conf->subvolume_status[cnt] = 1; conf->last_event[cnt] = event; + conf->subvol_up_time[cnt] = time.tv_sec; } UNLOCK (&conf->subvolume_lock); @@ -5089,6 +5096,7 @@ dht_notify (xlator_t *this, int event, void *data, ...) { conf->subvolume_status[cnt] = 0; conf->last_event[cnt] = event; + conf->subvol_up_time[cnt] = 0; } UNLOCK (&conf->subvolume_lock); diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 99b626c1695..95c20af1fe2 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -170,6 +170,7 @@ struct dht_conf { gf_boolean_t use_readdirp; char vol_uuid[UUID_SIZE + 1]; gf_boolean_t assert_no_child_down; + time_t *subvol_up_time; }; typedef struct dht_conf dht_conf_t; diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c index cd57b9ea083..42c6d025fc5 100644 --- a/xlators/cluster/dht/src/dht-helper.c +++ b/xlators/cluster/dht/src/dht-helper.c @@ -268,6 +268,7 @@ dht_first_up_subvol (xlator_t *this) dht_conf_t *conf = NULL; xlator_t *child = NULL; int i = 0; + time_t time = 0; conf = this->private; if (!conf) @@ -276,9 +277,14 @@ dht_first_up_subvol (xlator_t *this) LOCK (&conf->subvolume_lock); { for (i = 0; i < conf->subvolume_cnt; i++) { - if (conf->subvolume_status[i]) { - child = conf->subvolumes[i]; - break; + if (conf->subvol_up_time[i]) { + if (!time) { + time = conf->subvol_up_time[i]; + child = conf->subvolumes[i]; + } else if (time > conf->subvol_up_time[i]) { + time = conf->subvol_up_time[i]; + child = conf->subvolumes[i]; + } } } } diff --git a/xlators/cluster/dht/src/dht-mem-types.h b/xlators/cluster/dht/src/dht-mem-types.h index af31c8b0724..38bd3de1581 100644 --- a/xlators/cluster/dht/src/dht-mem-types.h +++ b/xlators/cluster/dht/src/dht-mem-types.h @@ -35,6 +35,7 @@ enum gf_dht_mem_types_ { gf_switch_mt_dht_du_t, gf_switch_mt_switch_sched_array, gf_switch_mt_switch_struct, + gf_dht_mt_subvol_time, gf_dht_mt_end }; #endif |