Re: [PATCH] LMAIL: preventing of excessive hdd access

Stephan Mueller <[email protected]>
Newsgroups gmane.mail.xmail.general
Message-ID <1274892924.30052.467.camel@tauon>
Sorry, another patch as the previous one omitted a sanity check that the
first patch had included.

The attached patch now has everything. It works on my system.

Ciao
Stephan

Am Mittwoch, den 26.05.2010, 13:35 +0200 schrieb Stephan Mueller:
> An update of the patch: I forgot to also close the directory file handle
> which leads to a file descriptor leak.
> 
> Furthermore, I removed the SysRemove() call as I think it is not
> necessary any more - the file is never created if it is not needed. and
> If it is needed, it should not be created.
> 
> Ciao
> Stephan
> 
> Am Mittwoch, den 26.05.2010, 11:42 +0200 schrieb Stephan Mueller:
> > Hi,
> > 
> > please see attached patch for LMAIL. It stops from creating tmp files if
> > there is no need to do so. This prevents excessive hdd access.
> > 
> > Though, there is one very minor issue - maybe you can help me: Since
> > SysRemove(pszSSFileName); is always called it usually calls unlink()
> > which returns in an strace an ENOENT (as the tmp file most of the time
> > does not exist). I think that this issue is negligible. Still, Davide,
> > can you please check whether we can simply remove that SysRemove() call
> > as the tmp file should have never been created with my patch when
> > iFileCount == 0?
> > 
> > Thanks
> > Stephan 
> > 
> > _______________________________________________
> > xmail mailing list
> > [email protected]
> > http://xmailserver.org/mailman/listinfo/xmail
> 
> _______________________________________________
> xmail mailing list
> [email protected]
> http://xmailserver.org/mailman/listinfo/xmail

_______________________________________________
xmail mailing list
[email protected]
http://xmailserver.org/mailman/listinfo/xmail
500-LMAILSrv.patch (text/x-patch, 1.4 KB)
--- LMAILSvr.cpp.orig	2010-05-26 08:49:02.000000000 +0200
+++ LMAILSvr.cpp	2010-05-26 17:09:08.000000000 +0200
@@ -116,6 +116,7 @@
 				 int iMaxSSFileName)
 {
 	char szSpoolDir[SYS_MAX_PATH];
+	FILE *pSSFile = NULL;
 
 	LMAILGetSpoolDir(szSpoolDir, sizeof(szSpoolDir));
 
@@ -129,14 +130,6 @@
 
 	UsrGetTmpFile(NULL, pszSSFileName, iMaxSSFileName);
 
-	FILE *pSSFile = fopen(pszSSFileName, "wb");
-
-	if (pSSFile == NULL) {
-		ErrorPush();
-		RLckUnlockSH(hResLock);
-		return ErrorPop();
-	}
-
 	int iFileCount = 0;
 	char szSpoolFileName[SYS_MAX_PATH];
 	FSCAN_HANDLE hFileScan = MscFirstFile(szSpoolDir, 0, szSpoolFileName,
@@ -149,17 +142,29 @@
 
 			if ((ulHashValue % (unsigned long) pLMAILCfg->lNumThreads) ==
 			    (unsigned long) lThreadId) {
+				if(pSSFile == NULL) {
+					pSSFile = fopen(pszSSFileName, "wb");
+
+					if (pSSFile == NULL) {
+						ErrorPush();
+						MscCloseFindFile(hFileScan);
+						RLckUnlockSH(hResLock);
+						return ErrorPop();
+					}
+				}
+
 				fprintf(pSSFile, "%s\r\n", szSpoolFileName);
 				++iFileCount;
 			}
 		} while (MscNextFile(hFileScan, szSpoolFileName, sizeof(szSpoolFileName)));
 		MscCloseFindFile(hFileScan);
 	}
-	fclose(pSSFile);
+
+	if(pSSFile != NULL)
+		fclose(pSSFile);
 	RLckUnlockSH(hResLock);
 
 	if (iFileCount == 0) {
-		SysRemove(pszSSFileName);
 		SetEmptyString(pszSSFileName);
 
 		ErrSetErrorCode(ERR_NO_LOCAL_SPOOL_FILES);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.