Always verify that the client is fully reachable before talking
authorNickolai Zeldovich <kolya@mit.edu>
Fri, 22 Feb 2002 08:58:20 +0000 (08:58 +0000)
committerNickolai Zeldovich <kolya@mit.edu>
Fri, 22 Feb 2002 08:58:20 +0000 (08:58 +0000)
to it, in the fileserver.  This prevents some additional lossage
cases with poorly-connected clients.

Disable same feature for other Rx services, since they don't
need to incur extra RTT delay.

src/rx/rx.c
src/rx/rx.h
src/viced/viced.c

index 166f38a..c64bb10 100644 (file)
@@ -1248,6 +1248,7 @@ rx_NewService(port, serviceId, serviceName, securityObjects,
            service->idleDeadTime = 60;
            service->connDeadTime = rx_connDeadTime;
            service->executeRequestProc = serviceProc;
+           service->checkReach = 0;
            rx_services[i] = service;   /* not visible until now */
            AFS_RXGUNLOCK();
            USERPRI;
@@ -2919,12 +2920,8 @@ static int rxi_CheckConnReach(conn, call)
     struct rx_peer *peer = conn->peer;
     afs_uint32 now, lastReach;
 
-    MUTEX_ENTER(&rx_serverPool_lock);
-    if (service->nRequestsRunning <= service->maxProcs/2) {
-       MUTEX_EXIT(&rx_serverPool_lock);
+    if (service->checkReach == 0)
        return 0;
-    }
-    MUTEX_EXIT(&rx_serverPool_lock);
 
     now = clock_Sec();
     MUTEX_ENTER(&peer->peer_lock);
index b330565..8cadf0b 100644 (file)
@@ -204,6 +204,9 @@ int ntoh_syserr_conv(int error);
 /* Set the connection dead time for any connections created for this service (server only) */
 #define rx_SetServiceDeadTime(service, seconds) ((service)->secondsUntilDead = (seconds))
 
+/* Enable or disable asymmetric client checking for a service */
+#define rx_SetCheckReach(service, x) ((service)->checkReach = (x))
+
 /* Set connection dead time, for a specific client or server connection */
 extern void rx_SetConnDeadTime();
 
@@ -346,6 +349,7 @@ struct rx_service {
     u_short minProcs;              /* Minimum # of requests guaranteed executable simultaneously */
     u_short connDeadTime;                  /* Seconds until a client of this service will be declared dead, if it is not responding */
     u_short idleDeadTime;                  /* Time a server will wait for I/O to start up again */
+    u_char checkReach;             /* Check for asymmetric clients? */
 };
 
 #endif /* KDUMP_RX_LOCK */
index 8d235b7..69299df 100644 (file)
@@ -488,6 +488,7 @@ main(argc, argv)
     rx_SetDestroyConnProc(tservice, (char (*)()) h_FreeConnection);
     rx_SetMinProcs(tservice, 3);
     rx_SetMaxProcs(tservice, lwps);
+    rx_SetCheckReach(tservice, 1);
 
     tservice = rx_NewService(0,  RX_STATS_SERVICE_ID, "rpcstats", sc, 4, RXSTATS_ExecuteRequest);
     if (!tservice) {