1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-27 20:41:58 +03:00

If a page is made eligible for recycling when more than the configured maximum number of pages are allocated, free it immediately instead of adding it to the LRU list. (CVS 5638)

FossilOrigin-Name: 4b12922dcb4547bf3a7276d0542b2e1d12ad338d
This commit is contained in:
danielk1977
2008-08-29 09:10:02 +00:00
parent 8b213899e8
commit 062d4cb0ae
6 changed files with 234 additions and 15 deletions

144
test/pcache.test Normal file
View File

@ -0,0 +1,144 @@
# 2008 August 29
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
#
# This file is focused on testing the pcache module.
#
# $Id: pcache.test,v 1.1 2008/08/29 09:10:03 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
# The pcache module limits the number of pages available to purgeable
# caches to the sum of the 'cache_size' values for the set of open
# caches. This block of tests, pcache-1.*, test that the library behaves
# corrctly when it is forced to exceed this limit.
#
do_test pcache-1.1 {
db close
pcache_stats
} {current 0 max 0 min 0 recyclable 0}
do_test pcache-1.2 {
sqlite3 db test.db
execsql "PRAGMA cache_size=10"
pcache_stats
} {current 1 max 10 min 10 recyclable 1}
do_test pcache-1.3 {
execsql {
BEGIN;
CREATE TABLE t1(a, b, c);
CREATE TABLE t2(a, b, c);
CREATE TABLE t3(a, b, c);
CREATE TABLE t4(a, b, c);
CREATE TABLE t5(a, b, c);
}
pcache_stats
} {current 6 max 10 min 10 recyclable 0}
do_test pcache-1.4 {
execsql {
CREATE TABLE t6(a, b, c);
CREATE TABLE t7(a, b, c);
CREATE TABLE t8(a, b, c);
CREATE TABLE t9(a, b, c);
}
pcache_stats
} {current 10 max 10 min 10 recyclable 0}
do_test pcache-1.5 {
sqlite3 db2 test.db
execsql "PRAGMA cache_size=10" db2
pcache_stats
} {current 11 max 20 min 20 recyclable 1}
do_test pcache-1.6 {
execsql {
BEGIN;
SELECT * FROM sqlite_master;
} db2
pcache_stats
} {current 11 max 20 min 20 recyclable 0}
# At this point connection db2 has a read lock on the database file and a
# single pinned page in its cache. Connection [db] is holding 10 dirty
# pages. It cannot recycle them because of the read lock held by db2.
#
do_test pcache-1.6 {
execsql {
CREATE INDEX i1 ON t1(a, b);
CREATE INDEX i2 ON t2(a, b);
CREATE INDEX i3 ON t3(a, b);
CREATE INDEX i4 ON t4(a, b);
CREATE INDEX i5 ON t5(a, b);
CREATE INDEX i6 ON t6(a, b);
CREATE INDEX i7 ON t7(a, b);
CREATE INDEX i8 ON t8(a, b);
CREATE INDEX i9 ON t9(a, b);
}
pcache_stats
} {current 20 max 20 min 20 recyclable 0}
do_test pcache-1.7 {
execsql {
CREATE TABLE t10(a, b, c);
}
pcache_stats
} {current 21 max 20 min 20 recyclable 0}
# Rolling back the transaction held by db2 at this point releases a pinned
# page. Because the number of allocated pages is greater than the
# configured maximum, this page should be freed immediately instead of
# recycled.
#
do_test pcache-1.8 {
execsql {ROLLBACK} db2
pcache_stats
} {current 20 max 20 min 20 recyclable 0}
do_test pcache-1.9 {
execsql COMMIT
pcache_stats
} {current 20 max 20 min 20 recyclable 20}
do_test pcache-1.10 {
db2 close
pcache_stats
} {current 10 max 10 min 10 recyclable 10}
do_test pcache-1.11 {
execsql { PRAGMA cache_size = 20 }
pcache_stats
} {current 10 max 20 min 10 recyclable 10}
do_test pcache-1.12 {
execsql {
SELECT * FROM t1 ORDER BY a; SELECT * FROM t1;
SELECT * FROM t2 ORDER BY a; SELECT * FROM t2;
SELECT * FROM t3 ORDER BY a; SELECT * FROM t3;
SELECT * FROM t4 ORDER BY a; SELECT * FROM t4;
SELECT * FROM t5 ORDER BY a; SELECT * FROM t5;
SELECT * FROM t6 ORDER BY a; SELECT * FROM t6;
SELECT * FROM t7 ORDER BY a; SELECT * FROM t7;
SELECT * FROM t8 ORDER BY a; SELECT * FROM t8;
SELECT * FROM t9 ORDER BY a; SELECT * FROM t9;
}
pcache_stats
} {current 19 max 20 min 10 recyclable 19}
do_test pcache-1.13 {
execsql { PRAGMA cache_size = 15 }
pcache_stats
} {current 15 max 15 min 10 recyclable 15}
finish_test