From: shane Date: Thu, 31 Jul 2008 01:34:34 +0000 (+0000) Subject: Improved retry logic for winDelete() when in "pending delete" state. (CVS 5505) X-Git-Tag: version-3.6.10~672 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3582c5a98ca15325f37d5e3cd423c2a61d6b0616;p=thirdparty%2Fsqlite.git Improved retry logic for winDelete() when in "pending delete" state. (CVS 5505) FossilOrigin-Name: 03a7973477b419d21c3b2925aa90efb05ff64ef9 --- diff --git a/manifest b/manifest index f2e8880c8e..a43688b953 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sopening\sa\szero-size\sdatabase\son\sunix,\swrite\sone\sbyte\sinto\sthe\sfile\sbefore\ninterrogating\sthe\sinode\snumber.\s\sThis\sworks\saround\sissues\swith\smsdos\nfilesystems\smounted\son\sOS-X.\s\sTicket\s#3260.\s(CVS\s5504) -D 2008-07-30T17:28:04 +C Improved\sretry\slogic\sfor\swinDelete()\swhen\sin\s"pending\sdelete"\sstate.\s(CVS\s5505) +D 2008-07-31T01:34:34 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in bbb62eecc851379aef5a48a1bf8787eb13e6ec06 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -134,7 +134,7 @@ F src/os.h ef8abeb9afc694b82dbd169a91c9b7e26db3c892 F src/os_common.h 24525d8b7bce66c374dfc1810a6c9043f3359b60 F src/os_os2.c 676ed273b17bd260f905df81375c9f9950d85517 F src/os_unix.c fe0dbc35bcd3de49e46b132abfc0f45d6dd6a864 -F src/os_win.c 50ec783403b418ddc9e6e05d541c6027dfd41070 +F src/os_win.c aefe9ee26430678a19a058a874e4e2bd91398142 F src/pager.c a6ecad26297469a8a3d1fd7a7c3dc2d603955044 F src/pager.h 588c1ac195228b2da45c4e5f7ab6c2fd253d1751 F src/parse.y 5ce0b04d2d35b987ccca8b46cfc2527dd932f040 @@ -614,7 +614,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P db4022db64dc5864e6f1d0a20672183879ad43aa -R 46a59a75e0405426ca6be3fd6558aebe -U drh -Z f2a23010508f2b32889d0e3805823d10 +P a480a8845fb3b49967de0790b30e6250c824b9be +R 7b2f7cd10860e5c19f09f3db17699242 +U shane +Z 43b2cced62bf2bf8c1e2bb2193bc268a diff --git a/manifest.uuid b/manifest.uuid index 813079e027..484e004d99 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a480a8845fb3b49967de0790b30e6250c824b9be \ No newline at end of file +03a7973477b419d21c3b2925aa90efb05ff64ef9 \ No newline at end of file diff --git a/src/os_win.c b/src/os_win.c index 4f710d60ca..e0194d3bd0 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -12,7 +12,7 @@ ** ** This file contains code that is specific to windows. ** -** $Id: os_win.c,v 1.131 2008/07/22 05:32:03 shane Exp $ +** $Id: os_win.c,v 1.132 2008/07/31 01:34:34 shane Exp $ */ #include "sqliteInt.h" #if SQLITE_OS_WIN /* This file is used for windows only */ @@ -1083,7 +1083,7 @@ static int getTempname(int nBuf, char *zBuf){ "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789"; - int i, j; + size_t i, j; char zTempPath[MAX_PATH+1]; if( sqlite3_temp_directory ){ sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", sqlite3_temp_directory); @@ -1288,7 +1288,7 @@ static int winOpen( ** Note that windows does not allow a file to be deleted if some other ** process has it open. Sometimes a virus scanner or indexing program ** will open a journal file shortly after it is created in order to do -** whatever does. While this other process is holding the +** whatever it does. While this other process is holding the ** file open, we will be unable to delete it. To work around this ** problem, we delay 100 milliseconds and try to delete again. Up ** to MX_DELETION_ATTEMPTs deletion attempts are run before giving @@ -1302,6 +1302,7 @@ static int winDelete( ){ int cnt = 0; int rc; + DWORD error; void *zConverted = convertUtf8Filename(zFilename); if( zConverted==0 ){ return SQLITE_NOMEM; @@ -1310,17 +1311,22 @@ static int winDelete( if( isNT() ){ do{ DeleteFileW(zConverted); - }while( (rc = GetFileAttributesW(zConverted))!=0xffffffff - && cnt++ < MX_DELETION_ATTEMPTS && (Sleep(100), 1) ); + }while( ( ((rc = GetFileAttributesW(zConverted)) != INVALID_FILE_ATTRIBUTES) + || ((error = GetLastError()) == ERROR_ACCESS_DENIED)) + && (cnt++ < MX_DELETION_ATTEMPTS) + && (Sleep(100), 1) ); }else{ do{ DeleteFileA(zConverted); - }while( (rc = GetFileAttributesA(zConverted))!=0xffffffff - && cnt++ < MX_DELETION_ATTEMPTS && (Sleep(100), 1) ); + }while( ( ((rc = GetFileAttributesA(zConverted)) != INVALID_FILE_ATTRIBUTES) + || ((error = GetLastError()) == ERROR_ACCESS_DENIED)) + && (cnt++ < MX_DELETION_ATTEMPTS) + && (Sleep(100), 1) ); } free(zConverted); OSTRACE2("DELETE \"%s\"\n", zFilename); - return rc==0xffffffff ? SQLITE_OK : SQLITE_IOERR_DELETE; + return ( (rc==INVALID_FILE_ATTRIBUTES) + && (error == ERROR_FILE_NOT_FOUND)) ? SQLITE_OK : SQLITE_IOERR_DELETE; } /*