diff mbox series

[pynfs] Actually reuse the slot only when the sequence op gets an NFS4ERR_DELAY status. Before this patch, any NFS4ERR_DELAY would consume a new slot even when the sequence op was not the culprit.

Message ID 20250410211720.480587-1-bryan@schmersal.org (mailing list archive)
State Handled Elsewhere
Headers show
Series [pynfs] Actually reuse the slot only when the sequence op gets an NFS4ERR_DELAY status. Before this patch, any NFS4ERR_DELAY would consume a new slot even when the sequence op was not the culprit. | expand

Commit Message

bryan@schmersal.org April 10, 2025, 9:17 p.m. UTC
From: Bryan Schmersal <bryan@schmersal.org>

Signed-off-by: Bryan Schmersal <bryan@schmersal.org>
---
 nfs4.1/nfs4client.py | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/nfs4.1/nfs4client.py b/nfs4.1/nfs4client.py
index f4fabcc..a180872 100644
--- a/nfs4.1/nfs4client.py
+++ b/nfs4.1/nfs4client.py
@@ -539,17 +539,21 @@  class SessionRecord(object):
         delay_time = 1
         handle_state_errors = kwargs.pop("handle_state_errors", True)
         saved_kwargs = kwargs
-        slot, seq_op = self._prepare_compound(kwargs)
+        do_prepare = True
         for item in range(max_retries):
+            if do_prepare:
+                slot, seq_op = self._prepare_compound(saved_kwargs)
             res = self.c.compound([seq_op] + ops, **kwargs)
             res = self.update_seq_state(res, slot)
             if res.status != NFS4ERR_DELAY or not handle_state_errors:
                 break
-            if res.resarray[0].sr_status != NFS4ERR_DELAY:
+            if res.resarray[0].sr_status == NFS4ERR_DELAY:
                 # As per errata ID 2006 for RFC 5661 section 15.1.1.3
                 # don't update the slot and sequence ID if the sequence
                 # operation itself receives NFS4ERR_DELAY
-                slot, seq_op = self._prepare_compound(saved_kwargs)
+                do_prepare = False
+            else:
+                do_prepare = True
             time.sleep(delay_time)
         res = self.remove_seq_op(res)
         return res