I'm observing some strange 3 minute slow response times for 
utimes() (setattr) calls on an NFSv4 filesystem, using an
amd64 solaris express nfs4 server box running snv_77 (and
bfu'ed to recent [=mid/end december 2007] opensolaris bits).
nfs4 clients are running either snv_77 x86, or snv_72 sparc,
or s10u2 x86.

It seems the issue is not 100% reproducible, but at least on
two different nfs4 servers I'm observing the problem quite often.
I can reproduce the issue like this:

1. On the snv_77 nfs4 server, create a new file on a local nfs shared
   filesystem (I tested both with zfs and ufs):

    nfs4server% rm foobar
    nfs4server% date > foobar

2. On a nfs4 client, first read the "foobar" file from the nfs4 server
   that was created in step 1., then change the timestamps on the file:

    nfs4client% cat foobar
    Thu Jan  3 17:24:29 CET 2008
    nfs4client% time touch -t 01011200 foobar
    0.00u 0.00s 3:00.10 0.0%


    Note that the touch command is stuck for 3 minutes until the
    command prompt returns.  While touch is stuck, the nfs4 client
    gets "NFS server nfs4server not responding; still trying" messages
    logged to /var/adm/messages.



snoop has traced this:

  1   0.00000 nfs4client -> nfs4server NFS C 4 (lookup valid) PUTFH FH=BCDC 
NVERIFY GETATTR 10011a b0a23a ACCESS rd,lk,mo,ext,dl LOOKUP tmp GETFH GETATTR 
10011...
  2   0.00031 nfs4server -> nfs4client NFS R 4 (lookup valid) NFS4ERR_SAME 
PUTFH NFS4_OK NVERIFY NFS4ERR_SAME 
  3   0.00009 nfs4client -> nfs4server NFS C 4 (lookup valid) PUTFH FH=A8C7 
NVERIFY GETATTR 10011a b0a23a ACCESS rd,lk,mo,ext,dl LOOKUP foobar GETFH 
GETATTR 10...
  4   0.00032 nfs4server -> nfs4client NFS R 4 (lookup valid) NFS4_OK PUTFH 
NFS4_OK NVERIFY NFS4_OK GETATTR NFS4_OK ACCESS NFS4_OK Supp=rd,lk,mo,ext,dl 
Allow=rd,lk,mo,...
  5   0.00308 nfs4client -> nfs4server NFS C 4 (access      ) PUTFH FH=C2F9 
ACCESS rd,mo,ext,exc GETATTR 10011a b0a23a 
  6   0.00014 nfs4server -> nfs4client NFS R 4 (access      ) NFS4_OK PUTFH 
NFS4_OK ACCESS NFS4_OK Supp=rd,mo,ext,exc Allow=rd,mo,ext GETATTR NFS4_OK 
  7   0.00010 nfs4client -> nfs4server NFS C 4 (open        ) PUTFH FH=A8C7 
OPEN foobar OT=NC SQ=4 CT=N AC=R DN=N OO=0090 GETFH GETATTR 10011a b0a23a 
  8   0.00010 nfs4server -> nfs4client NFS R 4 (open        ) NFS4ERR_EXPIRED 
PUTFH NFS4_OK OPEN NFS4ERR_EXPIRED 
  9   0.00021 nfs4client -> nfs4server NFS C 4 (setclientid ) PUTROOTFH GETATTR 
400 0 SETCLIENTID Prog=1073741825 ID=tcp Addr=172.20.0.11.182.32 
CBID=1073741825 
 10   0.00012 nfs4server -> nfs4client NFS R 4 (setclientid ) NFS4_OK PUTROOTFH 
NFS4_OK GETATTR NFS4_OK SETCLIENTID NFS4_OK CL=8f477b7ccf CFV=000000000000008F 
 11   0.00005 nfs4client -> nfs4server NFS C 4 (sclntid_conf) 
SETCLIENTID_CONFIRM CL=8f477b7ccf CFV=000000000000008F 
 12   0.03031 nfs4server -> nfs4client NFS R 4 (sclntid_conf) NFS4_OK 
SETCLIENTID_CONFIRM NFS4_OK 
 13   0.00024 nfs4server -> nfs4client NFS C CB_NULL
 14   0.00004 nfs4client -> nfs4server TCP D=57992 S=46624 Ack=3639677124 
Seq=1965079672 Len=0 Win=49640
 15   0.00019 nfs4client -> nfs4server NFS R CB_NULL 
 16   0.00009 nfs4server -> nfs4client TCP D=46624 S=57992 Ack=1965079700 
Seq=3639677124 Len=0 Win=49640
 17   0.00393 nfs4client -> nfs4server NFS C 4 (open        ) PUTFH FH=A8C7 
OPEN foobar OT=NC SQ=5 CT=N AC=R DN=N OO=0090 GETFH GETATTR 10011a b0a23a 
 18   0.00021 nfs4server -> nfs4client NFS R 4 (open        ) NFS4_OK PUTFH 
NFS4_OK OPEN NFS4_OK ST=1840:1 RF=CF,PL DT=R DST=18B9:0 GETFH NFS4_OK FH=C2F9 
GETATTR NFS4_OK 
 19   0.00008 nfs4client -> nfs4server NFS C 4 (open_confirm) PUTFH FH=C2F9 
OPEN_CONFIRM SQ=6 OST=1840:1 
 20   0.00011 nfs4server -> nfs4client NFS R 4 (open_confirm) NFS4_OK PUTFH 
NFS4_OK OPEN_CONFIRM NFS4_OK OST=1840:2 
 21   0.00014 nfs4client -> nfs4server NFS C 4 (read        ) PUTFH FH=C2F9 
READ ST=18B9:0 at 0 for 4096 
 22   0.00015 nfs4server -> nfs4client NFS R 4 (read        ) NFS4_OK PUTFH 
NFS4_OK READ NFS4_OK (29 bytes) EOF 
 23   0.00014 nfs4client -> nfs4server NFS C 4 (close       ) PUTFH FH=C2F9 
GETATTR 10011a b0a23a CLOSE SQ=7 OST=1840:2 
 24   0.00011 nfs4server -> nfs4client NFS R 4 (close       ) NFS4_OK PUTFH 
NFS4_OK GETATTR NFS4_OK CLOSE OST=1840:3 
 25   0.01700 nfs4client -> nfs4server TCP D=2049 S=997 Ack=3639480833 
Seq=1964998148 Len=0 Win=49640
 26   2.31082 nfs4client -> nfs4server NFS C 4 (lookup      ) PUTFH FH=BCDC 
SAVEFH LOOKUP tmp GETFH GETATTR 10011a b0a23a RESTOREFH NVERIFY GETATTR 10011a 
b0a2...
 27   0.00019 nfs4server -> nfs4client NFS R 4 (lookup      ) NFS4ERR_SAME 
PUTFH NFS4_OK SAVEFH NFS4_OK LOOKUP NFS4_OK GETFH NFS4_OK FH=A8C7 GETATTR 
NFS4_OK RESTOREFH NFS4_...
 28   0.00017 nfs4client -> nfs4server NFS C 4 (setattr     ) PUTFH FH=C2F9 
SETATTR ST=SPC0 GETATTR 10011a b0a23a 
 29   0.00026 nfs4server -> nfs4client NFS C CB4 (cb_recall) CBID=1073741825 
CB_RECALL FH=C2F9 ST=18B9:0 TR=F 
 30   0.00014 nfs4client -> nfs4server NFS R CB4 (cb_recall) NFS4_OK CB_RECALL 
NFS4_OK 
 31   0.05435 nfs4server -> nfs4client TCP D=997 S=2049 Ack=1964998676 
Seq=3639481153 Len=0 Win=49640
 32   0.00004 nfs4server -> nfs4client TCP D=46624 S=57992 Ack=1965079760 
Seq=3639677288 Len=0 Win=49640
 33  40.03157 nfs4client -> nfs4server NFS C 4 (renew       ) RENEW 
CL=8f477b7ccf 
 34   0.00030 nfs4server -> nfs4client NFS R 4 (renew       ) NFS4_OK RENEW 
NFS4_OK 
 35   0.05962 nfs4client -> nfs4server TCP D=2049 S=997 Ack=3639481213 
Seq=1964998784 Len=0 Win=49640
 36  41.93759 nfs4client -> nfs4server NFS C 4 (renew       ) RENEW 
CL=8f477b7ccf 
 37   0.00029 nfs4server -> nfs4client NFS R 4 (renew       ) NFS4_OK RENEW 
NFS4_OK 
 38   0.05965 nfs4client -> nfs4server TCP D=2049 S=997 Ack=3639481273 
Seq=1964998892 Len=0 Win=49640
 39   7.94707 nfs4server -> nfs4client NFS C CB4 (cb_recall) CBID=1073741825 
CB_RECALL FH=C2F9 ST=18B9:0 TR=F 
 40   0.00022 nfs4client -> nfs4server NFS R CB4 (cb_recall) NFS4_OK CB_RECALL 
NFS4_OK 
 41   0.05962 nfs4server -> nfs4client TCP D=46624 S=57992 Ack=1965079820 
Seq=3639677452 Len=0 Win=49640
 42  31.30150 nfs4client -> nfs4server NIS C MATCH www.opensolaris.org in 
ipnodes.byname
 43   0.00086 nfs4server -> nfs4client NIS R MATCH No more entries
 44   0.00590 nfs4server -> nfs4client RPC R XID=1198815295 Success
 45   1.67215 nfs4client -> nfs4server NIS C MATCH sunopensolaris.112.2o7.net 
in ipnodes.byname
 46   0.00476 nfs4server -> nfs4client NIS R MATCH No such key
 47   0.94554 nfs4client -> nfs4server NFS C 4 (renew       ) RENEW 
CL=8f477b7ccf 
 48   0.00031 nfs4server -> nfs4client NFS R 4 (renew       ) NFS4_OK RENEW 
NFS4_OK 
 49   0.05960 nfs4client -> nfs4server TCP D=2049 S=997 Ack=3639481333 
Seq=1964999000 Len=0 Win=49640
 50  39.93862 nfs4client -> nfs4server NIS C MATCH imap in ipnodes.byname
 51   0.00483 nfs4server -> nfs4client NIS R MATCH No such key
 52   0.00046 nfs4client -> nfs4server NIS C MATCH imap in ipnodes.byname
 53   0.00037 nfs4server -> nfs4client NIS R MATCH No such key
 54   0.00014 nfs4client -> nfs4server NIS C MATCH imap in hosts.byname
 55   0.00030 nfs4server -> nfs4client NIS R MATCH OK
 56   1.99283 nfs4client -> nfs4server NFS C 4 (renew       ) RENEW 
CL=8f477b7ccf 
 57   0.00031 nfs4server -> nfs4client NFS R 4 (renew       ) NFS4_OK RENEW 
NFS4_OK 
 58   0.05963 nfs4client -> nfs4server TCP D=2049 S=997 Ack=3639481393 
Seq=1964999108 Len=0 Win=49640
 59   4.61004 nfs4client -> nfs4server NIS C MATCH jk in passwd.byname
 60   0.00051 nfs4server -> nfs4client NIS R MATCH OK
 61   9.23876 nfs4client -> nfs4server NFS C 4 (setattr     ) PUTFH FH=C2F9 
SETATTR ST=SPC0 GETATTR 10011a b0a23a  (retransmit)
 62   0.05833 nfs4server -> nfs4client TCP D=997 S=2049 Ack=1964999368 
Seq=3639481393 Len=0 Win=49640
 63   0.06279 nfs4server -> nfs4client NFS R 4 (setattr     ) NFS4_OK PUTFH 
NFS4_OK SETATTR 0 410000 GETATTR NFS4_OK 
 64   0.00020 nfs4client -> nfs4server NFS C 4 (delegreturn ) PUTFH FH=C2F9 
GETATTR 10011a b0a23a DELEGRETURN DST=18B9:0 
 65   0.00021 nfs4server -> nfs4client NFS R 4 (delegreturn ) 
NFS4ERR_BAD_STATEID PUTFH NFS4_OK GETATTR NFS4_OK DELEGRETURN 
NFS4ERR_BAD_STATEID 
 66   0.00103 nfs4client -> nfs4server NIS C MATCH inbox in auto.home
 67   0.00057 nfs4server -> nfs4client NIS R MATCH OK
 68   0.00094 nfs4client -> nfs4server NIS C MATCH imap in ipnodes.byname
 69   0.00324 nfs4server -> nfs4client NIS R MATCH No such key
 70   0.00100 nfs4client -> nfs4server NIS C MATCH imap in ipnodes.byname
 71   0.00038 nfs4server -> nfs4client NIS R MATCH No such key
 72   0.02302 nfs4client -> nfs4server NIS C MATCH tiger2 in hosts.byname
 73   0.00028 nfs4server -> nfs4client NIS R MATCH OK
 74   0.02782 nfs4client -> nfs4server TCP D=2049 S=997 Ack=3639481893 
Seq=1964999580 Len=0 Win=49640
 75  27.90841 nfs4client -> nfs4server NFS C 4 (renew       ) RENEW 
CL=8f477b7ccf 
 76   0.00023 nfs4server -> nfs4client NFS R 4 (renew       ) NFS4_OK RENEW 
NFS4_OK 
 77   0.05969 nfs4client -> nfs4server TCP D=2049 S=997 Ack=3639481953 
Seq=1964999688 Len=0 Win=49640


Problem seems to start with the (setattr) packet #28, which doesn't
get a reply from the server until the client retransmits (packet #61/#63).
Instead of a reply for packet#28, the nfs4 server is sending a
(cb_recall) packet #29 to the nfs4 client (to revoke the read delegation?),
but the client doesn't send the (delegreturn) until packet #64

The (delegreturn) seems to be delayed on the client, because the
thread executing the nfs4delegreturn_impl() function is stuck in
usr/src/uts/common/fs/nfs/nfs4_callback.c, with one reader blocking
the r_deleg_recall_lock:

http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/fs/nfs/nfs4_callback.c#1633
  1633          /*
  1634           * Take r_deleg_recall_lock in WRITE mode, this will prevent
  1635           * nfs4_is_otw_open_necessary from trying to use the delegation
  1636           * while the DELEGRETURN is in progress.
  1637           */
  1638          (void) nfs_rw_enter_sig(&rp->r_deleg_recall_lock, RW_WRITER, 
FALSE);




Can anyone reproduce this?
 
 
This message posted from opensolaris.org

Reply via email to