summaryrefslogtreecommitdiff
path: root/swift/container
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2022-07-18 23:57:55 +0000
committerGerrit Code Review <review@openstack.org>2022-07-18 23:57:55 +0000
commitc3aa1ce66c20c0c9148a4d3e22d3ff5bcd12bfdb (patch)
treea191078d3b5a4353ff2077bcbfd7afafec352ec9 /swift/container
parent45e13ff4c56748345c9d31bbee3bc6e7abdb5b43 (diff)
parent57f7145f7379de1f736ff2d904e85918c8166536 (diff)
downloadswift-c3aa1ce66c20c0c9148a4d3e22d3ff5bcd12bfdb.tar.gz
Merge "sharder: always set state to CLEAVED after cleaving"
Diffstat (limited to 'swift/container')
-rw-r--r--swift/container/sharder.py83
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):