]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Optimize deferred allocation of pages on this branch by avoiding BTALLOC_LE.
authordan <Dan Kennedy>
Mon, 11 Nov 2024 18:11:34 +0000 (18:11 +0000)
committerdan <Dan Kennedy>
Mon, 11 Nov 2024 18:11:34 +0000 (18:11 +0000)
FossilOrigin-Name: 0812161025272851af6233f183a6abdee5c583decc688c4763965b50e7ab1b9d

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

index 1051ac17bdb66112e47a11cf2af3acb491e19a30..afb9e9f24f17440822e51373241b79fb8db1c8b1 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Update\sthis\sbranch\swith\slatest\schanges\sand\sbuild\ssystem\supdates\sfrom\strunk.
-D 2024-11-11T17:03:07.717
+C Optimize\sdeferred\sallocation\sof\spages\son\sthis\sbranch\sby\savoiding\sBTALLOC_LE.
+D 2024-11-11T18:11:34.465
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -49,7 +49,7 @@ F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1d
 F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f
 F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14
 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba
-F autosetup/proj.tcl 9772d3f89634089add92e2238551a59a5c764d501327f6eb433dca7f98138802 w autosetup/hwaci-common.tcl
+F autosetup/proj.tcl 9772d3f89634089add92e2238551a59a5c764d501327f6eb433dca7f98138802
 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9
 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x
 F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad
@@ -719,7 +719,7 @@ F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc
 F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523
 F src/bitvec.c 501daeef838fa82a9fb53540d72f29e3d9172c8867f1e19f94f681e2e20b966e
 F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
-F src/btree.c ef31e2a2dacc4581b53ac679af2f3e9f8d40bf12999f7a2e62a9296059a77aef
+F src/btree.c 9e32862e7369e8e5ee3f60f084cf40fb41cc1a8ba52a61093d08ecb3f941fd6c
 F src/btree.h df26089b055c4cffe243e5bc98edc729c4ad880bfeb8f229fd16248e4cec10ff
 F src/btreeInt.h 8efd30e75e35a3c6a1c4dad7410d4ddfcd560f5f46401b208fa79eceef34525a
 F src/build.c 196415a804a362dbae6d1939d6b8327d527fe08fb399834191e06d22a33a3aa4
@@ -1031,7 +1031,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
@@ -2215,8 +2215,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P af43791d471c8d09df5cccb413ebcbfcaa234f0ab3d101b10facd32ef1f08a51 b81976c520fbad0bbdbbb877fe85691bcda25c12cf5597cfe224fb6306cd65b3
-R 77211ffd1f96f196f5f7446bb066afc4
+P 52bd7953f1ff26942e6e4227dd112d8454f60a98ef1c5f62ef123085c769069a
+R 51355028405b6ebf515d12a5a6724571
 U dan
-Z 1b3b1af2e13d3cd199003d973ef91f6a
+Z dee158dc87e41100c2ffca6b82aee077
 # Remove this line to create a well-formed Fossil manifest.
index fed2730f3437abeca78188d41b6f42f3c92cf169..d9b063259c7db4190450ab97ed4e6b16507db9a0 100644 (file)
@@ -1 +1 @@
-52bd7953f1ff26942e6e4227dd112d8454f60a98ef1c5f62ef123085c769069a
+0812161025272851af6233f183a6abdee5c583decc688c4763965b50e7ab1b9d
index 16f06db5b28ef12437ba9cd06d42888c7a581b79..e4e28c103388251e39dd93bf189f6497330eca22 100644 (file)
@@ -4569,8 +4569,22 @@ static int btreeRelocateRange(
       if( iNew==PENDING_BYTE_PAGE(pBt) ) iNew = ++(*pnCurrent);
       rc = relocatePage(pBt, pPg, pEntry->eType, pEntry->parent, iNew, 1);
       releasePageNotNull(pPg);
-    }else{
-      rc = allocateBtreePage(pBt, &pFree, &iNew, iFirst-1, BTALLOC_LE);
+    }else if( pEntry->eType!=0 ){
+
+      /* 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 );
+
       assert( rc!=SQLITE_OK || iNew<iFirst );
       if( rc==SQLITE_OK ){
         releasePage(pFree);
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
 
+