Beispiel #1
0
    def test_enable(self):
        broker = self._make_broker()
        broker.update_metadata(
            {'X-Container-Sysmeta-Sharding': (True, Timestamp.now().internal)})
        # no shard ranges
        out = StringIO()
        err = StringIO()
        with self.assertRaises(SystemExit):
            with mock.patch('sys.stdout', out), mock.patch('sys.stderr', err):
                main([broker.db_file, 'enable'])
        expected = [
            "WARNING: invalid shard ranges: ['No shard ranges.'].", 'Aborting.'
        ]
        self.assertEqual(expected, out.getvalue().splitlines())
        self.assertEqual(['Loaded db broker for a/c.'],
                         err.getvalue().splitlines())

        # success
        shard_ranges = []
        for data in self.shard_data:
            path = ShardRange.make_path('.shards_a', 'c', 'c', Timestamp.now(),
                                        data['index'])
            shard_ranges.append(
                ShardRange(path, Timestamp.now(), data['lower'], data['upper'],
                           data['object_count']))
        broker.merge_shard_ranges(shard_ranges)
        out = StringIO()
        err = StringIO()
        with mock.patch('sys.stdout', out), mock.patch('sys.stderr', err):
            with mock_timestamp_now() as now:
                main([broker.db_file, 'enable'])
        expected = [
            "Container moved to state 'sharding' with epoch %s." %
            now.internal,
            'Run container-sharder on all nodes to shard the container.'
        ]
        self.assertEqual(expected, out.getvalue().splitlines())
        self.assertEqual(['Loaded db broker for a/c.'],
                         err.getvalue().splitlines())
        self._assert_enabled(broker, now)

        # already enabled
        out = StringIO()
        err = StringIO()
        with mock.patch('sys.stdout', out), mock.patch('sys.stderr', err):
            main([broker.db_file, 'enable'])
        expected = [
            "Container already in state 'sharding' with epoch %s." %
            now.internal, 'No action required.',
            'Run container-sharder on all nodes to shard the container.'
        ]
        self.assertEqual(expected, out.getvalue().splitlines())
        self.assertEqual(['Loaded db broker for a/c.'],
                         err.getvalue().splitlines())
        self._assert_enabled(broker, now)
Beispiel #2
0
def analyze_shard_ranges(args):
    shard_data = _load_and_validate_shard_data(args, require_index=False)
    for data in shard_data:
        # allow for incomplete shard range data that may have been scraped from
        # swift-container-info output
        data.setdefault('epoch', None)
    shard_ranges = [ShardRange.from_dict(data) for data in shard_data]
    whole_sr = ShardRange('whole/namespace', 0)
    try:
        find_repair_solution(shard_ranges, whole_sr, args)
    except ManageShardRangesException:
        return 1
    return 0
Beispiel #3
0
    def test_info(self):
        broker = self._make_broker()
        broker.update_metadata(
            {'X-Container-Sysmeta-Sharding': (True, Timestamp.now().internal)})
        out = StringIO()
        err = StringIO()
        with mock.patch('sys.stdout', out), mock.patch('sys.stderr', err):
            main([broker.db_file, 'info'])
        expected = [
            'Sharding enabled = True', 'Own shard range: None',
            'db_state = unsharded', 'Metadata:',
            '  X-Container-Sysmeta-Sharding = True'
        ]
        self.assertEqual(expected, out.getvalue().splitlines())
        self.assertEqual(['Loaded db broker for a/c.'],
                         err.getvalue().splitlines())

        retiring_db_id = broker.get_info()['id']
        broker.merge_shard_ranges(ShardRange('.shards/cc', Timestamp.now()))
        epoch = Timestamp.now()
        with mock_timestamp_now(epoch) as now:
            broker.enable_sharding(epoch)
        self.assertTrue(broker.set_sharding_state())
        out = StringIO()
        err = StringIO()
        with mock.patch('sys.stdout', out), mock.patch('sys.stderr', err):
            with mock_timestamp_now(now):
                main([broker.db_file, 'info'])
        expected = [
            'Sharding enabled = True', 'Own shard range: {',
            '  "bytes_used": 0, ', '  "deleted": 0, ',
            '  "epoch": "%s", ' % epoch.internal, '  "lower": "", ',
            '  "meta_timestamp": "%s", ' % now.internal, '  "name": "a/c", ',
            '  "object_count": 0, ', '  "state": "sharding", ',
            '  "state_timestamp": "%s", ' % now.internal,
            '  "timestamp": "%s", ' % now.internal, '  "upper": ""', '}',
            'db_state = sharding',
            'Retiring db id: %s' % retiring_db_id, 'Cleaving context: {',
            '  "cleave_to_row": null, ', '  "cleaving_done": false, ',
            '  "cursor": "", ', '  "last_cleave_to_row": null, ',
            '  "max_row": -1, ', '  "misplaced_done": false, ',
            '  "ranges_done": 0, ', '  "ranges_todo": 0, ',
            '  "ref": "%s"' % retiring_db_id, '}', 'Metadata:',
            '  X-Container-Sysmeta-Sharding = True'
        ]
        self.assertEqual(expected, out.getvalue().splitlines())
        self.assertEqual(['Loaded db broker for a/c.'],
                         err.getvalue().splitlines())

        self.assertTrue(broker.set_sharded_state())
        out = StringIO()
        err = StringIO()
        with mock.patch('sys.stdout', out), mock.patch('sys.stderr', err):
            with mock_timestamp_now(now):
                main([broker.db_file, 'info'])
        expected = [
            'Sharding enabled = True', 'Own shard range: {',
            '  "bytes_used": 0, ', '  "deleted": 0, ',
            '  "epoch": "%s", ' % epoch.internal, '  "lower": "", ',
            '  "meta_timestamp": "%s", ' % now.internal, '  "name": "a/c", ',
            '  "object_count": 0, ', '  "state": "sharding", ',
            '  "state_timestamp": "%s", ' % now.internal,
            '  "timestamp": "%s", ' % now.internal, '  "upper": ""', '}',
            'db_state = sharded', 'Metadata:',
            '  X-Container-Sysmeta-Sharding = True'
        ]
        self.assertEqual(expected, out.getvalue().splitlines())
        self.assertEqual(['Loaded db broker for a/c.'],
                         err.getvalue().splitlines())