/ Hex Artifact Content
Login

Artifact 415eccce672d681b297485fc20f44cdf0eac93af:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ile is part of t
0190: 68 65 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20  he test program 
01a0: 22 74 68 72 65 61 64 74 65 73 74 33 22 2e 20 44  "threadtest3". D
01b0: 65 73 70 69 74 65 20 62 65 69 6e 67 20 61 20 43  espite being a C
01c0: 0a 2a 2a 20 66 69 6c 65 20 69 74 20 69 73 20 6e  .** file it is n
01d0: 6f 74 20 63 6f 6d 70 69 6c 65 64 20 73 65 70 61  ot compiled sepa
01e0: 72 61 74 65 6c 79 2c 20 62 75 74 20 69 6e 63 6c  rately, but incl
01f0: 75 64 65 64 20 62 79 20 74 68 72 65 61 64 74 65  uded by threadte
0200: 73 74 33 2e 63 20 75 73 69 6e 67 0a 2a 2a 20 74  st3.c using.** t
0210: 68 65 20 23 69 6e 63 6c 75 64 65 20 64 69 72 65  he #include dire
0220: 63 74 69 76 65 20 6e 6f 72 6d 61 6c 6c 79 20 75  ctive normally u
0230: 73 65 64 20 77 69 74 68 20 68 65 61 64 65 72 20  sed with header 
0240: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  files..**.** Thi
0250: 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  s file contains 
0260: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
0270: 6f 6e 20 6f 66 20 74 65 73 74 20 63 61 73 65 73  on of test cases
0280: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 68 65 63  :.**.**     chec
0290: 6b 70 6f 69 6e 74 5f 73 74 61 72 76 61 74 69 6f  kpoint_starvatio
02a0: 6e 5f 31 0a 2a 2a 20 20 20 20 20 63 68 65 63 6b  n_1.**     check
02b0: 70 6f 69 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e  point_starvation
02c0: 5f 32 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74  _2.*/../*.** Bot
02d0: 68 20 74 65 73 74 20 63 61 73 65 73 20 69 6e 76  h test cases inv
02e0: 6f 6c 76 65 20 31 20 77 72 69 74 65 72 2f 63 68  olve 1 writer/ch
02f0: 65 63 6b 70 6f 69 6e 74 65 72 20 74 68 72 65 61  eckpointer threa
0300: 64 20 61 6e 64 20 4e 20 72 65 61 64 65 72 20 74  d and N reader t
0310: 68 72 65 61 64 73 2e 0a 2a 2a 20 0a 2a 2a 20 45  hreads..** .** E
0320: 61 63 68 20 72 65 61 64 65 72 20 74 68 72 65 61  ach reader threa
0330: 64 20 70 65 72 66 6f 72 6d 73 20 61 20 73 65 72  d performs a ser
0340: 69 65 73 20 6f 66 20 72 65 61 64 20 74 72 61 6e  ies of read tran
0350: 73 61 63 74 69 6f 6e 73 2c 20 6f 6e 65 20 61 66  sactions, one af
0360: 74 65 72 20 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e  ter .** another.
0370: 20 45 61 63 68 20 72 65 61 64 20 74 72 61 6e 73   Each read trans
0380: 61 63 74 69 6f 6e 20 6c 61 73 74 73 20 66 6f 72  action lasts for
0390: 20 31 30 30 20 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54   100 ms..**.** T
03a0: 68 65 20 77 72 69 74 65 72 20 77 72 69 74 65 73  he writer writes
03b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 73   transactions as
03c0: 20 66 61 73 74 20 61 73 20 70 6f 73 73 69 62 6c   fast as possibl
03d0: 65 2e 20 49 74 20 75 73 65 73 20 61 20 63 61 6c  e. It uses a cal
03e0: 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65  lback.** registe
03f0: 72 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  red with sqlite3
0400: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 74 6f 20 74  _wal_hook() to t
0410: 72 79 20 74 6f 20 6b 65 65 70 20 74 68 65 20 57  ry to keep the W
0420: 41 4c 2d 73 69 7a 65 20 6c 69 6d 69 74 65 64 20  AL-size limited 
0430: 74 6f 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 35 30  to .** around 50
0440: 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e   pages..**.** In
0450: 20 74 65 73 74 20 63 61 73 65 20 63 68 65 63 6b   test case check
0460: 70 6f 69 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e  point_starvation
0470: 5f 31 2c 20 74 68 65 20 61 75 74 6f 2d 63 68 65  _1, the auto-che
0480: 63 6b 70 6f 69 6e 74 20 75 73 65 73 20 0a 2a 2a  ckpoint uses .**
0490: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
04a0: 4e 54 5f 50 41 53 53 49 56 45 2e 20 49 6e 20 63  NT_PASSIVE. In c
04b0: 68 65 63 6b 70 6f 69 6e 74 5f 73 74 61 72 76 61  heckpoint_starva
04c0: 74 69 6f 6e 5f 32 2c 20 69 74 20 75 73 65 73 20  tion_2, it uses 
04d0: 52 45 53 54 41 52 54 2e 0a 2a 2a 20 54 68 65 20  RESTART..** The 
04e0: 65 78 70 65 63 74 61 74 69 6f 6e 20 69 73 20 74  expectation is t
04f0: 68 61 74 20 69 6e 20 74 68 65 20 66 69 72 73 74  hat in the first
0500: 20 63 61 73 65 20 74 68 65 20 57 41 4c 20 66 69   case the WAL fi
0510: 6c 65 20 77 69 6c 6c 20 67 72 6f 77 20 76 65 72  le will grow ver
0520: 79 20 0a 2a 2a 20 6c 61 72 67 65 2c 20 61 6e 64  y .** large, and
0530: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 77   in the second w
0540: 69 6c 6c 20 62 65 20 6c 69 6d 69 74 65 64 20 74  ill be limited t
0550: 6f 20 74 68 65 20 35 30 20 70 61 67 65 73 20 6f  o the 50 pages o
0560: 72 20 74 68 65 72 65 61 62 6f 75 74 73 2e 0a 2a  r thereabouts..*
0570: 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 6f  * However, the o
0580: 76 65 72 61 6c 6c 20 74 72 61 6e 73 61 63 74 69  verall transacti
0590: 6f 6e 20 74 68 72 6f 75 67 68 70 75 74 20 77 69  on throughput wi
05a0: 6c 6c 20 62 65 20 6c 6f 77 65 72 20 66 6f 72 20  ll be lower for 
05b0: 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 5f 73  .** checkpoint_s
05c0: 74 61 72 76 61 74 69 6f 6e 5f 32 2c 20 61 73 20  tarvation_2, as 
05d0: 65 76 65 72 79 20 63 68 65 63 6b 70 6f 69 6e 74  every checkpoint
05e0: 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 66 6f 72 20   will block for 
05f0: 75 70 20 74 6f 20 32 30 30 20 6d 73 0a 2a 2a 20  up to 200 ms.** 
0600: 77 61 69 74 69 6e 67 20 66 6f 72 20 72 65 61 64  waiting for read
0610: 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 2a 2f  ers to clear..*/
0620: 0a 0a 2f 2a 20 46 72 61 6d 65 20 6c 69 6d 69 74  ../* Frame limit
0630: 20 75 73 65 64 20 62 79 20 74 68 65 20 57 41 4c   used by the WAL
0640: 20 68 6f 6f 6b 20 66 6f 72 20 74 68 65 73 65 20   hook for these 
0650: 74 65 73 74 73 2e 20 2a 2f 0a 23 64 65 66 69 6e  tests. */.#defin
0660: 65 20 43 48 45 43 4b 50 4f 49 4e 54 5f 53 54 41  e CHECKPOINT_STA
0670: 52 56 41 54 49 4f 4e 5f 46 52 41 4d 45 4c 49 4d  RVATION_FRAMELIM
0680: 49 54 20 35 30 0a 0a 2f 2a 20 44 75 72 61 74 69  IT 50../* Durati
0690: 6f 6e 20 69 6e 20 6d 73 20 6f 66 20 65 61 63 68  on in ms of each
06a0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
06b0: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  n */.#define CHE
06c0: 43 4b 50 4f 49 4e 54 5f 53 54 41 52 56 41 54 49  CKPOINT_STARVATI
06d0: 4f 4e 5f 52 45 41 44 4d 53 20 20 20 20 31 30 30  ON_READMS    100
06e0: 0a 0a 73 74 72 75 63 74 20 43 68 65 63 6b 70 6f  ..struct Checkpo
06f0: 69 6e 74 53 74 61 72 76 61 74 69 6f 6e 43 74 78  intStarvationCtx
0700: 20 7b 0a 20 20 69 6e 74 20 65 4d 6f 64 65 3b 0a   {.  int eMode;.
0710: 20 20 69 6e 74 20 6e 4d 61 78 46 72 61 6d 65 3b    int nMaxFrame;
0720: 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  .};.typedef stru
0730: 63 74 20 43 68 65 63 6b 70 6f 69 6e 74 53 74 61  ct CheckpointSta
0740: 72 76 61 74 69 6f 6e 43 74 78 20 43 68 65 63 6b  rvationCtx Check
0750: 70 6f 69 6e 74 53 74 61 72 76 61 74 69 6f 6e 43  pointStarvationC
0760: 74 78 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  tx;..static int 
0770: 63 68 65 63 6b 70 6f 69 6e 74 5f 73 74 61 72 76  checkpoint_starv
0780: 61 74 69 6f 6e 5f 77 61 6c 68 6f 6f 6b 28 0a 20  ation_walhook(. 
0790: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
07a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
07b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
07c0: 20 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 0a 29   .  int nFrame.)
07d0: 7b 0a 20 20 43 68 65 63 6b 70 6f 69 6e 74 53 74  {.  CheckpointSt
07e0: 61 72 76 61 74 69 6f 6e 43 74 78 20 2a 70 20 3d  arvationCtx *p =
07f0: 20 28 43 68 65 63 6b 70 6f 69 6e 74 53 74 61 72   (CheckpointStar
0800: 76 61 74 69 6f 6e 43 74 78 20 2a 29 70 43 74 78  vationCtx *)pCtx
0810: 3b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 70  ;.  if( nFrame>p
0820: 2d 3e 6e 4d 61 78 46 72 61 6d 65 20 29 7b 0a 20  ->nMaxFrame ){. 
0830: 20 20 20 70 2d 3e 6e 4d 61 78 46 72 61 6d 65 20     p->nMaxFrame 
0840: 3d 20 6e 46 72 61 6d 65 3b 0a 20 20 7d 0a 20 20  = nFrame;.  }.  
0850: 69 66 28 20 6e 46 72 61 6d 65 3e 3d 43 48 45 43  if( nFrame>=CHEC
0860: 4b 50 4f 49 4e 54 5f 53 54 41 52 56 41 54 49 4f  KPOINT_STARVATIO
0870: 4e 5f 46 52 41 4d 45 4c 49 4d 49 54 20 29 7b 0a  N_FRAMELIMIT ){.
0880: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
0890: 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62  checkpoint_v2(db
08a0: 2c 20 7a 44 62 2c 20 70 2d 3e 65 4d 6f 64 65 2c  , zDb, p->eMode,
08b0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
08c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
08d0: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
08e0: 63 68 65 63 6b 70 6f 69 6e 74 5f 73 74 61 72 76  checkpoint_starv
08f0: 61 74 69 6f 6e 5f 72 65 61 64 65 72 28 69 6e 74  ation_reader(int
0900: 20 69 54 69 64 2c 20 69 6e 74 20 69 41 72 67 29   iTid, int iArg)
0910: 7b 0a 20 20 45 72 72 6f 72 20 65 72 72 20 3d 20  {.  Error err = 
0920: 7b 30 7d 3b 0a 20 20 53 71 6c 69 74 65 20 64 62  {0};.  Sqlite db
0930: 20 3d 20 7b 30 7d 3b 0a 0a 20 20 6f 70 65 6e 64   = {0};..  opend
0940: 62 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74 65  b(&err, &db, "te
0950: 73 74 2e 64 62 22 2c 20 30 29 3b 0a 20 20 77 68  st.db", 0);.  wh
0960: 69 6c 65 28 20 21 74 69 6d 65 74 6f 73 74 6f 70  ile( !timetostop
0970: 28 26 65 72 72 29 20 29 7b 0a 20 20 20 20 69 36  (&err) ){.    i6
0980: 34 20 69 43 6f 75 6e 74 31 2c 20 69 43 6f 75 6e  4 iCount1, iCoun
0990: 74 32 3b 0a 20 20 20 20 73 71 6c 5f 73 63 72 69  t2;.    sql_scri
09a0: 70 74 28 26 65 72 72 2c 20 26 64 62 2c 20 22 42  pt(&err, &db, "B
09b0: 45 47 49 4e 22 29 3b 0a 20 20 20 20 69 43 6f 75  EGIN");.    iCou
09c0: 6e 74 31 20 3d 20 65 78 65 63 73 71 6c 5f 69 36  nt1 = execsql_i6
09d0: 34 28 26 65 72 72 2c 20 26 64 62 2c 20 22 53 45  4(&err, &db, "SE
09e0: 4c 45 43 54 20 63 6f 75 6e 74 28 78 29 20 46 52  LECT count(x) FR
09f0: 4f 4d 20 74 31 22 29 3b 0a 20 20 20 20 75 73 6c  OM t1");.    usl
0a00: 65 65 70 28 43 48 45 43 4b 50 4f 49 4e 54 5f 53  eep(CHECKPOINT_S
0a10: 54 41 52 56 41 54 49 4f 4e 5f 52 45 41 44 4d 53  TARVATION_READMS
0a20: 2a 31 30 30 30 29 3b 0a 20 20 20 20 69 43 6f 75  *1000);.    iCou
0a30: 6e 74 32 20 3d 20 65 78 65 63 73 71 6c 5f 69 36  nt2 = execsql_i6
0a40: 34 28 26 65 72 72 2c 20 26 64 62 2c 20 22 53 45  4(&err, &db, "SE
0a50: 4c 45 43 54 20 63 6f 75 6e 74 28 78 29 20 46 52  LECT count(x) FR
0a60: 4f 4d 20 74 31 22 29 3b 0a 20 20 20 20 73 71 6c  OM t1");.    sql
0a70: 5f 73 63 72 69 70 74 28 26 65 72 72 2c 20 26 64  _script(&err, &d
0a80: 62 2c 20 22 43 4f 4d 4d 49 54 22 29 3b 0a 0a 20  b, "COMMIT");.. 
0a90: 20 20 20 69 66 28 20 69 43 6f 75 6e 74 31 21 3d     if( iCount1!=
0aa0: 69 43 6f 75 6e 74 32 20 29 7b 0a 20 20 20 20 20  iCount2 ){.     
0ab0: 20 74 65 73 74 5f 65 72 72 6f 72 28 26 65 72 72   test_error(&err
0ac0: 2c 20 22 49 73 6f 6c 61 74 69 6f 6e 20 66 61 69  , "Isolation fai
0ad0: 6c 75 72 65 20 2d 20 25 6c 6c 64 20 25 6c 6c 64  lure - %lld %lld
0ae0: 22 2c 20 69 43 6f 75 6e 74 31 2c 20 69 43 6f 75  ", iCount1, iCou
0af0: 6e 74 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nt2);.    }.  }.
0b00: 20 20 63 6c 6f 73 65 64 62 28 26 65 72 72 2c 20    closedb(&err, 
0b10: 26 64 62 29 3b 0a 0a 20 20 70 72 69 6e 74 5f 61  &db);..  print_a
0b20: 6e 64 5f 66 72 65 65 5f 65 72 72 28 26 65 72 72  nd_free_err(&err
0b30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
0b40: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ..static void ch
0b50: 65 63 6b 70 6f 69 6e 74 5f 73 74 61 72 76 61 74  eckpoint_starvat
0b60: 69 6f 6e 5f 6d 61 69 6e 28 69 6e 74 20 6e 4d 73  ion_main(int nMs
0b70: 2c 20 43 68 65 63 6b 70 6f 69 6e 74 53 74 61 72  , CheckpointStar
0b80: 76 61 74 69 6f 6e 43 74 78 20 2a 70 29 7b 0a 20  vationCtx *p){. 
0b90: 20 45 72 72 6f 72 20 65 72 72 20 3d 20 7b 30 7d   Error err = {0}
0ba0: 3b 0a 20 20 53 71 6c 69 74 65 20 64 62 20 3d 20  ;.  Sqlite db = 
0bb0: 7b 30 7d 3b 0a 20 20 54 68 72 65 61 64 73 65 74  {0};.  Threadset
0bc0: 20 74 68 72 65 61 64 73 20 3d 20 7b 30 7d 3b 0a   threads = {0};.
0bd0: 20 20 69 6e 74 20 6e 49 6e 73 65 72 74 20 3d 20    int nInsert = 
0be0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6f  0;.  int i;..  o
0bf0: 70 65 6e 64 62 28 26 65 72 72 2c 20 26 64 62 2c  pendb(&err, &db,
0c00: 20 22 74 65 73 74 2e 64 62 22 2c 20 31 29 3b 0a   "test.db", 1);.
0c10: 20 20 73 71 6c 5f 73 63 72 69 70 74 28 26 65 72    sql_script(&er
0c20: 72 2c 20 26 64 62 2c 20 0a 20 20 20 20 20 20 22  r, &db, .      "
0c30: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
0c40: 20 3d 20 31 30 32 34 3b 22 0a 20 20 20 20 20 20   = 1024;".      
0c50: 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f  "PRAGMA journal_
0c60: 6d 6f 64 65 20 3d 20 57 41 4c 3b 22 0a 20 20 20  mode = WAL;".   
0c70: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
0c80: 20 74 31 28 78 29 3b 22 0a 20 20 29 3b 0a 0a 20   t1(x);".  );.. 
0c90: 20 73 65 74 73 74 6f 70 74 69 6d 65 28 26 65 72   setstoptime(&er
0ca0: 72 2c 20 6e 4d 73 29 3b 0a 0a 20 20 66 6f 72 28  r, nMs);..  for(
0cb0: 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a  i=0; i<4; i++){.
0cc0: 20 20 20 20 6c 61 75 6e 63 68 5f 74 68 72 65 61      launch_threa
0cd0: 64 28 26 65 72 72 2c 20 26 74 68 72 65 61 64 73  d(&err, &threads
0ce0: 2c 20 63 68 65 63 6b 70 6f 69 6e 74 5f 73 74 61  , checkpoint_sta
0cf0: 72 76 61 74 69 6f 6e 5f 72 65 61 64 65 72 2c 20  rvation_reader, 
0d00: 30 29 3b 0a 20 20 20 20 75 73 6c 65 65 70 28 43  0);.    usleep(C
0d10: 48 45 43 4b 50 4f 49 4e 54 5f 53 54 41 52 56 41  HECKPOINT_STARVA
0d20: 54 49 4f 4e 5f 52 45 41 44 4d 53 2a 31 30 30 30  TION_READMS*1000
0d30: 2f 34 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  /4);.  }..  sqli
0d40: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2e  te3_wal_hook(db.
0d50: 64 62 2c 20 63 68 65 63 6b 70 6f 69 6e 74 5f 73  db, checkpoint_s
0d60: 74 61 72 76 61 74 69 6f 6e 5f 77 61 6c 68 6f 6f  tarvation_walhoo
0d70: 6b 2c 20 28 76 6f 69 64 20 2a 29 70 29 3b 0a 20  k, (void *)p);. 
0d80: 20 77 68 69 6c 65 28 20 21 74 69 6d 65 74 6f 73   while( !timetos
0d90: 74 6f 70 28 26 65 72 72 29 20 29 7b 0a 20 20 20  top(&err) ){.   
0da0: 20 73 71 6c 5f 73 63 72 69 70 74 28 26 65 72 72   sql_script(&err
0db0: 2c 20 26 64 62 2c 20 22 49 4e 53 45 52 54 20 49  , &db, "INSERT I
0dc0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
0dd0: 6e 64 6f 6d 62 6c 6f 62 28 31 32 30 30 29 29 22  ndomblob(1200))"
0de0: 29 3b 0a 20 20 20 20 6e 49 6e 73 65 72 74 2b 2b  );.    nInsert++
0df0: 3b 0a 20 20 7d 0a 0a 20 20 70 72 69 6e 74 66 28  ;.  }..  printf(
0e00: 22 20 43 68 65 63 6b 70 6f 69 6e 74 20 6d 6f 64  " Checkpoint mod
0e10: 65 20 20 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e  : %s\n",.    
0e20: 20 20 70 2d 3e 65 4d 6f 64 65 3d 3d 53 51 4c 49    p->eMode==SQLI
0e30: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
0e40: 53 53 49 56 45 20 3f 20 22 50 41 53 53 49 56 45  SSIVE ? "PASSIVE
0e50: 22 20 3a 20 22 52 45 53 54 41 52 54 22 0a 20 20  " : "RESTART".  
0e60: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 50 65  );.  printf(" Pe
0e70: 61 6b 20 57 41 4c 20 20 20 20 20 20 20 20 20 3a  ak WAL         :
0e80: 20 25 64 20 66 72 61 6d 65 73 5c 6e 22 2c 20 70   %d frames\n", p
0e90: 2d 3e 6e 4d 61 78 46 72 61 6d 65 29 3b 0a 20 20  ->nMaxFrame);.  
0ea0: 70 72 69 6e 74 66 28 22 20 54 72 61 6e 73 61 63  printf(" Transac
0eb0: 74 69 6f 6e 20 63 6f 75 6e 74 3a 20 25 64 20 74  tion count: %d t
0ec0: 72 61 6e 73 61 63 74 69 6f 6e 73 5c 6e 22 2c 20  ransactions\n", 
0ed0: 6e 49 6e 73 65 72 74 29 3b 0a 0a 20 20 6a 6f 69  nInsert);..  joi
0ee0: 6e 5f 61 6c 6c 5f 74 68 72 65 61 64 73 28 26 65  n_all_threads(&e
0ef0: 72 72 2c 20 26 74 68 72 65 61 64 73 29 3b 0a 20  rr, &threads);. 
0f00: 20 63 6c 6f 73 65 64 62 28 26 65 72 72 2c 20 26   closedb(&err, &
0f10: 64 62 29 3b 0a 20 20 70 72 69 6e 74 5f 61 6e 64  db);.  print_and
0f20: 5f 66 72 65 65 5f 65 72 72 28 26 65 72 72 29 3b  _free_err(&err);
0f30: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
0f40: 63 68 65 63 6b 70 6f 69 6e 74 5f 73 74 61 72 76  checkpoint_starv
0f50: 61 74 69 6f 6e 5f 31 28 69 6e 74 20 6e 4d 73 29  ation_1(int nMs)
0f60: 7b 0a 20 20 45 72 72 6f 72 20 65 72 72 20 3d 20  {.  Error err = 
0f70: 7b 30 7d 3b 0a 20 20 43 68 65 63 6b 70 6f 69 6e  {0};.  Checkpoin
0f80: 74 53 74 61 72 76 61 74 69 6f 6e 43 74 78 20 63  tStarvationCtx c
0f90: 74 78 20 3d 20 7b 20 53 51 4c 49 54 45 5f 43 48  tx = { SQLITE_CH
0fa0: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
0fb0: 2c 20 30 20 7d 3b 0a 20 20 63 68 65 63 6b 70 6f  , 0 };.  checkpo
0fc0: 69 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e 5f 6d  int_starvation_m
0fd0: 61 69 6e 28 6e 4d 73 2c 20 26 63 74 78 29 3b 0a  ain(nMs, &ctx);.
0fe0: 20 20 69 66 28 20 63 74 78 2e 6e 4d 61 78 46 72    if( ctx.nMaxFr
0ff0: 61 6d 65 3c 28 43 48 45 43 4b 50 4f 49 4e 54 5f  ame<(CHECKPOINT_
1000: 53 54 41 52 56 41 54 49 4f 4e 5f 46 52 41 4d 45  STARVATION_FRAME
1010: 4c 49 4d 49 54 2a 31 30 29 20 29 7b 0a 20 20 20  LIMIT*10) ){.   
1020: 20 74 65 73 74 5f 65 72 72 6f 72 28 26 65 72 72   test_error(&err
1030: 2c 20 22 57 41 4c 20 66 61 69 6c 65 64 20 74 6f  , "WAL failed to
1040: 20 67 72 6f 77 20 2d 20 25 64 20 66 72 61 6d 65   grow - %d frame
1050: 73 22 2c 20 63 74 78 2e 6e 4d 61 78 46 72 61 6d  s", ctx.nMaxFram
1060: 65 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 5f  e);.  }.  print_
1070: 61 6e 64 5f 66 72 65 65 5f 65 72 72 28 26 65 72  and_free_err(&er
1080: 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  r);.}..static vo
1090: 69 64 20 63 68 65 63 6b 70 6f 69 6e 74 5f 73 74  id checkpoint_st
10a0: 61 72 76 61 74 69 6f 6e 5f 32 28 69 6e 74 20 6e  arvation_2(int n
10b0: 4d 73 29 7b 0a 20 20 45 72 72 6f 72 20 65 72 72  Ms){.  Error err
10c0: 20 3d 20 7b 30 7d 3b 0a 20 20 43 68 65 63 6b 70   = {0};.  Checkp
10d0: 6f 69 6e 74 53 74 61 72 76 61 74 69 6f 6e 43 74  ointStarvationCt
10e0: 78 20 63 74 78 20 3d 20 7b 20 53 51 4c 49 54 45  x ctx = { SQLITE
10f0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
1100: 41 52 54 2c 20 30 20 7d 3b 0a 20 20 63 68 65 63  ART, 0 };.  chec
1110: 6b 70 6f 69 6e 74 5f 73 74 61 72 76 61 74 69 6f  kpoint_starvatio
1120: 6e 5f 6d 61 69 6e 28 6e 4d 73 2c 20 26 63 74 78  n_main(nMs, &ctx
1130: 29 3b 0a 20 20 69 66 28 20 63 74 78 2e 6e 4d 61  );.  if( ctx.nMa
1140: 78 46 72 61 6d 65 3e 43 48 45 43 4b 50 4f 49 4e  xFrame>CHECKPOIN
1150: 54 5f 53 54 41 52 56 41 54 49 4f 4e 5f 46 52 41  T_STARVATION_FRA
1160: 4d 45 4c 49 4d 49 54 2b 31 30 20 29 7b 0a 20 20  MELIMIT+10 ){.  
1170: 20 20 74 65 73 74 5f 65 72 72 6f 72 28 26 65 72    test_error(&er
1180: 72 2c 20 22 57 41 4c 20 67 72 65 77 20 74 6f 6f  r, "WAL grew too
1190: 20 6c 61 72 67 65 20 2d 20 25 64 20 66 72 61 6d   large - %d fram
11a0: 65 73 22 2c 20 63 74 78 2e 6e 4d 61 78 46 72 61  es", ctx.nMaxFra
11b0: 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74  me);.  }.  print
11c0: 5f 61 6e 64 5f 66 72 65 65 5f 65 72 72 28 26 65  _and_free_err(&e
11d0: 72 72 29 3b 0a 7d 0a 0a 0a                       rr);.}...