mirror of https://github.com/ceph/ceph
135 lines
4.8 KiB
Python
Executable File
135 lines
4.8 KiB
Python
Executable File
"""
|
|
locktests
|
|
"""
|
|
import logging
|
|
|
|
from teuthology.orchestra import run
|
|
from teuthology import misc as teuthology
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
def task(ctx, config):
|
|
"""
|
|
Run locktests, from the xfstests suite, on the given
|
|
clients. Whether the clients are ceph-fuse or kernel does not
|
|
matter, and the two clients can refer to the same mount.
|
|
|
|
The config is a list of two clients to run the locktest on. The
|
|
first client will be the host.
|
|
|
|
For example:
|
|
tasks:
|
|
- ceph:
|
|
- ceph-fuse: [client.0, client.1]
|
|
- locktest:
|
|
[client.0, client.1]
|
|
|
|
This task does not yield; there would be little point.
|
|
|
|
:param ctx: Context
|
|
:param config: Configuration
|
|
"""
|
|
|
|
assert isinstance(config, list)
|
|
log.info('fetching and building locktests...')
|
|
(host,) = ctx.cluster.only(config[0]).remotes
|
|
(client,) = ctx.cluster.only(config[1]).remotes
|
|
( _, _, host_id) = config[0].partition('.')
|
|
( _, _, client_id) = config[1].partition('.')
|
|
testdir = teuthology.get_testdir(ctx)
|
|
hostmnt = '{tdir}/mnt.{id}'.format(tdir=testdir, id=host_id)
|
|
clientmnt = '{tdir}/mnt.{id}'.format(tdir=testdir, id=client_id)
|
|
|
|
try:
|
|
for client_name in config:
|
|
log.info('building on {client_}'.format(client_=client_name))
|
|
ctx.cluster.only(client_name).run(
|
|
args=[
|
|
# explicitly does not support multiple autotest tasks
|
|
# in a single run; the result archival would conflict
|
|
'mkdir', '{tdir}/archive/locktest'.format(tdir=testdir),
|
|
run.Raw('&&'),
|
|
'mkdir', '{tdir}/locktest'.format(tdir=testdir),
|
|
run.Raw('&&'),
|
|
'wget',
|
|
'-nv',
|
|
'https://raw.github.com/gregsfortytwo/xfstests-ceph/master/src/locktest.c',
|
|
'-O', '{tdir}/locktest/locktest.c'.format(tdir=testdir),
|
|
run.Raw('&&'),
|
|
'g++', '{tdir}/locktest/locktest.c'.format(tdir=testdir),
|
|
'-o', '{tdir}/locktest/locktest'.format(tdir=testdir)
|
|
],
|
|
logger=log.getChild('locktest_client.{id}'.format(id=client_name)),
|
|
)
|
|
|
|
log.info('built locktest on each client')
|
|
|
|
host.run(args=['sudo', 'touch',
|
|
'{mnt}/locktestfile'.format(mnt=hostmnt),
|
|
run.Raw('&&'),
|
|
'sudo', 'chown', 'ubuntu.ubuntu',
|
|
'{mnt}/locktestfile'.format(mnt=hostmnt)
|
|
]
|
|
)
|
|
|
|
log.info('starting on host')
|
|
hostproc = host.run(
|
|
args=[
|
|
'{tdir}/locktest/locktest'.format(tdir=testdir),
|
|
'-p', '6788',
|
|
'-d',
|
|
'{mnt}/locktestfile'.format(mnt=hostmnt),
|
|
],
|
|
wait=False,
|
|
logger=log.getChild('locktest.host'),
|
|
)
|
|
log.info('starting on client')
|
|
(_,_,hostaddr) = host.name.partition('@')
|
|
clientproc = client.run(
|
|
args=[
|
|
'{tdir}/locktest/locktest'.format(tdir=testdir),
|
|
'-p', '6788',
|
|
'-d',
|
|
'-h', hostaddr,
|
|
'{mnt}/locktestfile'.format(mnt=clientmnt),
|
|
],
|
|
logger=log.getChild('locktest.client'),
|
|
wait=False
|
|
)
|
|
|
|
hostresult = hostproc.wait()
|
|
clientresult = clientproc.wait()
|
|
if (hostresult != 0) or (clientresult != 0):
|
|
raise Exception("Did not pass locking test!")
|
|
log.info('finished locktest executable with results {r} and {s}'. \
|
|
format(r=hostresult, s=clientresult))
|
|
|
|
finally:
|
|
log.info('cleaning up host dir')
|
|
host.run(
|
|
args=[
|
|
'mkdir', '-p', '{tdir}/locktest'.format(tdir=testdir),
|
|
run.Raw('&&'),
|
|
'rm', '-f', '{tdir}/locktest/locktest.c'.format(tdir=testdir),
|
|
run.Raw('&&'),
|
|
'rm', '-f', '{tdir}/locktest/locktest'.format(tdir=testdir),
|
|
run.Raw('&&'),
|
|
'rmdir', '{tdir}/locktest'
|
|
],
|
|
logger=log.getChild('.{id}'.format(id=config[0])),
|
|
)
|
|
log.info('cleaning up client dir')
|
|
client.run(
|
|
args=[
|
|
'mkdir', '-p', '{tdir}/locktest'.format(tdir=testdir),
|
|
run.Raw('&&'),
|
|
'rm', '-f', '{tdir}/locktest/locktest.c'.format(tdir=testdir),
|
|
run.Raw('&&'),
|
|
'rm', '-f', '{tdir}/locktest/locktest'.format(tdir=testdir),
|
|
run.Raw('&&'),
|
|
'rmdir', '{tdir}/locktest'.format(tdir=testdir)
|
|
],
|
|
logger=log.getChild('.{id}'.format(\
|
|
id=config[1])),
|
|
)
|