diff options
| author | Dan Lambright <dlambrig@redhat.com> | 2015-12-28 10:13:30 -0500 | 
|---|---|---|
| committer | Dan Lambright <dlambrig@redhat.com> | 2016-01-05 04:25:30 -0800 | 
| commit | 57ef73821c8062e1503926751fd72bdad7506c86 (patch) | |
| tree | 55999799df452cfef5b3017014fb6ad4d1eb33c7 | |
| parent | 50d14b2aec654eaf95a467bc12a8c6fd396cfb0a (diff) | |
cluster/tier: check watermark during migration
Currently we check the watermarks only before a cycle
begins. We should also check the hot tier's fullness
against the watermarks during the migration so the watermark
is not exceeded as files are promoted.
Change-Id: I2ff87a1c308d64fbdca14bbdf55f3ec3007290ae
BUG: 1293932
Signed-off-by: Dan Lambright <dlambrig@redhat.com>
Reviewed-on: http://review.gluster.org/13103
Reviewed-by: Joseph Fernandes
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: N Balachandran <nbalacha@redhat.com>
| -rw-r--r-- | xlators/cluster/dht/src/tier.c | 103 | 
1 files changed, 57 insertions, 46 deletions
diff --git a/xlators/cluster/dht/src/tier.c b/xlators/cluster/dht/src/tier.c index 50cbc509e6f..eef9ae10ab6 100644 --- a/xlators/cluster/dht/src/tier.c +++ b/xlators/cluster/dht/src/tier.c @@ -79,51 +79,6 @@ out:  }  int -tier_do_migration (xlator_t *this, int promote) -{ -        gf_defrag_info_t       *defrag = NULL; -        dht_conf_t             *conf   = NULL; -        long                    rand = 0; -        int                     migrate = 0; -        gf_tier_conf_t         *tier_conf = NULL; - -        conf = this->private; -        if (!conf) -                goto exit; - -        defrag = conf->defrag; -        if (!defrag) -                goto exit; - -        if (defrag->tier_conf.mode != TIER_MODE_WM) { -                migrate = 1; -                goto exit; -        } - -        tier_conf = &defrag->tier_conf; - -        switch (tier_conf->watermark_last) { -        case TIER_WM_LOW: -                migrate = promote ? 1 : 0; -                break; -        case TIER_WM_HI: -                migrate = promote ? 0 : 1; -                break; -        case TIER_WM_MID: -                rand = random() % 100; -                if (promote) { -                        migrate = (rand > tier_conf->percent_full); -                } else { -                        migrate = (rand <= tier_conf->percent_full); -                } -                break; -        } - -exit: -        return migrate; -} - -int  tier_check_watermark (xlator_t *this, loc_t *root_loc)  {          tier_watermark_op_t     wm = TIER_WM_NONE; @@ -152,6 +107,7 @@ tier_check_watermark (xlator_t *this, loc_t *root_loc)          /* Find how much free space is on the hot subvolume. Then see if that value */          /* is less than or greater than user defined watermarks. Stash results in */          /* the tier_conf data structure. */ +          ret = syncop_statfs (conf->subvolumes[1], root_loc, &statfs,                               xdata, NULL);          if (ret) { @@ -192,6 +148,59 @@ exit:          return ret;  } +int +tier_do_migration (xlator_t *this, int promote, loc_t *root_loc) +{ +        gf_defrag_info_t       *defrag = NULL; +        dht_conf_t             *conf   = NULL; +        long                    rand = 0; +        int                     migrate = 0; +        gf_tier_conf_t         *tier_conf = NULL; + +        conf = this->private; +        if (!conf) +                goto exit; + +        defrag = conf->defrag; +        if (!defrag) +                goto exit; + +        if (defrag->tier_conf.mode != TIER_MODE_WM) { +                migrate = 1; +                goto exit; +        } + +        if (tier_check_watermark (this, root_loc) != 0) { +                gf_msg (this->name, GF_LOG_CRITICAL, errno, +                        DHT_MSG_LOG_TIER_ERROR, +                        "Failed to get watermark"); +                goto exit; +        } + +        tier_conf = &defrag->tier_conf; + +        switch (tier_conf->watermark_last) { +        case TIER_WM_LOW: +                migrate = promote ? 1 : 0; +                break; +        case TIER_WM_HI: +                migrate = promote ? 0 : 1; +                break; +        case TIER_WM_MID: +                rand = random() % 100; +                if (promote) { +                        migrate = (rand > tier_conf->percent_full); +                } else { +                        migrate = (rand <= tier_conf->percent_full); +                } +                break; +        } + +exit: +        return migrate; +} + +  static int  tier_migrate_using_query_file (void *_args)  { @@ -224,6 +233,7 @@ tier_migrate_using_query_file (void *_args)          dht_conf_t   *conf                      = NULL;          uint64_t total_migrated_bytes           = 0;          int total_files                         = 0; +        loc_t root_loc                          = { 0 };          GF_VALIDATE_OR_GOTO ("tier", query_cbk_args, out);          GF_VALIDATE_OR_GOTO ("tier", query_cbk_args->this, out); @@ -259,6 +269,7 @@ tier_migrate_using_query_file (void *_args)                  goto out;          } +        dht_build_root_loc (defrag->root_inode, &root_loc);          /* Per file */          while ((ret = gfdb_methods.gfdb_read_query_record @@ -287,7 +298,7 @@ tier_migrate_using_query_file (void *_args)                          break;                  } -                if (!tier_do_migration (this, query_cbk_args->is_promotion)) { +                if (!tier_do_migration (this, query_cbk_args->is_promotion, &root_loc)) {                          gfdb_methods.gfdb_query_record_free (query_record);                          query_record = NULL;                          continue;  | 
