]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Optimize deferred allocation of pages on this branch by avoiding BTALLOC_LE.
authordan <Dan Kennedy>
Wed, 13 Nov 2024 11:12:30 +0000 (11:12 +0000)
committerdan <Dan Kennedy>
Wed, 13 Nov 2024 11:12:30 +0000 (11:12 +0000)
FossilOrigin-Name: e0c0176793d41bef30e093975a87170981277dac20cde08e0fd3e0b6f40dca2f

manifest
manifest.uuid
src/btree.c
src/wal.c
test/concurrent9.test

index 60629f5ae6edfb071d0b58bdde06304240f5fbef..22d148d76815fc87f9e69a9579896e7ea4f97a35 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Even\smore\sdetailed\slogging\sof\sslow\sCOMMIT\sstatements.
-D 2024-11-08T17:09:34.894
+C Optimize\sdeferred\sallocation\sof\spages\son\sthis\sbranch\sby\savoiding\sBTALLOC_LE.
+D 2024-11-13T11:12:30.936
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -713,7 +713,7 @@ F src/auth.c 4c1ea890e0069ad73bead5d17a5b12c34cfa4f1a24175c8147ea439b64be271c
 F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523
 F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e
 F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
-F src/btree.c 2ec90dfb60fc026d00a2736e0ec6483b5e6759d0809964602773ef4f3c3fd550
+F src/btree.c 68f32f71c33ab571b8d706940108c448e165d0c3d7317a1b5883d2b9dfcf2512
 F src/btree.h bdeeb35614caa33526b603138f04c8d07a3f90a1300b5ade76848b755edf2027
 F src/btreeInt.h caa893e74d2261fb0ff1681fce998533c0552858e882bd04fc6805075f5f6e75
 F src/build.c 08697d6a4df78f8e289582eb58473445492319676f81cc4794ef4056d36ae5fd
@@ -857,7 +857,7 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8
 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
 F src/vtab.c 5fb499d20494b7eecaadb7584634af9afcb374cb0524912b475fcb1712458a1b
 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
-F src/wal.c f7310528e03cdb3a27d945176ea2283d63e5311a7b691e264415f60fc817e52a
+F src/wal.c c5c772a50621548398bff23df38cc338c8b874188d1fa7bf975f3381f6071126
 F src/wal.h 8c59ee7a835574396d7cbd04626d11fd849613e361a46e7e9519091ab03bdb29
 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
 F src/where.c c046dd58c3410f7b7528e1e6317cb876398557bad346d568ed8562321a7d002d
@@ -1034,7 +1034,7 @@ F test/concurrent5.test 5031c87134fee85352ac33ad33c81c6ec4f07d5547fe2429e1d38492
 F test/concurrent6.test a7860e9ca13bb5fb76bcf41c5524fbfa9c37e6e258ecf84ffb5748a272488c67
 F test/concurrent7.test b96fa5c4cfdf8d5c0bc66b6934214500bad0260884a736f054ccc76e81aae85d
 F test/concurrent8.test b93937e74a8efb8b84f2fea7595b53418c5f29777bbe9cbdb5dc219b3dd72a7d
-F test/concurrent9.test 92a7315092e54c7377e58cfce1c158aa55f6915a026aff27da00db088676101b
+F test/concurrent9.test 25b6db3a56ee87208144a3793678d0dce5e10c5a600b1a13d4befb4ef19780c6
 F test/conflict.test b705cddf025a675d3c13d62fa78ab1e2696fb8e07a3d7cccce1596ff8b301492
 F test/conflict2.test 5557909ce683b1073982f5d1b61dfb1d41e369533bfdaf003180c5bc87282dd1
 F test/conflict3.test 81865d9599609aca394fb3b9cd5f561d4729ea5b176bece3644f6ecb540f88ac
@@ -2249,8 +2249,9 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 492a0a85438586a8ccd9629239304f4df3f2c6391ec05dd9837b7a553313d632
-R d991cbdeeb5fc92b3fc69dc783bdecdb
+P 3a45387a09398db8efdb2b6ecd773fa30970e61e5242823e04a2e968d1c93c10
+Q +0812161025272851af6233f183a6abdee5c583decc688c4763965b50e7ab1b9d
+R 608f78f15371bc6bff4085c3bfb99aee
 U dan
-Z 84fadaaa017854e6f13dffb1681bb1d2
+Z 8f96987b0e0c6b3e12665292bbb3a478
 # Remove this line to create a well-formed Fossil manifest.
index 289cd4bd877de2c2713e39bb50dece581a435b50..d3205236c229a1c72ff25a0dad1481dab2f52007 100644 (file)
@@ -1 +1 @@
-3a45387a09398db8efdb2b6ecd773fa30970e61e5242823e04a2e968d1c93c10
+e0c0176793d41bef30e093975a87170981277dac20cde08e0fd3e0b6f40dca2f
index c0ee2a0ca923c62f134097b90354a88e074faf95..941f27910fd286e6f39b06d6d0e75f34b5e3f30f 100644 (file)
@@ -4581,10 +4581,24 @@ static int btreeRelocateRange(
         pBt->aCommitTime[COMMIT_TIME_RELOCATE2_RELOCATEUS] += (sqlite3STimeNow() - t1);
       }
       releasePageNotNull(pPg);
-    }else{
+    }else if( pEntry->eType!=0 ){
       u64 t1;
       if( pBt->aCommitTime ) t1 = sqlite3STimeNow();
-      rc = allocateBtreePage(pBt, &pFree, &iNew, iFirst-1, BTALLOC_LE);
+
+      /* Allocate a new page from the free-list to move page iPg to. 
+      ** Except - if the page allocated is within the range being relocated
+      ** (i.e. pgno>=iFirst), then discard it and allocate another.  */
+      do {
+        rc = allocateBtreePage(pBt, &pFree, &iNew, 0, 0);
+        if( iNew>=iFirst ){
+          assert( sqlite3PagerPageRefcount(pFree->pDbPage)==1 );
+          assert( iNew>iPg );
+          sqlite3PcacheDrop(pFree->pDbPage);
+          pMap->aPtr[iNew - pMap->iFirst].eType = 0;
+          pFree = 0;
+        }
+      }while( pFree==0 );
+
       if( pBt->aCommitTime ){
         pBt->aCommitTime[COMMIT_TIME_RELOCATE2_ALLOCATEUS] += (sqlite3STimeNow() - t1);
       }
index adfd7f4aef06b3c7b4354b18a13e612aa8d3b1a3..6c6219e8139ce1d59eb346a7d79399431fc3683e 100644 (file)
--- a/src/wal.c
+++ b/src/wal.c
@@ -1072,6 +1072,7 @@ static int walIndexPage(
     if( pWal->aCommitTime ){
       pWal->aCommitTime[COMMIT_TIME_HASHMAPUS] += sqlite3STimeNow() - t1;
     }
+    return rc;
   }
   return SQLITE_OK;
 }
index c514f55b7a912705090fa9ce75804ec2bd799915..b7697e6ba29713d9323ad09e01569e656d135673 100644 (file)
@@ -51,5 +51,70 @@ do_execsql_test -db db2  1.4 {
   SELECT * FROM t2;
 } {1 2 3 a b c}
 
+db2 close
+
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 2.1 {
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
+  PRAGMA journal_mode = wal;
+  WITH s(i) AS (
+    SELECT 1 UNION SELECT i+1 FROM s WHERE i<500
+  )
+  INSERT INTO t1(b) SELECT hex(randomblob(200)) FROM s;
+  PRAGMA page_count;
+} {wal 255}
+
+sqlite3 db2 test.db
+do_execsql_test -db db2 2.2 {
+  DELETE FROM t1 WHERE a<100;
+  PRAGMA freelist_count;
+} {49}
+
+do_execsql_test 2.3 {
+  BEGIN CONCURRENT;
+    WITH s(i) AS (
+      SELECT 1 UNION SELECT i+1 FROM s WHERE i<100
+    )
+    INSERT INTO t1(b) SELECT hex(randomblob(200)) FROM s;
+}
+
+sqlite3_db_status db CACHE_MISS 1
+do_execsql_test 2.4.1 {
+  COMMIT;
+}
+
+do_test 2.4.2 {
+  lindex [sqlite3_db_status db CACHE_MISS 0] 1
+} {1}
+
+do_execsql_test -db db2 2.5 {
+  DELETE FROM t1 WHERE a<200;
+  PRAGMA freelist_count;
+} {50}
+
+do_execsql_test 2.6 {
+  BEGIN CONCURRENT;
+    WITH s(i) AS (
+      SELECT 1 UNION SELECT i+1 FROM s WHERE i<100
+    )
+    INSERT INTO t1(b) SELECT hex(randomblob(200)) FROM s;
+    DELETE FROM t1 WHERE rowid BETWEEN 600 AND 680;
+}
+
+sqlite3_db_status db CACHE_MISS 1
+do_execsql_test 2.7.1 {
+  COMMIT;
+}
+do_test 2.7.2 {
+  lindex [sqlite3_db_status db CACHE_MISS 0] 1
+} {1}
+
+do_execsql_test 2.8 {
+  PRAGMA integrity_check;
+} {ok}
+
 finish_test
 
+