diff options
author | Tim Burke <tim.burke@gmail.com> | 2020-04-17 10:22:43 -0700 |
---|---|---|
committer | Tim Burke <tburke@nvidia.com> | 2021-02-22 03:11:06 +0000 |
commit | ac6b89d127cee903541cdec2fde7a1f9eae4eb93 (patch) | |
tree | 72a3eb054256529fc337d2a46ca2805161508b2f | |
parent | 086fce5eeec9e547cc4d90e6b83fcd25a783cfb9 (diff) | |
download | swift-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.py | 4 | ||||
-rw-r--r-- | test/unit/cli/test_manage_shard_ranges.py | 19 |
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()) |