Merge "sharder: If saving own_shard_range use no_default=True"
This commit is contained in:
		| @@ -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): | ||||
|   | ||||
| @@ -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', ''))) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zuul
					Zuul