diff options
author | Zuul <zuul@review.opendev.org> | 2022-07-18 23:57:55 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2022-07-18 23:57:55 +0000 |
commit | c3aa1ce66c20c0c9148a4d3e22d3ff5bcd12bfdb (patch) | |
tree | a191078d3b5a4353ff2077bcbfd7afafec352ec9 /swift/container | |
parent | 45e13ff4c56748345c9d31bbee3bc6e7abdb5b43 (diff) | |
parent | 57f7145f7379de1f736ff2d904e85918c8166536 (diff) | |
download | swift-c3aa1ce66c20c0c9148a4d3e22d3ff5bcd12bfdb.tar.gz |
Merge "sharder: always set state to CLEAVED after cleaving"
Diffstat (limited to 'swift/container')
-rw-r--r-- | swift/container/sharder.py | 83 |
1 files changed, 42 insertions, 41 deletions
diff --git a/swift/container/sharder.py b/swift/container/sharder.py index 958418274..1812de74b 100644 --- a/swift/container/sharder.py +++ b/swift/container/sharder.py @@ -1660,6 +1660,7 @@ class ContainerSharder(ContainerSharderConf, ContainerReplicator): def _cleave_shard_broker(self, broker, cleaving_context, shard_range, own_shard_range, shard_broker, put_timestamp, shard_part, node_id): + result = CLEAVE_SUCCESS start = time.time() # only cleave from the retiring db - misplaced objects handler will # deal with any objects in the fresh db @@ -1685,15 +1686,9 @@ class ContainerSharder(ContainerSharderConf, ContainerReplicator): # This was just created; don't need to replicate this # SR because there was nothing there. So cleanup and # remove the shard_broker from its hand off location. - self.delete_db(shard_broker) - cleaving_context.range_done(shard_range.upper_str) - if shard_range.upper >= own_shard_range.upper: - # cleaving complete - cleaving_context.cleaving_done = True - cleaving_context.store(broker) # Because nothing was here we wont count it in the shard # batch count. - return CLEAVE_EMPTY + result = CLEAVE_EMPTY # Else, it wasn't newly created by us, and # we don't know what's in it or why. Let it get # replicated and counted in the batch count. @@ -1742,40 +1737,46 @@ class ContainerSharder(ContainerSharderConf, ContainerReplicator): shard_broker.merge_shard_ranges(shard_range) replication_quorum = self.shard_replication_quorum - self.logger.info( - 'Replicating new shard container %s for %s', - quote(shard_broker.path), own_shard_range) - - success, responses = self._replicate_object( - shard_part, shard_broker.db_file, node_id) - - replication_successes = responses.count(True) - if (not success and (not responses or - replication_successes < replication_quorum)): - # insufficient replication or replication not even attempted; - # break because we don't want to progress the cleave cursor - # until each shard range has been successfully cleaved - self.logger.warning( - 'Failed to sufficiently replicate cleaved shard %s for %s: ' - '%s successes, %s required.', shard_range, quote(broker.path), - replication_successes, replication_quorum) - self._increment_stat('cleaved', 'failure', statsd=True) - return CLEAVE_FAILED - - elapsed = round(time.time() - start, 3) - self._min_stat('cleaved', 'min_time', elapsed) - self._max_stat('cleaved', 'max_time', elapsed) - broker.merge_shard_ranges(shard_range) - cleaving_context.range_done(shard_range.upper_str) - if shard_range.upper >= own_shard_range.upper: - # cleaving complete - cleaving_context.cleaving_done = True - cleaving_context.store(broker) - self.logger.info( - 'Cleaved %s for shard range %s in %gs.', - quote(broker.path), shard_range, elapsed) - self._increment_stat('cleaved', 'success', statsd=True) - return CLEAVE_SUCCESS + if result == CLEAVE_EMPTY: + self.delete_db(shard_broker) + else: # result == CLEAVE_SUCCESS: + self.logger.info( + 'Replicating new shard container %s for %s', + quote(shard_broker.path), own_shard_range) + + success, responses = self._replicate_object( + shard_part, shard_broker.db_file, node_id) + + replication_successes = responses.count(True) + if (not success and (not responses or + replication_successes < replication_quorum)): + # insufficient replication or replication not even attempted; + # break because we don't want to progress the cleave cursor + # until each shard range has been successfully cleaved + self.logger.warning( + 'Failed to sufficiently replicate cleaved shard %s for %s:' + ' %s successes, %s required.', shard_range, + quote(broker.path), + replication_successes, replication_quorum) + self._increment_stat('cleaved', 'failure', statsd=True) + result = CLEAVE_FAILED + else: + elapsed = round(time.time() - start, 3) + self._min_stat('cleaved', 'min_time', elapsed) + self._max_stat('cleaved', 'max_time', elapsed) + self.logger.info( + 'Cleaved %s for shard range %s in %gs.', + quote(broker.path), shard_range, elapsed) + self._increment_stat('cleaved', 'success', statsd=True) + + if result in (CLEAVE_SUCCESS, CLEAVE_EMPTY): + broker.merge_shard_ranges(shard_range) + cleaving_context.range_done(shard_range.upper_str) + if shard_range.upper >= own_shard_range.upper: + # cleaving complete + cleaving_context.cleaving_done = True + cleaving_context.store(broker) + return result def _cleave_shard_range(self, broker, cleaving_context, shard_range, own_shard_range): |