summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Burke <tim.burke@gmail.com>2020-04-17 10:22:43 -0700
committerTim Burke <tburke@nvidia.com>2021-02-22 03:11:06 +0000
commitac6b89d127cee903541cdec2fde7a1f9eae4eb93 (patch)
tree72a3eb054256529fc337d2a46ca2805161508b2f
parent086fce5eeec9e547cc4d90e6b83fcd25a783cfb9 (diff)
downloadswift-ac6b89d127cee903541cdec2fde7a1f9eae4eb93.tar.gz
sharding: Don't inject shard ranges when user says quit
When an operator does a `find_and_replace` on a DB that already has shard ranges, they get a prompt like: This will delete existing 58 shard ranges. Do you want to show the existing ranges [s], delete the existing ranges [yes] or quit without deleting [q]? Previously, if they selected `q`, we would skip the delete but still do the merge (!) and immediately warn about how there are now invalid shard ranges. Now, quit without merging. Cherry-Picked-From: I7d869b137a6fbade59bb8ba16e4f3e9663e18822 Change-Id: I7ee69f0ca1aeef1004e61c45eeeb98dd35fe212e
-rw-r--r--swift/cli/manage_shard_ranges.py4
-rw-r--r--test/unit/cli/test_manage_shard_ranges.py19
2 files changed, 21 insertions, 2 deletions
diff --git a/swift/cli/manage_shard_ranges.py b/swift/cli/manage_shard_ranges.py
index 667304d57..e482e7f68 100644
--- a/swift/cli/manage_shard_ranges.py
+++ b/swift/cli/manage_shard_ranges.py
@@ -343,7 +343,9 @@ def _replace_shard_ranges(broker, args, shard_data, timeout=0):
# Crank up the timeout in an effort to *make sure* this succeeds
with broker.updated_timeout(max(timeout, args.replace_timeout)):
- delete_shard_ranges(broker, args)
+ delete_status = delete_shard_ranges(broker, args)
+ if delete_status != 0:
+ return delete_status
broker.merge_shard_ranges(shard_ranges)
print('Injected %d shard ranges.' % len(shard_ranges))
diff --git a/test/unit/cli/test_manage_shard_ranges.py b/test/unit/cli/test_manage_shard_ranges.py
index 11f6420e4..65bcd0dd6 100644
--- a/test/unit/cli/test_manage_shard_ranges.py
+++ b/test/unit/cli/test_manage_shard_ranges.py
@@ -358,6 +358,23 @@ class TestManageShardRanges(unittest.TestCase):
self.assertEqual(['Loaded db broker for a/c.'],
err.getvalue().splitlines())
self._assert_enabled(broker, now)
+ found_shard_ranges = broker.get_shard_ranges()
self.assertEqual(
[(data['lower'], data['upper']) for data in self.shard_data],
- [(sr.lower_str, sr.upper_str) for sr in broker.get_shard_ranges()])
+ [(sr.lower_str, sr.upper_str) for sr in found_shard_ranges])
+
+ # Do another find & replace but quit when prompted about existing
+ # shard ranges
+ out = StringIO()
+ err = StringIO()
+ to_patch = 'swift.cli.manage_shard_ranges.input'
+ with mock.patch('sys.stdout', out), mock.patch('sys.stderr', err), \
+ mock_timestamp_now() as now, \
+ mock.patch(to_patch, return_value='q'):
+ main([broker.db_file, 'find_and_replace', '10'])
+ # Shard ranges haven't changed at all
+ self.assertEqual(found_shard_ranges, broker.get_shard_ranges())
+ expected = ['This will delete existing 10 shard ranges.']
+ self.assertEqual(expected, out.getvalue().splitlines())
+ self.assertEqual(['Loaded db broker for a/c.'],
+ err.getvalue().splitlines())