102fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh# This is used directly by server/tests/barriertest/control.srv
202fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh
302fc0b9199aa71c7f801aee4fcd4b86513e8facbmblighimport logging, time
4f20b9cd8a026723ff11204281d281eac7b06c81dmblighfrom autotest_lib.client.bin import test
5999fb13dcbf4de5e37ca2b3059ef1061b5faba43mblighfrom autotest_lib.client.common_lib import barrier, error
6e1417fa0334ac4e2ab6064e42de0bb891e561057mbligh
7e74782b6199beac161ebd9e9ccd2266a97434821mbligh
802fc0b9199aa71c7f801aee4fcd4b86513e8facbmblighclass barriertest(test.test):
902fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh    version = 2
1002fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh
1102fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh
12999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh    def run_once(self, our_addr, hostnames, master, timeout=120):
1302fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        # A reusable local server as we're using multiple barriers in one test.
1402fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        server = barrier.listen_server()
1502fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh
1602fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        # Basic barrier rendezvous test.
17999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        self.job.barrier(our_addr, 'First', timeout=timeout,
18999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh                         listen_server=server).rendezvous(*hostnames)
1902fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        logging.info('1. rendezvous "First" complete.')
2002fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        time.sleep(2)
2102fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh
2202fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        # A rendezvous_servers using a different master than the default.
23999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        self.job.barrier(our_addr, 'Second', timeout=timeout,
24999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh                         listen_server=server
2502fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh                         ).rendezvous_servers(hostnames[-1], *hostnames[:-1])
2602fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        logging.info('2. rendezvous_servers "Second" complete.')
2702fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        time.sleep(2)
2802fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh
2902fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        # A regular rendezvous, this time testing the abort functionality.
3002fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        try:
31999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh            self.job.barrier(our_addr, 'WillAbort', timeout=timeout,
3202fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh                             listen_server=server
3302fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh                             ).rendezvous(abort=True, *hostnames)
34999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        except error.BarrierAbortError:
3502fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh            pass
36999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        except error.BarrierError, e:
37999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh            # We did get an error from the barrier, but was is acceptable or
38999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh            # not?  Site code may not be able to indicate an explicit abort.
39999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh            self.job.record('WARN', None, 'barriertest',
40999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh                            'BarrierError %s instead of BarrierAbortError.' % e)
4102fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        else:
4202fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh            raise error.TestFail('Explicit barrier rendezvous abort failed.')
43999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        logging.info('3. rendezvous(abort=True) complete.')
4402fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        time.sleep(2)
4502fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh
4602fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        # Now attempt a rendezvous_servers that also includes the server.
47999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        self.job.barrier(our_addr, 'FinalSync', timeout=timeout,
48999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh                         listen_server=server
4902fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh                         ).rendezvous_servers(master, *hostnames)
50999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        logging.info('4. rendezvous_servers "FinalSync" complete.')
51999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        time.sleep(2)
52999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh
53999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        # rendezvous_servers, aborted from the master.
54999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        try:
55999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh            self.job.barrier(our_addr, 'WillAbortServers', timeout=timeout,
56999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh                             listen_server=server
57999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh                             ).rendezvous_servers(master, *hostnames)
58999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        except error.BarrierAbortError:
59999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh            pass
60999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        except error.BarrierError, e:
61999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh            # We did get an error from the barrier, but was is acceptable or
62999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh            # not?  Site code may not be able to indicate an explicit abort.
63999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh            self.job.record('WARN', None, 'barriertest',
64999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh                            'BarrierError %s instead of BarrierAbortError.' % e)
65999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        else:
66999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh            raise error.TestFail('Explicit barrier rendezvous abort failed.')
67999fb13dcbf4de5e37ca2b3059ef1061b5faba43mbligh        logging.info('5. rendezvous_servers(abort=True) complete.')
6802fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        time.sleep(2)
6902fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh
7002fc0b9199aa71c7f801aee4fcd4b86513e8facbmbligh        server.close()
71