Whamcloud - gitweb
LU-11478 lnet: misleading discovery seqno. 04/33304/34
authorAmir Shehata <ashehata@whamcloud.com>
Fri, 5 Oct 2018 00:18:20 +0000 (17:18 -0700)
committerAmir Shehata <ashehata@whamcloud.com>
Fri, 7 Jun 2019 18:18:50 +0000 (18:18 +0000)
There is a sequence number used when sending discovery messages. This
sequence number is intended to detect stale messages. However it
could be misleading if the peer reboots. In this case the peer's
sequence number will reset. The node will think that all information
being sent to it is stale, while in reality the peer might've
changed configuration.

There is no reliable why to know whether a peer rebooted, so we'll
always assume that the messages we're receiving are valid. So we'll
operate on first come first serve basis.

Test-Parameters: forbuildonly
Signed-off-by: Amir Shehata <ashehata@whamcloud.com>
Change-Id: I421a00e47bc93ee60fa37c648d6d9a726d9def9c
Reviewed-on: https://review.whamcloud.com/33304
Reviewed-by: Olaf Weber <olaf.weber@hpe.com>
Tested-by: Jenkins
lnet/lnet/peer.c

index 73d86d5..775be5c 100644 (file)
@@ -1994,38 +1994,9 @@ void lnet_peer_push_event(struct lnet_event *ev)
                goto out;
        }
 
-       /*
-        * Check whether the Put data is stale. Stale data can just be
-        * dropped.
-        */
-       if (pbuf->pb_info.pi_nnis > 1 &&
-           lp->lp_primary_nid == pbuf->pb_info.pi_ni[1].ns_nid &&
-           LNET_PING_BUFFER_SEQNO(pbuf) < lp->lp_peer_seqno) {
-               CDEBUG(D_NET, "Stale Push from %s: got %u have %u\n",
-                      libcfs_nid2str(lp->lp_primary_nid),
-                      LNET_PING_BUFFER_SEQNO(pbuf),
-                      lp->lp_peer_seqno);
-               goto out;
-       }
-
-       /*
-        * Check whether the Put data is new, in which case we clear
-        * the UPTODATE flag and prepare to process it.
-        *
-        * If the Put data is current, and the peer is UPTODATE then
-        * we assome everything is all right and drop the data as
-        * stale.
-        */
-       if (LNET_PING_BUFFER_SEQNO(pbuf) > lp->lp_peer_seqno) {
-               lp->lp_peer_seqno = LNET_PING_BUFFER_SEQNO(pbuf);
-               lp->lp_state &= ~LNET_PEER_NIDS_UPTODATE;
-       } else if (lp->lp_state & LNET_PEER_NIDS_UPTODATE) {
-               CDEBUG(D_NET, "Stale Push from %s: got %u have %u\n",
-                      libcfs_nid2str(lp->lp_primary_nid),
-                      LNET_PING_BUFFER_SEQNO(pbuf),
-                      lp->lp_peer_seqno);
-               goto out;
-       }
+       /* always assume new data */
+       lp->lp_peer_seqno = LNET_PING_BUFFER_SEQNO(pbuf);
+       lp->lp_state &= ~LNET_PEER_NIDS_UPTODATE;
 
        /*
         * If there is data present that hasn't been processed yet,
@@ -2310,16 +2281,13 @@ lnet_discovery_event_reply(struct lnet_peer *lp, struct lnet_event *ev)
        if (pbuf->pb_info.pi_features & LNET_PING_FEAT_MULTI_RAIL &&
            pbuf->pb_info.pi_nnis > 1 &&
            lp->lp_primary_nid == pbuf->pb_info.pi_ni[1].ns_nid) {
-               if (LNET_PING_BUFFER_SEQNO(pbuf) < lp->lp_peer_seqno) {
-                       CDEBUG(D_NET, "Stale Reply from %s: got %u have %u\n",
+               if (LNET_PING_BUFFER_SEQNO(pbuf) < lp->lp_peer_seqno)
+                       CDEBUG(D_NET, "peer %s: seq# got %u have %u. peer rebooted?\n",
                                libcfs_nid2str(lp->lp_primary_nid),
                                LNET_PING_BUFFER_SEQNO(pbuf),
                                lp->lp_peer_seqno);
-                       goto out;
-               }
 
-               if (LNET_PING_BUFFER_SEQNO(pbuf) > lp->lp_peer_seqno)
-                       lp->lp_peer_seqno = LNET_PING_BUFFER_SEQNO(pbuf);
+               lp->lp_peer_seqno = LNET_PING_BUFFER_SEQNO(pbuf);
        }
 
        /* We're happy with the state of the data in the buffer. */