/ Hex Artifact Content
Login

Artifact 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1:


0000: 2f 2a 0a 2a 2a 20 32 30 31 31 2d 30 32 2d 30 32  /*.** 2011-02-02
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 73 20  ** This file is 
0180: 70 61 72 74 20 6f 66 20 74 68 65 20 74 65 73 74  part of the test
0190: 20 70 72 6f 67 72 61 6d 20 22 74 68 72 65 61 64   program "thread
01a0: 74 65 73 74 33 22 2e 20 44 65 73 70 69 74 65 20  test3". Despite 
01b0: 62 65 69 6e 67 20 61 20 43 0a 2a 2a 20 66 69 6c  being a C.** fil
01c0: 65 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6d 70  e it is not comp
01d0: 69 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2c  iled separately,
01e0: 20 62 75 74 20 69 6e 63 6c 75 64 65 64 20 62 79   but included by
01f0: 20 74 68 72 65 61 64 74 65 73 74 33 2e 63 20 75   threadtest3.c u
0200: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 23 69 6e 63  sing.** the #inc
0210: 6c 75 64 65 20 64 69 72 65 63 74 69 76 65 20 6e  lude directive n
0220: 6f 72 6d 61 6c 6c 79 20 75 73 65 64 20 77 69 74  ormally used wit
0230: 68 20 68 65 61 64 65 72 20 66 69 6c 65 73 2e 0a  h header files..
0240: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
0250: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
0260: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0270: 65 73 74 20 63 61 73 65 73 3a 0a 2a 2a 0a 2a 2a  est cases:.**.**
0280: 20 20 20 20 20 63 68 65 63 6b 70 6f 69 6e 74 5f       checkpoint_
0290: 73 74 61 72 76 61 74 69 6f 6e 5f 31 0a 2a 2a 20  starvation_1.** 
02a0: 20 20 20 20 63 68 65 63 6b 70 6f 69 6e 74 5f 73      checkpoint_s
02b0: 74 61 72 76 61 74 69 6f 6e 5f 32 0a 2a 2f 0a 0a  tarvation_2.*/..
02c0: 2f 2a 0a 2a 2a 20 42 6f 74 68 20 74 65 73 74 20  /*.** Both test 
02d0: 63 61 73 65 73 20 69 6e 76 6f 6c 76 65 20 31 20  cases involve 1 
02e0: 77 72 69 74 65 72 2f 63 68 65 63 6b 70 6f 69 6e  writer/checkpoin
02f0: 74 65 72 20 74 68 72 65 61 64 20 61 6e 64 20 4e  ter thread and N
0300: 20 72 65 61 64 65 72 20 74 68 72 65 61 64 73 2e   reader threads.
0310: 0a 2a 2a 20 0a 2a 2a 20 45 61 63 68 20 72 65 61  .** .** Each rea
0320: 64 65 72 20 74 68 72 65 61 64 20 70 65 72 66 6f  der thread perfo
0330: 72 6d 73 20 61 20 73 65 72 69 65 73 20 6f 66 20  rms a series of 
0340: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
0350: 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 0a 2a 2a  s, one after .**
0360: 20 61 6e 6f 74 68 65 72 2e 20 45 61 63 68 20 72   another. Each r
0370: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
0380: 6c 61 73 74 73 20 66 6f 72 20 31 30 30 20 6d 73  lasts for 100 ms
0390: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74  ..**.** The writ
03a0: 65 72 20 77 72 69 74 65 73 20 74 72 61 6e 73 61  er writes transa
03b0: 63 74 69 6f 6e 73 20 61 73 20 66 61 73 74 20 61  ctions as fast a
03c0: 73 20 70 6f 73 73 69 62 6c 65 2e 20 49 74 20 75  s possible. It u
03d0: 73 65 73 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a  ses a callback.*
03e0: 2a 20 72 65 67 69 73 74 65 72 65 64 20 77 69 74  * registered wit
03f0: 68 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  h sqlite3_wal_ho
0400: 6f 6b 28 29 20 74 6f 20 74 72 79 20 74 6f 20 6b  ok() to try to k
0410: 65 65 70 20 74 68 65 20 57 41 4c 2d 73 69 7a 65  eep the WAL-size
0420: 20 6c 69 6d 69 74 65 64 20 74 6f 20 0a 2a 2a 20   limited to .** 
0430: 61 72 6f 75 6e 64 20 35 30 20 70 61 67 65 73 2e  around 50 pages.
0440: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 65 73 74 20 63  .**.** In test c
0450: 61 73 65 20 63 68 65 63 6b 70 6f 69 6e 74 5f 73  ase checkpoint_s
0460: 74 61 72 76 61 74 69 6f 6e 5f 31 2c 20 74 68 65  tarvation_1, the
0470: 20 61 75 74 6f 2d 63 68 65 63 6b 70 6f 69 6e 74   auto-checkpoint
0480: 20 75 73 65 73 20 0a 2a 2a 20 53 51 4c 49 54 45   uses .** SQLITE
0490: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
04a0: 49 56 45 2e 20 49 6e 20 63 68 65 63 6b 70 6f 69  IVE. In checkpoi
04b0: 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e 5f 32 2c  nt_starvation_2,
04c0: 20 69 74 20 75 73 65 73 20 52 45 53 54 41 52 54   it uses RESTART
04d0: 2e 0a 2a 2a 20 54 68 65 20 65 78 70 65 63 74 61  ..** The expecta
04e0: 74 69 6f 6e 20 69 73 20 74 68 61 74 20 69 6e 20  tion is that in 
04f0: 74 68 65 20 66 69 72 73 74 20 63 61 73 65 20 74  the first case t
0500: 68 65 20 57 41 4c 20 66 69 6c 65 20 77 69 6c 6c  he WAL file will
0510: 20 67 72 6f 77 20 76 65 72 79 20 0a 2a 2a 20 6c   grow very .** l
0520: 61 72 67 65 2c 20 61 6e 64 20 69 6e 20 74 68 65  arge, and in the
0530: 20 73 65 63 6f 6e 64 20 77 69 6c 6c 20 62 65 20   second will be 
0540: 6c 69 6d 69 74 65 64 20 74 6f 20 74 68 65 20 35  limited to the 5
0550: 30 20 70 61 67 65 73 20 6f 72 20 74 68 65 72 65  0 pages or there
0560: 61 62 6f 75 74 73 2e 0a 2a 2a 20 48 6f 77 65 76  abouts..** Howev
0570: 65 72 2c 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  er, the overall 
0580: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 72 6f  transaction thro
0590: 75 67 68 70 75 74 20 77 69 6c 6c 20 62 65 20 6c  ughput will be l
05a0: 6f 77 65 72 20 66 6f 72 20 0a 2a 2a 20 63 68 65  ower for .** che
05b0: 63 6b 70 6f 69 6e 74 5f 73 74 61 72 76 61 74 69  ckpoint_starvati
05c0: 6f 6e 5f 32 2c 20 61 73 20 65 76 65 72 79 20 63  on_2, as every c
05d0: 68 65 63 6b 70 6f 69 6e 74 20 77 69 6c 6c 20 62  heckpoint will b
05e0: 6c 6f 63 6b 20 66 6f 72 20 75 70 20 74 6f 20 32  lock for up to 2
05f0: 30 30 20 6d 73 0a 2a 2a 20 77 61 69 74 69 6e 67  00 ms.** waiting
0600: 20 66 6f 72 20 72 65 61 64 65 72 73 20 74 6f 20   for readers to 
0610: 63 6c 65 61 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 72  clear..*/../* Fr
0620: 61 6d 65 20 6c 69 6d 69 74 20 75 73 65 64 20 62  ame limit used b
0630: 79 20 74 68 65 20 57 41 4c 20 68 6f 6f 6b 20 66  y the WAL hook f
0640: 6f 72 20 74 68 65 73 65 20 74 65 73 74 73 2e 20  or these tests. 
0650: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
0660: 50 4f 49 4e 54 5f 53 54 41 52 56 41 54 49 4f 4e  POINT_STARVATION
0670: 5f 46 52 41 4d 45 4c 49 4d 49 54 20 35 30 0a 0a  _FRAMELIMIT 50..
0680: 2f 2a 20 44 75 72 61 74 69 6f 6e 20 69 6e 20 6d  /* Duration in m
0690: 73 20 6f 66 20 65 61 63 68 20 72 65 61 64 20 74  s of each read t
06a0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 23 64  ransaction */.#d
06b0: 65 66 69 6e 65 20 43 48 45 43 4b 50 4f 49 4e 54  efine CHECKPOINT
06c0: 5f 53 54 41 52 56 41 54 49 4f 4e 5f 52 45 41 44  _STARVATION_READ
06d0: 4d 53 20 20 20 20 31 30 30 0a 0a 73 74 72 75 63  MS    100..struc
06e0: 74 20 43 68 65 63 6b 70 6f 69 6e 74 53 74 61 72  t CheckpointStar
06f0: 76 61 74 69 6f 6e 43 74 78 20 7b 0a 20 20 69 6e  vationCtx {.  in
0700: 74 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e  t eMode;.  int n
0710: 4d 61 78 46 72 61 6d 65 3b 0a 7d 3b 0a 74 79 70  MaxFrame;.};.typ
0720: 65 64 65 66 20 73 74 72 75 63 74 20 43 68 65 63  edef struct Chec
0730: 6b 70 6f 69 6e 74 53 74 61 72 76 61 74 69 6f 6e  kpointStarvation
0740: 43 74 78 20 43 68 65 63 6b 70 6f 69 6e 74 53 74  Ctx CheckpointSt
0750: 61 72 76 61 74 69 6f 6e 43 74 78 3b 0a 0a 73 74  arvationCtx;..st
0760: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 70 6f  atic int checkpo
0770: 69 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e 5f 77  int_starvation_w
0780: 61 6c 68 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a  alhook(.  void *
0790: 70 43 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33  pCtx, .  sqlite3
07a0: 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63   *db, .  const c
07b0: 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 69 6e 74  har *zDb, .  int
07c0: 20 6e 46 72 61 6d 65 0a 29 7b 0a 20 20 43 68 65   nFrame.){.  Che
07d0: 63 6b 70 6f 69 6e 74 53 74 61 72 76 61 74 69 6f  ckpointStarvatio
07e0: 6e 43 74 78 20 2a 70 20 3d 20 28 43 68 65 63 6b  nCtx *p = (Check
07f0: 70 6f 69 6e 74 53 74 61 72 76 61 74 69 6f 6e 43  pointStarvationC
0800: 74 78 20 2a 29 70 43 74 78 3b 0a 20 20 69 66 28  tx *)pCtx;.  if(
0810: 20 6e 46 72 61 6d 65 3e 70 2d 3e 6e 4d 61 78 46   nFrame>p->nMaxF
0820: 72 61 6d 65 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  rame ){.    p->n
0830: 4d 61 78 46 72 61 6d 65 20 3d 20 6e 46 72 61 6d  MaxFrame = nFram
0840: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 46 72  e;.  }.  if( nFr
0850: 61 6d 65 3e 3d 43 48 45 43 4b 50 4f 49 4e 54 5f  ame>=CHECKPOINT_
0860: 53 54 41 52 56 41 54 49 4f 4e 5f 46 52 41 4d 45  STARVATION_FRAME
0870: 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 73 71 6c  LIMIT ){.    sql
0880: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
0890: 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  int_v2(db, zDb, 
08a0: 70 2d 3e 65 4d 6f 64 65 2c 20 30 2c 20 30 29 3b  p->eMode, 0, 0);
08b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
08c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
08d0: 69 63 20 63 68 61 72 20 2a 63 68 65 63 6b 70 6f  ic char *checkpo
08e0: 69 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e 5f 72  int_starvation_r
08f0: 65 61 64 65 72 28 69 6e 74 20 69 54 69 64 2c 20  eader(int iTid, 
0900: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 45  void *pArg){.  E
0910: 72 72 6f 72 20 65 72 72 20 3d 20 7b 30 7d 3b 0a  rror err = {0};.
0920: 20 20 53 71 6c 69 74 65 20 64 62 20 3d 20 7b 30    Sqlite db = {0
0930: 7d 3b 0a 0a 20 20 6f 70 65 6e 64 62 28 26 65 72  };..  opendb(&er
0940: 72 2c 20 26 64 62 2c 20 22 74 65 73 74 2e 64 62  r, &db, "test.db
0950: 22 2c 20 30 29 3b 0a 20 20 77 68 69 6c 65 28 20  ", 0);.  while( 
0960: 21 74 69 6d 65 74 6f 73 74 6f 70 28 26 65 72 72  !timetostop(&err
0970: 29 20 29 7b 0a 20 20 20 20 69 36 34 20 69 43 6f  ) ){.    i64 iCo
0980: 75 6e 74 31 2c 20 69 43 6f 75 6e 74 32 3b 0a 20  unt1, iCount2;. 
0990: 20 20 20 73 71 6c 5f 73 63 72 69 70 74 28 26 65     sql_script(&e
09a0: 72 72 2c 20 26 64 62 2c 20 22 42 45 47 49 4e 22  rr, &db, "BEGIN"
09b0: 29 3b 0a 20 20 20 20 69 43 6f 75 6e 74 31 20 3d  );.    iCount1 =
09c0: 20 65 78 65 63 73 71 6c 5f 69 36 34 28 26 65 72   execsql_i64(&er
09d0: 72 2c 20 26 64 62 2c 20 22 53 45 4c 45 43 54 20  r, &db, "SELECT 
09e0: 63 6f 75 6e 74 28 78 29 20 46 52 4f 4d 20 74 31  count(x) FROM t1
09f0: 22 29 3b 0a 20 20 20 20 75 73 6c 65 65 70 28 43  ");.    usleep(C
0a00: 48 45 43 4b 50 4f 49 4e 54 5f 53 54 41 52 56 41  HECKPOINT_STARVA
0a10: 54 49 4f 4e 5f 52 45 41 44 4d 53 2a 31 30 30 30  TION_READMS*1000
0a20: 29 3b 0a 20 20 20 20 69 43 6f 75 6e 74 32 20 3d  );.    iCount2 =
0a30: 20 65 78 65 63 73 71 6c 5f 69 36 34 28 26 65 72   execsql_i64(&er
0a40: 72 2c 20 26 64 62 2c 20 22 53 45 4c 45 43 54 20  r, &db, "SELECT 
0a50: 63 6f 75 6e 74 28 78 29 20 46 52 4f 4d 20 74 31  count(x) FROM t1
0a60: 22 29 3b 0a 20 20 20 20 73 71 6c 5f 73 63 72 69  ");.    sql_scri
0a70: 70 74 28 26 65 72 72 2c 20 26 64 62 2c 20 22 43  pt(&err, &db, "C
0a80: 4f 4d 4d 49 54 22 29 3b 0a 0a 20 20 20 20 69 66  OMMIT");..    if
0a90: 28 20 69 43 6f 75 6e 74 31 21 3d 69 43 6f 75 6e  ( iCount1!=iCoun
0aa0: 74 32 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  t2 ){.      test
0ab0: 5f 65 72 72 6f 72 28 26 65 72 72 2c 20 22 49 73  _error(&err, "Is
0ac0: 6f 6c 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20  olation failure 
0ad0: 2d 20 25 6c 6c 64 20 25 6c 6c 64 22 2c 20 69 43  - %lld %lld", iC
0ae0: 6f 75 6e 74 31 2c 20 69 43 6f 75 6e 74 32 29 3b  ount1, iCount2);
0af0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6c 6f  .    }.  }.  clo
0b00: 73 65 64 62 28 26 65 72 72 2c 20 26 64 62 29 3b  sedb(&err, &db);
0b10: 0a 0a 20 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72  ..  print_and_fr
0b20: 65 65 5f 65 72 72 28 26 65 72 72 29 3b 0a 20 20  ee_err(&err);.  
0b30: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
0b40: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 70 6f  tic void checkpo
0b50: 69 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e 5f 6d  int_starvation_m
0b60: 61 69 6e 28 69 6e 74 20 6e 4d 73 2c 20 43 68 65  ain(int nMs, Che
0b70: 63 6b 70 6f 69 6e 74 53 74 61 72 76 61 74 69 6f  ckpointStarvatio
0b80: 6e 43 74 78 20 2a 70 29 7b 0a 20 20 45 72 72 6f  nCtx *p){.  Erro
0b90: 72 20 65 72 72 20 3d 20 7b 30 7d 3b 0a 20 20 53  r err = {0};.  S
0ba0: 71 6c 69 74 65 20 64 62 20 3d 20 7b 30 7d 3b 0a  qlite db = {0};.
0bb0: 20 20 54 68 72 65 61 64 73 65 74 20 74 68 72 65    Threadset thre
0bc0: 61 64 73 20 3d 20 7b 30 7d 3b 0a 20 20 69 6e 74  ads = {0};.  int
0bd0: 20 6e 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20   nInsert = 0;.  
0be0: 69 6e 74 20 69 3b 0a 0a 20 20 6f 70 65 6e 64 62  int i;..  opendb
0bf0: 28 26 65 72 72 2c 20 26 64 62 2c 20 22 74 65 73  (&err, &db, "tes
0c00: 74 2e 64 62 22 2c 20 31 29 3b 0a 20 20 73 71 6c  t.db", 1);.  sql
0c10: 5f 73 63 72 69 70 74 28 26 65 72 72 2c 20 26 64  _script(&err, &d
0c20: 62 2c 20 0a 20 20 20 20 20 20 22 50 52 41 47 4d  b, .      "PRAGM
0c30: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
0c40: 32 34 3b 22 0a 20 20 20 20 20 20 22 50 52 41 47  24;".      "PRAG
0c50: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
0c60: 3d 20 57 41 4c 3b 22 0a 20 20 20 20 20 20 22 43  = WAL;".      "C
0c70: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
0c80: 29 3b 22 0a 20 20 29 3b 0a 0a 20 20 73 65 74 73  );".  );..  sets
0c90: 74 6f 70 74 69 6d 65 28 26 65 72 72 2c 20 6e 4d  toptime(&err, nM
0ca0: 73 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s);..  for(i=0; 
0cb0: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  i<4; i++){.    l
0cc0: 61 75 6e 63 68 5f 74 68 72 65 61 64 28 26 65 72  aunch_thread(&er
0cd0: 72 2c 20 26 74 68 72 65 61 64 73 2c 20 63 68 65  r, &threads, che
0ce0: 63 6b 70 6f 69 6e 74 5f 73 74 61 72 76 61 74 69  ckpoint_starvati
0cf0: 6f 6e 5f 72 65 61 64 65 72 2c 20 30 29 3b 0a 20  on_reader, 0);. 
0d00: 20 20 20 75 73 6c 65 65 70 28 43 48 45 43 4b 50     usleep(CHECKP
0d10: 4f 49 4e 54 5f 53 54 41 52 56 41 54 49 4f 4e 5f  OINT_STARVATION_
0d20: 52 45 41 44 4d 53 2a 31 30 30 30 2f 34 29 3b 0a  READMS*1000/4);.
0d30: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77    }..  sqlite3_w
0d40: 61 6c 5f 68 6f 6f 6b 28 64 62 2e 64 62 2c 20 63  al_hook(db.db, c
0d50: 68 65 63 6b 70 6f 69 6e 74 5f 73 74 61 72 76 61  heckpoint_starva
0d60: 74 69 6f 6e 5f 77 61 6c 68 6f 6f 6b 2c 20 28 76  tion_walhook, (v
0d70: 6f 69 64 20 2a 29 70 29 3b 0a 20 20 77 68 69 6c  oid *)p);.  whil
0d80: 65 28 20 21 74 69 6d 65 74 6f 73 74 6f 70 28 26  e( !timetostop(&
0d90: 65 72 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 5f  err) ){.    sql_
0da0: 73 63 72 69 70 74 28 26 65 72 72 2c 20 26 64 62  script(&err, &db
0db0: 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  , "INSERT INTO t
0dc0: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
0dd0: 6c 6f 62 28 31 32 30 30 29 29 22 29 3b 0a 20 20  lob(1200))");.  
0de0: 20 20 6e 49 6e 73 65 72 74 2b 2b 3b 0a 20 20 7d    nInsert++;.  }
0df0: 0a 0a 20 20 70 72 69 6e 74 66 28 22 20 43 68 65  ..  printf(" Che
0e00: 63 6b 70 6f 69 6e 74 20 6d 6f 64 65 20 20 3a 20  ckpoint mode  : 
0e10: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 70 2d 3e  %s\n",.      p->
0e20: 65 4d 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 43 48  eMode==SQLITE_CH
0e30: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
0e40: 20 3f 20 22 50 41 53 53 49 56 45 22 20 3a 20 22   ? "PASSIVE" : "
0e50: 52 45 53 54 41 52 54 22 0a 20 20 29 3b 0a 20 20  RESTART".  );.  
0e60: 70 72 69 6e 74 66 28 22 20 50 65 61 6b 20 57 41  printf(" Peak WA
0e70: 4c 20 20 20 20 20 20 20 20 20 3a 20 25 64 20 66  L         : %d f
0e80: 72 61 6d 65 73 5c 6e 22 2c 20 70 2d 3e 6e 4d 61  rames\n", p->nMa
0e90: 78 46 72 61 6d 65 29 3b 0a 20 20 70 72 69 6e 74  xFrame);.  print
0ea0: 66 28 22 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  f(" Transaction 
0eb0: 63 6f 75 6e 74 3a 20 25 64 20 74 72 61 6e 73 61  count: %d transa
0ec0: 63 74 69 6f 6e 73 5c 6e 22 2c 20 6e 49 6e 73 65  ctions\n", nInse
0ed0: 72 74 29 3b 0a 0a 20 20 6a 6f 69 6e 5f 61 6c 6c  rt);..  join_all
0ee0: 5f 74 68 72 65 61 64 73 28 26 65 72 72 2c 20 26  _threads(&err, &
0ef0: 74 68 72 65 61 64 73 29 3b 0a 20 20 63 6c 6f 73  threads);.  clos
0f00: 65 64 62 28 26 65 72 72 2c 20 26 64 62 29 3b 0a  edb(&err, &db);.
0f10: 20 20 70 72 69 6e 74 5f 61 6e 64 5f 66 72 65 65    print_and_free
0f20: 5f 65 72 72 28 26 65 72 72 29 3b 0a 7d 0a 0a 73  _err(&err);.}..s
0f30: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
0f40: 70 6f 69 6e 74 5f 73 74 61 72 76 61 74 69 6f 6e  point_starvation
0f50: 5f 31 28 69 6e 74 20 6e 4d 73 29 7b 0a 20 20 45  _1(int nMs){.  E
0f60: 72 72 6f 72 20 65 72 72 20 3d 20 7b 30 7d 3b 0a  rror err = {0};.
0f70: 20 20 43 68 65 63 6b 70 6f 69 6e 74 53 74 61 72    CheckpointStar
0f80: 76 61 74 69 6f 6e 43 74 78 20 63 74 78 20 3d 20  vationCtx ctx = 
0f90: 7b 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  { SQLITE_CHECKPO
0fa0: 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 30 20 7d  INT_PASSIVE, 0 }
0fb0: 3b 0a 20 20 63 68 65 63 6b 70 6f 69 6e 74 5f 73  ;.  checkpoint_s
0fc0: 74 61 72 76 61 74 69 6f 6e 5f 6d 61 69 6e 28 6e  tarvation_main(n
0fd0: 4d 73 2c 20 26 63 74 78 29 3b 0a 20 20 69 66 28  Ms, &ctx);.  if(
0fe0: 20 63 74 78 2e 6e 4d 61 78 46 72 61 6d 65 3c 28   ctx.nMaxFrame<(
0ff0: 43 48 45 43 4b 50 4f 49 4e 54 5f 53 54 41 52 56  CHECKPOINT_STARV
1000: 41 54 49 4f 4e 5f 46 52 41 4d 45 4c 49 4d 49 54  ATION_FRAMELIMIT
1010: 2a 31 30 29 20 29 7b 0a 20 20 20 20 74 65 73 74  *10) ){.    test
1020: 5f 65 72 72 6f 72 28 26 65 72 72 2c 20 22 57 41  _error(&err, "WA
1030: 4c 20 66 61 69 6c 65 64 20 74 6f 20 67 72 6f 77  L failed to grow
1040: 20 2d 20 25 64 20 66 72 61 6d 65 73 22 2c 20 63   - %d frames", c
1050: 74 78 2e 6e 4d 61 78 46 72 61 6d 65 29 3b 0a 20  tx.nMaxFrame);. 
1060: 20 7d 0a 20 20 70 72 69 6e 74 5f 61 6e 64 5f 66   }.  print_and_f
1070: 72 65 65 5f 65 72 72 28 26 65 72 72 29 3b 0a 7d  ree_err(&err);.}
1080: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ..static void ch
1090: 65 63 6b 70 6f 69 6e 74 5f 73 74 61 72 76 61 74  eckpoint_starvat
10a0: 69 6f 6e 5f 32 28 69 6e 74 20 6e 4d 73 29 7b 0a  ion_2(int nMs){.
10b0: 20 20 45 72 72 6f 72 20 65 72 72 20 3d 20 7b 30    Error err = {0
10c0: 7d 3b 0a 20 20 43 68 65 63 6b 70 6f 69 6e 74 53  };.  CheckpointS
10d0: 74 61 72 76 61 74 69 6f 6e 43 74 78 20 63 74 78  tarvationCtx ctx
10e0: 20 3d 20 7b 20 53 51 4c 49 54 45 5f 43 48 45 43   = { SQLITE_CHEC
10f0: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 2c 20  KPOINT_RESTART, 
1100: 30 20 7d 3b 0a 20 20 63 68 65 63 6b 70 6f 69 6e  0 };.  checkpoin
1110: 74 5f 73 74 61 72 76 61 74 69 6f 6e 5f 6d 61 69  t_starvation_mai
1120: 6e 28 6e 4d 73 2c 20 26 63 74 78 29 3b 0a 20 20  n(nMs, &ctx);.  
1130: 69 66 28 20 63 74 78 2e 6e 4d 61 78 46 72 61 6d  if( ctx.nMaxFram
1140: 65 3e 43 48 45 43 4b 50 4f 49 4e 54 5f 53 54 41  e>CHECKPOINT_STA
1150: 52 56 41 54 49 4f 4e 5f 46 52 41 4d 45 4c 49 4d  RVATION_FRAMELIM
1160: 49 54 2b 31 30 20 29 7b 0a 20 20 20 20 74 65 73  IT+10 ){.    tes
1170: 74 5f 65 72 72 6f 72 28 26 65 72 72 2c 20 22 57  t_error(&err, "W
1180: 41 4c 20 67 72 65 77 20 74 6f 6f 20 6c 61 72 67  AL grew too larg
1190: 65 20 2d 20 25 64 20 66 72 61 6d 65 73 22 2c 20  e - %d frames", 
11a0: 63 74 78 2e 6e 4d 61 78 46 72 61 6d 65 29 3b 0a  ctx.nMaxFrame);.
11b0: 20 20 7d 0a 20 20 70 72 69 6e 74 5f 61 6e 64 5f    }.  print_and_
11c0: 66 72 65 65 5f 65 72 72 28 26 65 72 72 29 3b 0a  free_err(&err);.
11d0: 7d 0a                                            }.