2 Peer test (Single test, not much configurable here)
9 from teuthology import misc as teuthology
10 from util.rados import rados
12 log = logging.getLogger(__name__)
14 def task(ctx, config):
20 assert isinstance(config, dict), \
21 'peer task only accepts a dict for configuration'
22 first_mon = teuthology.get_first_mon(ctx, config)
23 (mon,) = ctx.cluster.only(first_mon).remotes.iterkeys()
25 manager = ceph_manager.CephManager(
28 logger=log.getChild('ceph_manager'),
31 while len(manager.get_osd_status()['up']) < 3:
33 manager.flush_pg_stats([0, 1, 2])
34 manager.wait_for_clean()
39 osd_recovery_delay_start=120)
43 manager.mark_down_osd(2)
45 # kludge to make sure they get a map
46 rados(ctx, mon, ['-p', 'data', 'get', 'dummy', '-'])
48 manager.flush_pg_stats([0, 1])
49 manager.wait_for_recovery()
51 # kill another and revive 2, so that some pgs can't peer.
53 manager.mark_down_osd(1)
55 manager.wait_till_osd_is_up(2)
57 manager.flush_pg_stats([0, 2])
59 manager.wait_for_active_or_down()
61 manager.flush_pg_stats([0, 2])
65 pgs = manager.get_pg_stats()
67 out = manager.raw_cluster_cmd('pg', pg['pgid'], 'query')
68 log.debug("out string %s",out)
70 log.info("pg is %s, query json is %s", pg, j)
72 if pg['state'].count('down'):
74 # verify that it is blocked on osd.1
75 rs = j['recovery_state']
77 assert rs[0]['name'] == 'Started/Primary/Peering/Down'
78 assert rs[1]['name'] == 'Started/Primary/Peering'
79 assert rs[1]['blocked']
80 assert rs[1]['down_osds_we_would_probe'] == [1]
81 assert len(rs[1]['peering_blocked_by']) == 1
82 assert rs[1]['peering_blocked_by'][0]['osd'] == 1
84 assert num_down_pgs > 0
88 manager.wait_till_osd_is_up(1)
89 manager.flush_pg_stats([0, 1, 2])
90 manager.wait_for_clean()