71 lines
3.0 KiB
Python
71 lines
3.0 KiB
Python
# This is used directly by server/tests/barriertest/control.srv
|
|
|
|
import logging, time
|
|
from autotest_lib.client.bin import test
|
|
from autotest_lib.client.common_lib import barrier, error
|
|
|
|
|
|
class barriertest(test.test):
|
|
version = 2
|
|
|
|
|
|
def run_once(self, our_addr, hostnames, main, timeout=120):
|
|
# A reusable local server as we're using multiple barriers in one test.
|
|
server = barrier.listen_server()
|
|
|
|
# Basic barrier rendezvous test.
|
|
self.job.barrier(our_addr, 'First', timeout=timeout,
|
|
listen_server=server).rendezvous(*hostnames)
|
|
logging.info('1. rendezvous "First" complete.')
|
|
time.sleep(2)
|
|
|
|
# A rendezvous_servers using a different main than the default.
|
|
self.job.barrier(our_addr, 'Second', timeout=timeout,
|
|
listen_server=server
|
|
).rendezvous_servers(hostnames[-1], *hostnames[:-1])
|
|
logging.info('2. rendezvous_servers "Second" complete.')
|
|
time.sleep(2)
|
|
|
|
# A regular rendezvous, this time testing the abort functionality.
|
|
try:
|
|
self.job.barrier(our_addr, 'WillAbort', timeout=timeout,
|
|
listen_server=server
|
|
).rendezvous(abort=True, *hostnames)
|
|
except error.BarrierAbortError:
|
|
pass
|
|
except error.BarrierError, e:
|
|
# We did get an error from the barrier, but was is acceptable or
|
|
# not? Site code may not be able to indicate an explicit abort.
|
|
self.job.record('WARN', None, 'barriertest',
|
|
'BarrierError %s instead of BarrierAbortError.' % e)
|
|
else:
|
|
raise error.TestFail('Explicit barrier rendezvous abort failed.')
|
|
logging.info('3. rendezvous(abort=True) complete.')
|
|
time.sleep(2)
|
|
|
|
# Now attempt a rendezvous_servers that also includes the server.
|
|
self.job.barrier(our_addr, 'FinalSync', timeout=timeout,
|
|
listen_server=server
|
|
).rendezvous_servers(main, *hostnames)
|
|
logging.info('4. rendezvous_servers "FinalSync" complete.')
|
|
time.sleep(2)
|
|
|
|
# rendezvous_servers, aborted from the main.
|
|
try:
|
|
self.job.barrier(our_addr, 'WillAbortServers', timeout=timeout,
|
|
listen_server=server
|
|
).rendezvous_servers(main, *hostnames)
|
|
except error.BarrierAbortError:
|
|
pass
|
|
except error.BarrierError, e:
|
|
# We did get an error from the barrier, but was is acceptable or
|
|
# not? Site code may not be able to indicate an explicit abort.
|
|
self.job.record('WARN', None, 'barriertest',
|
|
'BarrierError %s instead of BarrierAbortError.' % e)
|
|
else:
|
|
raise error.TestFail('Explicit barrier rendezvous abort failed.')
|
|
logging.info('5. rendezvous_servers(abort=True) complete.')
|
|
time.sleep(2)
|
|
|
|
server.close()
|