summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/dht/src/tier.c
diff options
context:
space:
mode:
authorDan Lambright <dlambrig@redhat.com>2015-10-05 19:52:02 +0000
committerDan Lambright <dlambrig@redhat.com>2015-10-21 19:46:18 -0700
commite851ecbb12647f3e66f6d4c1ebdb0741eb3a3d2c (patch)
tree5285a38c8c8d1a9e7cb83b251de637f8c431c1aa /xlators/cluster/dht/src/tier.c
parent6c6b4bb361fb6fa3adc69e43d185c755b2f4c771 (diff)
cluster/tier: add pause tier for snapshots
This is a backport of 12304 Snaps of tiered volumes cannot handle files undergoing migration. We implement a helper mechanism to "pause" migration. Any files undergoing migration are aborted. Clean up is done to remove sticky bits and data at the destination. Migration is restarted after snap completes. For testing an internal switch is added. It is not exposed externally. gluster volume set vol1 tier-pause [true|false] > Change-Id: Ia85bbf89ac142e9b7e73fcbef98bb9da86097799 > BUG: 1267950 > Signed-off-by: Dan Lambright <dlambrig@redhat.com> > Reviewed-on: http://review.gluster.org/12304 > Reviewed-by: N Balachandran <nbalacha@redhat.com> > Tested-by: NetBSD Build System <jenkins@build.gluster.org> > Tested-by: Gluster Build System <jenkins@build.gluster.com> Signed-off-by: Dan Lambright <dlambrig@redhat.com> Conflicts: xlators/mgmt/glusterd/src/glusterd-messages.h Change-Id: I5f039d8d38a4c915bd873969f336b96755a0b8f1 BUG: 1274101 Reviewed-on: http://review.gluster.org/12411 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Dan Lambright <dlambrig@redhat.com> Tested-by: Dan Lambright <dlambrig@redhat.com>
Diffstat (limited to 'xlators/cluster/dht/src/tier.c')
-rw-r--r--xlators/cluster/dht/src/tier.c68
1 files changed, 67 insertions, 1 deletions
diff --git a/xlators/cluster/dht/src/tier.c b/xlators/cluster/dht/src/tier.c
index efdc57fe644..ecb8709547c 100644
--- a/xlators/cluster/dht/src/tier.c
+++ b/xlators/cluster/dht/src/tier.c
@@ -311,6 +311,13 @@ tier_migrate_using_query_file (void *_args)
per_file_status = 0;
per_link_status = 0;
+ if (defrag->tier_conf.request_pause) {
+ gf_msg (this->name, GF_LOG_INFO, 0,
+ DHT_MSG_LOG_TIER_STATUS,
+ "Tiering paused. Exiting tier_migrate_using_query_file");
+ break;
+ }
+
memset (gfid_str, 0, UUID_CANONICAL_FORM_LEN+1);
memset (query_record->_link_info_str, 0, DB_QUERY_RECORD_SIZE);
@@ -372,6 +379,14 @@ tier_migrate_using_query_file (void *_args)
/* Per link of file */
while (token_str != NULL) {
+ if (defrag->tier_conf.request_pause) {
+ gf_msg (this->name, GF_LOG_INFO, 0,
+ DHT_MSG_LOG_TIER_STATUS,
+ "Tiering paused. "
+ "Exiting tier_migrate_using_query_file");
+ goto abort;
+ }
+
link_str = gf_strdup (token_str);
if (!link_info) {
@@ -489,6 +504,14 @@ tier_migrate_using_query_file (void *_args)
gf_uuid_copy (loc.gfid, loc.inode->gfid);
+ if (defrag->tier_conf.request_pause) {
+ gf_msg (this->name, GF_LOG_INFO, 0,
+ DHT_MSG_LOG_TIER_STATUS,
+ "Tiering paused. "
+ "Exiting tier_migrate_using_query_file");
+ goto abort;
+ }
+
ret = syncop_setxattr (this, &loc, migrate_data, 0,
NULL, NULL);
if (ret) {
@@ -1348,6 +1371,11 @@ tier_start (xlator_t *this, gf_defrag_info_t *defrag)
goto out;
}
+ if (defrag->tier_conf.request_pause)
+ defrag->tier_conf.paused = _gf_true;
+ else
+ defrag->tier_conf.paused = _gf_false;
+
sleep(1);
if (defrag->defrag_status != GF_DEFRAG_STATUS_STARTED) {
@@ -1370,6 +1398,11 @@ tier_start (xlator_t *this, gf_defrag_info_t *defrag)
goto out;
}
+ if ((defrag->tier_conf.paused) ||
+ (defrag->tier_conf.request_pause))
+ continue;
+
+
/* To have proper synchronization amongst all
* brick holding nodes, so that promotion and demotions
* start atomicly w.r.t promotion/demotion frequency
@@ -1660,6 +1693,7 @@ tier_init (xlator_t *this)
gf_defrag_info_t *defrag = NULL;
char *voldir = NULL;
char *mode = NULL;
+ char *paused = NULL;
ret = dht_init (this);
if (ret) {
@@ -1778,7 +1812,15 @@ tier_init (xlator_t *this)
defrag->tier_conf.mode = ret;
}
- ret = gf_asprintf (&voldir, "%s/%s",
+ defrag->tier_conf.request_pause = 0;
+
+ ret = dict_get_str (this->options,
+ "tier-pause", &paused);
+
+ if (paused && strcmp (paused, "on") == 0)
+ defrag->tier_conf.request_pause = 1;
+
+ ret = gf_asprintf(&voldir, "%s/%s",
DEFAULT_VAR_RUN_DIRECTORY,
this->name);
if (ret < 0)
@@ -1846,6 +1888,9 @@ tier_reconfigure (xlator_t *this, dict_t *options)
gf_defrag_info_t *defrag = NULL;
char *mode = NULL;
int migrate_mb = 0;
+ gf_boolean_t req_pause = _gf_false;
+ int ret = 0;
+
conf = this->private;
if (conf->defrag) {
@@ -1887,6 +1932,27 @@ tier_reconfigure (xlator_t *this, dict_t *options)
GF_OPTION_RECONF ("tier-max-files",
defrag->tier_conf.max_migrate_files, options,
int32, out);
+
+ GF_OPTION_RECONF ("tier-pause",
+ req_pause, options,
+ bool, out);
+
+ if (req_pause == _gf_true) {
+ ret = gf_defrag_pause_tier (this, defrag);
+ if (ret) {
+ gf_msg (this->name, GF_LOG_ERROR, 0,
+ DHT_MSG_LOG_TIER_ERROR,
+ "pause tier failed on reconfigure");
+ }
+ } else {
+ ret = gf_defrag_resume_tier (this, defrag);
+ if (ret) {
+ gf_msg (this->name, GF_LOG_ERROR, 0,
+ DHT_MSG_LOG_TIER_ERROR,
+ "resume tier failed on reconfigure");
+ }
+ }
+
}
out: