From 27adb21b22d63b5ea6777595cb61e8bb20967225 Mon Sep 17 00:00:00 2001 From: "Rob Swindell (on Debian Linux)" <rob@synchro.net> Date: Wed, 1 Jan 2025 03:42:43 -0800 Subject: [PATCH] Insure FILE_RETRY_DELAY before lock retries --- src/sbbs3/getnode.cpp | 6 ++++-- src/sbbs3/putnode.cpp | 14 +++++++------- src/sbbs3/userdat.c | 3 ++- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/sbbs3/getnode.cpp b/src/sbbs3/getnode.cpp index 475e59fda4..0d2eda66d5 100644 --- a/src/sbbs3/getnode.cpp +++ b/src/sbbs3/getnode.cpp @@ -56,6 +56,8 @@ bool sbbs_t::getnodedat(uint number, node_t *node, bool lockit) utime(str,NULL); /* NFS fix... utime() forces a cache refresh */ #endif for(count=0;count<LOOP_NODEDAB;count++) { + if(count > 0) + FILE_RETRY_DELAY(count + 1); if(lockit && lock(nodefile, nodedatoffset(number), sizeof(node_t))!=0) { unlock(nodefile, nodedatoffset(number), sizeof(node_t)); continue; @@ -67,7 +69,6 @@ bool sbbs_t::getnodedat(uint number, node_t *node, bool lockit) if(rd==sizeof(node_t)) break; } - FILE_RETRY_DELAY(count + 1); } if(!lockit && cfg.node_misc&NM_CLOSENODEDAB) { close(nodefile); @@ -289,6 +290,8 @@ bool sbbs_t::getnodeext(uint number, char *ext) number--; /* make zero based */ for(count=0;count<LOOP_NODEDAB;count++) { + if(count > 0) + FILE_RETRY_DELAY(count + 1); if(lock(node_ext,(long)number*128L,128)!=0) continue; lseek(node_ext,(long)number*128L,SEEK_SET); @@ -296,7 +299,6 @@ bool sbbs_t::getnodeext(uint number, char *ext) unlock(node_ext,(long)number*128L,128); if(rd==128) break; - FILE_RETRY_DELAY(count + 1); } close(node_ext); node_ext=-1; diff --git a/src/sbbs3/putnode.cpp b/src/sbbs3/putnode.cpp index 4ebb40427a..8f579bc5a1 100644 --- a/src/sbbs3/putnode.cpp +++ b/src/sbbs3/putnode.cpp @@ -118,12 +118,12 @@ bool sbbs_t::putnodeext(uint number, char *ext) } for(count=0;count<LOOP_NODEDAB;count++) { lseek(node_ext,(long)number*128L,SEEK_SET); - if(lock(node_ext,(long)number*128L,128)==-1) - continue; - wr=write(node_ext,ext,128); - unlock(node_ext,(long)number*128L,128); - if(wr==128) - break; + if(lock(node_ext,(long)number*128L,128) == 0) { + wr=write(node_ext,ext,128); + unlock(node_ext,(long)number*128L,128); + if(wr==128) + break; + } FILE_RETRY_DELAY(count + 1); } close(node_ext); @@ -132,7 +132,7 @@ bool sbbs_t::putnodeext(uint number, char *ext) if(count>(LOOP_NODEDAB/2) && count!=LOOP_NODEDAB) { snprintf(str, sizeof str, "NODE.EXB (node %d) COLLISION - Count: %d" ,number+1, count); - logline(LOG_NOTICE,"!!",str); + logline(LOG_NOTICE,"!!",str); } if(count==LOOP_NODEDAB) { errormsg(WHERE,ERR_WRITE,"NODE.EXB",number+1); diff --git a/src/sbbs3/userdat.c b/src/sbbs3/userdat.c index 42c6ab0a83..a714487664 100644 --- a/src/sbbs3/userdat.c +++ b/src/sbbs3/userdat.c @@ -1149,6 +1149,8 @@ int getnodedat(scfg_t* cfg, uint number, node_t *node, bool lockit, int* fdp) int result = USER_SIZE_ERROR; if(filelength(file)>=(long)(number*sizeof(node_t))) { for(count=0;count<LOOP_NODEDAB;count++) { + if(count > 0) + FILE_RETRY_DELAY(count + 1); if(!seeknodedat(file, number)) { result = USER_SEEK_ERROR; continue; @@ -1166,7 +1168,6 @@ int getnodedat(scfg_t* cfg, uint number, node_t *node, bool lockit, int* fdp) result = USER_SUCCESS; break; } - FILE_RETRY_DELAY(count + 1); } } -- GitLab