Merge "Fix ring-builder crash"
This commit is contained in:
commit
1e22e42235
@ -754,6 +754,7 @@ class RingBuilder(object):
|
|||||||
"""
|
"""
|
||||||
for dev in self._iter_devs():
|
for dev in self._iter_devs():
|
||||||
dev['sort_key'] = self._sort_key_for(dev)
|
dev['sort_key'] = self._sort_key_for(dev)
|
||||||
|
dev['tiers'] = tiers_for_dev(dev)
|
||||||
|
|
||||||
available_devs = \
|
available_devs = \
|
||||||
sorted((d for d in self._iter_devs() if d['weight']),
|
sorted((d for d in self._iter_devs() if d['weight']),
|
||||||
@ -764,7 +765,6 @@ class RingBuilder(object):
|
|||||||
tier2dev_sort_key = defaultdict(list)
|
tier2dev_sort_key = defaultdict(list)
|
||||||
max_tier_depth = 0
|
max_tier_depth = 0
|
||||||
for dev in available_devs:
|
for dev in available_devs:
|
||||||
dev['tiers'] = tiers_for_dev(dev)
|
|
||||||
for tier in dev['tiers']:
|
for tier in dev['tiers']:
|
||||||
tier2devs[tier].append(dev) # <-- starts out sorted!
|
tier2devs[tier].append(dev) # <-- starts out sorted!
|
||||||
tier2dev_sort_key[tier].append(dev['sort_key'])
|
tier2dev_sort_key[tier].append(dev['sort_key'])
|
||||||
@ -889,7 +889,7 @@ class RingBuilder(object):
|
|||||||
# Just to save memory and keep from accidental reuse.
|
# Just to save memory and keep from accidental reuse.
|
||||||
for dev in self._iter_devs():
|
for dev in self._iter_devs():
|
||||||
del dev['sort_key']
|
del dev['sort_key']
|
||||||
dev.pop('tiers', None) # May be absent for devices w/o weight
|
del dev['tiers']
|
||||||
|
|
||||||
def _sort_key_for(self, dev):
|
def _sort_key_for(self, dev):
|
||||||
return (dev['parts_wanted'], random.randint(0, 0xFFFF), dev['id'])
|
return (dev['parts_wanted'], random.randint(0, 0xFFFF), dev['id'])
|
||||||
|
@ -107,6 +107,33 @@ class TestRingBuilder(unittest.TestCase):
|
|||||||
self.assertNotEquals(r0.to_dict(), r1.to_dict())
|
self.assertNotEquals(r0.to_dict(), r1.to_dict())
|
||||||
self.assertEquals(r1.to_dict(), r2.to_dict())
|
self.assertEquals(r1.to_dict(), r2.to_dict())
|
||||||
|
|
||||||
|
def test_rebalance_part_on_deleted_other_part_on_drained(self):
|
||||||
|
rb = ring.RingBuilder(8, 3, 1)
|
||||||
|
rb.add_dev({'id': 0, 'region': 1, 'zone': 1, 'weight': 1,
|
||||||
|
'ip': '127.0.0.1', 'port': 10000, 'device': 'sda1'})
|
||||||
|
rb.add_dev({'id': 1, 'region': 1, 'zone': 1, 'weight': 1,
|
||||||
|
'ip': '127.0.0.1', 'port': 10001, 'device': 'sda1'})
|
||||||
|
rb.add_dev({'id': 2, 'region': 1, 'zone': 1, 'weight': 1,
|
||||||
|
'ip': '127.0.0.1', 'port': 10002, 'device': 'sda1'})
|
||||||
|
rb.add_dev({'id': 3, 'region': 1, 'zone': 1, 'weight': 1,
|
||||||
|
'ip': '127.0.0.1', 'port': 10003, 'device': 'sda1'})
|
||||||
|
rb.add_dev({'id': 4, 'region': 1, 'zone': 1, 'weight': 1,
|
||||||
|
'ip': '127.0.0.1', 'port': 10004, 'device': 'sda1'})
|
||||||
|
rb.add_dev({'id': 5, 'region': 1, 'zone': 1, 'weight': 1,
|
||||||
|
'ip': '127.0.0.1', 'port': 10005, 'device': 'sda1'})
|
||||||
|
|
||||||
|
rb.rebalance(seed=1)
|
||||||
|
# We want a partition where 1 replica is on a removed device, 1
|
||||||
|
# replica is on a 0-weight device, and 1 on a normal device. To
|
||||||
|
# guarantee we have one, we see where partition 123 is, then
|
||||||
|
# manipulate its devices accordingly.
|
||||||
|
zero_weight_dev_id = rb._replica2part2dev[1][123]
|
||||||
|
delete_dev_id = rb._replica2part2dev[2][123]
|
||||||
|
|
||||||
|
rb.set_dev_weight(zero_weight_dev_id, 0.0)
|
||||||
|
rb.remove_dev(delete_dev_id)
|
||||||
|
rb.rebalance()
|
||||||
|
|
||||||
def test_set_replicas(self):
|
def test_set_replicas(self):
|
||||||
rb = ring.RingBuilder(8, 3.2, 1)
|
rb = ring.RingBuilder(8, 3.2, 1)
|
||||||
rb.devs_changed = False
|
rb.devs_changed = False
|
||||||
|
Loading…
x
Reference in New Issue
Block a user