rx: Avoid rxi_Delay on RXS_CheckResponse failure 97/10997/1
authorAndrew Deason <adeason@sinenomine.net>
Fri, 21 Feb 2014 21:30:49 +0000 (15:30 -0600)
committerSimon Wilkinson <sxw@your-file-system.com>
Tue, 1 Apr 2014 21:34:08 +0000 (22:34 +0100)
Currently we rxi_Delay whenever RXS_CheckResponse fails for any
reason. This can result in disastrous performance degradations if a
client keeps sending "bad" responses, since rxi_Delay'ing here will
delay the Rx listener thread. This means we cannot receive any packets
for about a second, which can easily cause us to drop a lot of
incoming packets.

Instead, send the abort after 1 second by scheduling an event. This
will retain existing behavior from the point of view of the client
(it will get the abort after 1 second), but avoids hanging the Rx
listener thread.

FIXES 131802

Change-Id: Id8f9fc46902ae3cf019dd0ece0a96133b9b9d07c

src/rx/rx.c

index 5b1b5e3..5fe3a16 100644 (file)
@@ -4824,13 +4824,12 @@ rxi_ReceiveResponsePacket(struct rx_connection *conn,
     error = RXS_CheckResponse(conn->securityObject, conn, np);
     if (error) {
        /* If the response is invalid, reset the connection, sending
-        * an abort to the peer */
-#ifndef KERNEL
-       rxi_Delay(1);
-#endif
+        * an abort to the peer. Send the abort with a 1 second delay,
+        * to avoid a peer hammering us by constantly recreating a
+        * connection with bad credentials. */
        rxi_ConnectionError(conn, error);
        MUTEX_ENTER(&conn->conn_data_lock);
-       np = rxi_SendConnectionAbort(conn, np, istack, 0);
+       rxi_SendConnectionAbortLater(conn, 1000);
        MUTEX_EXIT(&conn->conn_data_lock);
        return np;
     } else {