Merge "sharder: If saving own_shard_range use no_default=True"

This commit is contained in:
Zuul 2021-07-16 23:47:12 +00:00 committed by Gerrit Code Review
commit 668d2c02ac
2 changed files with 64 additions and 3 deletions

View File

@ -1615,7 +1615,14 @@ class ContainerSharder(ContainerSharderConf, ContainerReplicator):
self._increment_stat('cleaved', 'failure', statsd=True)
return CLEAVE_FAILED
own_shard_range = broker.get_own_shard_range()
own_shard_range = broker.get_own_shard_range(no_default=True)
if own_shard_range is None:
# A default should never be SHRINKING or SHRUNK but because we
# may write own_shard_range back to broker, let's make sure
# it can't be defaulted.
self.logger.warning('Failed to get own_shard_range for %s',
quote(broker.path))
return CLEAVE_FAILED
# only cleave from the retiring db - misplaced objects handler will
# deal with any objects in the fresh db
@ -1833,7 +1840,14 @@ class ContainerSharder(ContainerSharderConf, ContainerReplicator):
# Move all CLEAVED shards to ACTIVE state and if a shard then
# delete own shard range; these changes will be simultaneously
# reported in the next update to the root container.
own_shard_range = broker.get_own_shard_range()
own_shard_range = broker.get_own_shard_range(no_default=True)
if own_shard_range is None:
# This is more of a belts and braces, not sure we could even
# get this far with without an own_shard_range. But because
# we will be writing own_shard_range back, we need to make sure
self.logger.warning('Failed to get own_shard_range for %s',
quote(broker.path))
return False
own_shard_range.update_meta(0, 0)
if own_shard_range.state in (ShardRange.SHRINKING,
ShardRange.SHRUNK):

View File

@ -42,7 +42,8 @@ from swift.container.sharder import ContainerSharder, sharding_enabled, \
CleavingContext, DEFAULT_SHARDER_CONF, finalize_shrinking, \
find_shrinking_candidates, process_compactible_shard_sequences, \
find_compactible_shard_sequences, is_shrinking_candidate, \
is_sharding_candidate, find_paths, rank_paths, ContainerSharderConf
is_sharding_candidate, find_paths, rank_paths, ContainerSharderConf, \
CLEAVE_FAILED
from swift.common.utils import ShardRange, Timestamp, hash_path, \
encode_timestamps, parse_db_filename, quorum_size, Everything, md5
from test import annotate_failure
@ -1667,6 +1668,27 @@ class TestSharder(BaseTestSharder):
self.assertEqual(cleaving_context.ranges_todo, 2)
self.assertFalse(cleaving_context.cleaving_done)
def test_cleave_shard_range_no_own_shard_range(self):
broker = self._make_sharding_broker()
obj = {'name': 'obj', 'created_at': next(self.ts_iter).internal,
'size': 14, 'content_type': 'text/plain', 'etag': 'an etag',
'deleted': 0}
broker.get_brokers()[0].merge_items([obj])
self.assertEqual(2, len(broker.db_files)) # sanity check
context = CleavingContext.load(broker)
shard_range = broker.get_shard_ranges()[0]
with self._mock_sharder() as sharder, mock.patch(
'swift.container.backend.ContainerBroker.get_own_shard_range',
return_value=None):
self.assertEqual(
sharder._cleave_shard_range(broker, context, shard_range),
CLEAVE_FAILED)
self.assertEqual(SHARDING, broker.get_db_state())
warning_lines = sharder.logger.get_lines_for_level('warning')
self.assertEqual(warning_lines[0],
'Failed to get own_shard_range for a/c')
def test_cleave_shard(self):
broker = self._make_broker(account='.shards_a', container='shard_c')
own_shard_range = ShardRange(
@ -2877,6 +2899,31 @@ class TestSharder(BaseTestSharder):
'.shards_', 'shard_c', (('l', 'mid'), ('mid', 'u')))
self.assertEqual(1, broker.get_own_shard_range().deleted)
def test_complete_sharding_missing_own_shard_range(self):
broker = self._make_sharding_broker()
obj = {'name': 'obj', 'created_at': next(self.ts_iter).internal,
'size': 14, 'content_type': 'text/plain', 'etag': 'an etag',
'deleted': 0}
broker.get_brokers()[0].merge_items([obj])
self.assertEqual(2, len(broker.db_files)) # sanity check
# Make cleaving context_done
context = CleavingContext.load(broker)
self.assertEqual(1, context.max_row)
context.cleave_to_row = 1 # pretend all rows have been cleaved
context.cleaving_done = True
context.misplaced_done = True
context.store(broker)
with self._mock_sharder() as sharder, mock.patch(
'swift.container.backend.ContainerBroker.get_own_shard_range',
return_value=None):
self.assertFalse(sharder._complete_sharding(broker))
self.assertEqual(SHARDING, broker.get_db_state())
warning_lines = sharder.logger.get_lines_for_level('warning')
self.assertEqual(warning_lines[0],
'Failed to get own_shard_range for a/c')
def test_sharded_record_sharding_progress_missing_contexts(self):
broker = self._check_complete_sharding(
'a', 'c', (('', 'mid'), ('mid', '')))