If you issue a write_ring to swift-ring-builder, but there's no nodes in the ring, it crashes out. This will cause it not to crash and write an empty ring.gz file.
This is mainly helpful for enabling servers on nodes before pushing out a centrally generated master ring.
This commit is contained in:
commit
17f65e0431
@ -533,10 +533,16 @@ Exit codes: 0 = ring changed, 1 = ring did not change, 2 = error
|
||||
exit(EXIT_RING_UNCHANGED)
|
||||
|
||||
elif argv[2] == 'write_ring':
|
||||
pickle.dump(builder.get_ring(),
|
||||
ring_data = builder.get_ring()
|
||||
if not ring_data._replica2part2dev_id:
|
||||
if ring_data.devs:
|
||||
print 'Warning: Writing a ring with no partition assignments but with devices; did you forget to run "rebalance"?'
|
||||
else:
|
||||
print 'Warning: Writing an empty ring'
|
||||
pickle.dump(ring_data,
|
||||
GzipFile(pathjoin(backup_dir, '%d.' % time() +
|
||||
basename(ring_file)), 'wb'), protocol=2)
|
||||
pickle.dump(builder.get_ring(), GzipFile(ring_file, 'wb'), protocol=2)
|
||||
pickle.dump(ring_data, GzipFile(ring_file, 'wb'), protocol=2)
|
||||
exit(EXIT_RING_CHANGED)
|
||||
|
||||
elif argv[2] == 'pretend_min_part_hours_passed':
|
||||
|
@ -100,9 +100,12 @@ class RingBuilder(object):
|
||||
continue
|
||||
devs[dev['id']] = dict((k, v) for k, v in dev.items()
|
||||
if k not in ('parts', 'parts_wanted'))
|
||||
self._ring = \
|
||||
RingData([array('H', p2d) for p2d in self._replica2part2dev],
|
||||
devs, 32 - self.part_power)
|
||||
if not self._replica2part2dev:
|
||||
self._ring = RingData([], devs, 32 - self.part_power)
|
||||
else:
|
||||
self._ring = \
|
||||
RingData([array('H', p2d) for p2d in self._replica2part2dev],
|
||||
devs, 32 - self.part_power)
|
||||
return self._ring
|
||||
|
||||
def add_dev(self, dev):
|
||||
|
@ -43,7 +43,6 @@ class TestRingBuilder(unittest.TestCase):
|
||||
|
||||
def test_get_ring(self):
|
||||
rb = ring.RingBuilder(8, 3, 1)
|
||||
self.assertRaises(Exception, rb.get_ring)
|
||||
rb.add_dev({'id': 0, 'zone': 0, 'weight': 1, 'ip': '127.0.0.1',
|
||||
'port': 10000, 'device': 'sda1'})
|
||||
rb.add_dev({'id': 1, 'zone': 1, 'weight': 1, 'ip': '127.0.0.1',
|
||||
|
Loading…
x
Reference in New Issue
Block a user