Message ID | 20210219212447.15549-1-calum.mackay@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | pynfs: add courteous server tests | expand |
On Fri, Feb 19, 2021 at 09:24:47PM +0000, Calum Mackay wrote: > Add a first test that simply locks, sleeps for twice the lease period, > then unlocks. > > Signed-off-by: Calum Mackay <calum.mackay@oracle.com> > --- > > I plan to add some more tests shortly, but will send what I have now, > in case it's useful for the upcoming BAT. This first test has been tried > against Solaris & Linux (discourteous) servers. Looks good to me. Thanks! --b. > > nfs4.1/server41tests/__init__.py | 1 + > nfs4.1/server41tests/st_courtesy.py | 47 +++++++++++++++++++++++++++++ > 2 files changed, 48 insertions(+) > create mode 100644 nfs4.1/server41tests/st_courtesy.py > > diff --git a/nfs4.1/server41tests/__init__.py b/nfs4.1/server41tests/__init__.py > index a4d7ee65fb5e..ebb4e8847151 100644 > --- a/nfs4.1/server41tests/__init__.py > +++ b/nfs4.1/server41tests/__init__.py > @@ -25,4 +25,5 @@ __all__ = ["st_exchange_id.py", # draft 21 > "st_sparse.py", > "st_flex.py", > "st_xattr.py", > + "st_courtesy.py", > ] > diff --git a/nfs4.1/server41tests/st_courtesy.py b/nfs4.1/server41tests/st_courtesy.py > new file mode 100644 > index 000000000000..5e13dad44a01 > --- /dev/null > +++ b/nfs4.1/server41tests/st_courtesy.py > @@ -0,0 +1,47 @@ > +from .st_create_session import create_session > +from xdrdef.nfs4_const import * > + > +from .environment import check, fail, create_file, open_file, close_file > +from .environment import open_create_file_op, use_obj > +from xdrdef.nfs4_type import open_owner4, openflag4, createhow4, open_claim4 > +from xdrdef.nfs4_type import creatverfattr, fattr4, stateid4, locker4, lock_owner4 > +from xdrdef.nfs4_type import open_to_lock_owner4 > +import nfs_ops > +op = nfs_ops.NFS4ops() > +import threading > + > + > +def _getleasetime(sess): > + res = sess.compound([op.putrootfh(), op.getattr(1 << FATTR4_LEASE_TIME)]) > + return res.resarray[-1].obj_attributes[FATTR4_LEASE_TIME] > + > +def testLockSleepLockU(t, env): > + """test server courtesy by having LOCK and LOCKU > + in separate compounds, separated by a sleep of twice the lease period > + > + FLAGS: courteous > + CODE: COUR1 > + """ > + sess1 = env.c1.new_client_session(env.testname(t)) > + > + res = create_file(sess1, env.testname(t)) > + check(res) > + > + fh = res.resarray[-1].object > + stateid = res.resarray[-2].stateid > + open_to_lock_owner = open_to_lock_owner4( 0, stateid, 0, lock_owner4(0, b"lock1")) > + lock_owner = locker4(open_owner=open_to_lock_owner, new_lock_owner=True) > + lock_ops = [ op.lock(WRITE_LT, False, 0, NFS4_UINT64_MAX, lock_owner) ] > + res = sess1.compound([op.putfh(fh)] + lock_ops) > + check(res, NFS4_OK) > + > + lease_time = _getleasetime(sess1) > + env.sleep(lease_time * 2, "twice the lease period") > + > + lock_stateid = res.resarray[-1].lock_stateid > + lock_ops = [ op.locku(WRITE_LT, 0, lock_stateid, 0, NFS4_UINT64_MAX) ] > + res = sess1.compound([op.putfh(fh)] + lock_ops) > + check(res, NFS4_OK, warnlist = [NFS4ERR_BADSESSION]) > + > + res = close_file(sess1, fh, stateid=stateid) > + check(res) > -- > 2.18.4 >
diff --git a/nfs4.1/server41tests/__init__.py b/nfs4.1/server41tests/__init__.py index a4d7ee65fb5e..ebb4e8847151 100644 --- a/nfs4.1/server41tests/__init__.py +++ b/nfs4.1/server41tests/__init__.py @@ -25,4 +25,5 @@ __all__ = ["st_exchange_id.py", # draft 21 "st_sparse.py", "st_flex.py", "st_xattr.py", + "st_courtesy.py", ] diff --git a/nfs4.1/server41tests/st_courtesy.py b/nfs4.1/server41tests/st_courtesy.py new file mode 100644 index 000000000000..5e13dad44a01 --- /dev/null +++ b/nfs4.1/server41tests/st_courtesy.py @@ -0,0 +1,47 @@ +from .st_create_session import create_session +from xdrdef.nfs4_const import * + +from .environment import check, fail, create_file, open_file, close_file +from .environment import open_create_file_op, use_obj +from xdrdef.nfs4_type import open_owner4, openflag4, createhow4, open_claim4 +from xdrdef.nfs4_type import creatverfattr, fattr4, stateid4, locker4, lock_owner4 +from xdrdef.nfs4_type import open_to_lock_owner4 +import nfs_ops +op = nfs_ops.NFS4ops() +import threading + + +def _getleasetime(sess): + res = sess.compound([op.putrootfh(), op.getattr(1 << FATTR4_LEASE_TIME)]) + return res.resarray[-1].obj_attributes[FATTR4_LEASE_TIME] + +def testLockSleepLockU(t, env): + """test server courtesy by having LOCK and LOCKU + in separate compounds, separated by a sleep of twice the lease period + + FLAGS: courteous + CODE: COUR1 + """ + sess1 = env.c1.new_client_session(env.testname(t)) + + res = create_file(sess1, env.testname(t)) + check(res) + + fh = res.resarray[-1].object + stateid = res.resarray[-2].stateid + open_to_lock_owner = open_to_lock_owner4( 0, stateid, 0, lock_owner4(0, b"lock1")) + lock_owner = locker4(open_owner=open_to_lock_owner, new_lock_owner=True) + lock_ops = [ op.lock(WRITE_LT, False, 0, NFS4_UINT64_MAX, lock_owner) ] + res = sess1.compound([op.putfh(fh)] + lock_ops) + check(res, NFS4_OK) + + lease_time = _getleasetime(sess1) + env.sleep(lease_time * 2, "twice the lease period") + + lock_stateid = res.resarray[-1].lock_stateid + lock_ops = [ op.locku(WRITE_LT, 0, lock_stateid, 0, NFS4_UINT64_MAX) ] + res = sess1.compound([op.putfh(fh)] + lock_ops) + check(res, NFS4_OK, warnlist = [NFS4ERR_BADSESSION]) + + res = close_file(sess1, fh, stateid=stateid) + check(res)
Add a first test that simply locks, sleeps for twice the lease period, then unlocks. Signed-off-by: Calum Mackay <calum.mackay@oracle.com> --- I plan to add some more tests shortly, but will send what I have now, in case it's useful for the upcoming BAT. This first test has been tried against Solaris & Linux (discourteous) servers. nfs4.1/server41tests/__init__.py | 1 + nfs4.1/server41tests/st_courtesy.py | 47 +++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 nfs4.1/server41tests/st_courtesy.py