Whamcloud - gitweb
b=22556 should check # of remained RPCs before aborting
authorVitaly Fertman <vitaly.fertman@oracle.com>
Tue, 14 Dec 2010 23:00:07 +0000 (02:00 +0300)
committerVitaly Fertman <vitaly.fertman@oracle.com>
Wed, 15 Dec 2010 02:25:02 +0000 (05:25 +0300)
o=liang
i=isaac

lstcon_rpc_trans_postwait() calls lstcon_rpc_trans_abort() only when the
transaction is timeout, so if we got "end_session" to interrupt waiting
on transaction, then we can hit ASSERTION(crpc->crp_stamp != 0).

lnet/selftest/conrpc.c

index e376ce3..94074ae 100644 (file)
@@ -295,8 +295,12 @@ lstcon_rpc_trans_abort(lstcon_rpc_trans_t *trans, int error)
 
                 cfs_spin_lock(&rpc->crpc_lock);
 
-                if (!crpc->crp_posted || crpc->crp_stamp != 0) {
-                        /* rpc done or aborted already */
+                if (!crpc->crp_posted || /* not posted */
+                    crpc->crp_stamp != 0) { /* rpc done or aborted already */
+                        if (crpc->crp_stamp == 0) {
+                                crpc->crp_stamp = cfs_time_current();
+                                crpc->crp_status = -EINTR;
+                        }
                         cfs_spin_unlock(&rpc->crpc_lock);
                         continue;
                 }
@@ -366,7 +370,7 @@ lstcon_rpc_trans_postwait(lstcon_rpc_trans_t *trans, int timeout)
         if (console_session.ses_shutdown)
                 rc = -ESHUTDOWN;
 
-        if (rc != 0) {
+        if (rc != 0 || atomic_read(&trans->tas_remaining) != 0) {
                 /* treat short timeout as canceled */
                 if (rc == -ETIMEDOUT && timeout < LST_TRANS_MIN_TIMEOUT * 2)
                         rc = -EINTR;