| Index: third_party/sqlite/sqlite-src-3080704/test/tt3_checkpoint.c
|
| diff --git a/third_party/sqlite/sqlite-src-3080704/test/tt3_checkpoint.c b/third_party/sqlite/sqlite-src-3080704/test/tt3_checkpoint.c
|
| deleted file mode 100644
|
| index 3c28f0d3a50ac30241922592b577d5f061b0d18f..0000000000000000000000000000000000000000
|
| --- a/third_party/sqlite/sqlite-src-3080704/test/tt3_checkpoint.c
|
| +++ /dev/null
|
| @@ -1,150 +0,0 @@
|
| -/*
|
| -** 2001 September 15
|
| -**
|
| -** 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 part of the test program "threadtest3". Despite being a C
|
| -** file it is not compiled separately, but included by threadtest3.c using
|
| -** the #include directive normally used with header files.
|
| -**
|
| -** This file contains the implementation of test cases:
|
| -**
|
| -** checkpoint_starvation_1
|
| -** checkpoint_starvation_2
|
| -*/
|
| -
|
| -/*
|
| -** Both test cases involve 1 writer/checkpointer thread and N reader threads.
|
| -**
|
| -** Each reader thread performs a series of read transactions, one after
|
| -** another. Each read transaction lasts for 100 ms.
|
| -**
|
| -** The writer writes transactions as fast as possible. It uses a callback
|
| -** registered with sqlite3_wal_hook() to try to keep the WAL-size limited to
|
| -** around 50 pages.
|
| -**
|
| -** In test case checkpoint_starvation_1, the auto-checkpoint uses
|
| -** SQLITE_CHECKPOINT_PASSIVE. In checkpoint_starvation_2, it uses RESTART.
|
| -** The expectation is that in the first case the WAL file will grow very
|
| -** large, and in the second will be limited to the 50 pages or thereabouts.
|
| -** However, the overall transaction throughput will be lower for
|
| -** checkpoint_starvation_2, as every checkpoint will block for up to 200 ms
|
| -** waiting for readers to clear.
|
| -*/
|
| -
|
| -/* Frame limit used by the WAL hook for these tests. */
|
| -#define CHECKPOINT_STARVATION_FRAMELIMIT 50
|
| -
|
| -/* Duration in ms of each read transaction */
|
| -#define CHECKPOINT_STARVATION_READMS 100
|
| -
|
| -struct CheckpointStarvationCtx {
|
| - int eMode;
|
| - int nMaxFrame;
|
| -};
|
| -typedef struct CheckpointStarvationCtx CheckpointStarvationCtx;
|
| -
|
| -static int checkpoint_starvation_walhook(
|
| - void *pCtx,
|
| - sqlite3 *db,
|
| - const char *zDb,
|
| - int nFrame
|
| -){
|
| - CheckpointStarvationCtx *p = (CheckpointStarvationCtx *)pCtx;
|
| - if( nFrame>p->nMaxFrame ){
|
| - p->nMaxFrame = nFrame;
|
| - }
|
| - if( nFrame>=CHECKPOINT_STARVATION_FRAMELIMIT ){
|
| - sqlite3_wal_checkpoint_v2(db, zDb, p->eMode, 0, 0);
|
| - }
|
| - return SQLITE_OK;
|
| -}
|
| -
|
| -static char *checkpoint_starvation_reader(int iTid, int iArg){
|
| - Error err = {0};
|
| - Sqlite db = {0};
|
| -
|
| - opendb(&err, &db, "test.db", 0);
|
| - while( !timetostop(&err) ){
|
| - i64 iCount1, iCount2;
|
| - sql_script(&err, &db, "BEGIN");
|
| - iCount1 = execsql_i64(&err, &db, "SELECT count(x) FROM t1");
|
| - usleep(CHECKPOINT_STARVATION_READMS*1000);
|
| - iCount2 = execsql_i64(&err, &db, "SELECT count(x) FROM t1");
|
| - sql_script(&err, &db, "COMMIT");
|
| -
|
| - if( iCount1!=iCount2 ){
|
| - test_error(&err, "Isolation failure - %lld %lld", iCount1, iCount2);
|
| - }
|
| - }
|
| - closedb(&err, &db);
|
| -
|
| - print_and_free_err(&err);
|
| - return 0;
|
| -}
|
| -
|
| -static void checkpoint_starvation_main(int nMs, CheckpointStarvationCtx *p){
|
| - Error err = {0};
|
| - Sqlite db = {0};
|
| - Threadset threads = {0};
|
| - int nInsert = 0;
|
| - int i;
|
| -
|
| - opendb(&err, &db, "test.db", 1);
|
| - sql_script(&err, &db,
|
| - "PRAGMA page_size = 1024;"
|
| - "PRAGMA journal_mode = WAL;"
|
| - "CREATE TABLE t1(x);"
|
| - );
|
| -
|
| - setstoptime(&err, nMs);
|
| -
|
| - for(i=0; i<4; i++){
|
| - launch_thread(&err, &threads, checkpoint_starvation_reader, 0);
|
| - usleep(CHECKPOINT_STARVATION_READMS*1000/4);
|
| - }
|
| -
|
| - sqlite3_wal_hook(db.db, checkpoint_starvation_walhook, (void *)p);
|
| - while( !timetostop(&err) ){
|
| - sql_script(&err, &db, "INSERT INTO t1 VALUES(randomblob(1200))");
|
| - nInsert++;
|
| - }
|
| -
|
| - printf(" Checkpoint mode : %s\n",
|
| - p->eMode==SQLITE_CHECKPOINT_PASSIVE ? "PASSIVE" : "RESTART"
|
| - );
|
| - printf(" Peak WAL : %d frames\n", p->nMaxFrame);
|
| - printf(" Transaction count: %d transactions\n", nInsert);
|
| -
|
| - join_all_threads(&err, &threads);
|
| - closedb(&err, &db);
|
| - print_and_free_err(&err);
|
| -}
|
| -
|
| -static void checkpoint_starvation_1(int nMs){
|
| - Error err = {0};
|
| - CheckpointStarvationCtx ctx = { SQLITE_CHECKPOINT_PASSIVE, 0 };
|
| - checkpoint_starvation_main(nMs, &ctx);
|
| - if( ctx.nMaxFrame<(CHECKPOINT_STARVATION_FRAMELIMIT*10) ){
|
| - test_error(&err, "WAL failed to grow - %d frames", ctx.nMaxFrame);
|
| - }
|
| - print_and_free_err(&err);
|
| -}
|
| -
|
| -static void checkpoint_starvation_2(int nMs){
|
| - Error err = {0};
|
| - CheckpointStarvationCtx ctx = { SQLITE_CHECKPOINT_RESTART, 0 };
|
| - checkpoint_starvation_main(nMs, &ctx);
|
| - if( ctx.nMaxFrame>CHECKPOINT_STARVATION_FRAMELIMIT+10 ){
|
| - test_error(&err, "WAL grew too large - %d frames", ctx.nMaxFrame);
|
| - }
|
| - print_and_free_err(&err);
|
| -}
|
| -
|
| -
|
|
|