summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClay Gerrard <clay.gerrard@gmail.com>2015-01-27 10:19:41 -0800
committerClay Gerrard <clay.gerrard@gmail.com>2015-01-27 10:19:41 -0800
commit376dc5adc381f769091f29c75d9b26493383bac6 (patch)
tree6edb634c1660f303ebb84173f71b6931d1c6ede1
parentecf4d057b30befbc8d6bd48a311ebc67d4278648 (diff)
downloadswift-376dc5adc381f769091f29c75d9b26493383bac6.tar.gz
don't print cached dispersion if it's a lie
Change-Id: I551fcaf274876861feb12848749590f220842d68
-rwxr-xr-xswift/cli/ringbuilder.py8
-rw-r--r--swift/common/ring/builder.py2
-rw-r--r--test/unit/cli/test_ringbuilder.py22
3 files changed, 28 insertions, 4 deletions
diff --git a/swift/cli/ringbuilder.py b/swift/cli/ringbuilder.py
index 3bf073550..65ad12e51 100755
--- a/swift/cli/ringbuilder.py
+++ b/swift/cli/ringbuilder.py
@@ -248,10 +248,12 @@ swift-ring-builder <builder_file>
dev_count = len([dev for dev in builder.devs
if dev is not None])
balance = builder.get_balance()
+ dispersion_trailer = '' if builder.dispersion is None else (
+ ', %.02f dispersion' % (builder.dispersion))
print '%d partitions, %.6f replicas, %d regions, %d zones, ' \
- '%d devices, %.02f balance, %.02f dispersion' % (
+ '%d devices, %.02f balance%s' % (
builder.parts, builder.replicas, regions, zones, dev_count,
- balance, builder.dispersion)
+ balance, dispersion_trailer)
print 'The minimum number of hours before a partition can be ' \
'reassigned is %s' % builder.min_part_hours
print 'The overload factor is %.6f' % builder.overload
@@ -637,7 +639,7 @@ swift-ring-builder <builder_file> rebalance [options]
)
print '-' * 79
exit(EXIT_ERROR)
- if not parts:
+ if not (parts or options.force):
print 'No partitions could be reassigned.'
print 'Either none need to be or none can be due to ' \
'min_part_hours [%s].' % builder.min_part_hours
diff --git a/swift/common/ring/builder.py b/swift/common/ring/builder.py
index 11324ec43..a0d0d5200 100644
--- a/swift/common/ring/builder.py
+++ b/swift/common/ring/builder.py
@@ -147,7 +147,7 @@ class RingBuilder(object):
self._last_part_moves = builder['_last_part_moves']
self._last_part_gather_start = builder['_last_part_gather_start']
self._dispersion_graph = builder.get('_dispersion_graph', {})
- self.dispersion = builder.get('dispersion', 0.0)
+ self.dispersion = builder.get('dispersion')
self._remove_devs = builder['_remove_devs']
self._ring = None
diff --git a/test/unit/cli/test_ringbuilder.py b/test/unit/cli/test_ringbuilder.py
index 2fb231f9d..82abeb954 100644
--- a/test/unit/cli/test_ringbuilder.py
+++ b/test/unit/cli/test_ringbuilder.py
@@ -381,6 +381,28 @@ class TestRebalanceCommand(unittest.TestCase):
out, err = self.run_srb("rebalance")
self.assertTrue("rebalance/repush" in out)
+ def test_cached_dispersion_value(self):
+ self.run_srb("create", 8, 3, 24)
+ self.run_srb("add",
+ "r1z1-10.1.1.1:2345/sda", 100.0,
+ "r1z1-10.1.1.1:2345/sdb", 100.0,
+ "r1z1-10.1.1.1:2345/sdc", 100.0,
+ "r1z1-10.1.1.1:2345/sdd", 100.0)
+ self.run_srb('rebalance')
+ out, err = self.run_srb() # list devices
+ self.assertTrue('dispersion' in out)
+ # remove cached dispersion value
+ builder = RingBuilder.load(self.tempfile)
+ builder.dispersion = None
+ builder.save(self.tempfile)
+ # now dispersion output is supressed
+ out, err = self.run_srb() # list devices
+ self.assertFalse('dispersion' in out)
+ # but will show up after rebalance
+ self.run_srb('rebalance', '-f')
+ out, err = self.run_srb() # list devices
+ self.assertTrue('dispersion' in out)
+
if __name__ == '__main__':
unittest.main()