diff options
Diffstat (limited to 'xlators/cluster')
-rw-r--r-- | xlators/cluster/dht/src/tier.c | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/xlators/cluster/dht/src/tier.c b/xlators/cluster/dht/src/tier.c index 2b3838ff5f6..7be5c4a2b81 100644 --- a/xlators/cluster/dht/src/tier.c +++ b/xlators/cluster/dht/src/tier.c @@ -31,6 +31,9 @@ static gfdb_methods_t gfdb_methods; #define DB_QUERY_RECORD_SIZE 4096 +/* Check and update the watermark every WM_INTERVAL seconds */ +#define WM_INTERVAL 5 + static int tier_check_same_node (xlator_t *this, loc_t *loc, gf_defrag_info_t *defrag) { @@ -376,6 +379,21 @@ tier_migrate_using_query_file (void *_args) if (!tier_do_migration (this, query_cbk_args->is_promotion, &root_loc)) { gfdb_methods.gfdb_query_record_free (query_record); query_record = NULL; + + /* We have crossed the high watermark. Stop processing + * files if this is a promotion cycle so demotion gets + * a chance to start if not already running*/ + + if (query_cbk_args->is_promotion && + defrag->tier_conf.mode == TIER_WM_HI) { + + gf_msg (this->name, GF_LOG_INFO, 0, + DHT_MSG_LOG_TIER_STATUS, + "High watermark crossed during " + "promotion. Exiting " + "tier_migrate_using_query_file"); + break; + } continue; } @@ -466,8 +484,6 @@ tier_migrate_using_query_file (void *_args) p_loc.inode = linked_inode; - - /* Preparing File Inode */ gf_uuid_copy (loc.gfid, query_record->gfid); loc.inode = inode_new (defrag->root_inode->table); @@ -1428,6 +1444,8 @@ tier_start (xlator_t *this, gf_defrag_info_t *defrag) xlator_t *xlator = NULL; gf_tier_conf_t *tier_conf = NULL; loc_t root_loc = { 0 }; + int check_watermark = 0; + conf = this->private; @@ -1507,6 +1525,19 @@ tier_start (xlator_t *this, gf_defrag_info_t *defrag) goto out; } + check_watermark++; + + if (check_watermark >= WM_INTERVAL) { + check_watermark = 0; + ret = tier_check_watermark (this, &root_loc); + if (ret != 0) { + gf_msg (this->name, GF_LOG_CRITICAL, errno, + DHT_MSG_LOG_TIER_ERROR, + "Failed to get watermark"); + continue; + } + } + freq_demote = tier_get_freq_demote (tier_conf); is_demotion_triggered = (is_hot_list_empty) ? _gf_false : @@ -1523,13 +1554,9 @@ tier_start (xlator_t *this, gf_defrag_info_t *defrag) if (!is_promotion_triggered && !is_demotion_triggered) continue; - ret = tier_check_watermark (this, &root_loc); - if (ret != 0) { - gf_msg (this->name, GF_LOG_CRITICAL, errno, - DHT_MSG_LOG_TIER_ERROR, - "Failed to get watermark"); - goto out; - } + /* Check the statfs immediately after the processing threads + return */ + check_watermark = WM_INTERVAL; ret_promotion = -1; ret_demotion = -1; |