Hi Minh,

ACK from me.

Best Regards,
ThuanTr

-----Original Message-----
From: Minh Chau <minh.c...@dektech.com.au> 
Sent: Wednesday, October 16, 2019 6:53 PM
To: thuan.t...@dektech.com.au; hans.nordeb...@ericsson.com;
gary....@dektech.com.au; vu.m.ngu...@dektech.com.au
Cc: opensaf-devel@lists.sourceforge.net; Minh Chau
<minh.c...@dektech.com.au>
Subject: [PATCH 1/1] mds: Do not check upper limit of window size [#3100]

According to RFC1982: "Addition of a value outside the range
[0 .. (2^(SERIAL_BITS - 1) - 1)] is undefined.". Mds uses 16 bits for mds
flow control, thus the maximum allowed range of window size is 2^15 - 1 =
32767.
The 'mdstest 27 8' has randomly hit this limitation with the counter errors
that is detected in mds as belog logging:

FCTRL: [me] <-- [node:1001001, ref:2784751213], RcvChkAck[fseq:31067,
chunk:3], sndwnd[acked:31064, send:63850, nacked:1901634],
queue[size:32785], Error[msg disordered]

The fseq should always be less then sndwnd_.send_, hence mds should check
the sender being capable of sending more message only if D = sndwnd_.send_ -
sndwnd_.acked_ < 2^15 - 1 = 32767 If a burst of message is sent, D could be
> 32767, mds in this case should notify the sender try to send again later;
which however could leads to a backward compatibility. For now mds weaken
the windown size verification, only logs a warning and let the transmission
continue.
---
 src/mds/mds_tipc_fctrl_portid.cc | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/mds/mds_tipc_fctrl_portid.cc
b/src/mds/mds_tipc_fctrl_portid.cc
index a9fa7d3..6eae7d4 100644
--- a/src/mds/mds_tipc_fctrl_portid.cc
+++ b/src/mds/mds_tipc_fctrl_portid.cc
@@ -378,7 +378,28 @@ void TipcPortId::ReceiveChunkAck(uint16_t fseq,
uint16_t chksize) {
         txprob_cnt_, (uint8_t)state_);
   }
   // update sender sequence window
-  if (sndwnd_.acked_ < Seq16(fseq) && Seq16(fseq) < sndwnd_.send_) {
+  if (sndwnd_.acked_ < Seq16(fseq)) {
+    // The fseq_ should always be less then sndwnd_.send_, hence
+    // mds should check the sender being capable of sending more
+    // message only if D = sndwnd_.send_ - sndwnd_.acked_ < 2^15 - 1 =
32767
+    // If a burst of message is sent, D could be > 32767
+    // mds in this case should notify the sender try to send again
+    // later; which however could leads to a backward compatibility
+    // For now mds logs a warning and let the transmission continue
+    // (mds could be changed to return try again if it is not a backward
+    // compatibility problem to a specific client.
+    if (Seq16(fseq) >= sndwnd_.send_) {
+      m_MDS_LOG_ERR("FCTRL: [me] <-- [node:%x, ref:%u], "
+          "RcvChkAck[fseq:%u, chunk:%u], "
+          "sndwnd[acked:%u, send:%u, nacked:%" PRIu64 "], "
+          "queue[size:%" PRIu64 "], "
+          "Warning[ack sequence out of window]",
+          id_.node, id_.ref,
+          fseq, chksize,
+          sndwnd_.acked_.v(), sndwnd_.send_.v(), sndwnd_.nacked_space_,
+          sndqueue_.Size());
+    }
+
     m_MDS_LOG_DBG("FCTRL: [me] <-- [node:%x, ref:%u], "
         "RcvChkAck[fseq:%u, chunk:%u], "
         "sndwnd[acked:%u, send:%u, nacked:%" PRIu64 "], "
--
2.7.4




_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to