diff --git a/bin/swift-ring-builder b/bin/swift-ring-builder index 877590da2e..50353df256 100755 --- a/bin/swift-ring-builder +++ b/bin/swift-ring-builder @@ -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': diff --git a/swift/common/ring/builder.py b/swift/common/ring/builder.py index 7c0b08adea..46ce76e149 100644 --- a/swift/common/ring/builder.py +++ b/swift/common/ring/builder.py @@ -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): diff --git a/test/unit/common/ring/test_builder.py b/test/unit/common/ring/test_builder.py index e4be88b6dc..2928558c8b 100644 --- a/test/unit/common/ring/test_builder.py +++ b/test/unit/common/ring/test_builder.py @@ -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',