don't print cached dispersion if it's a lie

Change-Id: I551fcaf274876861feb12848749590f220842d68
This commit is contained in:
Clay Gerrard 2015-01-27 10:19:41 -08:00
parent ecf4d057b3
commit 376dc5adc3
3 changed files with 28 additions and 4 deletions
swift
test/unit/cli

@ -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

@ -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

@ -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()