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  | 
