From: Jeffrey Altman Date: Tue, 8 Aug 2006 17:39:17 +0000 (+0000) Subject: DEVEL15-windows-restrict-timeouts-to-cifs-20060808 X-Git-Tag: openafs-devel-1_5_6~7 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=27458dd5a4c489aa8fa1b03db5e2a7b3794a94ec;p=packages%2Fo%2Fopenafs.git DEVEL15-windows-restrict-timeouts-to-cifs-20060808 If afsd takes longer than the cifs timeout to complete an operation the cifs client may break the virtual circuit and create a new one. this forces all file handles to be closed and locks to be released. Try to prevent the circuit from being destroyed by allowing the CIFS lanmanworkstation SessTimeout value to enforce upper limits on the Conn and Hard Dead Timeouts. Permit this automatic configuration to be disabled by setting specific configuration values for timeouts in the registry. (cherry picked from commit 09020663fad32a30cec3f425d6dee7807799eadb) --- diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c index f820c6ddb..916501e77 100644 --- a/src/WINNT/afsd/afsd_init.c +++ b/src/WINNT/afsd/afsd_init.c @@ -997,16 +997,6 @@ int afsd_InitCM(char **reasonP) if (rx_enable_process_stats) afsi_log("RX Process Statistics gathering is enabled"); - dummyLen = sizeof(ConnDeadtimeout); - code = RegQueryValueEx(parmKey, "ConnDeadTimeout", NULL, NULL, - (BYTE *) &ConnDeadtimeout, &dummyLen); - afsi_log("ConnDeadTimeout is %d", ConnDeadtimeout); - - dummyLen = sizeof(HardDeadtimeout); - code = RegQueryValueEx(parmKey, "HardDeadTimeout", NULL, NULL, - (BYTE *) &HardDeadtimeout, &dummyLen); - afsi_log("HardDeadTimeout is %d", HardDeadtimeout); - dummyLen = sizeof(DWORD); code = RegQueryValueEx(parmKey, "daemonCheckDownInterval", NULL, NULL, (BYTE *) &dwValue, &dummyLen); diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index aa841e152..3a48feaae 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -20,6 +20,7 @@ #include #include #include +#include osi_rwlock_t cm_connLock; @@ -41,10 +42,11 @@ void cm_PutConn(cm_conn_t *connp) void cm_InitConn(void) { - static osi_once_t once; - long code; - DWORD sessTimeout; - HKEY parmKey; + static osi_once_t once; + long code; + DWORD dwValue; + DWORD dummyLen; + HKEY parmKey; if (osi_Once(&once)) { lock_InitializeRWLock(&cm_connLock, "connection global lock"); @@ -60,25 +62,40 @@ void cm_InitConn(void) 0, KEY_QUERY_VALUE, &parmKey); if (code == ERROR_SUCCESS) { - DWORD dummyLen = sizeof(sessTimeout); + dummyLen = sizeof(DWORD); code = RegQueryValueEx(parmKey, LANMAN_WKS_SESSION_TIMEOUT, NULL, NULL, - (BYTE *) &sessTimeout, &dummyLen); + (BYTE *) &dwValue, &dummyLen); if (code == ERROR_SUCCESS) - { - RDRtimeout = sessTimeout; - } + RDRtimeout = dwValue; + RegCloseKey(parmKey); } - afsi_log("lanmanworkstation : SessTimeout %d", sessTimeout); - if ( ConnDeadtimeout < RDRtimeout + 15 ) { - ConnDeadtimeout = RDRtimeout + 15; - afsi_log("ConnDeadTimeout increased to %d", ConnDeadtimeout); - } - if ( HardDeadtimeout < 2 * ConnDeadtimeout ) { - HardDeadtimeout = 2 * ConnDeadtimeout; - afsi_log("HardDeadTimeout increased to %d", HardDeadtimeout); + code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, + 0, KEY_QUERY_VALUE, &parmKey); + if (code == ERROR_SUCCESS) { + dummyLen = sizeof(DWORD); + code = RegQueryValueEx(parmKey, "ConnDeadTimeout", NULL, NULL, + (BYTE *) &dwValue, &dummyLen); + if (code == ERROR_SUCCESS) + ConnDeadtimeout = dwValue; + + dummyLen = sizeof(DWORD); + code = RegQueryValueEx(parmKey, "HardDeadTimeout", NULL, NULL, + (BYTE *) &dwValue, &dummyLen); + if (code == ERROR_SUCCESS) + HardDeadtimeout = dwValue; + afsi_log("HardDeadTimeout is %d", HardDeadtimeout); + RegCloseKey(parmKey); } + afsi_log("lanmanworkstation : SessTimeout %d", RDRtimeout); + if (ConnDeadtimeout == 0) + ConnDeadtimeout = RDRtimeout / 2; + afsi_log("ConnDeadTimeout is %d", ConnDeadtimeout); + if (HardDeadtimeout == 0) + HardDeadtimeout = RDRtimeout; + afsi_log("HardDeadTimeout is %d", HardDeadtimeout); + osi_EndOnce(&once); } } diff --git a/src/WINNT/afsd/cm_conn.h b/src/WINNT/afsd/cm_conn.h index fb4548444..d0cf8ada6 100644 --- a/src/WINNT/afsd/cm_conn.h +++ b/src/WINNT/afsd/cm_conn.h @@ -11,8 +11,8 @@ #define __CM_CONN_H_ENV__ 1 #define CM_CONN_DEFAULTRDRTIMEOUT 45 -#define CM_CONN_CONNDEADTIME 60 -#define CM_CONN_HARDDEADTIME 120 +#define CM_CONN_CONNDEADTIME 0 +#define CM_CONN_HARDDEADTIME 0 extern unsigned short ConnDeadtimeout; extern unsigned short HardDeadtimeout;