]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
WAL runs but quickly deadlocks.
authordrh <drh@noemail.net>
Mon, 31 May 2010 01:41:15 +0000 (01:41 +0000)
committerdrh <drh@noemail.net>
Mon, 31 May 2010 01:41:15 +0000 (01:41 +0000)
FossilOrigin-Name: ace58acbf1fad13d2be96cafebc3a22875098d03

manifest
manifest.uuid
src/os_unix.c
src/wal.c

index 78015b2b1f05723e1bb02ba3b49f5a0bc76afb3a..6065559281a5b80749fdef98fbe9b7de60f56f54 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,8 +1,8 @@
 -----BEGIN PGP SIGNED MESSAGE-----
 Hash: SHA1
 
-C Initial\scode\sfor\sincremental\scheckpoint\sin\sWAL\smode.\s\sThis\scheck-in\scompiles\non\sunix\sand\sruns\sas\slong\sas\syou\sdo\snot\sengage\sWAL\smode.\s\sWAL\smode\scrashes\sand\nburns.\s\sConsider\sthis\scheck-in\sa\sbaseline\simplementation\sfor\sgetting\sthe\snew\ncapability\sup\sand\srunning.
-D 2010-05-30T19:55:16
+C WAL\sruns\sbut\squickly\sdeadlocks.
+D 2010-05-31T01:41:16
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in a5cad1f8f3e021356bfcc6c77dc16f6f1952bbc3
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -155,7 +155,7 @@ F src/os.c 1516984144e26734f97748f891f1a04f9e294c2e
 F src/os.h 6f604986f0ef0ca288c2330b16051ff70b431e8c
 F src/os_common.h a8f95b81eca8a1ab8593d23e94f8a35f35d4078f
 F src/os_os2.c 665876d5eec7585226b0a1cf5e18098de2b2da19
-F src/os_unix.c df0c87b2d55772d55de8158fb43d107d2f7a98a9
+F src/os_unix.c f95ffaf6874cbd3432ffad6fb49c86a084a2db72
 F src/os_win.c 81dd8f5434b3b73b1f1567a784811601b6437ce3
 F src/pager.c f7128f02623beab9462ca6e73516cf73c49186f8
 F src/pager.h 76466c3a5af56943537f68b1f16567101a0cd1d0
@@ -227,7 +227,7 @@ F src/vdbeblob.c 5327132a42a91e8b7acfb60b9d2c3b1c5c863e0e
 F src/vdbemem.c 2a82f455f6ca6f78b59fb312f96054c04ae0ead1
 F src/vdbetrace.c 864cef96919323482ebd9986f2132435115e9cc2
 F src/vtab.c a0f8a40274e4261696ef57aa806de2776ab72cda
-F src/wal.c ef02a5f4d4d652ee4d94ac88822a73a1411d10d6
+F src/wal.c 016ea4ed0323907bc8139622c9dae5ab75ec364c
 F src/wal.h 1c1c9feb629b7f4afcbe0b47f80f47c5551d3a02
 F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f
 F src/where.c 75fee9e255b62f773fcadd1d1f25b6f63ac7a356
@@ -818,18 +818,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
-P e9e5b1001986348ef0f88c19de87b94559a5451e
-R 3cb5cfcba75aef739a2ee45b712a8927
-T *bgcolor * #d0c0ff
-T *branch * wal-incr-ckpt
-T *sym-wal-incr-ckpt *
-T -sym-trunk *
+P ef3ba7a17ff90674d702e5694b9e792851ab6998
+R 651c029120b6d93a925820592e49e0df
 U drh
-Z ed18a54c191ab99d049f2d0a8d31b002
+Z fe262abca6c7606bad6380cede9b085d
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.6 (GNU/Linux)
 
-iD8DBQFMAsKpoxKgR168RlERAvtWAJ99mBxnLNXe1beJRyx/6q6ucCHBKgCfaA4I
-OHb/Ln2lM1z/XtiNWshOkow=
-=bcY+
+iD8DBQFMAxPBoxKgR168RlERAvPlAJ9ajxNPryXB6MLg8ylPwxiINjVplACfZFw5
+H866uySmTIu3rUiQvqGaMCI=
+=yN+5
 -----END PGP SIGNATURE-----
index a92cc2e8889b20a2b398cdb75df5f04cda908f06..a7687e51833c9445e48dc1ab7de64020863c2807 100644 (file)
@@ -1 +1 @@
-ef3ba7a17ff90674d702e5694b9e792851ab6998
\ No newline at end of file
+ace58acbf1fad13d2be96cafebc3a22875098d03
\ No newline at end of file
index cdba3d9f1d2641a02fc4979b5914788c5e26614d..3b33edc93763d9a6eea8cd4fb9d9ac68ea7cab86 100644 (file)
@@ -3180,7 +3180,7 @@ struct unixShm {
 /*
 ** Constants used for locking
 */
-#define UNIX_SHM_BASE      80        /* Byte offset of the first lock byte */
+#define UNIX_SHM_BASE      81        /* Byte offset of the first lock byte */
 #define UNIX_SHM_DMS       80        /* The deadman switch lock */
 
 #ifdef SQLITE_DEBUG
@@ -3241,13 +3241,13 @@ static int unixShmSystemLock(
   assert( n==1 || lockType!=F_RDLCK );
 
   /* Locks are within range */
-  assert( n>=1 && ofst>=0 && ofst+n<SQLITE_SHM_NLOCK );
+  assert( n>=1 && n<SQLITE_SHM_NLOCK );
 
   /* Initialize the locking parameters */
   memset(&f, 0, sizeof(f));
   f.l_type = lockType;
   f.l_whence = SEEK_SET;
-  f.l_start = ofst+UNIX_SHM_BASE;
+  f.l_start = ofst;
   f.l_len = n;
 
   rc = fcntl(pShmNode->h, F_SETLK, &f);
@@ -3621,7 +3621,7 @@ static int unixShmLock(
 
   assert( pShmNode==pDbFd->pInode->pShmNode );
   assert( pShmNode->pInode==pDbFd->pInode );
-  assert( ofst>=0 && ofst+n<SQLITE_SHM_NLOCK );
+  assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK );
   assert( n>=1 );
   assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED)
        || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE)
@@ -3629,7 +3629,7 @@ static int unixShmLock(
        || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) );
   assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 );
 
-  mask = (1<<(ofst+n+1)) - (1<<(ofst+1));
+  mask = (1<<(ofst+n)) - (1<<ofst);
   assert( n>1 || mask==(1<<ofst) );
   sqlite3_mutex_enter(pShmNode->mutex);
   if( flags & SQLITE_SHM_UNLOCK ){
@@ -3644,7 +3644,7 @@ static int unixShmLock(
 
     /* Unlock the system-level locks */
     if( (mask & allMask)==0 ){
-      rc = unixShmSystemLock(pShmNode, F_UNLCK, ofst+1, n);
+      rc = unixShmSystemLock(pShmNode, F_UNLCK, ofst+UNIX_SHM_BASE, n);
     }else{
       rc = SQLITE_OK;
     }
@@ -3673,7 +3673,7 @@ static int unixShmLock(
     /* Get shared locks at the system level, if necessary */
     if( rc==SQLITE_OK ){
       if( (allShared & mask)==0 ){
-        rc = unixShmSystemLock(pShmNode, F_RDLCK, ofst+1, n);
+        rc = unixShmSystemLock(pShmNode, F_RDLCK, ofst+UNIX_SHM_BASE, n);
       }else{
         rc = SQLITE_OK;
       }
@@ -3699,7 +3699,7 @@ static int unixShmLock(
     ** also mark the local connection as being locked.
     */
     if( rc==SQLITE_OK ){
-      rc = unixShmSystemLock(pShmNode, F_WRLCK, ofst+1, n);
+      rc = unixShmSystemLock(pShmNode, F_WRLCK, ofst+UNIX_SHM_BASE, n);
       if( rc==SQLITE_OK ){
         p->sharedMask &= ~mask;
         p->exclMask |= mask;
index 0bdd4adbe1519dbec2e2d18bbe13e44588fe2eb6..0d1d0e42b4d42b7f3408e7bb3235b861f8f3f05c 100644 (file)
--- a/src/wal.c
+++ b/src/wal.c
@@ -1933,6 +1933,7 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal){
   if( rc ){
     return rc;
   }
+  pWal->writeLock = 1;
 
   /* If another connection has written to the database file since the
   ** time the read transaction on this connection was started, then
@@ -1941,10 +1942,12 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal){
   rc = walIndexMap(pWal, pWal->hdr.mxFrame);
   if( rc ){
     walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1);
+    pWal->writeLock = 0;
     return rc;
   }
   if( memcmp(&pWal->hdr, (void*)pWal->pWiData, sizeof(WalIndexHdr))!=0 ){
     walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1);
+    pWal->writeLock = 0;
     walIndexUnmap(pWal);
     return SQLITE_BUSY;
   }
@@ -1968,6 +1971,7 @@ int sqlite3WalBeginWriteTransaction(Wal *pWal){
       walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1);
     }
     walUnlockShared(pWal, WAL_READ_LOCK(0));
+    pWal->readLock = -1;
     do{
       int notUsed;
       rc = walTryBeginRead(pWal, &notUsed, 1);