summaryrefslogtreecommitdiff
path: root/swift/common/ring/builder.py
diff options
context:
space:
mode:
authorLisak, Peter <peter.lisak@firma.seznam.cz>2015-10-09 16:13:55 +0200
committerMatthew Oliver <matt@oliver.net.au>2016-03-10 03:54:46 +0000
commiteabe02cd717f5799e8f38389882025a70b7270f8 (patch)
tree396824f5163af436e50d49d1e728aa6ecb560fab /swift/common/ring/builder.py
parenta4c1825a026655b7ed21d779824ae7c25318fd52 (diff)
downloadswift-stable/kilo.tar.gz
swift-ring-builder can't remove a device with zero weightkilo-eolstable/kilo
If a device with 0 weight is tried to remove, the following rebalance does not write changes into builder file. Scenario: $ swift-ring-builder object.builder set_weight --id 1 0.00 $ swift-ring-builder object.builder rebalance Wait for moving files out of the device id=1. $ swift-ring-builder object.builder remove --id 1 $ swift-ring-builder object.builder rebalance In fact, the device id=1 is not removed after rebalance (must be --force used). Change-Id: Iad5a444023eae9882a3addd7f119ff4d18559ddd (cherry picked from commit 71993d84e88cc1d5f7742182905cace21c7e88cb)
Diffstat (limited to 'swift/common/ring/builder.py')
-rw-r--r--swift/common/ring/builder.py6
1 files changed, 4 insertions, 2 deletions
diff --git a/swift/common/ring/builder.py b/swift/common/ring/builder.py
index 6672fdbec..385033c0e 100644
--- a/swift/common/ring/builder.py
+++ b/swift/common/ring/builder.py
@@ -375,7 +375,7 @@ class RingBuilder(object):
self._initial_balance()
self.devs_changed = False
self._build_dispersion_graph()
- return self.parts, self.get_balance()
+ return self.parts, self.get_balance(), 0
changed_parts = 0
self._update_last_part_moves()
last_balance = 0
@@ -387,6 +387,7 @@ class RingBuilder(object):
self._set_parts_wanted()
self._reassign_parts(new_parts)
changed_parts += len(new_parts)
+ removed_devs = 0
while True:
reassign_parts = self._gather_reassign_parts()
changed_parts += len(reassign_parts)
@@ -397,6 +398,7 @@ class RingBuilder(object):
remove_dev_id = self._remove_devs.pop()['id']
self.logger.debug("Removing dev %d", remove_dev_id)
self.devs[remove_dev_id] = None
+ removed_devs += 1
balance = self.get_balance()
if balance < 1 or abs(last_balance - balance) < 1 or \
changed_parts == self.parts:
@@ -406,7 +408,7 @@ class RingBuilder(object):
self.version += 1
changed_parts = self._build_dispersion_graph(old_replica2part2dev)
- return changed_parts, balance
+ return changed_parts, balance, removed_devs
def _build_dispersion_graph(self, old_replica2part2dev=None):
"""