/ Hex Artifact Content
Login

Artifact c38bb8994e7416e6b2be480e095f4f4cda582126204e632d165c4b1feefc5aea:


0000: 0a 23 69 6e 63 6c 75 64 65 20 22 6c 73 6d 74 65  .#include "lsmte
0010: 73 74 5f 74 64 62 2e 68 22 0a 23 69 6e 63 6c 75  st_tdb.h".#inclu
0020: 64 65 20 22 6c 73 6d 2e 68 22 0a 23 69 6e 63 6c  de "lsm.h".#incl
0030: 75 64 65 20 22 6c 73 6d 74 65 73 74 2e 68 22 0a  ude "lsmtest.h".
0040: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
0050: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  b.h>.#include <s
0060: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
0070: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 66  e <assert.h>.#if
0080: 6e 64 65 66 20 5f 57 49 4e 33 32 0a 23 20 69 6e  ndef _WIN32.# in
0090: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
00a0: 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65  .#endif.#include
00b0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69 66 6e   <stdio.h>..#ifn
00c0: 64 65 66 20 5f 57 49 4e 33 32 0a 23 20 69 6e 63  def _WIN32.# inc
00d0: 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68  lude <sys/time.h
00e0: 3e 0a 23 65 6e 64 69 66 0a 0a 74 79 70 65 64 65  >.#endif..typede
00f0: 66 20 73 74 72 75 63 74 20 4c 73 6d 44 62 20 4c  f struct LsmDb L
0100: 73 6d 44 62 3b 0a 74 79 70 65 64 65 66 20 73 74  smDb;.typedef st
0110: 72 75 63 74 20 4c 73 6d 57 6f 72 6b 65 72 20 4c  ruct LsmWorker L
0120: 73 6d 57 6f 72 6b 65 72 3b 0a 74 79 70 65 64 65  smWorker;.typede
0130: 66 20 73 74 72 75 63 74 20 4c 73 6d 46 69 6c 65  f struct LsmFile
0140: 20 4c 73 6d 46 69 6c 65 3b 0a 0a 23 64 65 66 69   LsmFile;..#defi
0150: 6e 65 20 4c 53 4d 54 45 53 54 5f 44 46 4c 54 5f  ne LSMTEST_DFLT_
0160: 4d 54 5f 4d 41 58 5f 43 4b 50 54 20 28 38 2a 31  MT_MAX_CKPT (8*1
0170: 30 32 34 29 0a 23 64 65 66 69 6e 65 20 4c 53 4d  024).#define LSM
0180: 54 45 53 54 5f 44 46 4c 54 5f 4d 54 5f 4d 49 4e  TEST_DFLT_MT_MIN
0190: 5f 43 4b 50 54 20 28 32 2a 31 30 32 34 29 0a 0a  _CKPT (2*1024)..
01a0: 23 69 66 64 65 66 20 4c 53 4d 5f 4d 55 54 45 58  #ifdef LSM_MUTEX
01b0: 5f 50 54 48 52 45 41 44 53 0a 23 69 6e 63 6c 75  _PTHREADS.#inclu
01c0: 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 0a  de <pthread.h>..
01d0: 23 64 65 66 69 6e 65 20 4c 53 4d 54 45 53 54 5f  #define LSMTEST_
01e0: 54 48 52 45 41 44 5f 43 4b 50 54 20 20 20 20 20  THREAD_CKPT     
01f0: 20 31 0a 23 64 65 66 69 6e 65 20 4c 53 4d 54 45   1.#define LSMTE
0200: 53 54 5f 54 48 52 45 41 44 5f 57 4f 52 4b 45 52  ST_THREAD_WORKER
0210: 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4c 53      2.#define LS
0220: 4d 54 45 53 54 5f 54 48 52 45 41 44 5f 57 4f 52  MTEST_THREAD_WOR
0230: 4b 45 52 5f 41 43 20 33 0a 0a 2f 2a 0a 2a 2a 20  KER_AC 3../*.** 
0240: 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61  There are severa
0250: 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  l different type
0260: 73 20 6f 66 20 77 6f 72 6b 65 72 20 74 68 72 65  s of worker thre
0270: 61 64 73 20 74 68 61 74 20 72 75 6e 20 69 6e 20  ads that run in 
0280: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 74 65 73  different.** tes
0290: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t configurations
02a0: 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
02b0: 68 65 20 76 61 6c 75 65 20 6f 66 20 4c 73 6d 57  he value of LsmW
02c0: 6f 72 6b 65 72 2e 65 54 79 70 65 2e 0a 2a 2a 0a  orker.eType..**.
02d0: 2a 2a 20 20 20 31 2e 20 43 68 65 63 6b 70 6f 69  **   1. Checkpoi
02e0: 6e 74 65 72 2e 0a 2a 2a 20 20 20 32 2e 20 57 6f  nter..**   2. Wo
02f0: 72 6b 65 72 20 77 69 74 68 20 61 75 74 6f 2d 63  rker with auto-c
0300: 68 65 63 6b 70 6f 69 6e 74 2e 0a 2a 2a 20 20 20  heckpoint..**   
0310: 33 2e 20 57 6f 72 6b 65 72 20 77 69 74 68 6f 75  3. Worker withou
0320: 74 20 61 75 74 6f 2d 63 68 65 63 6b 70 6f 69 6e  t auto-checkpoin
0330: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 73 6d  t..*/.struct Lsm
0340: 57 6f 72 6b 65 72 20 7b 0a 20 20 4c 73 6d 44 62  Worker {.  LsmDb
0350: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
0360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
0370: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
0380: 63 74 75 72 65 20 2a 2f 0a 20 20 6c 73 6d 5f 64  cture */.  lsm_d
0390: 62 20 2a 70 57 6f 72 6b 65 72 3b 20 20 20 20 20  b *pWorker;     
03a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 6f             /* Wo
03b0: 72 6b 65 72 20 64 61 74 61 62 61 73 65 20 68 61  rker database ha
03c0: 6e 64 6c 65 20 2a 2f 0a 20 20 70 74 68 72 65 61  ndle */.  pthrea
03d0: 64 5f 74 20 77 6f 72 6b 65 72 5f 74 68 72 65 61  d_t worker_threa
03e0: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 6f 72  d;        /* Wor
03f0: 6b 65 72 20 74 68 72 65 61 64 20 2a 2f 0a 20 20  ker thread */.  
0400: 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 74 20 77  pthread_cond_t w
0410: 6f 72 6b 65 72 5f 63 6f 6e 64 3b 20 20 20 20 20  orker_cond;     
0420: 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 76 61 72  /* Condition var
0430: 20 74 68 65 20 77 6f 72 6b 65 72 20 77 61 69 74   the worker wait
0440: 73 20 6f 6e 20 2a 2f 0a 20 20 70 74 68 72 65 61  s on */.  pthrea
0450: 64 5f 6d 75 74 65 78 5f 74 20 77 6f 72 6b 65 72  d_mutex_t worker
0460: 5f 6d 75 74 65 78 3b 20 20 20 2f 2a 20 4d 75 74  _mutex;   /* Mut
0470: 65 78 20 75 73 65 64 20 77 69 74 68 20 77 6f 72  ex used with wor
0480: 6b 65 72 5f 63 6f 6e 64 20 2a 2f 0a 20 20 69 6e  ker_cond */.  in
0490: 74 20 62 44 6f 57 6f 72 6b 3b 20 20 20 20 20 20  t bDoWork;      
04a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
04b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 62 79 20   Set to true by 
04c0: 63 6c 69 65 6e 74 20 77 68 65 6e 20 74 68 65 72  client when ther
04d0: 65 20 69 73 20 77 6f 72 6b 20 2a 2f 0a 20 20 69  e is work */.  i
04e0: 6e 74 20 77 6f 72 6b 65 72 5f 72 63 3b 20 20 20  nt worker_rc;   
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0500: 2a 20 53 74 6f 72 65 20 65 72 72 6f 72 20 63 6f  * Store error co
0510: 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  de here */.  int
0520: 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0540: 4c 53 4d 54 45 53 54 5f 54 48 52 45 41 44 5f 58  LSMTEST_THREAD_X
0550: 58 58 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20  XX constant */. 
0560: 20 69 6e 74 20 62 42 6c 6f 63 6b 3b 0a 7d 3b 0a   int bBlock;.};.
0570: 23 65 6c 73 65 0a 73 74 72 75 63 74 20 4c 73 6d  #else.struct Lsm
0580: 57 6f 72 6b 65 72 20 7b 20 69 6e 74 20 77 6f 72  Worker { int wor
0590: 6b 65 72 5f 72 63 3b 20 69 6e 74 20 62 42 6c 6f  ker_rc; int bBlo
05a0: 63 6b 3b 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 73  ck; };.#endif..s
05b0: 74 61 74 69 63 20 76 6f 69 64 20 6d 74 5f 73 68  tatic void mt_sh
05c0: 75 74 64 6f 77 6e 28 4c 73 6d 44 62 20 2a 29 3b  utdown(LsmDb *);
05d0: 0a 0a 6c 73 6d 5f 65 6e 76 20 2a 74 64 62 5f 6c  ..lsm_env *tdb_l
05e0: 73 6d 5f 65 6e 76 28 76 6f 69 64 29 7b 0a 20 20  sm_env(void){.  
05f0: 73 74 61 74 69 63 20 69 6e 74 20 62 49 6e 69 74  static int bInit
0600: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 6c   = 0;.  static l
0610: 73 6d 5f 65 6e 76 20 65 6e 76 3b 0a 20 20 69 66  sm_env env;.  if
0620: 28 20 62 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  ( bInit==0 ){.  
0630: 20 20 6d 65 6d 63 70 79 28 26 65 6e 76 2c 20 6c    memcpy(&env, l
0640: 73 6d 5f 64 65 66 61 75 6c 74 5f 65 6e 76 28 29  sm_default_env()
0650: 2c 20 73 69 7a 65 6f 66 28 65 6e 76 29 29 3b 0a  , sizeof(env));.
0660: 20 20 20 20 62 49 6e 69 74 20 3d 20 31 3b 0a 20      bInit = 1;. 
0670: 20 7d 0a 20 20 72 65 74 75 72 6e 20 26 65 6e 76   }.  return &env
0680: 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
0690: 75 63 74 20 46 69 6c 65 53 65 63 74 6f 72 20 46  uct FileSector F
06a0: 69 6c 65 53 65 63 74 6f 72 3b 0a 74 79 70 65 64  ileSector;.typed
06b0: 65 66 20 73 74 72 75 63 74 20 46 69 6c 65 44 61  ef struct FileDa
06c0: 74 61 20 46 69 6c 65 44 61 74 61 3b 0a 0a 73 74  ta FileData;..st
06d0: 72 75 63 74 20 46 69 6c 65 53 65 63 74 6f 72 20  ruct FileSector 
06e0: 7b 0a 20 20 75 38 20 2a 61 4f 6c 64 3b 20 20 20  {.  u8 *aOld;   
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 2f 2a 20 4f 6c 64 20 64 61 74 61 20      /* Old data 
0710: 66 6f 72 20 74 68 69 73 20 73 65 63 74 6f 72 20  for this sector 
0720: 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 69  */.};..struct Fi
0730: 6c 65 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 6e  leData {.  int n
0740: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
0750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
0760: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
0770: 61 70 53 65 63 74 6f 72 5b 5d 20 61 72 72 61 79  apSector[] array
0780: 20 2a 2f 0a 20 20 46 69 6c 65 53 65 63 74 6f 72   */.  FileSector
0790: 20 2a 61 53 65 63 74 6f 72 3b 20 20 20 20 20 20   *aSector;      
07a0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
07b0: 66 20 66 69 6c 65 20 73 65 63 74 6f 72 73 20 2a  f file sectors *
07c0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 62 50 72 65  /.};../*.** bPre
07d0: 70 61 72 65 43 72 61 73 68 3a 0a 2a 2a 20 20 20  pareCrash:.**   
07e0: 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  If non-zero, the
07f0: 20 66 69 6c 65 20 77 72 61 70 70 65 72 73 20 6d   file wrappers m
0800: 61 69 6e 74 61 69 6e 20 65 6e 6f 75 67 68 20 69  aintain enough i
0810: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 74 6f  n-memory data to
0820: 0a 2a 2a 20 20 20 73 69 6d 75 6c 61 74 65 20 74  .**   simulate t
0830: 68 65 20 65 66 66 65 63 74 20 6f 66 20 61 20 70  he effect of a p
0840: 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 6e 20  ower-failure on 
0850: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
0860: 28 69 2e 65 2e 20 74 68 61 74 0a 2a 2a 20 20 20  (i.e. that.**   
0870: 75 6e 73 79 6e 63 65 64 20 73 65 63 74 6f 72 73  unsynced sectors
0880: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 2c   may be written,
0890: 20 6e 6f 74 20 77 72 69 74 74 65 6e 2c 20 6f 72   not written, or
08a0: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
08b0: 68 0a 2a 2a 20 20 20 61 72 62 69 74 72 61 72 79  h.**   arbitrary
08c0: 20 64 61 74 61 20 77 68 65 6e 20 74 68 65 20 63   data when the c
08d0: 72 61 73 68 20 6f 63 63 75 72 73 29 2e 0a 2a 2a  rash occurs)..**
08e0: 0a 2a 2a 20 62 43 72 61 73 68 65 64 3a 0a 2a 2a  .** bCrashed:.**
08f0: 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 61     Set to true a
0900: 66 74 65 72 20 61 20 63 72 61 73 68 20 69 73 20  fter a crash is 
0910: 73 69 6d 75 6c 61 74 65 64 2e 20 4f 6e 63 65 20  simulated. Once 
0920: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
0930: 20 74 72 75 65 2c 20 61 6c 6c 0a 2a 2a 20 20 20   true, all.**   
0940: 56 46 53 20 6d 65 74 68 6f 64 73 20 6f 74 68 65  VFS methods othe
0950: 72 20 74 68 61 6e 20 78 43 6c 6f 73 65 28 29 20  r than xClose() 
0960: 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52 52  return LSM_IOERR
0970: 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 79   as soon as they
0980: 20 61 72 65 0a 2a 2a 20 20 20 63 61 6c 6c 65 64   are.**   called
0990: 20 28 77 69 74 68 6f 75 74 20 61 66 66 65 63 74   (without affect
09a0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
09b0: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
09c0: 74 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 65 6e 76 3a  tem)..**.** env:
09d0: 0a 2a 2a 20 20 20 54 68 65 20 65 6e 76 69 72 6f  .**   The enviro
09e0: 6e 6d 65 6e 74 20 6f 62 6a 65 63 74 20 75 73 65  nment object use
09f0: 64 20 62 79 20 61 6c 6c 20 6c 73 6d 5f 64 62 2a  d by all lsm_db*
0a00: 20 68 61 6e 64 6c 65 73 20 6f 70 65 6e 65 64 20   handles opened 
0a10: 62 79 20 74 68 69 73 0a 2a 2a 20 20 20 6f 62 6a  by this.**   obj
0a20: 65 63 74 20 28 69 2e 65 2e 20 4c 73 6d 44 62 2e  ect (i.e. LsmDb.
0a30: 64 62 20 70 6c 75 73 20 61 6e 79 20 77 6f 72 6b  db plus any work
0a40: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 29 2e  er connections).
0a50: 20 56 61 72 69 61 62 6c 65 20 65 6e 76 2e 70 56   Variable env.pV
0a60: 66 73 43 74 78 0a 2a 2a 20 20 20 61 6c 77 61 79  fsCtx.**   alway
0a70: 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  s points to the 
0a80: 63 6f 6e 74 61 69 6e 69 6e 67 20 4c 73 6d 44 62  containing LsmDb
0a90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
0aa0: 74 72 75 63 74 20 4c 73 6d 44 62 20 7b 0a 20 20  truct LsmDb {.  
0ab0: 54 65 73 74 44 62 20 62 61 73 65 3b 20 20 20 20  TestDb base;    
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2d 20  /* Base class - 
0ae0: 6d 65 74 68 6f 64 73 20 74 61 62 6c 65 20 2a 2f  methods table */
0af0: 0a 20 20 6c 73 6d 5f 65 6e 76 20 65 6e 76 3b 20  .  lsm_env env; 
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 20 20 2f 2a 20 45 6e 76 69 72 6f 6e 6d 65 6e     /* Environmen
0b20: 74 20 75 73 65 64 20 62 79 20 63 6f 6e 6e 65 63  t used by connec
0b30: 74 69 6f 6e 20 64 62 20 2a 2f 0a 20 20 63 68 61  tion db */.  cha
0b40: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0b60: 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  Database file na
0b70: 6d 65 20 2a 2f 0a 20 20 6c 73 6d 5f 64 62 20 2a  me */.  lsm_db *
0b80: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
0b90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 53 4d 20 64          /* LSM d
0ba0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
0bb0: 2f 0a 0a 20 20 6c 73 6d 5f 63 75 72 73 6f 72 20  /..  lsm_cursor 
0bc0: 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *pCsr;          
0bd0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68       /* Cursor h
0be0: 65 6c 64 20 6f 70 65 6e 20 64 75 72 69 6e 67 20  eld open during 
0bf0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
0c00: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
0c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0c20: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
0c30: 66 6f 72 20 74 64 62 5f 66 65 74 63 68 28 29 20  for tdb_fetch() 
0c40: 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
0c50: 6e 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  nBuf;           
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0c70: 6c 6c 6f 63 61 74 65 64 20 28 6e 6f 74 20 75 73  llocated (not us
0c80: 65 64 29 20 73 69 7a 65 20 6f 66 20 70 42 75 66  ed) size of pBuf
0c90: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 61 73 68 20   */..  /* Crash 
0ca0: 74 65 73 74 69 6e 67 20 72 65 6c 61 74 65 64 20  testing related 
0cb0: 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62  state */.  int b
0cc0: 43 72 61 73 68 65 64 3b 20 20 20 20 20 20 20 20  Crashed;        
0cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
0ce0: 75 65 20 6f 6e 63 65 20 61 20 63 72 61 73 68 20  ue once a crash 
0cf0: 68 61 73 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  has occurred */.
0d00: 20 20 69 6e 74 20 6e 41 75 74 6f 43 72 61 73 68    int nAutoCrash
0d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0d20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
0d30: 79 6e 63 73 20 75 6e 74 69 6c 20 61 20 63 72 61  yncs until a cra
0d40: 73 68 20 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65  sh */.  int bPre
0d50: 70 61 72 65 43 72 61 73 68 3b 20 20 20 20 20 20  pareCrash;      
0d60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0d70: 74 6f 20 73 74 6f 72 65 20 77 72 69 74 65 73 20  to store writes 
0d80: 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20  in memory */..  
0d90: 2f 2a 20 55 6e 73 79 6e 63 65 64 20 64 61 74 61  /* Unsynced data
0da0: 20 28 77 68 69 6c 65 20 63 72 61 73 68 20 74 65   (while crash te
0db0: 73 74 69 6e 67 29 20 2a 2f 0a 20 20 69 6e 74 20  sting) */.  int 
0dc0: 73 7a 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20  szSector;       
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0de0: 73 73 75 6d 65 64 20 73 69 7a 65 20 6f 66 20 64  ssumed size of d
0df0: 69 73 6b 20 73 65 63 74 6f 72 73 20 28 35 31 32  isk sectors (512
0e00: 42 29 20 2a 2f 0a 20 20 46 69 6c 65 44 61 74 61  B) */.  FileData
0e10: 20 61 46 69 6c 65 5b 32 5d 3b 20 20 20 20 20 20   aFile[2];      
0e20: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
0e30: 61 73 65 20 61 6e 64 20 6c 6f 67 20 66 69 6c 65  ase and log file
0e40: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   data */..  /* O
0e50: 74 68 65 72 20 74 65 73 74 20 69 6e 73 74 72 75  ther test instru
0e60: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  mentation */.  i
0e70: 6e 74 20 62 4e 6f 52 65 63 6f 76 65 72 79 3b 20  nt bNoRecovery; 
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0e90: 2a 20 49 66 20 74 72 75 65 2c 20 61 73 73 75 6d  * If true, assum
0ea0: 65 20 44 4d 53 32 20 69 73 20 6c 6f 63 6b 65 64  e DMS2 is locked
0eb0: 20 2a 2f 0a 0a 20 20 2f 2a 20 57 6f 72 6b 20 68   */..  /* Work h
0ec0: 6f 6f 6b 20 72 65 64 69 72 65 63 74 69 6f 6e 20  ook redirection 
0ed0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 57 6f 72  */.  void (*xWor
0ee0: 6b 29 28 6c 73 6d 5f 64 62 20 2a 2c 20 76 6f 69  k)(lsm_db *, voi
0ef0: 64 20 2a 29 3b 0a 20 20 76 6f 69 64 20 2a 70 57  d *);.  void *pW
0f00: 6f 72 6b 43 74 78 3b 0a 0a 20 20 2f 2a 20 49 4f  orkCtx;..  /* IO
0f10: 20 6c 6f 67 67 69 6e 67 20 68 6f 6f 6b 20 2a 2f   logging hook */
0f20: 0a 20 20 76 6f 69 64 20 28 2a 78 57 72 69 74 65  .  void (*xWrite
0f30: 48 6f 6f 6b 29 28 76 6f 69 64 20 2a 2c 20 69 6e  Hook)(void *, in
0f40: 74 2c 20 6c 73 6d 5f 69 36 34 2c 20 69 6e 74 2c  t, lsm_i64, int,
0f50: 20 69 6e 74 29 3b 0a 20 20 76 6f 69 64 20 2a 70   int);.  void *p
0f60: 57 72 69 74 65 43 74 78 3b 0a 20 20 0a 20 20 2f  WriteCtx;.  .  /
0f70: 2a 20 57 6f 72 6b 65 72 20 74 68 72 65 61 64 73  * Worker threads
0f80: 20 28 66 6f 72 20 6c 73 6d 5f 6d 74 29 20 2a 2f   (for lsm_mt) */
0f90: 0a 20 20 69 6e 74 20 6e 4d 74 4d 69 6e 43 6b 70  .  int nMtMinCkp
0fa0: 74 3b 0a 20 20 69 6e 74 20 6e 4d 74 4d 61 78 43  t;.  int nMtMaxC
0fb0: 6b 70 74 3b 0a 20 20 69 6e 74 20 65 4d 6f 64 65  kpt;.  int eMode
0fc0: 3b 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 65 72 3b  ;.  int nWorker;
0fd0: 0a 20 20 4c 73 6d 57 6f 72 6b 65 72 20 2a 61 57  .  LsmWorker *aW
0fe0: 6f 72 6b 65 72 3b 0a 7d 3b 0a 0a 23 64 65 66 69  orker;.};..#defi
0ff0: 6e 65 20 4c 53 4d 54 45 53 54 5f 4d 4f 44 45 5f  ne LSMTEST_MODE_
1000: 53 49 4e 47 4c 45 54 48 52 45 41 44 20 20 20 20  SINGLETHREAD    
1010: 31 0a 23 64 65 66 69 6e 65 20 4c 53 4d 54 45 53  1.#define LSMTES
1020: 54 5f 4d 4f 44 45 5f 42 41 43 4b 47 52 4f 55 4e  T_MODE_BACKGROUN
1030: 44 5f 43 4b 50 54 20 32 0a 23 64 65 66 69 6e 65  D_CKPT 2.#define
1040: 20 4c 53 4d 54 45 53 54 5f 4d 4f 44 45 5f 42 41   LSMTEST_MODE_BA
1050: 43 4b 47 52 4f 55 4e 44 5f 57 4f 52 4b 20 33 0a  CKGROUND_WORK 3.
1060: 23 64 65 66 69 6e 65 20 4c 53 4d 54 45 53 54 5f  #define LSMTEST_
1070: 4d 4f 44 45 5f 42 41 43 4b 47 52 4f 55 4e 44 5f  MODE_BACKGROUND_
1080: 42 4f 54 48 20 34 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  BOTH 4../*******
1090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1120: 20 42 65 67 69 6e 20 74 65 73 74 20 56 46 53 20   Begin test VFS 
1130: 63 6f 64 65 2e 0a 2a 2f 0a 0a 73 74 72 75 63 74  code..*/..struct
1140: 20 4c 73 6d 46 69 6c 65 20 7b 0a 20 20 6c 73 6d   LsmFile {.  lsm
1150: 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b 20 20 20  _file *pReal;   
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1170: 52 65 61 6c 20 75 6e 64 65 72 6c 79 69 6e 67 20  Real underlying 
1180: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 4c  file */.  int bL
1190: 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  og;             
11a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
11b0: 65 20 66 6f 72 20 6c 6f 67 20 66 69 6c 65 2e 20  e for log file. 
11c0: 46 61 6c 73 65 20 66 6f 72 20 64 62 20 66 69 6c  False for db fil
11d0: 65 20 2a 2f 0a 20 20 4c 73 6d 44 62 20 2a 70 44  e */.  LsmDb *pD
11e0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
11f0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1200: 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 75  se handle that u
1210: 73 65 73 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ses this file */
1220: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .};..static int 
1230: 74 65 73 74 45 6e 76 46 75 6c 6c 70 61 74 68 28  testEnvFullpath(
1240: 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76  .  lsm_env *pEnv
1250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1260: 20 20 20 2f 2a 20 45 6e 76 69 72 6f 6e 6d 65 6e     /* Environmen
1270: 74 20 66 6f 72 20 63 75 72 72 65 6e 74 20 4c 73  t for current Ls
1280: 6d 44 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  mDb */.  const c
1290: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20  har *zFile,     
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 61           /* Rela
12b0: 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 2a  tive path name *
12c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20  /.  char *zOut, 
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
12f0: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
1300: 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
1310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
1320: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 6f 75 74  OUT: Size of out
1330: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
1340: 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 52 65 61  .  lsm_env *pRea
1350: 6c 45 6e 76 20 3d 20 74 64 62 5f 6c 73 6d 5f 65  lEnv = tdb_lsm_e
1360: 6e 76 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  nv();.  return p
1370: 52 65 61 6c 45 6e 76 2d 3e 78 46 75 6c 6c 70 61  RealEnv->xFullpa
1380: 74 68 28 70 52 65 61 6c 45 6e 76 2c 20 7a 46 69  th(pRealEnv, zFi
1390: 6c 65 2c 20 7a 4f 75 74 2c 20 70 6e 4f 75 74 29  le, zOut, pnOut)
13a0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
13b0: 74 65 73 74 45 6e 76 4f 70 65 6e 28 0a 20 20 6c  testEnvOpen(.  l
13c0: 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 20 20  sm_env *pEnv,   
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e0: 2a 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 66 6f  * Environment fo
13f0: 72 20 63 75 72 72 65 6e 74 20 4c 73 6d 44 62 20  r current LsmDb 
1400: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1410: 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *zFile,         
1420: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1430: 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
1440: 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 6c    int flags,.  l
1450: 73 6d 5f 66 69 6c 65 20 2a 2a 70 70 46 69 6c 65  sm_file **ppFile
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1470: 2a 20 4f 55 54 3a 20 4e 65 77 20 66 69 6c 65 20  * OUT: New file 
1480: 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  handle object */
1490: 0a 29 7b 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70  .){.  lsm_env *p
14a0: 52 65 61 6c 45 6e 76 20 3d 20 74 64 62 5f 6c 73  RealEnv = tdb_ls
14b0: 6d 5f 65 6e 76 28 29 3b 0a 20 20 4c 73 6d 44 62  m_env();.  LsmDb
14c0: 20 2a 70 44 62 20 3d 20 28 4c 73 6d 44 62 20 2a   *pDb = (LsmDb *
14d0: 29 70 45 6e 76 2d 3e 70 56 66 73 43 74 78 3b 0a  )pEnv->pVfsCtx;.
14e0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1510: 20 2a 2f 0a 20 20 4c 73 6d 46 69 6c 65 20 2a 70   */.  LsmFile *p
1520: 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
1530: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1540: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
1550: 20 20 69 6e 74 20 6e 46 69 6c 65 3b 20 20 20 20    int nFile;    
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
1580: 74 72 69 6e 67 20 7a 46 69 6c 65 20 69 6e 20 62  tring zFile in b
1590: 79 74 65 73 20 2a 2f 0a 0a 20 20 6e 46 69 6c 65  ytes */..  nFile
15a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29   = strlen(zFile)
15b0: 3b 0a 20 20 70 52 65 74 20 3d 20 28 4c 73 6d 46  ;.  pRet = (LsmF
15c0: 69 6c 65 20 2a 29 74 65 73 74 4d 61 6c 6c 6f 63  ile *)testMalloc
15d0: 28 73 69 7a 65 6f 66 28 4c 73 6d 46 69 6c 65 29  (sizeof(LsmFile)
15e0: 29 3b 0a 20 20 70 52 65 74 2d 3e 70 44 62 20 3d  );.  pRet->pDb =
15f0: 20 70 44 62 3b 0a 20 20 70 52 65 74 2d 3e 62 4c   pDb;.  pRet->bL
1600: 6f 67 20 3d 20 28 6e 46 69 6c 65 20 3e 20 34 20  og = (nFile > 4 
1610: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 2d 6c  && 0==memcmp("-l
1620: 6f 67 22 2c 20 26 7a 46 69 6c 65 5b 6e 46 69 6c  og", &zFile[nFil
1630: 65 2d 34 5d 2c 20 34 29 29 3b 0a 0a 20 20 72 63  e-4], 4));..  rc
1640: 20 3d 20 70 52 65 61 6c 45 6e 76 2d 3e 78 4f 70   = pRealEnv->xOp
1650: 65 6e 28 70 52 65 61 6c 45 6e 76 2c 20 7a 46 69  en(pRealEnv, zFi
1660: 6c 65 2c 20 66 6c 61 67 73 2c 20 26 70 52 65 74  le, flags, &pRet
1670: 2d 3e 70 52 65 61 6c 29 3b 0a 20 20 69 66 28 20  ->pReal);.  if( 
1680: 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc!=LSM_OK ){.  
1690: 20 20 74 65 73 74 46 72 65 65 28 70 52 65 74 29    testFree(pRet)
16a0: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  ;.    pRet = 0;.
16b0: 20 20 7d 0a 0a 20 20 2a 70 70 46 69 6c 65 20 3d    }..  *ppFile =
16c0: 20 28 6c 73 6d 5f 66 69 6c 65 20 2a 29 70 52 65   (lsm_file *)pRe
16d0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
16e0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
16f0: 73 74 45 6e 76 52 65 61 64 28 6c 73 6d 5f 66 69  stEnvRead(lsm_fi
1700: 6c 65 20 2a 70 46 69 6c 65 2c 20 6c 73 6d 5f 69  le *pFile, lsm_i
1710: 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70  64 iOff, void *p
1720: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
1730: 7b 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 52 65  {.  lsm_env *pRe
1740: 61 6c 45 6e 76 20 3d 20 74 64 62 5f 6c 73 6d 5f  alEnv = tdb_lsm_
1750: 65 6e 76 28 29 3b 0a 20 20 4c 73 6d 46 69 6c 65  env();.  LsmFile
1760: 20 2a 70 20 3d 20 28 4c 73 6d 46 69 6c 65 20 2a   *p = (LsmFile *
1770: 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 2d  )pFile;.  if( p-
1780: 3e 70 44 62 2d 3e 62 43 72 61 73 68 65 64 20 29  >pDb->bCrashed )
1790: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52   return LSM_IOER
17a0: 52 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61  R;.  return pRea
17b0: 6c 45 6e 76 2d 3e 78 52 65 61 64 28 70 2d 3e 70  lEnv->xRead(p->p
17c0: 52 65 61 6c 2c 20 69 4f 66 66 2c 20 70 44 61 74  Real, iOff, pDat
17d0: 61 2c 20 6e 44 61 74 61 29 3b 0a 7d 0a 0a 73 74  a, nData);.}..st
17e0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 45 6e 76  atic int testEnv
17f0: 57 72 69 74 65 28 6c 73 6d 5f 66 69 6c 65 20 2a  Write(lsm_file *
1800: 70 46 69 6c 65 2c 20 6c 73 6d 5f 69 36 34 20 69  pFile, lsm_i64 i
1810: 4f 66 66 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  Off, void *pData
1820: 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
1830: 6c 73 6d 5f 65 6e 76 20 2a 70 52 65 61 6c 45 6e  lsm_env *pRealEn
1840: 76 20 3d 20 74 64 62 5f 6c 73 6d 5f 65 6e 76 28  v = tdb_lsm_env(
1850: 29 3b 0a 20 20 4c 73 6d 46 69 6c 65 20 2a 70 20  );.  LsmFile *p 
1860: 3d 20 28 4c 73 6d 46 69 6c 65 20 2a 29 70 46 69  = (LsmFile *)pFi
1870: 6c 65 3b 0a 20 20 4c 73 6d 44 62 20 2a 70 44 62  le;.  LsmDb *pDb
1880: 20 3d 20 70 2d 3e 70 44 62 3b 0a 0a 20 20 69 66   = p->pDb;..  if
1890: 28 20 70 44 62 2d 3e 62 43 72 61 73 68 65 64 20  ( pDb->bCrashed 
18a0: 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45  ) return LSM_IOE
18b0: 52 52 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e  RR;..  if( pDb->
18c0: 62 50 72 65 70 61 72 65 43 72 61 73 68 20 29 7b  bPrepareCrash ){
18d0: 0a 20 20 20 20 46 69 6c 65 44 61 74 61 20 2a 70  .    FileData *p
18e0: 44 61 74 61 32 20 3d 20 26 70 44 62 2d 3e 61 46  Data2 = &pDb->aF
18f0: 69 6c 65 5b 70 2d 3e 62 4c 6f 67 5d 3b 0a 20 20  ile[p->bLog];.  
1900: 20 20 69 6e 74 20 69 46 69 72 73 74 3b 20 20 20    int iFirst;   
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
1920: 20 20 20 69 6e 74 20 69 4c 61 73 74 3b 0a 20 20     int iLast;.  
1930: 20 20 69 6e 74 20 69 53 65 63 74 6f 72 3b 0a 0a    int iSector;..
1940: 20 20 20 20 69 46 69 72 73 74 20 3d 20 28 69 6e      iFirst = (in
1950: 74 29 28 69 4f 66 66 20 2f 20 70 44 62 2d 3e 73  t)(iOff / pDb->s
1960: 7a 53 65 63 74 6f 72 29 3b 0a 20 20 20 20 69 4c  zSector);.    iL
1970: 61 73 74 20 3d 20 20 28 69 6e 74 29 28 28 69 4f  ast =  (int)((iO
1980: 66 66 20 2b 20 6e 44 61 74 61 20 2d 20 31 29 20  ff + nData - 1) 
1990: 2f 20 70 44 62 2d 3e 73 7a 53 65 63 74 6f 72 29  / pDb->szSector)
19a0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  ;..    if( pData
19b0: 32 2d 3e 6e 53 65 63 74 6f 72 3c 28 69 4c 61 73  2->nSector<(iLas
19c0: 74 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  t+1) ){.      in
19d0: 74 20 6e 4e 65 77 20 3d 20 28 20 28 28 69 4c 61  t nNew = ( ((iLa
19e0: 73 74 20 2b 20 31 29 20 2b 20 36 33 29 20 2f 20  st + 1) + 63) / 
19f0: 36 34 20 29 20 2a 20 36 34 3b 0a 20 20 20 20 20  64 ) * 64;.     
1a00: 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 69 4c   assert( nNew>iL
1a10: 61 73 74 20 29 3b 0a 20 20 20 20 20 20 70 44 61  ast );.      pDa
1a20: 74 61 32 2d 3e 61 53 65 63 74 6f 72 20 3d 20 28  ta2->aSector = (
1a30: 46 69 6c 65 53 65 63 74 6f 72 20 2a 29 74 65 73  FileSector *)tes
1a40: 74 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  tRealloc(.      
1a50: 20 20 20 20 70 44 61 74 61 32 2d 3e 61 53 65 63      pData2->aSec
1a60: 74 6f 72 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66  tor, nNew*sizeof
1a70: 28 46 69 6c 65 53 65 63 74 6f 72 29 0a 20 20 20  (FileSector).   
1a80: 20 20 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73     );.      mems
1a90: 65 74 28 26 70 44 61 74 61 32 2d 3e 61 53 65 63  et(&pData2->aSec
1aa0: 74 6f 72 5b 70 44 61 74 61 32 2d 3e 6e 53 65 63  tor[pData2->nSec
1ab0: 74 6f 72 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  tor], .         
1ac0: 20 30 2c 20 28 6e 4e 65 77 20 2d 20 70 44 61 74   0, (nNew - pDat
1ad0: 61 32 2d 3e 6e 53 65 63 74 6f 72 29 20 2a 20 73  a2->nSector) * s
1ae0: 69 7a 65 6f 66 28 46 69 6c 65 53 65 63 74 6f 72  izeof(FileSector
1af0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
1b00: 20 70 44 61 74 61 32 2d 3e 6e 53 65 63 74 6f 72   pData2->nSector
1b10: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a   = nNew;.    }..
1b20: 20 20 20 20 66 6f 72 28 69 53 65 63 74 6f 72 3d      for(iSector=
1b30: 69 46 69 72 73 74 3b 20 69 53 65 63 74 6f 72 3c  iFirst; iSector<
1b40: 3d 69 4c 61 73 74 3b 20 69 53 65 63 74 6f 72 2b  =iLast; iSector+
1b50: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  +){.      if( pD
1b60: 61 74 61 32 2d 3e 61 53 65 63 74 6f 72 5b 69 53  ata2->aSector[iS
1b70: 65 63 74 6f 72 5d 2e 61 4f 6c 64 3d 3d 30 20 29  ector].aOld==0 )
1b80: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 4f  {.        u8 *aO
1b90: 6c 64 20 3d 20 28 75 38 20 2a 29 74 65 73 74 4d  ld = (u8 *)testM
1ba0: 61 6c 6c 6f 63 28 70 44 62 2d 3e 73 7a 53 65 63  alloc(pDb->szSec
1bb0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 70 52  tor);.        pR
1bc0: 65 61 6c 45 6e 76 2d 3e 78 52 65 61 64 28 0a 20  ealEnv->xRead(. 
1bd0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 52             p->pR
1be0: 65 61 6c 2c 20 28 6c 73 6d 5f 69 36 34 29 69 53  eal, (lsm_i64)iS
1bf0: 65 63 74 6f 72 2a 70 44 62 2d 3e 73 7a 53 65 63  ector*pDb->szSec
1c00: 74 6f 72 2c 20 61 4f 6c 64 2c 20 70 44 62 2d 3e  tor, aOld, pDb->
1c10: 73 7a 53 65 63 74 6f 72 0a 20 20 20 20 20 20 20  szSector.       
1c20: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74   );.        pDat
1c30: 61 32 2d 3e 61 53 65 63 74 6f 72 5b 69 53 65 63  a2->aSector[iSec
1c40: 74 6f 72 5d 2e 61 4f 6c 64 20 3d 20 61 4f 6c 64  tor].aOld = aOld
1c50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c60: 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e    }..  if( pDb->
1c70: 78 57 72 69 74 65 48 6f 6f 6b 20 29 7b 0a 20 20  xWriteHook ){.  
1c80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
1c90: 74 20 6e 55 73 3b 0a 20 20 20 20 73 74 72 75 63  t nUs;.    struc
1ca0: 74 20 74 69 6d 65 76 61 6c 20 74 31 3b 0a 20 20  t timeval t1;.  
1cb0: 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
1cc0: 20 74 32 3b 0a 0a 20 20 20 20 67 65 74 74 69 6d   t2;..    gettim
1cd0: 65 6f 66 64 61 79 28 26 74 31 2c 20 30 29 3b 0a  eofday(&t1, 0);.
1ce0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 61 74      assert( nDat
1cf0: 61 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  a>0 );.    rc = 
1d00: 70 52 65 61 6c 45 6e 76 2d 3e 78 57 72 69 74 65  pRealEnv->xWrite
1d10: 28 70 2d 3e 70 52 65 61 6c 2c 20 69 4f 66 66 2c  (p->pReal, iOff,
1d20: 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a   pData, nData);.
1d30: 20 20 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79      gettimeofday
1d40: 28 26 74 32 2c 20 30 29 3b 0a 0a 20 20 20 20 6e  (&t2, 0);..    n
1d50: 55 73 20 3d 20 28 74 32 2e 74 76 5f 73 65 63 20  Us = (t2.tv_sec 
1d60: 2d 20 74 31 2e 74 76 5f 73 65 63 29 20 2a 20 31  - t1.tv_sec) * 1
1d70: 30 30 30 30 30 30 20 2b 20 28 74 32 2e 74 76 5f  000000 + (t2.tv_
1d80: 75 73 65 63 20 2d 20 74 31 2e 74 76 5f 75 73 65  usec - t1.tv_use
1d90: 63 29 3b 0a 20 20 20 20 70 44 62 2d 3e 78 57 72  c);.    pDb->xWr
1da0: 69 74 65 48 6f 6f 6b 28 70 44 62 2d 3e 70 57 72  iteHook(pDb->pWr
1db0: 69 74 65 43 74 78 2c 20 70 2d 3e 62 4c 6f 67 2c  iteCtx, p->bLog,
1dc0: 20 69 4f 66 66 2c 20 6e 44 61 74 61 2c 20 6e 55   iOff, nData, nU
1dd0: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  s);.    return r
1de0: 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
1df0: 20 70 52 65 61 6c 45 6e 76 2d 3e 78 57 72 69 74   pRealEnv->xWrit
1e00: 65 28 70 2d 3e 70 52 65 61 6c 2c 20 69 4f 66 66  e(p->pReal, iOff
1e10: 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  , pData, nData);
1e20: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1e30: 64 6f 53 79 73 74 65 6d 43 72 61 73 68 28 4c 73  doSystemCrash(Ls
1e40: 6d 44 62 20 2a 70 44 62 29 3b 0a 0a 73 74 61 74  mDb *pDb);..stat
1e50: 69 63 20 69 6e 74 20 74 65 73 74 45 6e 76 53 79  ic int testEnvSy
1e60: 6e 63 28 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69  nc(lsm_file *pFi
1e70: 6c 65 29 7b 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a  le){.  lsm_env *
1e80: 70 52 65 61 6c 45 6e 76 20 3d 20 74 64 62 5f 6c  pRealEnv = tdb_l
1e90: 73 6d 5f 65 6e 76 28 29 3b 0a 20 20 4c 73 6d 46  sm_env();.  LsmF
1ea0: 69 6c 65 20 2a 70 20 3d 20 28 4c 73 6d 46 69 6c  ile *p = (LsmFil
1eb0: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 4c 73 6d  e *)pFile;.  Lsm
1ec0: 44 62 20 2a 70 44 62 20 3d 20 70 2d 3e 70 44 62  Db *pDb = p->pDb
1ed0: 3b 0a 20 20 46 69 6c 65 44 61 74 61 20 2a 70 44  ;.  FileData *pD
1ee0: 61 74 61 20 3d 20 26 70 44 62 2d 3e 61 46 69 6c  ata = &pDb->aFil
1ef0: 65 5b 70 2d 3e 62 4c 6f 67 5d 3b 0a 20 20 69 6e  e[p->bLog];.  in
1f00: 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d  t i;..  if( pDb-
1f10: 3e 62 43 72 61 73 68 65 64 20 29 20 72 65 74 75  >bCrashed ) retu
1f20: 72 6e 20 4c 53 4d 5f 49 4f 45 52 52 3b 0a 0a 20  rn LSM_IOERR;.. 
1f30: 20 69 66 28 20 70 44 62 2d 3e 6e 41 75 74 6f 43   if( pDb->nAutoC
1f40: 72 61 73 68 20 29 7b 0a 20 20 20 20 70 44 62 2d  rash ){.    pDb-
1f50: 3e 6e 41 75 74 6f 43 72 61 73 68 2d 2d 3b 0a 20  >nAutoCrash--;. 
1f60: 20 20 20 69 66 28 20 70 44 62 2d 3e 6e 41 75 74     if( pDb->nAut
1f70: 6f 43 72 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  oCrash==0 ){.   
1f80: 20 20 20 64 6f 53 79 73 74 65 6d 43 72 61 73 68     doSystemCrash
1f90: 28 70 44 62 29 3b 0a 20 20 20 20 20 20 70 44 62  (pDb);.      pDb
1fa0: 2d 3e 62 43 72 61 73 68 65 64 20 3d 20 31 3b 0a  ->bCrashed = 1;.
1fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d        return LSM
1fc0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
1fd0: 7d 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 62 50  }..  if( pDb->bP
1fe0: 72 65 70 61 72 65 43 72 61 73 68 20 29 7b 0a 20  repareCrash ){. 
1ff0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44     for(i=0; i<pD
2000: 61 74 61 2d 3e 6e 53 65 63 74 6f 72 3b 20 69 2b  ata->nSector; i+
2010: 2b 29 7b 0a 20 20 20 20 20 20 74 65 73 74 46 72  +){.      testFr
2020: 65 65 28 70 44 61 74 61 2d 3e 61 53 65 63 74 6f  ee(pData->aSecto
2030: 72 5b 69 5d 2e 61 4f 6c 64 29 3b 0a 20 20 20 20  r[i].aOld);.    
2040: 20 20 70 44 61 74 61 2d 3e 61 53 65 63 74 6f 72    pData->aSector
2050: 5b 69 5d 2e 61 4f 6c 64 20 3d 20 30 3b 0a 20 20  [i].aOld = 0;.  
2060: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
2070: 44 62 2d 3e 78 57 72 69 74 65 48 6f 6f 6b 20 29  Db->xWriteHook )
2080: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
2090: 20 20 69 6e 74 20 6e 55 73 3b 0a 20 20 20 20 73    int nUs;.    s
20a0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 74 31  truct timeval t1
20b0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 74 69 6d  ;.    struct tim
20c0: 65 76 61 6c 20 74 32 3b 0a 0a 20 20 20 20 67 65  eval t2;..    ge
20d0: 74 74 69 6d 65 6f 66 64 61 79 28 26 74 31 2c 20  ttimeofday(&t1, 
20e0: 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 52 65  0);.    rc = pRe
20f0: 61 6c 45 6e 76 2d 3e 78 53 79 6e 63 28 70 2d 3e  alEnv->xSync(p->
2100: 70 52 65 61 6c 29 3b 0a 20 20 20 20 67 65 74 74  pReal);.    gett
2110: 69 6d 65 6f 66 64 61 79 28 26 74 32 2c 20 30 29  imeofday(&t2, 0)
2120: 3b 0a 0a 20 20 20 20 6e 55 73 20 3d 20 28 74 32  ;..    nUs = (t2
2130: 2e 74 76 5f 73 65 63 20 2d 20 74 31 2e 74 76 5f  .tv_sec - t1.tv_
2140: 73 65 63 29 20 2a 20 31 30 30 30 30 30 30 20 2b  sec) * 1000000 +
2150: 20 28 74 32 2e 74 76 5f 75 73 65 63 20 2d 20 74   (t2.tv_usec - t
2160: 31 2e 74 76 5f 75 73 65 63 29 3b 0a 20 20 20 20  1.tv_usec);.    
2170: 70 44 62 2d 3e 78 57 72 69 74 65 48 6f 6f 6b 28  pDb->xWriteHook(
2180: 70 44 62 2d 3e 70 57 72 69 74 65 43 74 78 2c 20  pDb->pWriteCtx, 
2190: 70 2d 3e 62 4c 6f 67 2c 20 30 2c 20 30 2c 20 6e  p->bLog, 0, 0, n
21a0: 55 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Us);.    return 
21b0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rc;.  }..  retur
21c0: 6e 20 70 52 65 61 6c 45 6e 76 2d 3e 78 53 79 6e  n pRealEnv->xSyn
21d0: 63 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a  c(p->pReal);.}..
21e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 45  static int testE
21f0: 6e 76 54 72 75 6e 63 61 74 65 28 6c 73 6d 5f 66  nvTruncate(lsm_f
2200: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 6c 73 6d 5f  ile *pFile, lsm_
2210: 69 36 34 20 69 4f 66 66 29 7b 0a 20 20 6c 73 6d  i64 iOff){.  lsm
2220: 5f 65 6e 76 20 2a 70 52 65 61 6c 45 6e 76 20 3d  _env *pRealEnv =
2230: 20 74 64 62 5f 6c 73 6d 5f 65 6e 76 28 29 3b 0a   tdb_lsm_env();.
2240: 20 20 4c 73 6d 46 69 6c 65 20 2a 70 20 3d 20 28    LsmFile *p = (
2250: 4c 73 6d 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  LsmFile *)pFile;
2260: 0a 20 20 69 66 28 20 70 2d 3e 70 44 62 2d 3e 62  .  if( p->pDb->b
2270: 43 72 61 73 68 65 64 20 29 20 72 65 74 75 72 6e  Crashed ) return
2280: 20 4c 53 4d 5f 49 4f 45 52 52 3b 0a 20 20 72 65   LSM_IOERR;.  re
2290: 74 75 72 6e 20 70 52 65 61 6c 45 6e 76 2d 3e 78  turn pRealEnv->x
22a0: 54 72 75 6e 63 61 74 65 28 70 2d 3e 70 52 65 61  Truncate(p->pRea
22b0: 6c 2c 20 69 4f 66 66 29 3b 0a 7d 0a 0a 73 74 61  l, iOff);.}..sta
22c0: 74 69 63 20 69 6e 74 20 74 65 73 74 45 6e 76 53  tic int testEnvS
22d0: 65 63 74 6f 72 53 69 7a 65 28 6c 73 6d 5f 66 69  ectorSize(lsm_fi
22e0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 6c 73  le *pFile){.  ls
22f0: 6d 5f 65 6e 76 20 2a 70 52 65 61 6c 45 6e 76 20  m_env *pRealEnv 
2300: 3d 20 74 64 62 5f 6c 73 6d 5f 65 6e 76 28 29 3b  = tdb_lsm_env();
2310: 0a 20 20 4c 73 6d 46 69 6c 65 20 2a 70 20 3d 20  .  LsmFile *p = 
2320: 28 4c 73 6d 46 69 6c 65 20 2a 29 70 46 69 6c 65  (LsmFile *)pFile
2330: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 61 6c  ;.  return pReal
2340: 45 6e 76 2d 3e 78 53 65 63 74 6f 72 53 69 7a 65  Env->xSectorSize
2350: 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 73  (p->pReal);.}..s
2360: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 45 6e  tatic int testEn
2370: 76 52 65 6d 61 70 28 0a 20 20 6c 73 6d 5f 66 69  vRemap(.  lsm_fi
2380: 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 6c 73  le *pFile, .  ls
2390: 6d 5f 69 36 34 20 69 4d 69 6e 2c 20 0a 20 20 76  m_i64 iMin, .  v
23a0: 6f 69 64 20 2a 2a 70 70 4f 75 74 2c 0a 20 20 6c  oid **ppOut,.  l
23b0: 73 6d 5f 69 36 34 20 2a 70 6e 4f 75 74 0a 29 7b  sm_i64 *pnOut.){
23c0: 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 52 65 61  .  lsm_env *pRea
23d0: 6c 45 6e 76 20 3d 20 74 64 62 5f 6c 73 6d 5f 65  lEnv = tdb_lsm_e
23e0: 6e 76 28 29 3b 0a 20 20 4c 73 6d 46 69 6c 65 20  nv();.  LsmFile 
23f0: 2a 70 20 3d 20 28 4c 73 6d 46 69 6c 65 20 2a 29  *p = (LsmFile *)
2400: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
2410: 70 52 65 61 6c 45 6e 76 2d 3e 78 52 65 6d 61 70  pRealEnv->xRemap
2420: 28 70 2d 3e 70 52 65 61 6c 2c 20 69 4d 69 6e 2c  (p->pReal, iMin,
2430: 20 70 70 4f 75 74 2c 20 70 6e 4f 75 74 29 3b 0a   ppOut, pnOut);.
2440: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
2450: 73 74 45 6e 76 46 69 6c 65 69 64 28 0a 20 20 6c  stEnvFileid(.  l
2460: 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  sm_file *pFile, 
2470: 0a 20 20 76 6f 69 64 20 2a 70 70 4f 75 74 2c 0a  .  void *ppOut,.
2480: 20 20 69 6e 74 20 2a 70 6e 4f 75 74 0a 29 7b 0a    int *pnOut.){.
2490: 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 52 65 61 6c    lsm_env *pReal
24a0: 45 6e 76 20 3d 20 74 64 62 5f 6c 73 6d 5f 65 6e  Env = tdb_lsm_en
24b0: 76 28 29 3b 0a 20 20 4c 73 6d 46 69 6c 65 20 2a  v();.  LsmFile *
24c0: 70 20 3d 20 28 4c 73 6d 46 69 6c 65 20 2a 29 70  p = (LsmFile *)p
24d0: 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  File;.  return p
24e0: 52 65 61 6c 45 6e 76 2d 3e 78 46 69 6c 65 69 64  RealEnv->xFileid
24f0: 28 70 2d 3e 70 52 65 61 6c 2c 20 70 70 4f 75 74  (p->pReal, ppOut
2500: 2c 20 70 6e 4f 75 74 29 3b 0a 7d 0a 0a 73 74 61  , pnOut);.}..sta
2510: 74 69 63 20 69 6e 74 20 74 65 73 74 45 6e 76 43  tic int testEnvC
2520: 6c 6f 73 65 28 6c 73 6d 5f 66 69 6c 65 20 2a 70  lose(lsm_file *p
2530: 46 69 6c 65 29 7b 0a 20 20 6c 73 6d 5f 65 6e 76  File){.  lsm_env
2540: 20 2a 70 52 65 61 6c 45 6e 76 20 3d 20 74 64 62   *pRealEnv = tdb
2550: 5f 6c 73 6d 5f 65 6e 76 28 29 3b 0a 20 20 4c 73  _lsm_env();.  Ls
2560: 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4c 73 6d 46  mFile *p = (LsmF
2570: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 0a 20 20  ile *)pFile;..  
2580: 70 52 65 61 6c 45 6e 76 2d 3e 78 43 6c 6f 73 65  pRealEnv->xClose
2590: 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 20 20 74 65  (p->pReal);.  te
25a0: 73 74 46 72 65 65 28 70 29 3b 0a 20 20 72 65 74  stFree(p);.  ret
25b0: 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73  urn LSM_OK;.}..s
25c0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 45 6e  tatic int testEn
25d0: 76 55 6e 6c 69 6e 6b 28 6c 73 6d 5f 65 6e 76 20  vUnlink(lsm_env 
25e0: 2a 70 45 6e 76 2c 20 63 6f 6e 73 74 20 63 68 61  *pEnv, const cha
25f0: 72 20 2a 7a 46 69 6c 65 29 7b 0a 20 20 6c 73 6d  r *zFile){.  lsm
2600: 5f 65 6e 76 20 2a 70 52 65 61 6c 45 6e 76 20 3d  _env *pRealEnv =
2610: 20 74 64 62 5f 6c 73 6d 5f 65 6e 76 28 29 3b 0a   tdb_lsm_env();.
2620: 20 20 75 6e 75 73 65 64 5f 70 61 72 61 6d 65 74    unused_paramet
2630: 65 72 28 70 45 6e 76 29 3b 0a 20 20 72 65 74 75  er(pEnv);.  retu
2640: 72 6e 20 70 52 65 61 6c 45 6e 76 2d 3e 78 55 6e  rn pRealEnv->xUn
2650: 6c 69 6e 6b 28 70 52 65 61 6c 45 6e 76 2c 20 7a  link(pRealEnv, z
2660: 46 69 6c 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  File);.}..static
2670: 20 69 6e 74 20 74 65 73 74 45 6e 76 4c 6f 63 6b   int testEnvLock
2680: 28 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c 65  (lsm_file *pFile
2690: 2c 20 69 6e 74 20 69 4c 6f 63 6b 2c 20 69 6e 74  , int iLock, int
26a0: 20 65 54 79 70 65 29 7b 0a 20 20 4c 73 6d 46 69   eType){.  LsmFi
26b0: 6c 65 20 2a 70 20 3d 20 28 4c 73 6d 46 69 6c 65  le *p = (LsmFile
26c0: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 6c 73 6d 5f   *)pFile;.  lsm_
26d0: 65 6e 76 20 2a 70 52 65 61 6c 45 6e 76 20 3d 20  env *pRealEnv = 
26e0: 74 64 62 5f 6c 73 6d 5f 65 6e 76 28 29 3b 0a 0a  tdb_lsm_env();..
26f0: 20 20 69 66 28 20 69 4c 6f 63 6b 3d 3d 32 20 26    if( iLock==2 &
2700: 26 20 65 54 79 70 65 3d 3d 4c 53 4d 5f 4c 4f 43  & eType==LSM_LOC
2710: 4b 5f 45 58 43 4c 20 26 26 20 70 2d 3e 70 44 62  K_EXCL && p->pDb
2720: 2d 3e 62 4e 6f 52 65 63 6f 76 65 72 79 20 29 7b  ->bNoRecovery ){
2730: 0a 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f  .    return LSM_
2740: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BUSY;.  }.  retu
2750: 72 6e 20 70 52 65 61 6c 45 6e 76 2d 3e 78 4c 6f  rn pRealEnv->xLo
2760: 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 69 4c 6f  ck(p->pReal, iLo
2770: 63 6b 2c 20 65 54 79 70 65 29 3b 0a 7d 0a 0a 73  ck, eType);.}..s
2780: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 45 6e  tatic int testEn
2790: 76 54 65 73 74 4c 6f 63 6b 28 6c 73 6d 5f 66 69  vTestLock(lsm_fi
27a0: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 69  le *pFile, int i
27b0: 4c 6f 63 6b 2c 20 69 6e 74 20 6e 4c 6f 63 6b 2c  Lock, int nLock,
27c0: 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 4c   int eType){.  L
27d0: 73 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4c 73 6d  smFile *p = (Lsm
27e0: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
27f0: 6c 73 6d 5f 65 6e 76 20 2a 70 52 65 61 6c 45 6e  lsm_env *pRealEn
2800: 76 20 3d 20 74 64 62 5f 6c 73 6d 5f 65 6e 76 28  v = tdb_lsm_env(
2810: 29 3b 0a 0a 20 20 69 66 28 20 69 4c 6f 63 6b 3d  );..  if( iLock=
2820: 3d 32 20 26 26 20 65 54 79 70 65 3d 3d 4c 53 4d  =2 && eType==LSM
2830: 5f 4c 4f 43 4b 5f 45 58 43 4c 20 26 26 20 70 2d  _LOCK_EXCL && p-
2840: 3e 70 44 62 2d 3e 62 4e 6f 52 65 63 6f 76 65 72  >pDb->bNoRecover
2850: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
2860: 4c 53 4d 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  LSM_BUSY;.  }.  
2870: 72 65 74 75 72 6e 20 70 52 65 61 6c 45 6e 76 2d  return pRealEnv-
2880: 3e 78 54 65 73 74 4c 6f 63 6b 28 70 2d 3e 70 52  >xTestLock(p->pR
2890: 65 61 6c 2c 20 69 4c 6f 63 6b 2c 20 6e 4c 6f 63  eal, iLock, nLoc
28a0: 6b 2c 20 65 54 79 70 65 29 3b 0a 7d 0a 0a 73 74  k, eType);.}..st
28b0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 45 6e 76  atic int testEnv
28c0: 53 68 6d 4d 61 70 28 6c 73 6d 5f 66 69 6c 65 20  ShmMap(lsm_file 
28d0: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 69 52 65 67  *pFile, int iReg
28e0: 69 6f 6e 2c 20 69 6e 74 20 73 7a 2c 20 76 6f 69  ion, int sz, voi
28f0: 64 20 2a 2a 70 70 29 7b 0a 20 20 4c 73 6d 46 69  d **pp){.  LsmFi
2900: 6c 65 20 2a 70 20 3d 20 28 4c 73 6d 46 69 6c 65  le *p = (LsmFile
2910: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 6c 73 6d 5f   *)pFile;.  lsm_
2920: 65 6e 76 20 2a 70 52 65 61 6c 45 6e 76 20 3d 20  env *pRealEnv = 
2930: 74 64 62 5f 6c 73 6d 5f 65 6e 76 28 29 3b 0a 20  tdb_lsm_env();. 
2940: 20 72 65 74 75 72 6e 20 70 52 65 61 6c 45 6e 76   return pRealEnv
2950: 2d 3e 78 53 68 6d 4d 61 70 28 70 2d 3e 70 52 65  ->xShmMap(p->pRe
2960: 61 6c 2c 20 69 52 65 67 69 6f 6e 2c 20 73 7a 2c  al, iRegion, sz,
2970: 20 70 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   pp);.}..static 
2980: 76 6f 69 64 20 74 65 73 74 45 6e 76 53 68 6d 42  void testEnvShmB
2990: 61 72 72 69 65 72 28 76 6f 69 64 29 7b 0a 7d 0a  arrier(void){.}.
29a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
29b0: 45 6e 76 53 68 6d 55 6e 6d 61 70 28 6c 73 6d 5f  EnvShmUnmap(lsm_
29c0: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
29d0: 20 62 44 65 6c 29 7b 0a 20 20 4c 73 6d 46 69 6c   bDel){.  LsmFil
29e0: 65 20 2a 70 20 3d 20 28 4c 73 6d 46 69 6c 65 20  e *p = (LsmFile 
29f0: 2a 29 70 46 69 6c 65 3b 0a 20 20 6c 73 6d 5f 65  *)pFile;.  lsm_e
2a00: 6e 76 20 2a 70 52 65 61 6c 45 6e 76 20 3d 20 74  nv *pRealEnv = t
2a10: 64 62 5f 6c 73 6d 5f 65 6e 76 28 29 3b 0a 20 20  db_lsm_env();.  
2a20: 72 65 74 75 72 6e 20 70 52 65 61 6c 45 6e 76 2d  return pRealEnv-
2a30: 3e 78 53 68 6d 55 6e 6d 61 70 28 70 2d 3e 70 52  >xShmUnmap(p->pR
2a40: 65 61 6c 2c 20 62 44 65 6c 29 3b 0a 7d 0a 0a 73  eal, bDel);.}..s
2a50: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 45 6e  tatic int testEn
2a60: 76 53 6c 65 65 70 28 6c 73 6d 5f 65 6e 76 20 2a  vSleep(lsm_env *
2a70: 70 45 6e 76 2c 20 69 6e 74 20 75 73 29 7b 0a 20  pEnv, int us){. 
2a80: 20 6c 73 6d 5f 65 6e 76 20 2a 70 52 65 61 6c 45   lsm_env *pRealE
2a90: 6e 76 20 3d 20 74 64 62 5f 6c 73 6d 5f 65 6e 76  nv = tdb_lsm_env
2aa0: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  ();.  return pRe
2ab0: 61 6c 45 6e 76 2d 3e 78 53 6c 65 65 70 28 70 52  alEnv->xSleep(pR
2ac0: 65 61 6c 45 6e 76 2c 20 75 73 29 3b 0a 7d 0a 0a  ealEnv, us);.}..
2ad0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 53 79  static void doSy
2ae0: 73 74 65 6d 43 72 61 73 68 28 4c 73 6d 44 62 20  stemCrash(LsmDb 
2af0: 2a 70 44 62 29 7b 0a 20 20 6c 73 6d 5f 65 6e 76  *pDb){.  lsm_env
2b00: 20 2a 70 45 6e 76 20 3d 20 74 64 62 5f 6c 73 6d   *pEnv = tdb_lsm
2b10: 5f 65 6e 76 28 29 3b 0a 20 20 69 6e 74 20 69 46  _env();.  int iF
2b20: 69 6c 65 3b 0a 20 20 69 6e 74 20 69 53 65 65 64  ile;.  int iSeed
2b30: 20 3d 20 70 44 62 2d 3e 61 46 69 6c 65 5b 30 5d   = pDb->aFile[0]
2b40: 2e 6e 53 65 63 74 6f 72 20 2b 20 70 44 62 2d 3e  .nSector + pDb->
2b50: 61 46 69 6c 65 5b 31 5d 2e 6e 53 65 63 74 6f 72  aFile[1].nSector
2b60: 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ;..  char *zFile
2b70: 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20   = pDb->zName;. 
2b80: 20 63 68 61 72 20 2a 7a 46 72 65 65 20 3d 20 30   char *zFree = 0
2b90: 3b 0a 0a 20 20 66 6f 72 28 69 46 69 6c 65 3d 30  ;..  for(iFile=0
2ba0: 3b 20 69 46 69 6c 65 3c 32 3b 20 69 46 69 6c 65  ; iFile<2; iFile
2bb0: 2b 2b 29 7b 0a 20 20 20 20 6c 73 6d 5f 66 69 6c  ++){.    lsm_fil
2bc0: 65 20 2a 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  e *pFile = 0;.  
2bd0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 70 45    int i;..    pE
2be0: 6e 76 2d 3e 78 4f 70 65 6e 28 70 45 6e 76 2c 20  nv->xOpen(pEnv, 
2bf0: 7a 46 69 6c 65 2c 20 30 2c 20 26 70 46 69 6c 65  zFile, 0, &pFile
2c00: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2c10: 69 3c 70 44 62 2d 3e 61 46 69 6c 65 5b 69 46 69  i<pDb->aFile[iFi
2c20: 6c 65 5d 2e 6e 53 65 63 74 6f 72 3b 20 69 2b 2b  le].nSector; i++
2c30: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f 6c  ){.      u8 *aOl
2c40: 64 20 3d 20 70 44 62 2d 3e 61 46 69 6c 65 5b 69  d = pDb->aFile[i
2c50: 46 69 6c 65 5d 2e 61 53 65 63 74 6f 72 5b 69 5d  File].aSector[i]
2c60: 2e 61 4f 6c 64 3b 0a 20 20 20 20 20 20 69 66 28  .aOld;.      if(
2c70: 20 61 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20   aOld ){.       
2c80: 20 69 6e 74 20 69 4f 70 74 20 3d 20 74 65 73 74   int iOpt = test
2c90: 50 72 6e 67 56 61 6c 75 65 28 69 53 65 65 64 2b  PrngValue(iSeed+
2ca0: 2b 29 20 25 20 33 3b 0a 20 20 20 20 20 20 20 20  +) % 3;.        
2cb0: 73 77 69 74 63 68 28 20 69 4f 70 74 20 29 7b 0a  switch( iOpt ){.
2cc0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 30            case 0
2cd0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  :.            br
2ce0: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  eak;..          
2cf0: 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 20 20  case 1:.        
2d00: 20 20 20 20 74 65 73 74 50 72 6e 67 41 72 72 61      testPrngArra
2d10: 79 28 69 53 65 65 64 2b 2b 2c 20 28 75 33 32 20  y(iSeed++, (u32 
2d20: 2a 29 61 4f 6c 64 2c 20 70 44 62 2d 3e 73 7a 53  *)aOld, pDb->szS
2d30: 65 63 74 6f 72 2f 34 29 3b 0a 20 20 20 20 20 20  ector/4);.      
2d40: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 2d 74 68        /* Fall-th
2d50: 72 6f 75 67 68 20 2a 2f 0a 0a 20 20 20 20 20 20  rough */..      
2d60: 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
2d70: 20 20 20 20 20 20 20 20 70 45 6e 76 2d 3e 78 57          pEnv->xW
2d80: 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20  rite(.          
2d90: 20 20 20 20 20 20 70 46 69 6c 65 2c 20 28 6c 73        pFile, (ls
2da0: 6d 5f 69 36 34 29 69 20 2a 20 70 44 62 2d 3e 73  m_i64)i * pDb->s
2db0: 7a 53 65 63 74 6f 72 2c 20 61 4f 6c 64 2c 20 70  zSector, aOld, p
2dc0: 44 62 2d 3e 73 7a 53 65 63 74 6f 72 0a 20 20 20  Db->szSector.   
2dd0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
2de0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2df0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e00: 20 74 65 73 74 46 72 65 65 28 61 4f 6c 64 29 3b   testFree(aOld);
2e10: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 61 46  .        pDb->aF
2e20: 69 6c 65 5b 69 46 69 6c 65 5d 2e 61 53 65 63 74  ile[iFile].aSect
2e30: 6f 72 5b 69 5d 2e 61 4f 6c 64 20 3d 20 30 3b 0a  or[i].aOld = 0;.
2e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e50: 20 20 70 45 6e 76 2d 3e 78 43 6c 6f 73 65 28 70    pEnv->xClose(p
2e60: 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 72 65 65  File);.    zFree
2e70: 20 3d 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74   = zFile = sqlit
2e80: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 6c  e3_mprintf("%s-l
2e90: 6f 67 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  og", pDb->zName)
2ea0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2eb0: 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 7d 0a  _free(zFree);.}.
2ec0: 2f 2a 0a 2a 2a 20 45 6e 64 20 74 65 73 74 20 56  /*.** End test V
2ed0: 46 53 20 63 6f 64 65 2e 0a 2a 2a 2a 2a 2a 2a 2a  FS code..*******
2ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f20: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
2f70: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3000: 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 74  *****.** Begin t
3010: 65 73 74 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20  est compression 
3020: 68 6f 6f 6b 73 2e 0a 2a 2f 0a 0a 23 69 66 64 65  hooks..*/..#ifde
3030: 66 20 48 41 56 45 5f 5a 4c 49 42 0a 23 69 6e 63  f HAVE_ZLIB.#inc
3040: 6c 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 0a 73  lude <zlib.h>..s
3050: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5a 69  tatic int testZi
3060: 70 42 6f 75 6e 64 28 76 6f 69 64 20 2a 70 43 74  pBound(void *pCt
3070: 78 2c 20 69 6e 74 20 6e 53 72 63 29 7b 0a 20 20  x, int nSrc){.  
3080: 72 65 74 75 72 6e 20 63 6f 6d 70 72 65 73 73 42  return compressB
3090: 6f 75 6e 64 28 6e 53 72 63 29 3b 0a 7d 0a 0a 73  ound(nSrc);.}..s
30a0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5a 69  tatic int testZi
30b0: 70 43 6f 6d 70 72 65 73 73 28 0a 20 20 76 6f 69  pCompress(.  voi
30c0: 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  d *pCtx,        
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e0: 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20  Context pointer 
30f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 2c  */.  char *aOut,
3100: 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 20 20 20   int *pnOut,    
3110: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 75 66       /* OUT: Buf
3120: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
3130: 6f 6d 70 72 65 73 73 65 64 20 64 61 74 61 20 2a  ompressed data *
3140: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3150: 61 49 6e 2c 20 69 6e 74 20 6e 49 6e 20 20 20 20  aIn, int nIn    
3160: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3170: 6e 74 61 69 6e 69 6e 67 20 69 6e 70 75 74 20 64  ntaining input d
3180: 61 74 61 20 2a 2f 0a 29 7b 0a 20 20 75 4c 6f 6e  ata */.){.  uLon
3190: 67 66 20 6e 20 3d 20 2a 70 6e 4f 75 74 3b 20 20  gf n = *pnOut;  
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31b0: 6e 2f 6f 75 74 20 62 75 66 66 65 72 20 73 69 7a  n/out buffer siz
31c0: 65 20 66 6f 72 20 63 6f 6d 70 72 65 73 73 28 29  e for compress()
31d0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 72 65 73        /* compres
3200: 73 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20  s() return code 
3210: 2a 2f 0a 20 0a 20 20 72 63 20 3d 20 63 6f 6d 70  */. .  rc = comp
3220: 72 65 73 73 28 28 42 79 74 65 66 2a 29 61 4f 75  ress((Bytef*)aOu
3230: 74 2c 20 26 6e 2c 20 28 42 79 74 65 66 2a 29 61  t, &n, (Bytef*)a
3240: 49 6e 2c 20 6e 49 6e 29 3b 0a 20 20 2a 70 6e 4f  In, nIn);.  *pnO
3250: 75 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ut = n;.  return
3260: 20 28 72 63 3d 3d 5a 5f 4f 4b 20 3f 20 30 20 3a   (rc==Z_OK ? 0 :
3270: 20 4c 53 4d 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a   LSM_ERROR);.}..
3280: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5a  static int testZ
3290: 69 70 55 6e 63 6f 6d 70 72 65 73 73 28 0a 20 20  ipUncompress(.  
32a0: 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74  /* Context point
32d0: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 4f  er */.  char *aO
32e0: 75 74 2c 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20  ut, int *pnOut, 
32f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
3300: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3310: 67 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20 64  g uncompressed d
3320: 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ata */.  const c
3330: 68 61 72 20 2a 61 49 6e 2c 20 69 6e 74 20 6e 49  har *aIn, int nI
3340: 6e 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66  n        /* Buff
3350: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 6e  er containing in
3360: 70 75 74 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20  put data */.){. 
3370: 20 75 4c 6f 6e 67 66 20 6e 20 3d 20 2a 70 6e 4f   uLongf n = *pnO
3380: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
3390: 20 2f 2a 20 49 6e 2f 6f 75 74 20 62 75 66 66 65   /* In/out buffe
33a0: 72 20 73 69 7a 65 20 66 6f 72 20 75 6e 63 6f 6d  r size for uncom
33b0: 70 72 65 73 73 28 29 20 2a 2f 0a 20 20 69 6e 74  press() */.  int
33c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33e0: 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74  uncompress() ret
33f0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72  urn code */..  r
3400: 63 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28 28  c = uncompress((
3410: 42 79 74 65 66 2a 29 61 4f 75 74 2c 20 26 6e 2c  Bytef*)aOut, &n,
3420: 20 28 42 79 74 65 66 2a 29 61 49 6e 2c 20 6e 49   (Bytef*)aIn, nI
3430: 6e 29 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20 6e  n);.  *pnOut = n
3440: 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ;.  return (rc==
3450: 5a 5f 4f 4b 20 3f 20 30 20 3a 20 4c 53 4d 5f 45  Z_OK ? 0 : LSM_E
3460: 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  RROR);.}..static
3470: 20 69 6e 74 20 74 65 73 74 43 6f 6e 66 69 67 75   int testConfigu
3480: 72 65 43 6f 6d 70 72 65 73 73 69 6f 6e 28 6c 73  reCompression(ls
3490: 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20 73 74  m_db *pDb){.  st
34a0: 61 74 69 63 20 6c 73 6d 5f 63 6f 6d 70 72 65 73  atic lsm_compres
34b0: 73 20 7a 69 70 20 3d 20 7b 0a 20 20 20 20 30 2c  s zip = {.    0,
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
34e0: 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 28  ontext pointer (
34f0: 75 6e 75 73 65 64 29 20 2a 2f 0a 20 20 20 20 31  unused) */.    1
3500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3520: 49 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  Id value */.    
3530: 74 65 73 74 5a 69 70 42 6f 75 6e 64 2c 20 20 20  testZipBound,   
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3550: 20 78 42 6f 75 6e 64 20 6d 65 74 68 6f 64 20 2a   xBound method *
3560: 2f 0a 20 20 20 20 74 65 73 74 5a 69 70 43 6f 6d  /.    testZipCom
3570: 70 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  press,          
3580: 20 20 20 20 2f 2a 20 78 43 6f 6d 70 72 65 73 73      /* xCompress
3590: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 20 20 74   method */.    t
35a0: 65 73 74 5a 69 70 55 6e 63 6f 6d 70 72 65 73 73  estZipUncompress
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35c0: 78 55 6e 63 6f 6d 70 72 65 73 73 20 6d 65 74 68  xUncompress meth
35d0: 6f 64 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72 65 74  od */.  };.  ret
35e0: 75 72 6e 20 6c 73 6d 5f 63 6f 6e 66 69 67 28 70  urn lsm_config(p
35f0: 44 62 2c 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 53  Db, LSM_CONFIG_S
3600: 45 54 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 2c 20  ET_COMPRESSION, 
3610: 26 7a 69 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  &zip);.}.#endif 
3620: 2f 2a 20 69 66 64 65 66 20 48 41 56 45 5f 5a 4c  /* ifdef HAVE_ZL
3630: 49 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 6e 64  IB */../*.** End
3640: 20 74 65 73 74 20 63 6f 6d 70 72 65 73 73 69 6f   test compressio
3650: 6e 20 68 6f 6f 6b 73 2e 0a 2a 2a 2a 2a 2a 2a 2a  n hooks..*******
3660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36a0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
36b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
36f0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3700: 6c 73 6d 5f 63 6c 6f 73 65 28 54 65 73 74 44 62  lsm_close(TestDb
3710: 20 2a 70 54 65 73 74 44 62 29 7b 0a 20 20 69 6e   *pTestDb){.  in
3720: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
3730: 4c 53 4d 5f 4f 4b 3b 0a 20 20 4c 73 6d 44 62 20  LSM_OK;.  LsmDb 
3740: 2a 70 44 62 20 3d 20 28 4c 73 6d 44 62 20 2a 29  *pDb = (LsmDb *)
3750: 70 54 65 73 74 44 62 3b 0a 0a 20 20 6c 73 6d 5f  pTestDb;..  lsm_
3760: 63 73 72 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 70  csr_close(pDb->p
3770: 43 73 72 29 3b 0a 20 20 6c 73 6d 5f 63 6c 6f 73  Csr);.  lsm_clos
3780: 65 28 70 44 62 2d 3e 64 62 29 3b 0a 0a 20 20 2f  e(pDb->db);..  /
3790: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6d  * If this is a m
37a0: 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 64 61  ulti-threaded da
37b0: 74 61 62 61 73 65 2c 20 77 61 69 74 20 6f 6e 20  tabase, wait on 
37c0: 74 68 65 20 77 6f 72 6b 65 72 20 74 68 72 65 61  the worker threa
37d0: 64 73 2e 20 2a 2f 0a 20 20 6d 74 5f 73 68 75 74  ds. */.  mt_shut
37e0: 64 6f 77 6e 28 70 44 62 29 3b 0a 20 20 66 6f 72  down(pDb);.  for
37f0: 28 69 3d 30 3b 20 69 3c 70 44 62 2d 3e 6e 57 6f  (i=0; i<pDb->nWo
3800: 72 6b 65 72 20 26 26 20 72 63 3d 3d 4c 53 4d 5f  rker && rc==LSM_
3810: 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  OK; i++){.    rc
3820: 20 3d 20 70 44 62 2d 3e 61 57 6f 72 6b 65 72 5b   = pDb->aWorker[
3830: 69 5d 2e 77 6f 72 6b 65 72 5f 72 63 3b 0a 20 20  i].worker_rc;.  
3840: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
3850: 70 44 62 2d 3e 61 46 69 6c 65 5b 30 5d 2e 6e 53  pDb->aFile[0].nS
3860: 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
3870: 20 74 65 73 74 46 72 65 65 28 70 44 62 2d 3e 61   testFree(pDb->a
3880: 46 69 6c 65 5b 30 5d 2e 61 53 65 63 74 6f 72 5b  File[0].aSector[
3890: 69 5d 2e 61 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20  i].aOld);.  }.  
38a0: 74 65 73 74 46 72 65 65 28 70 44 62 2d 3e 61 46  testFree(pDb->aF
38b0: 69 6c 65 5b 30 5d 2e 61 53 65 63 74 6f 72 29 3b  ile[0].aSector);
38c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
38d0: 62 2d 3e 61 46 69 6c 65 5b 31 5d 2e 6e 53 65 63  b->aFile[1].nSec
38e0: 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74  tor; i++){.    t
38f0: 65 73 74 46 72 65 65 28 70 44 62 2d 3e 61 46 69  estFree(pDb->aFi
3900: 6c 65 5b 31 5d 2e 61 53 65 63 74 6f 72 5b 69 5d  le[1].aSector[i]
3910: 2e 61 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 74 65  .aOld);.  }.  te
3920: 73 74 46 72 65 65 28 70 44 62 2d 3e 61 46 69 6c  stFree(pDb->aFil
3930: 65 5b 31 5d 2e 61 53 65 63 74 6f 72 29 3b 0a 0a  e[1].aSector);..
3940: 20 20 6d 65 6d 73 65 74 28 70 44 62 2c 20 73 69    memset(pDb, si
3950: 7a 65 6f 66 28 4c 73 6d 44 62 29 2c 20 30 78 31  zeof(LsmDb), 0x1
3960: 31 29 3b 0a 20 20 74 65 73 74 46 72 65 65 28 28  1);.  testFree((
3970: 63 68 61 72 20 2a 29 70 44 62 2d 3e 70 42 75 66  char *)pDb->pBuf
3980: 29 3b 0a 20 20 74 65 73 74 46 72 65 65 28 28 63  );.  testFree((c
3990: 68 61 72 20 2a 29 70 44 62 29 3b 0a 20 20 72 65  har *)pDb);.  re
39a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
39b0: 69 63 20 76 6f 69 64 20 6d 74 5f 73 69 67 6e 61  ic void mt_signa
39c0: 6c 5f 77 6f 72 6b 65 72 28 4c 73 6d 44 62 2a 2c  l_worker(LsmDb*,
39d0: 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20 69   int);..static i
39e0: 6e 74 20 77 61 69 74 4f 6e 43 68 65 63 6b 70 6f  nt waitOnCheckpo
39f0: 69 6e 74 65 72 28 4c 73 6d 44 62 20 2a 70 44 62  inter(LsmDb *pDb
3a00: 2c 20 6c 73 6d 5f 64 62 20 2a 64 62 29 7b 0a 20  , lsm_db *db){. 
3a10: 20 69 6e 74 20 6e 53 6c 65 65 70 20 3d 20 30 3b   int nSleep = 0;
3a20: 0a 20 20 69 6e 74 20 6e 4b 42 3b 0a 20 20 69 6e  .  int nKB;.  in
3a30: 74 20 72 63 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  t rc;..  do {.  
3a40: 20 20 6e 4b 42 20 3d 20 30 3b 0a 20 20 20 20 72    nKB = 0;.    r
3a50: 63 20 3d 20 6c 73 6d 5f 69 6e 66 6f 28 64 62 2c  c = lsm_info(db,
3a60: 20 4c 53 4d 5f 49 4e 46 4f 5f 43 48 45 43 4b 50   LSM_INFO_CHECKP
3a70: 4f 49 4e 54 5f 53 49 5a 45 2c 20 26 6e 4b 42 29  OINT_SIZE, &nKB)
3a80: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 4c 53  ;.    if( rc!=LS
3a90: 4d 5f 4f 4b 20 7c 7c 20 6e 4b 42 3c 70 44 62 2d  M_OK || nKB<pDb-
3aa0: 3e 6e 4d 74 4d 61 78 43 6b 70 74 20 29 20 62 72  >nMtMaxCkpt ) br
3ab0: 65 61 6b 3b 0a 23 69 66 64 65 66 20 4c 53 4d 5f  eak;.#ifdef LSM_
3ac0: 4d 55 54 45 58 5f 50 54 48 52 45 41 44 53 0a 20  MUTEX_PTHREADS. 
3ad0: 20 20 20 6d 74 5f 73 69 67 6e 61 6c 5f 77 6f 72     mt_signal_wor
3ae0: 6b 65 72 28 70 44 62 2c 20 0a 20 20 20 20 20 20  ker(pDb, .      
3af0: 20 20 28 70 44 62 2d 3e 65 4d 6f 64 65 3d 3d 4c    (pDb->eMode==L
3b00: 53 4d 54 45 53 54 5f 4d 4f 44 45 5f 42 41 43 4b  SMTEST_MODE_BACK
3b10: 47 52 4f 55 4e 44 5f 43 4b 50 54 20 3f 20 30 20  GROUND_CKPT ? 0 
3b20: 3a 20 31 29 0a 20 20 20 20 29 3b 0a 23 65 6e 64  : 1).    );.#end
3b30: 69 66 0a 20 20 20 20 75 73 6c 65 65 70 28 35 30  if.    usleep(50
3b40: 30 30 29 3b 0a 20 20 20 20 6e 53 6c 65 65 70 20  00);.    nSleep 
3b50: 2b 3d 20 35 3b 0a 20 20 7d 77 68 69 6c 65 28 20  += 5;.  }while( 
3b60: 31 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20  1 );..#if 0.    
3b70: 69 66 28 20 6e 53 6c 65 65 70 20 29 20 70 72 69  if( nSleep ) pri
3b80: 6e 74 66 28 22 23 20 77 61 69 74 4f 6e 43 68 65  ntf("# waitOnChe
3b90: 63 6b 70 6f 69 6e 74 65 72 28 29 3a 20 6e 53 6c  ckpointer(): nSl
3ba0: 65 65 70 3d 25 64 5c 6e 22 2c 20 6e 53 6c 65 65  eep=%d\n", nSlee
3bb0: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  p);.#endif..  re
3bc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
3bd0: 69 63 20 69 6e 74 20 77 61 69 74 4f 6e 57 6f 72  ic int waitOnWor
3be0: 6b 65 72 28 4c 73 6d 44 62 20 2a 70 44 62 29 7b  ker(LsmDb *pDb){
3bf0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
3c00: 20 6e 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20   nLimit = -1;.  
3c10: 69 6e 74 20 6e 53 6c 65 65 70 20 3d 20 30 3b 0a  int nSleep = 0;.
3c20: 0a 20 20 72 63 20 3d 20 6c 73 6d 5f 63 6f 6e 66  .  rc = lsm_conf
3c30: 69 67 28 70 44 62 2d 3e 64 62 2c 20 4c 53 4d 5f  ig(pDb->db, LSM_
3c40: 43 4f 4e 46 49 47 5f 41 55 54 4f 46 4c 55 53 48  CONFIG_AUTOFLUSH
3c50: 2c 20 26 6e 4c 69 6d 69 74 29 3b 0a 20 20 64 6f  , &nLimit);.  do
3c60: 20 7b 0a 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c   {.    int nOld,
3c70: 20 6e 4e 65 77 2c 20 72 63 32 3b 0a 20 20 20 20   nNew, rc2;.    
3c80: 72 63 32 20 3d 20 6c 73 6d 5f 69 6e 66 6f 28 70  rc2 = lsm_info(p
3c90: 44 62 2d 3e 64 62 2c 20 4c 53 4d 5f 49 4e 46 4f  Db->db, LSM_INFO
3ca0: 5f 54 52 45 45 5f 53 49 5a 45 2c 20 26 6e 4f 6c  _TREE_SIZE, &nOl
3cb0: 64 2c 20 26 6e 4e 65 77 29 3b 0a 20 20 20 20 69  d, &nNew);.    i
3cc0: 66 28 20 72 63 32 21 3d 4c 53 4d 5f 4f 4b 20 29  f( rc2!=LSM_OK )
3cd0: 20 72 65 74 75 72 6e 20 72 63 32 3b 0a 20 20 20   return rc2;.   
3ce0: 20 69 66 28 20 6e 4f 6c 64 3d 3d 30 20 7c 7c 20   if( nOld==0 || 
3cf0: 6e 4e 65 77 3c 28 6e 4c 69 6d 69 74 2f 32 29 20  nNew<(nLimit/2) 
3d00: 29 20 62 72 65 61 6b 3b 0a 23 69 66 64 65 66 20  ) break;.#ifdef 
3d10: 4c 53 4d 5f 4d 55 54 45 58 5f 50 54 48 52 45 41  LSM_MUTEX_PTHREA
3d20: 44 53 0a 20 20 20 20 6d 74 5f 73 69 67 6e 61 6c  DS.    mt_signal
3d30: 5f 77 6f 72 6b 65 72 28 70 44 62 2c 20 30 29 3b  _worker(pDb, 0);
3d40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 73 6c 65  .#endif.    usle
3d50: 65 70 28 35 30 30 30 29 3b 0a 20 20 20 20 6e 53  ep(5000);.    nS
3d60: 6c 65 65 70 20 2b 3d 20 35 3b 0a 20 20 7d 77 68  leep += 5;.  }wh
3d70: 69 6c 65 28 20 31 20 29 3b 0a 0a 23 69 66 20 30  ile( 1 );..#if 0
3d80: 0a 20 20 69 66 28 20 6e 53 6c 65 65 70 20 29 20  .  if( nSleep ) 
3d90: 70 72 69 6e 74 66 28 22 23 20 77 61 69 74 4f 6e  printf("# waitOn
3da0: 57 6f 72 6b 65 72 28 29 3a 20 6e 53 6c 65 65 70  Worker(): nSleep
3db0: 3d 25 64 5c 6e 22 2c 20 6e 53 6c 65 65 70 29 3b  =%d\n", nSleep);
3dc0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
3dd0: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
3de0: 69 6e 74 20 74 65 73 74 5f 6c 73 6d 5f 77 72 69  int test_lsm_wri
3df0: 74 65 28 0a 20 20 54 65 73 74 44 62 20 2a 70 54  te(.  TestDb *pT
3e00: 65 73 74 44 62 2c 20 0a 20 20 76 6f 69 64 20 2a  estDb, .  void *
3e10: 70 4b 65 79 2c 20 0a 20 20 69 6e 74 20 6e 4b 65  pKey, .  int nKe
3e20: 79 2c 20 0a 20 20 76 6f 69 64 20 2a 70 56 61 6c  y, .  void *pVal
3e30: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 0a 29 7b 0a  ,.  int nVal.){.
3e40: 20 20 4c 73 6d 44 62 20 2a 70 44 62 20 3d 20 28    LsmDb *pDb = (
3e50: 4c 73 6d 44 62 20 2a 29 70 54 65 73 74 44 62 3b  LsmDb *)pTestDb;
3e60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f  .  int rc = LSM_
3e70: 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e  OK;..  if( pDb->
3e80: 65 4d 6f 64 65 3d 3d 4c 53 4d 54 45 53 54 5f 4d  eMode==LSMTEST_M
3e90: 4f 44 45 5f 42 41 43 4b 47 52 4f 55 4e 44 5f 43  ODE_BACKGROUND_C
3ea0: 4b 50 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  KPT ){.    rc = 
3eb0: 77 61 69 74 4f 6e 43 68 65 63 6b 70 6f 69 6e 74  waitOnCheckpoint
3ec0: 65 72 28 70 44 62 2c 20 70 44 62 2d 3e 64 62 29  er(pDb, pDb->db)
3ed0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 0a 20  ;.  }else if( . 
3ee0: 20 20 20 20 20 70 44 62 2d 3e 65 4d 6f 64 65 3d       pDb->eMode=
3ef0: 3d 4c 53 4d 54 45 53 54 5f 4d 4f 44 45 5f 42 41  =LSMTEST_MODE_BA
3f00: 43 4b 47 52 4f 55 4e 44 5f 57 4f 52 4b 0a 20 20  CKGROUND_WORK.  
3f10: 20 7c 7c 20 70 44 62 2d 3e 65 4d 6f 64 65 3d 3d   || pDb->eMode==
3f20: 4c 53 4d 54 45 53 54 5f 4d 4f 44 45 5f 42 41 43  LSMTEST_MODE_BAC
3f30: 4b 47 52 4f 55 4e 44 5f 42 4f 54 48 20 0a 20 20  KGROUND_BOTH .  
3f40: 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 61 69 74  ){.    rc = wait
3f50: 4f 6e 57 6f 72 6b 65 72 28 70 44 62 29 3b 0a 20  OnWorker(pDb);. 
3f60: 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53   }..  if( rc==LS
3f70: 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  M_OK ){.    rc =
3f80: 20 6c 73 6d 5f 69 6e 73 65 72 74 28 70 44 62 2d   lsm_insert(pDb-
3f90: 3e 64 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  >db, pKey, nKey,
3fa0: 20 70 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20   pVal, nVal);.  
3fb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
3fc0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
3fd0: 74 5f 6c 73 6d 5f 64 65 6c 65 74 65 28 54 65 73  t_lsm_delete(Tes
3fe0: 74 44 62 20 2a 70 54 65 73 74 44 62 2c 20 76 6f  tDb *pTestDb, vo
3ff0: 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b  id *pKey, int nK
4000: 65 79 29 7b 0a 20 20 4c 73 6d 44 62 20 2a 70 44  ey){.  LsmDb *pD
4010: 62 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70 54 65  b = (LsmDb *)pTe
4020: 73 74 44 62 3b 0a 20 20 72 65 74 75 72 6e 20 6c  stDb;.  return l
4030: 73 6d 5f 64 65 6c 65 74 65 28 70 44 62 2d 3e 64  sm_delete(pDb->d
4040: 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, pKey, nKey);.
4050: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
4060: 73 74 5f 6c 73 6d 5f 64 65 6c 65 74 65 5f 72 61  st_lsm_delete_ra
4070: 6e 67 65 28 0a 20 20 54 65 73 74 44 62 20 2a 70  nge(.  TestDb *p
4080: 54 65 73 74 44 62 2c 20 0a 20 20 76 6f 69 64 20  TestDb, .  void 
4090: 2a 70 4b 65 79 31 2c 20 69 6e 74 20 6e 4b 65 79  *pKey1, int nKey
40a0: 31 2c 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 32  1,.  void *pKey2
40b0: 2c 20 69 6e 74 20 6e 4b 65 79 32 0a 29 7b 0a 20  , int nKey2.){. 
40c0: 20 4c 73 6d 44 62 20 2a 70 44 62 20 3d 20 28 4c   LsmDb *pDb = (L
40d0: 73 6d 44 62 20 2a 29 70 54 65 73 74 44 62 3b 0a  smDb *)pTestDb;.
40e0: 20 20 72 65 74 75 72 6e 20 6c 73 6d 5f 64 65 6c    return lsm_del
40f0: 65 74 65 5f 72 61 6e 67 65 28 70 44 62 2d 3e 64  ete_range(pDb->d
4100: 62 2c 20 70 4b 65 79 31 2c 20 6e 4b 65 79 31 2c  b, pKey1, nKey1,
4110: 20 70 4b 65 79 32 2c 20 6e 4b 65 79 32 29 3b 0a   pKey2, nKey2);.
4120: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
4130: 73 74 5f 6c 73 6d 5f 66 65 74 63 68 28 0a 20 20  st_lsm_fetch(.  
4140: 54 65 73 74 44 62 20 2a 70 54 65 73 74 44 62 2c  TestDb *pTestDb,
4150: 20 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20   .  void *pKey, 
4160: 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 0a 20 20  .  int nKey, .  
4170: 76 6f 69 64 20 2a 2a 70 70 56 61 6c 2c 20 0a 20  void **ppVal, . 
4180: 20 69 6e 74 20 2a 70 6e 56 61 6c 0a 29 7b 0a 20   int *pnVal.){. 
4190: 20 69 6e 74 20 72 63 3b 0a 20 20 4c 73 6d 44 62   int rc;.  LsmDb
41a0: 20 2a 70 44 62 20 3d 20 28 4c 73 6d 44 62 20 2a   *pDb = (LsmDb *
41b0: 29 70 54 65 73 74 44 62 3b 0a 20 20 6c 73 6d 5f  )pTestDb;.  lsm_
41c0: 63 75 72 73 6f 72 20 2a 63 73 72 3b 0a 0a 20 20  cursor *csr;..  
41d0: 69 66 28 20 70 4b 65 79 3d 3d 30 20 29 20 72 65  if( pKey==0 ) re
41e0: 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20  turn LSM_OK;..  
41f0: 69 66 28 20 70 44 62 2d 3e 70 43 73 72 3d 3d 30  if( pDb->pCsr==0
4200: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d   ){.    rc = lsm
4210: 5f 63 73 72 5f 6f 70 65 6e 28 70 44 62 2d 3e 64  _csr_open(pDb->d
4220: 62 2c 20 26 63 73 72 29 3b 0a 20 20 20 20 69 66  b, &csr);.    if
4230: 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72  ( rc!=LSM_OK ) r
4240: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73  eturn rc;.  }els
4250: 65 7b 0a 20 20 20 20 63 73 72 20 3d 20 70 44 62  e{.    csr = pDb
4260: 2d 3e 70 43 73 72 3b 0a 20 20 7d 0a 0a 20 20 72  ->pCsr;.  }..  r
4270: 63 20 3d 20 6c 73 6d 5f 63 73 72 5f 73 65 65 6b  c = lsm_csr_seek
4280: 28 63 73 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  (csr, pKey, nKey
4290: 2c 20 4c 53 4d 5f 53 45 45 4b 5f 45 51 29 3b 0a  , LSM_SEEK_EQ);.
42a0: 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
42b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 73 6d 5f   ){.    if( lsm_
42c0: 63 73 72 5f 76 61 6c 69 64 28 63 73 72 29 20 29  csr_valid(csr) )
42d0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f  {.      const vo
42e0: 69 64 20 2a 70 56 61 6c 3b 20 69 6e 74 20 6e 56  id *pVal; int nV
42f0: 61 6c 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  al;.      rc = l
4300: 73 6d 5f 63 73 72 5f 76 61 6c 75 65 28 63 73 72  sm_csr_value(csr
4310: 2c 20 26 70 56 61 6c 2c 20 26 6e 56 61 6c 29 3b  , &pVal, &nVal);
4320: 0a 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3e  .      if( nVal>
4330: 70 44 62 2d 3e 6e 42 75 66 20 29 7b 0a 20 20 20  pDb->nBuf ){.   
4340: 20 20 20 20 20 74 65 73 74 46 72 65 65 28 70 44       testFree(pD
4350: 62 2d 3e 70 42 75 66 29 3b 0a 20 20 20 20 20 20  b->pBuf);.      
4360: 20 20 70 44 62 2d 3e 70 42 75 66 20 3d 20 74 65    pDb->pBuf = te
4370: 73 74 4d 61 6c 6c 6f 63 28 6e 56 61 6c 2a 32 29  stMalloc(nVal*2)
4380: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 6e  ;.        pDb->n
4390: 42 75 66 20 3d 20 6e 56 61 6c 2a 32 3b 0a 20 20  Buf = nVal*2;.  
43a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
43b0: 70 79 28 70 44 62 2d 3e 70 42 75 66 2c 20 70 56  py(pDb->pBuf, pV
43c0: 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 20 20 20  al, nVal);.     
43d0: 20 2a 70 70 56 61 6c 20 3d 20 70 44 62 2d 3e 70   *ppVal = pDb->p
43e0: 42 75 66 3b 0a 20 20 20 20 20 20 2a 70 6e 56 61  Buf;.      *pnVa
43f0: 6c 20 3d 20 6e 56 61 6c 3b 0a 20 20 20 20 7d 65  l = nVal;.    }e
4400: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 56 61  lse{.      *ppVa
4410: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 6e  l = 0;.      *pn
4420: 56 61 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  Val = -1;.    }.
4430: 20 20 7d 0a 20 20 69 66 28 20 70 44 62 2d 3e 70    }.  if( pDb->p
4440: 43 73 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6c 73  Csr==0 ){.    ls
4450: 6d 5f 63 73 72 5f 63 6c 6f 73 65 28 63 73 72 29  m_csr_close(csr)
4460: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4470: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
4480: 20 74 65 73 74 5f 6c 73 6d 5f 73 63 61 6e 28 0a   test_lsm_scan(.
4490: 20 20 54 65 73 74 44 62 20 2a 70 54 65 73 74 44    TestDb *pTestD
44a0: 62 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  b,.  void *pCtx,
44b0: 0a 20 20 69 6e 74 20 62 52 65 76 65 72 73 65 2c  .  int bReverse,
44c0: 0a 20 20 76 6f 69 64 20 2a 70 46 69 72 73 74 2c  .  void *pFirst,
44d0: 20 69 6e 74 20 6e 46 69 72 73 74 2c 0a 20 20 76   int nFirst,.  v
44e0: 6f 69 64 20 2a 70 4c 61 73 74 2c 20 69 6e 74 20  oid *pLast, int 
44f0: 6e 4c 61 73 74 2c 0a 20 20 76 6f 69 64 20 28 2a  nLast,.  void (*
4500: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20  xCallback)(void 
4510: 2a 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74 20 2c  *, void *, int ,
4520: 20 76 6f 69 64 20 2a 2c 20 69 6e 74 29 0a 29 7b   void *, int).){
4530: 0a 20 20 4c 73 6d 44 62 20 2a 70 44 62 20 3d 20  .  LsmDb *pDb = 
4540: 28 4c 73 6d 44 62 20 2a 29 70 54 65 73 74 44 62  (LsmDb *)pTestDb
4550: 3b 0a 20 20 6c 73 6d 5f 63 75 72 73 6f 72 20 2a  ;.  lsm_cursor *
4560: 63 73 72 3b 0a 20 20 6c 73 6d 5f 63 75 72 73 6f  csr;.  lsm_curso
4570: 72 20 2a 63 73 72 32 20 3d 20 30 3b 0a 20 20 69  r *csr2 = 0;.  i
4580: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 44  nt rc;..  if( pD
4590: 62 2d 3e 70 43 73 72 3d 3d 30 20 29 7b 0a 20 20  b->pCsr==0 ){.  
45a0: 20 20 72 63 20 3d 20 6c 73 6d 5f 63 73 72 5f 6f    rc = lsm_csr_o
45b0: 70 65 6e 28 70 44 62 2d 3e 64 62 2c 20 26 63 73  pen(pDb->db, &cs
45c0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
45d0: 4c 53 4d 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  LSM_OK ) return 
45e0: 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rc;.  }else{.   
45f0: 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20   rc = LSM_OK;.  
4600: 20 20 63 73 72 20 3d 20 70 44 62 2d 3e 70 43 73    csr = pDb->pCs
4610: 72 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 52  r;.  }..  if( bR
4620: 65 76 65 72 73 65 20 29 7b 0a 20 20 20 20 69 66  everse ){.    if
4630: 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ( pLast ){.     
4640: 20 72 63 20 3d 20 6c 73 6d 5f 63 73 72 5f 73 65   rc = lsm_csr_se
4650: 65 6b 28 63 73 72 2c 20 70 4c 61 73 74 2c 20 6e  ek(csr, pLast, n
4660: 4c 61 73 74 2c 20 4c 53 4d 5f 53 45 45 4b 5f 4c  Last, LSM_SEEK_L
4670: 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  E);.    }else{. 
4680: 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f 63 73       rc = lsm_cs
4690: 72 5f 6c 61 73 74 28 63 73 72 29 3b 0a 20 20 20  r_last(csr);.   
46a0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
46b0: 69 66 28 20 70 46 69 72 73 74 20 29 7b 0a 20 20  if( pFirst ){.  
46c0: 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f 63 73 72      rc = lsm_csr
46d0: 5f 73 65 65 6b 28 63 73 72 2c 20 70 46 69 72 73  _seek(csr, pFirs
46e0: 74 2c 20 6e 46 69 72 73 74 2c 20 4c 53 4d 5f 53  t, nFirst, LSM_S
46f0: 45 45 4b 5f 47 45 29 3b 0a 20 20 20 20 7d 65 6c  EEK_GE);.    }el
4700: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  se{.      rc = l
4710: 73 6d 5f 63 73 72 5f 66 69 72 73 74 28 63 73 72  sm_csr_first(csr
4720: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
4730: 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f  while( rc==LSM_O
4740: 4b 20 26 26 20 6c 73 6d 5f 63 73 72 5f 76 61 6c  K && lsm_csr_val
4750: 69 64 28 63 73 72 29 20 29 7b 0a 20 20 20 20 63  id(csr) ){.    c
4760: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 3b  onst void *pKey;
4770: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 63   int nKey;.    c
4780: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 56 61 6c 3b  onst void *pVal;
4790: 20 69 6e 74 20 6e 56 61 6c 3b 0a 20 20 20 20 69   int nVal;.    i
47a0: 6e 74 20 63 6d 70 3b 0a 0a 20 20 20 20 6c 73 6d  nt cmp;..    lsm
47b0: 5f 63 73 72 5f 6b 65 79 28 63 73 72 2c 20 26 70  _csr_key(csr, &p
47c0: 4b 65 79 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20  Key, &nKey);.   
47d0: 20 6c 73 6d 5f 63 73 72 5f 76 61 6c 75 65 28 63   lsm_csr_value(c
47e0: 73 72 2c 20 26 70 56 61 6c 2c 20 26 6e 56 61 6c  sr, &pVal, &nVal
47f0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 52 65 76  );..    if( bRev
4800: 65 72 73 65 20 26 26 20 70 46 69 72 73 74 20 29  erse && pFirst )
4810: 7b 0a 20 20 20 20 20 20 63 6d 70 20 3d 20 6d 65  {.      cmp = me
4820: 6d 63 6d 70 28 70 46 69 72 73 74 2c 20 70 4b 65  mcmp(pFirst, pKe
4830: 79 2c 20 4d 49 4e 28 6e 4b 65 79 2c 20 6e 46 69  y, MIN(nKey, nFi
4840: 72 73 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28  rst));.      if(
4850: 20 63 6d 70 3e 30 20 7c 7c 20 28 63 6d 70 3d 3d   cmp>0 || (cmp==
4860: 30 20 26 26 20 6e 46 69 72 73 74 3e 6e 4b 65 79  0 && nFirst>nKey
4870: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
4880: 65 6c 73 65 20 69 66 28 20 62 52 65 76 65 72 73  else if( bRevers
4890: 65 3d 3d 30 20 26 26 20 70 4c 61 73 74 20 29 7b  e==0 && pLast ){
48a0: 0a 20 20 20 20 20 20 63 6d 70 20 3d 20 6d 65 6d  .      cmp = mem
48b0: 63 6d 70 28 70 4c 61 73 74 2c 20 70 4b 65 79 2c  cmp(pLast, pKey,
48c0: 20 4d 49 4e 28 6e 4b 65 79 2c 20 6e 4c 61 73 74   MIN(nKey, nLast
48d0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d  ));.      if( cm
48e0: 70 3c 30 20 7c 7c 20 28 63 6d 70 3d 3d 30 20 26  p<0 || (cmp==0 &
48f0: 26 20 6e 4c 61 73 74 3c 6e 4b 65 79 29 20 29 20  & nLast<nKey) ) 
4900: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4910: 20 20 78 43 61 6c 6c 62 61 63 6b 28 70 43 74 78    xCallback(pCtx
4920: 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 2c 20  , (void *)pKey, 
4930: 6e 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 56  nKey, (void *)pV
4940: 61 6c 2c 20 6e 56 61 6c 29 3b 0a 0a 20 20 20 20  al, nVal);..    
4950: 69 66 28 20 62 52 65 76 65 72 73 65 20 29 7b 0a  if( bReverse ){.
4960: 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f 63        rc = lsm_c
4970: 73 72 5f 70 72 65 76 28 63 73 72 29 3b 0a 20 20  sr_prev(csr);.  
4980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
4990: 63 20 3d 20 6c 73 6d 5f 63 73 72 5f 6e 65 78 74  c = lsm_csr_next
49a0: 28 63 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (csr);.    }.  }
49b0: 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 43 73  ..  if( pDb->pCs
49c0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6c 73 6d 5f  r==0 ){.    lsm_
49d0: 63 73 72 5f 63 6c 6f 73 65 28 63 73 72 29 3b 0a  csr_close(csr);.
49e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
49f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
4a00: 65 73 74 5f 6c 73 6d 5f 62 65 67 69 6e 28 54 65  est_lsm_begin(Te
4a10: 73 74 44 62 20 2a 70 54 65 73 74 44 62 2c 20 69  stDb *pTestDb, i
4a20: 6e 74 20 69 4c 65 76 65 6c 29 7b 0a 20 20 69 6e  nt iLevel){.  in
4a30: 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20  t rc = LSM_OK;. 
4a40: 20 4c 73 6d 44 62 20 2a 70 44 62 20 3d 20 28 4c   LsmDb *pDb = (L
4a50: 73 6d 44 62 20 2a 29 70 54 65 73 74 44 62 3b 0a  smDb *)pTestDb;.
4a60: 0a 20 20 2f 2a 20 69 4c 65 76 65 6c 3d 3d 30 20  .  /* iLevel==0 
4a70: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
4a80: 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 29   if( iLevel==0 )
4a90: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 69 66   return 0;..  if
4aa0: 28 20 70 44 62 2d 3e 70 43 73 72 3d 3d 30 20 29  ( pDb->pCsr==0 )
4ab0: 20 72 63 20 3d 20 6c 73 6d 5f 63 73 72 5f 6f 70   rc = lsm_csr_op
4ac0: 65 6e 28 70 44 62 2d 3e 64 62 2c 20 26 70 44 62  en(pDb->db, &pDb
4ad0: 2d 3e 70 43 73 72 29 3b 0a 20 20 69 66 28 20 72  ->pCsr);.  if( r
4ae0: 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 69 4c 65  c==LSM_OK && iLe
4af0: 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 72 63 20  vel>1 ){.    rc 
4b00: 3d 20 6c 73 6d 5f 62 65 67 69 6e 28 70 44 62 2d  = lsm_begin(pDb-
4b10: 3e 64 62 2c 20 69 4c 65 76 65 6c 2d 31 29 3b 0a  >db, iLevel-1);.
4b20: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
4b30: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
4b40: 65 73 74 5f 6c 73 6d 5f 63 6f 6d 6d 69 74 28 54  est_lsm_commit(T
4b50: 65 73 74 44 62 20 2a 70 54 65 73 74 44 62 2c 20  estDb *pTestDb, 
4b60: 69 6e 74 20 69 4c 65 76 65 6c 29 7b 0a 20 20 4c  int iLevel){.  L
4b70: 73 6d 44 62 20 2a 70 44 62 20 3d 20 28 4c 73 6d  smDb *pDb = (Lsm
4b80: 44 62 20 2a 29 70 54 65 73 74 44 62 3b 0a 0a 20  Db *)pTestDb;.. 
4b90: 20 2f 2a 20 49 66 20 69 4c 65 76 65 6c 3d 3d 30   /* If iLevel==0
4ba0: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 70 65 6e  , close any open
4bb0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
4bc0: 6e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65  n */.  if( iLeve
4bd0: 6c 3d 3d 30 20 26 26 20 70 44 62 2d 3e 70 43 73  l==0 && pDb->pCs
4be0: 72 20 29 7b 0a 20 20 20 20 6c 73 6d 5f 63 73 72  r ){.    lsm_csr
4bf0: 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 70 43 73 72  _close(pDb->pCsr
4c00: 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 73 72  );.    pDb->pCsr
4c10: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
4c20: 49 66 20 69 4c 65 76 65 6c 3d 3d 30 2c 20 63 6c  If iLevel==0, cl
4c30: 6f 73 65 20 61 6e 79 20 6f 70 65 6e 20 72 65 61  ose any open rea
4c40: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d transaction */
4c50: 0a 20 20 72 65 74 75 72 6e 20 6c 73 6d 5f 63 6f  .  return lsm_co
4c60: 6d 6d 69 74 28 70 44 62 2d 3e 64 62 2c 20 4d 41  mmit(pDb->db, MA
4c70: 58 28 30 2c 20 69 4c 65 76 65 6c 2d 31 29 29 3b  X(0, iLevel-1));
4c80: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
4c90: 73 74 5f 6c 73 6d 5f 72 6f 6c 6c 62 61 63 6b 28  st_lsm_rollback(
4ca0: 54 65 73 74 44 62 20 2a 70 54 65 73 74 44 62 2c  TestDb *pTestDb,
4cb0: 20 69 6e 74 20 69 4c 65 76 65 6c 29 7b 0a 20 20   int iLevel){.  
4cc0: 4c 73 6d 44 62 20 2a 70 44 62 20 3d 20 28 4c 73  LsmDb *pDb = (Ls
4cd0: 6d 44 62 20 2a 29 70 54 65 73 74 44 62 3b 0a 0a  mDb *)pTestDb;..
4ce0: 20 20 2f 2a 20 49 66 20 69 4c 65 76 65 6c 3d 3d    /* If iLevel==
4cf0: 30 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 70 65  0, close any ope
4d00: 6e 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  n read transacti
4d10: 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76  on */.  if( iLev
4d20: 65 6c 3d 3d 30 20 26 26 20 70 44 62 2d 3e 70 43  el==0 && pDb->pC
4d30: 73 72 20 29 7b 0a 20 20 20 20 6c 73 6d 5f 63 73  sr ){.    lsm_cs
4d40: 72 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 70 43 73  r_close(pDb->pCs
4d50: 72 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 73  r);.    pDb->pCs
4d60: 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  r = 0;.  }..  re
4d70: 74 75 72 6e 20 6c 73 6d 5f 72 6f 6c 6c 62 61 63  turn lsm_rollbac
4d80: 6b 28 70 44 62 2d 3e 64 62 2c 20 4d 41 58 28 30  k(pDb->db, MAX(0
4d90: 2c 20 69 4c 65 76 65 6c 2d 31 29 29 3b 0a 7d 0a  , iLevel-1));.}.
4da0: 0a 2f 2a 0a 2a 2a 20 41 20 6c 6f 67 20 6d 65 73  ./*.** A log mes
4db0: 73 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 72 65  sage callback re
4dc0: 67 69 73 74 65 72 65 64 20 77 69 74 68 20 6c 73  gistered with ls
4dd0: 6d 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 50  m connections. P
4de0: 72 69 6e 74 73 20 61 6c 6c 20 0a 2a 2a 20 6d 65  rints all .** me
4df0: 73 73 61 67 65 73 20 74 6f 20 73 74 64 65 72 72  ssages to stderr
4e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4e10: 20 78 4c 6f 67 28 76 6f 69 64 20 2a 70 43 74 78   xLog(void *pCtx
4e20: 2c 20 69 6e 74 20 72 63 2c 20 63 6f 6e 73 74 20  , int rc, const 
4e30: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 75 73  char *z){.  unus
4e40: 65 64 5f 70 61 72 61 6d 65 74 65 72 28 72 63 29  ed_parameter(rc)
4e50: 3b 0a 20 20 2f 2a 20 66 70 72 69 6e 74 66 28 73  ;.  /* fprintf(s
4e60: 74 64 65 72 72 2c 20 22 6c 73 6d 3a 20 72 63 3d  tderr, "lsm: rc=
4e70: 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 72 63  %d \"%s\"\n", rc
4e80: 2c 20 7a 29 3b 20 2a 2f 0a 20 20 69 66 28 20 70  , z); */.  if( p
4e90: 43 74 78 20 29 20 66 70 72 69 6e 74 66 28 73 74  Ctx ) fprintf(st
4ea0: 64 65 72 72 2c 20 22 25 73 3a 20 22 2c 20 28 63  derr, "%s: ", (c
4eb0: 68 61 72 20 2a 29 70 43 74 78 29 3b 0a 20 20 66  har *)pCtx);.  f
4ec0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
4ed0: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 66 66 6c  %s\n", z);.  ffl
4ee0: 75 73 68 28 73 74 64 65 72 72 29 3b 0a 7d 0a 0a  ush(stderr);.}..
4ef0: 73 74 61 74 69 63 20 76 6f 69 64 20 78 57 6f 72  static void xWor
4f00: 6b 48 6f 6f 6b 28 6c 73 6d 5f 64 62 20 2a 64 62  kHook(lsm_db *db
4f10: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
4f20: 20 4c 73 6d 44 62 20 2a 70 20 3d 20 28 4c 73 6d   LsmDb *p = (Lsm
4f30: 44 62 20 2a 29 70 41 72 67 3b 0a 20 20 69 66 28  Db *)pArg;.  if(
4f40: 20 70 2d 3e 78 57 6f 72 6b 20 29 20 70 2d 3e 78   p->xWork ) p->x
4f50: 57 6f 72 6b 28 64 62 2c 20 70 2d 3e 70 57 6f 72  Work(db, p->pWor
4f60: 6b 43 74 78 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e  kCtx);.}..#defin
4f70: 65 20 54 45 53 54 5f 4e 4f 5f 52 45 43 4f 56 45  e TEST_NO_RECOVE
4f80: 52 59 20 2d 31 0a 23 64 65 66 69 6e 65 20 54 45  RY -1.#define TE
4f90: 53 54 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 20 2d  ST_COMPRESSION -
4fa0: 33 0a 0a 23 64 65 66 69 6e 65 20 54 45 53 54 5f  3..#define TEST_
4fb0: 4d 54 5f 4d 4f 44 45 20 20 20 20 20 2d 32 0a 23  MT_MODE     -2.#
4fc0: 64 65 66 69 6e 65 20 54 45 53 54 5f 4d 54 5f 4d  define TEST_MT_M
4fd0: 49 4e 5f 43 4b 50 54 20 2d 34 0a 23 64 65 66 69  IN_CKPT -4.#defi
4fe0: 6e 65 20 54 45 53 54 5f 4d 54 5f 4d 41 58 5f 43  ne TEST_MT_MAX_C
4ff0: 4b 50 54 20 2d 35 0a 0a 0a 69 6e 74 20 74 65 73  KPT -5...int tes
5000: 74 5f 6c 73 6d 5f 63 6f 6e 66 69 67 5f 73 74 72  t_lsm_config_str
5010: 28 0a 20 20 4c 73 6d 44 62 20 2a 70 4c 73 6d 2c  (.  LsmDb *pLsm,
5020: 0a 20 20 6c 73 6d 5f 64 62 20 2a 64 62 2c 20 0a  .  lsm_db *db, .
5030: 20 20 69 6e 74 20 62 57 6f 72 6b 65 72 2c 0a 20    int bWorker,. 
5040: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
5050: 72 2c 0a 20 20 69 6e 74 20 2a 70 6e 54 68 72 65  r,.  int *pnThre
5060: 61 64 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  ad.){.  struct C
5070: 66 67 50 61 72 61 6d 20 7b 0a 20 20 20 20 63 6f  fgParam {.    co
5080: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
5090: 3b 0a 20 20 20 20 69 6e 74 20 62 57 6f 72 6b 65  ;.    int bWorke
50a0: 72 3b 0a 20 20 20 20 69 6e 74 20 65 50 61 72 61  r;.    int ePara
50b0: 6d 3b 0a 20 20 7d 20 61 50 61 72 61 6d 5b 5d 20  m;.  } aParam[] 
50c0: 3d 20 7b 0a 20 20 20 20 7b 20 22 61 75 74 6f 66  = {.    { "autof
50d0: 6c 75 73 68 22 2c 20 20 20 20 20 20 20 20 30 2c  lush",        0,
50e0: 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 41 55 54 4f   LSM_CONFIG_AUTO
50f0: 46 4c 55 53 48 20 7d 2c 0a 20 20 20 20 7b 20 22  FLUSH },.    { "
5100: 70 61 67 65 5f 73 69 7a 65 22 2c 20 20 20 20 20  page_size",     
5110: 20 20 20 30 2c 20 4c 53 4d 5f 43 4f 4e 46 49 47     0, LSM_CONFIG
5120: 5f 50 41 47 45 5f 53 49 5a 45 20 7d 2c 0a 20 20  _PAGE_SIZE },.  
5130: 20 20 7b 20 22 62 6c 6f 63 6b 5f 73 69 7a 65 22    { "block_size"
5140: 2c 20 20 20 20 20 20 20 30 2c 20 4c 53 4d 5f 43  ,       0, LSM_C
5150: 4f 4e 46 49 47 5f 42 4c 4f 43 4b 5f 53 49 5a 45  ONFIG_BLOCK_SIZE
5160: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 61 66 65 74   },.    { "safet
5170: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c  y",           0,
5180: 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 53 41 46 45   LSM_CONFIG_SAFE
5190: 54 59 20 7d 2c 0a 20 20 20 20 7b 20 22 61 75 74  TY },.    { "aut
51a0: 6f 77 6f 72 6b 22 2c 20 20 20 20 20 20 20 20 20  owork",         
51b0: 30 2c 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 41 55  0, LSM_CONFIG_AU
51c0: 54 4f 57 4f 52 4b 20 7d 2c 0a 20 20 20 20 7b 20  TOWORK },.    { 
51d0: 22 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 22  "autocheckpoint"
51e0: 2c 20 20 20 30 2c 20 4c 53 4d 5f 43 4f 4e 46 49  ,   0, LSM_CONFI
51f0: 47 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54  G_AUTOCHECKPOINT
5200: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 6d 61 70 22   },.    { "mmap"
5210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,             0,
5220: 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50   LSM_CONFIG_MMAP
5230: 20 7d 2c 0a 20 20 20 20 7b 20 22 75 73 65 5f 6c   },.    { "use_l
5240: 6f 67 22 2c 20 20 20 20 20 20 20 20 20 20 30 2c  og",          0,
5250: 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 55 53 45 5f   LSM_CONFIG_USE_
5260: 4c 4f 47 20 7d 2c 0a 20 20 20 20 7b 20 22 61 75  LOG },.    { "au
5270: 74 6f 6d 65 72 67 65 22 2c 20 20 20 20 20 20 20  tomerge",       
5280: 20 30 2c 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 41   0, LSM_CONFIG_A
5290: 55 54 4f 4d 45 52 47 45 20 7d 2c 0a 20 20 20 20  UTOMERGE },.    
52a0: 7b 20 22 6d 61 78 5f 66 72 65 65 6c 69 73 74 22  { "max_freelist"
52b0: 2c 20 20 20 20 20 30 2c 20 4c 53 4d 5f 43 4f 4e  ,     0, LSM_CON
52c0: 46 49 47 5f 4d 41 58 5f 46 52 45 45 4c 49 53 54  FIG_MAX_FREELIST
52d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 75 6c 74 69   },.    { "multi
52e0: 5f 70 72 6f 63 22 2c 20 20 20 20 20 20 20 30 2c  _proc",       0,
52f0: 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54   LSM_CONFIG_MULT
5300: 49 50 4c 45 5f 50 52 4f 43 45 53 53 45 53 20 7d  IPLE_PROCESSES }
5310: 2c 0a 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f  ,.    { "worker_
5320: 61 75 74 6f 6d 65 72 67 65 22 2c 20 31 2c 20 4c  automerge", 1, L
5330: 53 4d 5f 43 4f 4e 46 49 47 5f 41 55 54 4f 4d 45  SM_CONFIG_AUTOME
5340: 52 47 45 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65  RGE },.    { "te
5350: 73 74 5f 6e 6f 5f 72 65 63 6f 76 65 72 79 22 2c  st_no_recovery",
5360: 20 30 2c 20 54 45 53 54 5f 4e 4f 5f 52 45 43 4f   0, TEST_NO_RECO
5370: 56 45 52 59 20 7d 2c 0a 20 20 20 20 7b 20 22 62  VERY },.    { "b
5380: 67 5f 6d 69 6e 5f 63 6b 70 74 22 2c 20 20 20 20  g_min_ckpt",    
5390: 20 20 30 2c 20 54 45 53 54 5f 4e 4f 5f 52 45 43    0, TEST_NO_REC
53a0: 4f 56 45 52 59 20 7d 2c 0a 0a 20 20 20 20 7b 20  OVERY },..    { 
53b0: 22 6d 74 5f 6d 6f 64 65 22 2c 20 20 20 20 20 20  "mt_mode",      
53c0: 20 20 20 20 30 2c 20 54 45 53 54 5f 4d 54 5f 4d      0, TEST_MT_M
53d0: 4f 44 45 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 74  ODE },.    { "mt
53e0: 5f 6d 69 6e 5f 63 6b 70 74 22 2c 20 20 20 20 20  _min_ckpt",     
53f0: 20 30 2c 20 54 45 53 54 5f 4d 54 5f 4d 49 4e 5f   0, TEST_MT_MIN_
5400: 43 4b 50 54 20 7d 2c 0a 20 20 20 20 7b 20 22 6d  CKPT },.    { "m
5410: 74 5f 6d 61 78 5f 63 6b 70 74 22 2c 20 20 20 20  t_max_ckpt",    
5420: 20 20 30 2c 20 54 45 53 54 5f 4d 54 5f 4d 41 58    0, TEST_MT_MAX
5430: 5f 43 4b 50 54 20 7d 2c 0a 0a 23 69 66 64 65 66  _CKPT },..#ifdef
5440: 20 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 7b   HAVE_ZLIB.    {
5450: 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20   "compression", 
5460: 20 20 20 20 20 30 2c 20 54 45 53 54 5f 43 4f 4d       0, TEST_COM
5470: 50 52 45 53 53 49 4f 4e 20 7d 2c 0a 23 65 6e 64  PRESSION },.#end
5480: 69 66 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  if.    { 0, 0 }.
5490: 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61    };.  const cha
54a0: 72 20 2a 7a 20 3d 20 7a 53 74 72 3b 0a 20 20 69  r *z = zStr;.  i
54b0: 6e 74 20 6e 54 68 72 65 61 64 20 3d 20 31 3b 0a  nt nThread = 1;.
54c0: 0a 20 20 69 66 28 20 7a 53 74 72 3d 3d 30 20 29  .  if( zStr==0 )
54d0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 61 73   return 0;..  as
54e0: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 77 68  sert( db );.  wh
54f0: 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20  ile( z[0] ){.   
5500: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
5510: 61 72 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69  art;..    /* Ski
5520: 70 20 77 68 69 74 65 73 70 61 63 65 20 2a 2f 0a  p whitespace */.
5530: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d 3d 27      while( *z=='
5540: 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7a 53   ' ) z++;.    zS
5550: 74 61 72 74 20 3d 20 7a 3b 0a 0a 20 20 20 20 77  tart = z;..    w
5560: 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d  hile( *z && *z!=
5570: 27 3d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69  '=' ) z++;.    i
5580: 66 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 69  f( *z ){.      i
5590: 6e 74 20 65 50 61 72 61 6d 3b 0a 20 20 20 20 20  nt eParam;.     
55a0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
55b0: 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 6e  t iVal;.      in
55c0: 74 20 69 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20  t iMul = 1;.    
55d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
55e0: 63 68 61 72 20 7a 50 61 72 61 6d 5b 33 32 5d 3b  char zParam[32];
55f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 72 61  .      int nPara
5600: 6d 20 3d 20 7a 2d 7a 53 74 61 72 74 3b 0a 20 20  m = z-zStart;.  
5610: 20 20 20 20 69 66 28 20 6e 50 61 72 61 6d 3d 3d      if( nParam==
5620: 30 20 7c 7c 20 6e 50 61 72 61 6d 3e 73 69 7a 65  0 || nParam>size
5630: 6f 66 28 7a 50 61 72 61 6d 29 2d 31 20 29 20 67  of(zParam)-1 ) g
5640: 6f 74 6f 20 73 79 6e 74 61 78 5f 65 72 72 6f 72  oto syntax_error
5650: 3b 0a 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ;..      memcpy(
5660: 7a 50 61 72 61 6d 2c 20 7a 53 74 61 72 74 2c 20  zParam, zStart, 
5670: 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20 20 20 7a  nParam);.      z
5680: 50 61 72 61 6d 5b 6e 50 61 72 61 6d 5d 20 3d 20  Param[nParam] = 
5690: 27 5c 30 27 3b 0a 20 20 20 20 20 20 72 63 20 3d  '\0';.      rc =
56a0: 20 74 65 73 74 41 72 67 53 65 6c 65 63 74 28 61   testArgSelect(a
56b0: 50 61 72 61 6d 2c 20 22 70 61 72 61 6d 22 2c 20  Param, "param", 
56c0: 7a 50 61 72 61 6d 2c 20 26 69 29 3b 0a 20 20 20  zParam, &i);.   
56d0: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
56e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
56f0: 65 50 61 72 61 6d 20 3d 20 61 50 61 72 61 6d 5b  eParam = aParam[
5700: 69 5d 2e 65 50 61 72 61 6d 3b 0a 0a 20 20 20 20  i].eParam;..    
5710: 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7a 53 74    z++;.      zSt
5720: 61 72 74 20 3d 20 7a 3b 0a 20 20 20 20 20 20 77  art = z;.      w
5730: 68 69 6c 65 28 20 2a 7a 3e 3d 27 30 27 20 26 26  hile( *z>='0' &&
5740: 20 2a 7a 3c 3d 27 39 27 20 29 20 7a 2b 2b 3b 0a   *z<='9' ) z++;.
5750: 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 6b        if( *z=='k
5760: 27 20 7c 7c 20 2a 7a 3d 3d 27 4b 27 20 29 7b 0a  ' || *z=='K' ){.
5770: 20 20 20 20 20 20 20 20 69 4d 75 6c 20 3d 20 31          iMul = 1
5780: 3b 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20  ;.        z++;. 
5790: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2a       }else if( *
57a0: 7a 3d 3d 27 4d 27 20 7c 7c 20 2a 7a 3d 3d 27 4d  z=='M' || *z=='M
57b0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4d 75  ' ){.        iMu
57c0: 6c 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 20 20  l = 1024;.      
57d0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    z++;.      }. 
57e0: 20 20 20 20 20 6e 50 61 72 61 6d 20 3d 20 7a 2d       nParam = z-
57f0: 7a 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66  zStart;.      if
5800: 28 20 6e 50 61 72 61 6d 3d 3d 30 20 7c 7c 20 6e  ( nParam==0 || n
5810: 50 61 72 61 6d 3e 73 69 7a 65 6f 66 28 7a 50 61  Param>sizeof(zPa
5820: 72 61 6d 29 2d 31 20 29 20 67 6f 74 6f 20 73 79  ram)-1 ) goto sy
5830: 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
5840: 20 20 6d 65 6d 63 70 79 28 7a 50 61 72 61 6d 2c    memcpy(zParam,
5850: 20 7a 53 74 61 72 74 2c 20 6e 50 61 72 61 6d 29   zStart, nParam)
5860: 3b 0a 20 20 20 20 20 20 7a 50 61 72 61 6d 5b 6e  ;.      zParam[n
5870: 50 61 72 61 6d 5d 20 3d 20 27 5c 30 27 3b 0a 20  Param] = '\0';. 
5880: 20 20 20 20 20 69 56 61 6c 20 3d 20 61 74 6f 69       iVal = atoi
5890: 28 7a 50 61 72 61 6d 29 20 2a 20 69 4d 75 6c 3b  (zParam) * iMul;
58a0: 0a 0a 20 20 20 20 20 20 69 66 28 20 65 50 61 72  ..      if( ePar
58b0: 61 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  am>0 ){.        
58c0: 69 66 28 20 62 57 6f 72 6b 65 72 20 7c 7c 20 61  if( bWorker || a
58d0: 50 61 72 61 6d 5b 69 5d 2e 62 57 6f 72 6b 65 72  Param[i].bWorker
58e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
58f0: 20 6c 73 6d 5f 63 6f 6e 66 69 67 28 64 62 2c 20   lsm_config(db, 
5900: 65 50 61 72 61 6d 2c 20 26 69 56 61 6c 29 3b 0a  eParam, &iVal);.
5910: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5920: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5930: 77 69 74 63 68 28 20 65 50 61 72 61 6d 20 29 7b  witch( eParam ){
5940: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
5950: 54 45 53 54 5f 4e 4f 5f 52 45 43 4f 56 45 52 59  TEST_NO_RECOVERY
5960: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  :.            if
5970: 28 20 70 4c 73 6d 20 29 20 70 4c 73 6d 2d 3e 62  ( pLsm ) pLsm->b
5980: 4e 6f 52 65 63 6f 76 65 72 79 20 3d 20 69 56 61  NoRecovery = iVa
5990: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  l;.            b
59a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
59b0: 63 61 73 65 20 54 45 53 54 5f 4d 54 5f 4d 4f 44  case TEST_MT_MOD
59c0: 45 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  E:.            i
59d0: 66 28 20 70 4c 73 6d 20 29 20 6e 54 68 72 65 61  f( pLsm ) nThrea
59e0: 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  d = iVal;.      
59f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5a00: 20 20 20 20 20 20 20 63 61 73 65 20 54 45 53 54         case TEST
5a10: 5f 4d 54 5f 4d 49 4e 5f 43 4b 50 54 3a 0a 20 20  _MT_MIN_CKPT:.  
5a20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
5a30: 73 6d 20 26 26 20 69 56 61 6c 3e 30 20 29 20 70  sm && iVal>0 ) p
5a40: 4c 73 6d 2d 3e 6e 4d 74 4d 69 6e 43 6b 70 74 20  Lsm->nMtMinCkpt 
5a50: 3d 20 69 56 61 6c 2a 31 30 32 34 3b 0a 20 20 20  = iVal*1024;.   
5a60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5a70: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
5a80: 45 53 54 5f 4d 54 5f 4d 41 58 5f 43 4b 50 54 3a  EST_MT_MAX_CKPT:
5a90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
5aa0: 20 70 4c 73 6d 20 26 26 20 69 56 61 6c 3e 30 20   pLsm && iVal>0 
5ab0: 29 20 70 4c 73 6d 2d 3e 6e 4d 74 4d 61 78 43 6b  ) pLsm->nMtMaxCk
5ac0: 70 74 20 3d 20 69 56 61 6c 2a 31 30 32 34 3b 0a  pt = iVal*1024;.
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
5ae0: 6b 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 5a  k;.#ifdef HAVE_Z
5af0: 4c 49 42 0a 20 20 20 20 20 20 20 20 20 20 63 61  LIB.          ca
5b00: 73 65 20 54 45 53 54 5f 43 4f 4d 50 52 45 53 53  se TEST_COMPRESS
5b10: 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ION:.           
5b20: 20 74 65 73 74 43 6f 6e 66 69 67 75 72 65 43 6f   testConfigureCo
5b30: 6d 70 72 65 73 73 69 6f 6e 28 64 62 29 3b 0a 20  mpression(db);. 
5b40: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
5b50: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
5b60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
5b70: 65 6c 73 65 20 69 66 28 20 7a 21 3d 7a 53 74 61  else if( z!=zSta
5b80: 72 74 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rt ){.      goto
5b90: 20 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20   syntax_error;. 
5ba0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
5bb0: 70 6e 54 68 72 65 61 64 20 29 20 2a 70 6e 54 68  pnThread ) *pnTh
5bc0: 72 65 61 64 20 3d 20 6e 54 68 72 65 61 64 3b 0a  read = nThread;.
5bd0: 20 20 69 66 28 20 70 4c 73 6d 20 26 26 20 70 4c    if( pLsm && pL
5be0: 73 6d 2d 3e 6e 4d 74 4d 61 78 43 6b 70 74 20 3c  sm->nMtMaxCkpt <
5bf0: 20 70 4c 73 6d 2d 3e 6e 4d 74 4d 69 6e 43 6b 70   pLsm->nMtMinCkp
5c00: 74 20 29 7b 0a 20 20 20 20 70 4c 73 6d 2d 3e 6e  t ){.    pLsm->n
5c10: 4d 74 4d 69 6e 43 6b 70 74 20 3d 20 70 4c 73 6d  MtMinCkpt = pLsm
5c20: 2d 3e 6e 4d 74 4d 61 78 43 6b 70 74 3b 0a 20 20  ->nMtMaxCkpt;.  
5c30: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  }..  return 0;. 
5c40: 73 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20 20  syntax_error:.  
5c50: 74 65 73 74 50 72 69 6e 74 45 72 72 6f 72 28 22  testPrintError("
5c60: 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 74 3a  syntax error at:
5c70: 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 29 3b 0a   \"%s\"\n", z);.
5c80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 69    return 1;.}..i
5c90: 6e 74 20 74 64 62 5f 6c 73 6d 5f 63 6f 6e 66 69  nt tdb_lsm_confi
5ca0: 67 5f 73 74 72 28 54 65 73 74 44 62 20 2a 70 44  g_str(TestDb *pD
5cb0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
5cc0: 53 74 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Str){.  int rc =
5cd0: 20 30 3b 0a 20 20 69 66 28 20 74 64 62 5f 6c 73   0;.  if( tdb_ls
5ce0: 6d 28 70 44 62 29 20 29 7b 0a 23 69 66 64 65 66  m(pDb) ){.#ifdef
5cf0: 20 4c 53 4d 5f 4d 55 54 45 58 5f 50 54 48 52 45   LSM_MUTEX_PTHRE
5d00: 41 44 53 0a 20 20 20 20 69 6e 74 20 69 3b 0a 23  ADS.    int i;.#
5d10: 65 6e 64 69 66 0a 20 20 20 20 4c 73 6d 44 62 20  endif.    LsmDb 
5d20: 2a 70 4c 73 6d 20 3d 20 28 4c 73 6d 44 62 20 2a  *pLsm = (LsmDb *
5d30: 29 70 44 62 3b 0a 0a 20 20 20 20 72 63 20 3d 20  )pDb;..    rc = 
5d40: 74 65 73 74 5f 6c 73 6d 5f 63 6f 6e 66 69 67 5f  test_lsm_config_
5d50: 73 74 72 28 70 4c 73 6d 2c 20 70 4c 73 6d 2d 3e  str(pLsm, pLsm->
5d60: 64 62 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b  db, 0, zStr, 0);
5d70: 0a 23 69 66 64 65 66 20 4c 53 4d 5f 4d 55 54 45  .#ifdef LSM_MUTE
5d80: 58 5f 50 54 48 52 45 41 44 53 0a 20 20 20 20 66  X_PTHREADS.    f
5d90: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 30 20 26 26  or(i=0; rc==0 &&
5da0: 20 69 3c 70 4c 73 6d 2d 3e 6e 57 6f 72 6b 65 72   i<pLsm->nWorker
5db0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
5dc0: 20 3d 20 74 65 73 74 5f 6c 73 6d 5f 63 6f 6e 66   = test_lsm_conf
5dd0: 69 67 5f 73 74 72 28 30 2c 20 70 4c 73 6d 2d 3e  ig_str(0, pLsm->
5de0: 61 57 6f 72 6b 65 72 5b 69 5d 2e 70 57 6f 72 6b  aWorker[i].pWork
5df0: 65 72 2c 20 31 2c 20 7a 53 74 72 2c 20 30 29 3b  er, 1, zStr, 0);
5e00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
5e10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5e20: 0a 0a 69 6e 74 20 74 64 62 5f 6c 73 6d 5f 63 6f  ..int tdb_lsm_co
5e30: 6e 66 69 67 75 72 65 28 6c 73 6d 5f 64 62 20 2a  nfigure(lsm_db *
5e40: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
5e50: 7a 43 6f 6e 66 69 67 29 7b 0a 20 20 72 65 74 75  zConfig){.  retu
5e60: 72 6e 20 74 65 73 74 5f 6c 73 6d 5f 63 6f 6e 66  rn test_lsm_conf
5e70: 69 67 5f 73 74 72 28 30 2c 20 64 62 2c 20 30 2c  ig_str(0, db, 0,
5e80: 20 7a 43 6f 6e 66 69 67 2c 20 30 29 3b 0a 7d 0a   zConfig, 0);.}.
5e90: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
5ea0: 4c 73 6d 53 74 61 72 74 57 6f 72 6b 65 72 73 28  LsmStartWorkers(
5eb0: 4c 73 6d 44 62 20 2a 2c 20 69 6e 74 2c 20 63 6f  LsmDb *, int, co
5ec0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e 73  nst char *, cons
5ed0: 74 20 63 68 61 72 20 2a 29 3b 0a 0a 73 74 61 74  t char *);..stat
5ee0: 69 63 20 69 6e 74 20 74 65 73 74 4c 73 6d 4f 70  ic int testLsmOp
5ef0: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
5f00: 20 2a 7a 43 66 67 2c 0a 20 20 63 6f 6e 73 74 20   *zCfg,.  const 
5f10: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
5f20: 20 0a 20 20 69 6e 74 20 62 43 6c 65 61 72 2c 20   .  int bClear, 
5f30: 0a 20 20 54 65 73 74 44 62 20 2a 2a 70 70 44 62  .  TestDb **ppDb
5f40: 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
5f50: 73 74 20 44 61 74 61 62 61 73 65 4d 65 74 68 6f  st DatabaseMetho
5f60: 64 73 20 4c 73 6d 4d 65 74 68 6f 64 73 20 3d 20  ds LsmMethods = 
5f70: 7b 0a 20 20 20 20 74 65 73 74 5f 6c 73 6d 5f 63  {.    test_lsm_c
5f80: 6c 6f 73 65 2c 0a 20 20 20 20 74 65 73 74 5f 6c  lose,.    test_l
5f90: 73 6d 5f 77 72 69 74 65 2c 0a 20 20 20 20 74 65  sm_write,.    te
5fa0: 73 74 5f 6c 73 6d 5f 64 65 6c 65 74 65 2c 0a 20  st_lsm_delete,. 
5fb0: 20 20 20 74 65 73 74 5f 6c 73 6d 5f 64 65 6c 65     test_lsm_dele
5fc0: 74 65 5f 72 61 6e 67 65 2c 0a 20 20 20 20 74 65  te_range,.    te
5fd0: 73 74 5f 6c 73 6d 5f 66 65 74 63 68 2c 0a 20 20  st_lsm_fetch,.  
5fe0: 20 20 74 65 73 74 5f 6c 73 6d 5f 73 63 61 6e 2c    test_lsm_scan,
5ff0: 0a 20 20 20 20 74 65 73 74 5f 6c 73 6d 5f 62 65  .    test_lsm_be
6000: 67 69 6e 2c 0a 20 20 20 20 74 65 73 74 5f 6c 73  gin,.    test_ls
6010: 6d 5f 63 6f 6d 6d 69 74 2c 0a 20 20 20 20 74 65  m_commit,.    te
6020: 73 74 5f 6c 73 6d 5f 72 6f 6c 6c 62 61 63 6b 0a  st_lsm_rollback.
6030: 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a    };..  int rc;.
6040: 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
6050: 0a 20 20 4c 73 6d 44 62 20 2a 70 44 62 3b 0a 0a  .  LsmDb *pDb;..
6060: 20 20 2f 2a 20 49 66 20 74 68 65 20 62 43 6c 65    /* If the bCle
6070: 61 72 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ar flag is set, 
6080: 64 65 6c 65 74 65 20 61 6e 79 20 65 78 69 73 74  delete any exist
6090: 69 6e 67 20 64 61 74 61 62 61 73 65 2e 20 2a 2f  ing database. */
60a0: 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65  .  assert( zFile
60b0: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 62 43 6c  name);.  if( bCl
60c0: 65 61 72 20 29 20 74 65 73 74 44 65 6c 65 74 65  ear ) testDelete
60d0: 4c 73 6d 64 62 28 7a 46 69 6c 65 6e 61 6d 65 29  Lsmdb(zFilename)
60e0: 3b 0a 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  ;.  nFilename = 
60f0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
6100: 29 3b 0a 0a 20 20 70 44 62 20 3d 20 28 4c 73 6d  );..  pDb = (Lsm
6110: 44 62 20 2a 29 74 65 73 74 4d 61 6c 6c 6f 63 28  Db *)testMalloc(
6120: 73 69 7a 65 6f 66 28 4c 73 6d 44 62 29 20 2b 20  sizeof(LsmDb) + 
6130: 6e 46 69 6c 65 6e 61 6d 65 20 2b 20 31 29 3b 0a  nFilename + 1);.
6140: 20 20 6d 65 6d 73 65 74 28 70 44 62 2c 20 30 2c    memset(pDb, 0,
6150: 20 73 69 7a 65 6f 66 28 4c 73 6d 44 62 29 29 3b   sizeof(LsmDb));
6160: 0a 20 20 70 44 62 2d 3e 62 61 73 65 2e 70 4d 65  .  pDb->base.pMe
6170: 74 68 6f 64 73 20 3d 20 26 4c 73 6d 4d 65 74 68  thods = &LsmMeth
6180: 6f 64 73 3b 0a 20 20 70 44 62 2d 3e 7a 4e 61 6d  ods;.  pDb->zNam
6190: 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 44 62  e = (char *)&pDb
61a0: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  [1];.  memcpy(pD
61b0: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 46 69 6c 65 6e  b->zName, zFilen
61c0: 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 20 2b  ame, nFilename +
61d0: 20 31 29 3b 0a 0a 20 20 2f 2a 20 44 65 66 61 75   1);..  /* Defau
61e0: 6c 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  lt the sector si
61f0: 7a 65 20 75 73 65 64 20 66 6f 72 20 63 72 61 73  ze used for cras
6200: 68 20 73 69 6d 75 6c 61 74 69 6f 6e 20 74 6f 20  h simulation to 
6210: 35 31 32 20 62 79 74 65 73 2e 20 0a 20 20 2a 2a  512 bytes. .  **
6220: 20 54 6f 64 6f 3a 20 54 68 65 72 65 20 73 68 6f   Todo: There sho
6230: 75 6c 64 20 62 65 20 61 6e 20 4f 53 20 6d 65 74  uld be an OS met
6240: 68 6f 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  hod to obtain th
6250: 69 73 20 76 61 6c 75 65 20 2d 20 6a 75 73 74 20  is value - just 
6260: 61 73 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  as.  ** there is
6270: 20 69 6e 20 53 51 4c 69 74 65 2e 20 46 6f 72 20   in SQLite. For 
6280: 6e 6f 77 2c 20 4c 53 4d 20 61 73 73 75 6d 65 73  now, LSM assumes
6290: 20 74 68 61 74 20 69 74 20 69 73 20 73 6d 61 6c   that it is smal
62a0: 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68  ler than.  ** th
62b0: 65 20 70 61 67 65 20 73 69 7a 65 20 28 64 65 66  e page size (def
62c0: 61 75 6c 74 20 34 4b 42 29 2e 0a 20 20 2a 2f 0a  ault 4KB)..  */.
62d0: 20 20 70 44 62 2d 3e 73 7a 53 65 63 74 6f 72 20    pDb->szSector 
62e0: 3d 20 32 35 36 3b 0a 0a 20 20 2f 2a 20 44 65 66  = 256;..  /* Def
62f0: 61 75 6c 74 20 76 61 6c 75 65 73 20 66 6f 72 20  ault values for 
6300: 74 68 65 20 6d 74 5f 6d 69 6e 5f 63 6b 70 74 20  the mt_min_ckpt 
6310: 61 6e 64 20 6d 74 5f 6d 61 78 5f 63 6b 70 74 20  and mt_max_ckpt 
6320: 70 61 72 61 6d 65 74 65 72 73 2e 20 2a 2f 0a 20  parameters. */. 
6330: 20 70 44 62 2d 3e 6e 4d 74 4d 69 6e 43 6b 70 74   pDb->nMtMinCkpt
6340: 20 3d 20 4c 53 4d 54 45 53 54 5f 44 46 4c 54 5f   = LSMTEST_DFLT_
6350: 4d 54 5f 4d 49 4e 5f 43 4b 50 54 3b 0a 20 20 70  MT_MIN_CKPT;.  p
6360: 44 62 2d 3e 6e 4d 74 4d 61 78 43 6b 70 74 20 3d  Db->nMtMaxCkpt =
6370: 20 4c 53 4d 54 45 53 54 5f 44 46 4c 54 5f 4d 54   LSMTEST_DFLT_MT
6380: 5f 4d 41 58 5f 43 4b 50 54 3b 0a 0a 20 20 6d 65  _MAX_CKPT;..  me
6390: 6d 63 70 79 28 26 70 44 62 2d 3e 65 6e 76 2c 20  mcpy(&pDb->env, 
63a0: 74 64 62 5f 6c 73 6d 5f 65 6e 76 28 29 2c 20 73  tdb_lsm_env(), s
63b0: 69 7a 65 6f 66 28 6c 73 6d 5f 65 6e 76 29 29 3b  izeof(lsm_env));
63c0: 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 70 56 66 73  .  pDb->env.pVfs
63d0: 43 74 78 20 3d 20 28 76 6f 69 64 20 2a 29 70 44  Ctx = (void *)pD
63e0: 62 3b 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 46  b;.  pDb->env.xF
63f0: 75 6c 6c 70 61 74 68 20 3d 20 74 65 73 74 45 6e  ullpath = testEn
6400: 76 46 75 6c 6c 70 61 74 68 3b 0a 20 20 70 44 62  vFullpath;.  pDb
6410: 2d 3e 65 6e 76 2e 78 4f 70 65 6e 20 3d 20 74 65  ->env.xOpen = te
6420: 73 74 45 6e 76 4f 70 65 6e 3b 0a 20 20 70 44 62  stEnvOpen;.  pDb
6430: 2d 3e 65 6e 76 2e 78 52 65 61 64 20 3d 20 74 65  ->env.xRead = te
6440: 73 74 45 6e 76 52 65 61 64 3b 0a 20 20 70 44 62  stEnvRead;.  pDb
6450: 2d 3e 65 6e 76 2e 78 57 72 69 74 65 20 3d 20 74  ->env.xWrite = t
6460: 65 73 74 45 6e 76 57 72 69 74 65 3b 0a 20 20 70  estEnvWrite;.  p
6470: 44 62 2d 3e 65 6e 76 2e 78 54 72 75 6e 63 61 74  Db->env.xTruncat
6480: 65 20 3d 20 74 65 73 74 45 6e 76 54 72 75 6e 63  e = testEnvTrunc
6490: 61 74 65 3b 0a 20 20 70 44 62 2d 3e 65 6e 76 2e  ate;.  pDb->env.
64a0: 78 53 79 6e 63 20 3d 20 74 65 73 74 45 6e 76 53  xSync = testEnvS
64b0: 79 6e 63 3b 0a 20 20 70 44 62 2d 3e 65 6e 76 2e  ync;.  pDb->env.
64c0: 78 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 74 65  xSectorSize = te
64d0: 73 74 45 6e 76 53 65 63 74 6f 72 53 69 7a 65 3b  stEnvSectorSize;
64e0: 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 52 65 6d  .  pDb->env.xRem
64f0: 61 70 20 3d 20 74 65 73 74 45 6e 76 52 65 6d 61  ap = testEnvRema
6500: 70 3b 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 46  p;.  pDb->env.xF
6510: 69 6c 65 69 64 20 3d 20 74 65 73 74 45 6e 76 46  ileid = testEnvF
6520: 69 6c 65 69 64 3b 0a 20 20 70 44 62 2d 3e 65 6e  ileid;.  pDb->en
6530: 76 2e 78 43 6c 6f 73 65 20 3d 20 74 65 73 74 45  v.xClose = testE
6540: 6e 76 43 6c 6f 73 65 3b 0a 20 20 70 44 62 2d 3e  nvClose;.  pDb->
6550: 65 6e 76 2e 78 55 6e 6c 69 6e 6b 20 3d 20 74 65  env.xUnlink = te
6560: 73 74 45 6e 76 55 6e 6c 69 6e 6b 3b 0a 20 20 70  stEnvUnlink;.  p
6570: 44 62 2d 3e 65 6e 76 2e 78 4c 6f 63 6b 20 3d 20  Db->env.xLock = 
6580: 74 65 73 74 45 6e 76 4c 6f 63 6b 3b 0a 20 20 70  testEnvLock;.  p
6590: 44 62 2d 3e 65 6e 76 2e 78 54 65 73 74 4c 6f 63  Db->env.xTestLoc
65a0: 6b 20 3d 20 74 65 73 74 45 6e 76 54 65 73 74 4c  k = testEnvTestL
65b0: 6f 63 6b 3b 0a 20 20 70 44 62 2d 3e 65 6e 76 2e  ock;.  pDb->env.
65c0: 78 53 68 6d 42 61 72 72 69 65 72 20 3d 20 74 65  xShmBarrier = te
65d0: 73 74 45 6e 76 53 68 6d 42 61 72 72 69 65 72 3b  stEnvShmBarrier;
65e0: 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 53 68 6d  .  pDb->env.xShm
65f0: 4d 61 70 20 3d 20 74 65 73 74 45 6e 76 53 68 6d  Map = testEnvShm
6600: 4d 61 70 3b 0a 20 20 70 44 62 2d 3e 65 6e 76 2e  Map;.  pDb->env.
6610: 78 53 68 6d 55 6e 6d 61 70 20 3d 20 74 65 73 74  xShmUnmap = test
6620: 45 6e 76 53 68 6d 55 6e 6d 61 70 3b 0a 20 20 70  EnvShmUnmap;.  p
6630: 44 62 2d 3e 65 6e 76 2e 78 53 6c 65 65 70 20 3d  Db->env.xSleep =
6640: 20 74 65 73 74 45 6e 76 53 6c 65 65 70 3b 0a 0a   testEnvSleep;..
6650: 20 20 72 63 20 3d 20 6c 73 6d 5f 6e 65 77 28 26    rc = lsm_new(&
6660: 70 44 62 2d 3e 65 6e 76 2c 20 26 70 44 62 2d 3e  pDb->env, &pDb->
6670: 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c  db);.  if( rc==L
6680: 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  SM_OK ){.    int
6690: 20 6e 54 68 72 65 61 64 20 3d 20 31 3b 0a 20 20   nThread = 1;.  
66a0: 20 20 6c 73 6d 5f 63 6f 6e 66 69 67 5f 6c 6f 67    lsm_config_log
66b0: 28 70 44 62 2d 3e 64 62 2c 20 78 4c 6f 67 2c 20  (pDb->db, xLog, 
66c0: 30 29 3b 0a 20 20 20 20 6c 73 6d 5f 63 6f 6e 66  0);.    lsm_conf
66d0: 69 67 5f 77 6f 72 6b 5f 68 6f 6f 6b 28 70 44 62  ig_work_hook(pDb
66e0: 2d 3e 64 62 2c 20 78 57 6f 72 6b 48 6f 6f 6b 2c  ->db, xWorkHook,
66f0: 20 28 76 6f 69 64 20 2a 29 70 44 62 29 3b 0a 0a   (void *)pDb);..
6700: 20 20 20 20 72 63 20 3d 20 74 65 73 74 5f 6c 73      rc = test_ls
6710: 6d 5f 63 6f 6e 66 69 67 5f 73 74 72 28 70 44 62  m_config_str(pDb
6720: 2c 20 70 44 62 2d 3e 64 62 2c 20 30 2c 20 7a 43  , pDb->db, 0, zC
6730: 66 67 2c 20 26 6e 54 68 72 65 61 64 29 3b 0a 20  fg, &nThread);. 
6740: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
6750: 4b 20 29 20 72 63 20 3d 20 6c 73 6d 5f 6f 70 65  K ) rc = lsm_ope
6760: 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 46 69 6c 65  n(pDb->db, zFile
6770: 6e 61 6d 65 29 3b 0a 0a 20 20 20 20 70 44 62 2d  name);..    pDb-
6780: 3e 65 4d 6f 64 65 20 3d 20 6e 54 68 72 65 61 64  >eMode = nThread
6790: 3b 0a 23 69 66 64 65 66 20 4c 53 4d 5f 4d 55 54  ;.#ifdef LSM_MUT
67a0: 45 58 5f 50 54 48 52 45 41 44 53 0a 20 20 20 20  EX_PTHREADS.    
67b0: 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  if( rc==LSM_OK &
67c0: 26 20 6e 54 68 72 65 61 64 3e 31 20 29 7b 0a 20  & nThread>1 ){. 
67d0: 20 20 20 20 20 74 65 73 74 4c 73 6d 53 74 61 72       testLsmStar
67e0: 74 57 6f 72 6b 65 72 73 28 70 44 62 2c 20 6e 54  tWorkers(pDb, nT
67f0: 68 72 65 61 64 2c 20 7a 46 69 6c 65 6e 61 6d 65  hread, zFilename
6800: 2c 20 7a 43 66 67 29 3b 0a 20 20 20 20 7d 0a 23  , zCfg);.    }.#
6810: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 72  endif..    if( r
6820: 63 21 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c!=LSM_OK ){.   
6830: 20 20 20 74 65 73 74 5f 6c 73 6d 5f 63 6c 6f 73     test_lsm_clos
6840: 65 28 28 54 65 73 74 44 62 20 2a 29 70 44 62 29  e((TestDb *)pDb)
6850: 3b 0a 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b  ;.      pDb = 0;
6860: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
6870: 70 44 62 20 3d 20 28 54 65 73 74 44 62 20 2a 29  pDb = (TestDb *)
6880: 70 44 62 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  pDb;.  return rc
6890: 3b 0a 7d 0a 0a 69 6e 74 20 74 65 73 74 5f 6c 73  ;.}..int test_ls
68a0: 6d 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  m_open(.  const 
68b0: 63 68 61 72 20 2a 7a 53 70 65 63 2c 20 0a 20 20  char *zSpec, .  
68c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
68d0: 65 6e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 62 43  ename, .  int bC
68e0: 6c 65 61 72 2c 20 0a 20 20 54 65 73 74 44 62 20  lear, .  TestDb 
68f0: 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 72 65 74 75  **ppDb.){.  retu
6900: 72 6e 20 74 65 73 74 4c 73 6d 4f 70 65 6e 28 7a  rn testLsmOpen(z
6910: 53 70 65 63 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  Spec, zFilename,
6920: 20 62 43 6c 65 61 72 2c 20 70 70 44 62 29 3b 0a   bClear, ppDb);.
6930: 7d 0a 0a 69 6e 74 20 74 65 73 74 5f 6c 73 6d 5f  }..int test_lsm_
6940: 73 6d 61 6c 6c 5f 6f 70 65 6e 28 0a 20 20 63 6f  small_open(.  co
6950: 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 65 63 2c  nst char *zSpec,
6960: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
6970: 7a 46 69 6c 65 2c 20 0a 20 20 69 6e 74 20 62 43  zFile, .  int bC
6980: 6c 65 61 72 2c 20 0a 20 20 54 65 73 74 44 62 20  lear, .  TestDb 
6990: 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 6f 6e 73  **ppDb.){.  cons
69a0: 74 20 63 68 61 72 20 2a 7a 43 66 67 20 3d 20 22  t char *zCfg = "
69b0: 70 61 67 65 5f 73 69 7a 65 3d 32 35 36 20 62 6c  page_size=256 bl
69c0: 6f 63 6b 5f 73 69 7a 65 3d 36 34 20 6d 6d 61 70  ock_size=64 mmap
69d0: 3d 31 30 32 34 22 3b 0a 20 20 72 65 74 75 72 6e  =1024";.  return
69e0: 20 74 65 73 74 4c 73 6d 4f 70 65 6e 28 7a 43 66   testLsmOpen(zCf
69f0: 67 2c 20 7a 46 69 6c 65 2c 20 62 43 6c 65 61 72  g, zFile, bClear
6a00: 2c 20 70 70 44 62 29 3b 0a 7d 0a 0a 69 6e 74 20  , ppDb);.}..int 
6a10: 74 65 73 74 5f 6c 73 6d 5f 6c 6f 6d 65 6d 5f 6f  test_lsm_lomem_o
6a20: 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
6a30: 72 20 2a 7a 53 70 65 63 2c 20 0a 20 20 63 6f 6e  r *zSpec, .  con
6a40: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
6a50: 6d 65 2c 20 0a 20 20 69 6e 74 20 62 43 6c 65 61  me, .  int bClea
6a60: 72 2c 20 0a 20 20 54 65 73 74 44 62 20 2a 2a 70  r, .  TestDb **p
6a70: 70 44 62 0a 29 7b 0a 20 20 20 20 2f 2a 20 22 6d  pDb.){.    /* "m
6a80: 61 78 5f 66 72 65 65 6c 69 73 74 3d 34 20 61 75  ax_freelist=4 au
6a90: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 3d 33 32 22  tocheckpoint=32"
6aa0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
6ab0: 20 2a 7a 43 66 67 20 3d 20 0a 20 20 20 20 22 70   *zCfg = .    "p
6ac0: 61 67 65 5f 73 69 7a 65 3d 32 35 36 20 62 6c 6f  age_size=256 blo
6ad0: 63 6b 5f 73 69 7a 65 3d 36 34 20 61 75 74 6f 66  ck_size=64 autof
6ae0: 6c 75 73 68 3d 31 36 20 22 0a 20 20 20 20 22 61  lush=16 ".    "a
6af0: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 3d 33 32  utocheckpoint=32
6b00: 22 0a 20 20 20 20 22 6d 6d 61 70 3d 30 20 22 0a  ".    "mmap=0 ".
6b10: 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 74 65 73    ;.  return tes
6b20: 74 4c 73 6d 4f 70 65 6e 28 7a 43 66 67 2c 20 7a  tLsmOpen(zCfg, z
6b30: 46 69 6c 65 6e 61 6d 65 2c 20 62 43 6c 65 61 72  Filename, bClear
6b40: 2c 20 70 70 44 62 29 3b 0a 7d 0a 0a 69 6e 74 20  , ppDb);.}..int 
6b50: 74 65 73 74 5f 6c 73 6d 5f 6c 6f 6d 65 6d 32 5f  test_lsm_lomem2_
6b60: 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  open(.  const ch
6b70: 61 72 20 2a 7a 53 70 65 63 2c 20 0a 20 20 63 6f  ar *zSpec, .  co
6b80: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
6b90: 61 6d 65 2c 20 0a 20 20 69 6e 74 20 62 43 6c 65  ame, .  int bCle
6ba0: 61 72 2c 20 0a 20 20 54 65 73 74 44 62 20 2a 2a  ar, .  TestDb **
6bb0: 70 70 44 62 0a 29 7b 0a 20 20 20 20 2f 2a 20 22  ppDb.){.    /* "
6bc0: 6d 61 78 5f 66 72 65 65 6c 69 73 74 3d 34 20 61  max_freelist=4 a
6bd0: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 3d 33 32  utocheckpoint=32
6be0: 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  " */.  const cha
6bf0: 72 20 2a 7a 43 66 67 20 3d 20 0a 20 20 20 20 22  r *zCfg = .    "
6c00: 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 20 62 6c  page_size=512 bl
6c10: 6f 63 6b 5f 73 69 7a 65 3d 36 34 20 61 75 74 6f  ock_size=64 auto
6c20: 66 6c 75 73 68 3d 30 20 6d 6d 61 70 3d 30 20 22  flush=0 mmap=0 "
6c30: 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 74 65  .  ;.  return te
6c40: 73 74 4c 73 6d 4f 70 65 6e 28 7a 43 66 67 2c 20  stLsmOpen(zCfg, 
6c50: 7a 46 69 6c 65 6e 61 6d 65 2c 20 62 43 6c 65 61  zFilename, bClea
6c60: 72 2c 20 70 70 44 62 29 3b 0a 7d 0a 0a 69 6e 74  r, ppDb);.}..int
6c70: 20 74 65 73 74 5f 6c 73 6d 5f 7a 69 70 5f 6f 70   test_lsm_zip_op
6c80: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
6c90: 20 2a 7a 53 70 65 63 2c 20 0a 20 20 63 6f 6e 73   *zSpec, .  cons
6ca0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
6cb0: 65 2c 20 0a 20 20 69 6e 74 20 62 43 6c 65 61 72  e, .  int bClear
6cc0: 2c 20 0a 20 20 54 65 73 74 44 62 20 2a 2a 70 70  , .  TestDb **pp
6cd0: 44 62 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Db.){.  const ch
6ce0: 61 72 20 2a 7a 43 66 67 20 3d 20 0a 20 20 20 20  ar *zCfg = .    
6cf0: 22 70 61 67 65 5f 73 69 7a 65 3d 32 35 36 20 62  "page_size=256 b
6d00: 6c 6f 63 6b 5f 73 69 7a 65 3d 36 34 20 61 75 74  lock_size=64 aut
6d10: 6f 66 6c 75 73 68 3d 31 36 20 22 0a 20 20 20 20  oflush=16 ".    
6d20: 22 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 3d  "autocheckpoint=
6d30: 33 32 20 63 6f 6d 70 72 65 73 73 69 6f 6e 3d 31  32 compression=1
6d40: 20 6d 6d 61 70 3d 30 20 22 0a 20 20 3b 0a 20 20   mmap=0 ".  ;.  
6d50: 72 65 74 75 72 6e 20 74 65 73 74 4c 73 6d 4f 70  return testLsmOp
6d60: 65 6e 28 7a 43 66 67 2c 20 7a 46 69 6c 65 6e 61  en(zCfg, zFilena
6d70: 6d 65 2c 20 62 43 6c 65 61 72 2c 20 70 70 44 62  me, bClear, ppDb
6d80: 29 3b 0a 7d 0a 0a 6c 73 6d 5f 64 62 20 2a 74 64  );.}..lsm_db *td
6d90: 62 5f 6c 73 6d 28 54 65 73 74 44 62 20 2a 70 44  b_lsm(TestDb *pD
6da0: 62 29 7b 0a 20 20 69 66 28 20 70 44 62 2d 3e 70  b){.  if( pDb->p
6db0: 4d 65 74 68 6f 64 73 2d 3e 78 43 6c 6f 73 65 3d  Methods->xClose=
6dc0: 3d 74 65 73 74 5f 6c 73 6d 5f 63 6c 6f 73 65 20  =test_lsm_close 
6dd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28  ){.    return ((
6de0: 4c 73 6d 44 62 20 2a 29 70 44 62 29 2d 3e 64 62  LsmDb *)pDb)->db
6df0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
6e00: 3b 0a 7d 0a 0a 69 6e 74 20 74 64 62 5f 6c 73 6d  ;.}..int tdb_lsm
6e10: 5f 6d 75 6c 74 69 74 68 72 65 61 64 28 54 65 73  _multithread(Tes
6e20: 74 44 62 20 2a 70 44 62 29 7b 0a 20 20 69 6e 74  tDb *pDb){.  int
6e30: 20 72 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   ret = 0;.  if( 
6e40: 74 64 62 5f 6c 73 6d 28 70 44 62 29 20 29 7b 0a  tdb_lsm(pDb) ){.
6e50: 20 20 20 20 72 65 74 20 3d 20 28 28 4c 73 6d 44      ret = ((LsmD
6e60: 62 2a 29 70 44 62 29 2d 3e 65 4d 6f 64 65 21 3d  b*)pDb)->eMode!=
6e70: 4c 53 4d 54 45 53 54 5f 4d 4f 44 45 5f 53 49 4e  LSMTEST_MODE_SIN
6e80: 47 4c 45 54 48 52 45 41 44 3b 0a 20 20 7d 0a 20  GLETHREAD;.  }. 
6e90: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
6ea0: 76 6f 69 64 20 74 64 62 5f 6c 73 6d 5f 65 6e 61  void tdb_lsm_ena
6eb0: 62 6c 65 5f 6c 6f 67 28 54 65 73 74 44 62 20 2a  ble_log(TestDb *
6ec0: 70 44 62 2c 20 69 6e 74 20 62 45 6e 61 62 6c 65  pDb, int bEnable
6ed0: 29 7b 0a 20 20 6c 73 6d 5f 64 62 20 2a 64 62 20  ){.  lsm_db *db 
6ee0: 3d 20 74 64 62 5f 6c 73 6d 28 70 44 62 29 3b 0a  = tdb_lsm(pDb);.
6ef0: 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
6f00: 6c 73 6d 5f 63 6f 6e 66 69 67 5f 6c 6f 67 28 64  lsm_config_log(d
6f10: 62 2c 20 28 62 45 6e 61 62 6c 65 20 3f 20 78 4c  b, (bEnable ? xL
6f20: 6f 67 20 3a 20 30 29 2c 20 28 76 6f 69 64 20 2a  og : 0), (void *
6f30: 29 22 63 6c 69 65 6e 74 22 29 3b 0a 20 20 7d 0a  )"client");.  }.
6f40: 7d 0a 0a 76 6f 69 64 20 74 64 62 5f 6c 73 6d 5f  }..void tdb_lsm_
6f50: 61 70 70 6c 69 63 61 74 69 6f 6e 5f 63 72 61 73  application_cras
6f60: 68 28 54 65 73 74 44 62 20 2a 70 44 62 29 7b 0a  h(TestDb *pDb){.
6f70: 20 20 69 66 28 20 74 64 62 5f 6c 73 6d 28 70 44    if( tdb_lsm(pD
6f80: 62 29 20 29 7b 0a 20 20 20 20 4c 73 6d 44 62 20  b) ){.    LsmDb 
6f90: 2a 70 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70 44  *p = (LsmDb *)pD
6fa0: 62 3b 0a 20 20 20 20 70 2d 3e 62 43 72 61 73 68  b;.    p->bCrash
6fb0: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 76  ed = 1;.  }.}..v
6fc0: 6f 69 64 20 74 64 62 5f 6c 73 6d 5f 70 72 65 70  oid tdb_lsm_prep
6fd0: 61 72 65 5f 73 79 73 74 65 6d 5f 63 72 61 73 68  are_system_crash
6fe0: 28 54 65 73 74 44 62 20 2a 70 44 62 29 7b 0a 20  (TestDb *pDb){. 
6ff0: 20 69 66 28 20 74 64 62 5f 6c 73 6d 28 70 44 62   if( tdb_lsm(pDb
7000: 29 20 29 7b 0a 20 20 20 20 4c 73 6d 44 62 20 2a  ) ){.    LsmDb *
7010: 70 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70 44 62  p = (LsmDb *)pDb
7020: 3b 0a 20 20 20 20 70 2d 3e 62 50 72 65 70 61 72  ;.    p->bPrepar
7030: 65 43 72 61 73 68 20 3d 20 31 3b 0a 20 20 7d 0a  eCrash = 1;.  }.
7040: 7d 0a 0a 76 6f 69 64 20 74 64 62 5f 6c 73 6d 5f  }..void tdb_lsm_
7050: 73 79 73 74 65 6d 5f 63 72 61 73 68 28 54 65 73  system_crash(Tes
7060: 74 44 62 20 2a 70 44 62 29 7b 0a 20 20 69 66 28  tDb *pDb){.  if(
7070: 20 74 64 62 5f 6c 73 6d 28 70 44 62 29 20 29 7b   tdb_lsm(pDb) ){
7080: 0a 20 20 20 20 4c 73 6d 44 62 20 2a 70 20 3d 20  .    LsmDb *p = 
7090: 28 4c 73 6d 44 62 20 2a 29 70 44 62 3b 0a 20 20  (LsmDb *)pDb;.  
70a0: 20 20 70 2d 3e 62 43 72 61 73 68 65 64 20 3d 20    p->bCrashed = 
70b0: 31 3b 0a 20 20 20 20 64 6f 53 79 73 74 65 6d 43  1;.    doSystemC
70c0: 72 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  rash(p);.  }.}..
70d0: 76 6f 69 64 20 74 64 62 5f 6c 73 6d 5f 73 61 66  void tdb_lsm_saf
70e0: 65 74 79 28 54 65 73 74 44 62 20 2a 70 44 62 2c  ety(TestDb *pDb,
70f0: 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
7100: 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 4c 53  ssert( eMode==LS
7110: 4d 5f 53 41 46 45 54 59 5f 4f 46 46 20 0a 20 20  M_SAFETY_OFF .  
7120: 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 4c       || eMode==L
7130: 53 4d 5f 53 41 46 45 54 59 5f 4e 4f 52 4d 41 4c  SM_SAFETY_NORMAL
7140: 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64   .       || eMod
7150: 65 3d 3d 4c 53 4d 5f 53 41 46 45 54 59 5f 46 55  e==LSM_SAFETY_FU
7160: 4c 4c 20 0a 20 20 29 3b 0a 20 20 69 66 28 20 74  LL .  );.  if( t
7170: 64 62 5f 6c 73 6d 28 70 44 62 29 20 29 7b 0a 20  db_lsm(pDb) ){. 
7180: 20 20 20 69 6e 74 20 69 50 61 72 61 6d 20 3d 20     int iParam = 
7190: 65 4d 6f 64 65 3b 0a 20 20 20 20 4c 73 6d 44 62  eMode;.    LsmDb
71a0: 20 2a 70 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70   *p = (LsmDb *)p
71b0: 44 62 3b 0a 20 20 20 20 6c 73 6d 5f 63 6f 6e 66  Db;.    lsm_conf
71c0: 69 67 28 70 2d 3e 64 62 2c 20 4c 53 4d 5f 43 4f  ig(p->db, LSM_CO
71d0: 4e 46 49 47 5f 53 41 46 45 54 59 2c 20 26 69 50  NFIG_SAFETY, &iP
71e0: 61 72 61 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f  aram);.  }.}..vo
71f0: 69 64 20 74 64 62 5f 6c 73 6d 5f 70 72 65 70 61  id tdb_lsm_prepa
7200: 72 65 5f 73 79 6e 63 5f 63 72 61 73 68 28 54 65  re_sync_crash(Te
7210: 73 74 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69  stDb *pDb, int i
7220: 53 79 6e 63 29 7b 0a 20 20 61 73 73 65 72 74 28  Sync){.  assert(
7230: 20 69 53 79 6e 63 3e 30 20 29 3b 0a 20 20 69 66   iSync>0 );.  if
7240: 28 20 74 64 62 5f 6c 73 6d 28 70 44 62 29 20 29  ( tdb_lsm(pDb) )
7250: 7b 0a 20 20 20 20 4c 73 6d 44 62 20 2a 70 20 3d  {.    LsmDb *p =
7260: 20 28 4c 73 6d 44 62 20 2a 29 70 44 62 3b 0a 20   (LsmDb *)pDb;. 
7270: 20 20 20 70 2d 3e 6e 41 75 74 6f 43 72 61 73 68     p->nAutoCrash
7280: 20 3d 20 69 53 79 6e 63 3b 0a 20 20 20 20 70 2d   = iSync;.    p-
7290: 3e 62 50 72 65 70 61 72 65 43 72 61 73 68 20 3d  >bPrepareCrash =
72a0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20   1;.  }.}..void 
72b0: 74 64 62 5f 6c 73 6d 5f 63 6f 6e 66 69 67 5f 77  tdb_lsm_config_w
72c0: 6f 72 6b 5f 68 6f 6f 6b 28 0a 20 20 54 65 73 74  ork_hook(.  Test
72d0: 44 62 20 2a 70 44 62 2c 20 0a 20 20 76 6f 69 64  Db *pDb, .  void
72e0: 20 28 2a 78 57 6f 72 6b 29 28 6c 73 6d 5f 64 62   (*xWork)(lsm_db
72f0: 20 2a 2c 20 76 6f 69 64 20 2a 29 2c 20 0a 20 20   *, void *), .  
7300: 76 6f 69 64 20 2a 70 57 6f 72 6b 43 74 78 0a 29  void *pWorkCtx.)
7310: 7b 0a 20 20 69 66 28 20 74 64 62 5f 6c 73 6d 28  {.  if( tdb_lsm(
7320: 70 44 62 29 20 29 7b 0a 20 20 20 20 4c 73 6d 44  pDb) ){.    LsmD
7330: 62 20 2a 70 20 3d 20 28 4c 73 6d 44 62 20 2a 29  b *p = (LsmDb *)
7340: 70 44 62 3b 0a 20 20 20 20 70 2d 3e 78 57 6f 72  pDb;.    p->xWor
7350: 6b 20 3d 20 78 57 6f 72 6b 3b 0a 20 20 20 20 70  k = xWork;.    p
7360: 2d 3e 70 57 6f 72 6b 43 74 78 20 3d 20 70 57 6f  ->pWorkCtx = pWo
7370: 72 6b 43 74 78 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f  rkCtx;.  }.}..vo
7380: 69 64 20 74 64 62 5f 6c 73 6d 5f 77 72 69 74 65  id tdb_lsm_write
7390: 5f 68 6f 6f 6b 28 0a 20 20 54 65 73 74 44 62 20  _hook(.  TestDb 
73a0: 2a 70 44 62 2c 20 0a 20 20 76 6f 69 64 20 28 2a  *pDb, .  void (*
73b0: 78 57 72 69 74 65 29 28 76 6f 69 64 20 2a 2c 20  xWrite)(void *, 
73c0: 69 6e 74 2c 20 6c 73 6d 5f 69 36 34 2c 20 69 6e  int, lsm_i64, in
73d0: 74 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  t, int),.  void 
73e0: 2a 70 57 72 69 74 65 43 74 78 0a 29 7b 0a 20 20  *pWriteCtx.){.  
73f0: 69 66 28 20 74 64 62 5f 6c 73 6d 28 70 44 62 29  if( tdb_lsm(pDb)
7400: 20 29 7b 0a 20 20 20 20 4c 73 6d 44 62 20 2a 70   ){.    LsmDb *p
7410: 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70 44 62 3b   = (LsmDb *)pDb;
7420: 0a 20 20 20 20 70 2d 3e 78 57 72 69 74 65 48 6f  .    p->xWriteHo
7430: 6f 6b 20 3d 20 78 57 72 69 74 65 3b 0a 20 20 20  ok = xWrite;.   
7440: 20 70 2d 3e 70 57 72 69 74 65 43 74 78 20 3d 20   p->pWriteCtx = 
7450: 70 57 72 69 74 65 43 74 78 3b 0a 20 20 7d 0a 7d  pWriteCtx;.  }.}
7460: 0a 0a 69 6e 74 20 74 64 62 5f 6c 73 6d 5f 6f 70  ..int tdb_lsm_op
7470: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
7480: 43 66 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Cfg, const char 
7490: 2a 7a 44 62 2c 20 69 6e 74 20 62 43 6c 65 61 72  *zDb, int bClear
74a0: 2c 20 54 65 73 74 44 62 20 2a 2a 70 70 44 62 29  , TestDb **ppDb)
74b0: 7b 0a 20 20 72 65 74 75 72 6e 20 74 65 73 74 4c  {.  return testL
74c0: 73 6d 4f 70 65 6e 28 7a 43 66 67 2c 20 7a 44 62  smOpen(zCfg, zDb
74d0: 2c 20 62 43 6c 65 61 72 2c 20 70 70 44 62 29 3b  , bClear, ppDb);
74e0: 0a 7d 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f 4d  .}..#ifdef LSM_M
74f0: 55 54 45 58 5f 50 54 48 52 45 41 44 53 0a 0a 2f  UTEX_PTHREADS../
7500: 2a 0a 2a 2a 20 53 69 67 6e 61 6c 20 77 6f 72 6b  *.** Signal work
7510: 65 72 20 74 68 72 65 61 64 20 69 57 6f 72 6b 65  er thread iWorke
7520: 72 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  r that there may
7530: 20 62 65 20 77 6f 72 6b 20 74 6f 20 64 6f 2e 0a   be work to do..
7540: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
7550: 74 5f 73 69 67 6e 61 6c 5f 77 6f 72 6b 65 72 28  t_signal_worker(
7560: 4c 73 6d 44 62 20 2a 70 44 62 2c 20 69 6e 74 20  LsmDb *pDb, int 
7570: 69 57 6f 72 6b 65 72 29 7b 0a 20 20 4c 73 6d 57  iWorker){.  LsmW
7580: 6f 72 6b 65 72 20 2a 70 20 3d 20 26 70 44 62 2d  orker *p = &pDb-
7590: 3e 61 57 6f 72 6b 65 72 5b 69 57 6f 72 6b 65 72  >aWorker[iWorker
75a0: 5d 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74  ];.  pthread_mut
75b0: 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e 77 6f 72 6b  ex_lock(&p->work
75c0: 65 72 5f 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  er_mutex);.  p->
75d0: 62 44 6f 57 6f 72 6b 20 3d 20 31 3b 0a 20 20 70  bDoWork = 1;.  p
75e0: 74 68 72 65 61 64 5f 63 6f 6e 64 5f 73 69 67 6e  thread_cond_sign
75f0: 61 6c 28 26 70 2d 3e 77 6f 72 6b 65 72 5f 63 6f  al(&p->worker_co
7600: 6e 64 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d  nd);.  pthread_m
7610: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e  utex_unlock(&p->
7620: 77 6f 72 6b 65 72 5f 6d 75 74 65 78 29 3b 0a 7d  worker_mutex);.}
7630: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7640: 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20  tine is used as 
7650: 74 68 65 20 6d 61 69 6e 28 29 20 66 6f 72 20 61  the main() for a
7660: 6c 6c 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64  ll worker thread
7670: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7680: 64 20 2a 77 6f 72 6b 65 72 5f 6d 61 69 6e 28 76  d *worker_main(v
7690: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 4c 73  oid *pArg){.  Ls
76a0: 6d 57 6f 72 6b 65 72 20 2a 70 20 3d 20 28 4c 73  mWorker *p = (Ls
76b0: 6d 57 6f 72 6b 65 72 20 2a 29 70 41 72 67 3b 0a  mWorker *)pArg;.
76c0: 20 20 6c 73 6d 5f 64 62 20 2a 70 57 6f 72 6b 65    lsm_db *pWorke
76d0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
76e0: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
76f0: 74 6f 20 61 63 63 65 73 73 20 64 62 20 74 68 72  to access db thr
7700: 6f 75 67 68 20 2a 2f 0a 0a 20 20 70 74 68 72 65  ough */..  pthre
7710: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70  ad_mutex_lock(&p
7720: 2d 3e 77 6f 72 6b 65 72 5f 6d 75 74 65 78 29 3b  ->worker_mutex);
7730: 0a 20 20 77 68 69 6c 65 28 20 28 70 57 6f 72 6b  .  while( (pWork
7740: 65 72 20 3d 20 70 2d 3e 70 57 6f 72 6b 65 72 29  er = p->pWorker)
7750: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
7760: 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 20 20 2f 2a   LSM_OK;..    /*
7770: 20 44 6f 20 73 6f 6d 65 20 77 6f 72 6b 2e 20 49   Do some work. I
7780: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7790: 73 2c 20 65 78 69 74 2e 20 2a 2f 0a 0a 20 20 20  s, exit. */..   
77a0: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75   pthread_mutex_u
77b0: 6e 6c 6f 63 6b 28 26 70 2d 3e 77 6f 72 6b 65 72  nlock(&p->worker
77c0: 5f 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66 28  _mutex);.    if(
77d0: 20 70 2d 3e 65 54 79 70 65 3d 3d 4c 53 4d 54 45   p->eType==LSMTE
77e0: 53 54 5f 54 48 52 45 41 44 5f 43 4b 50 54 20 29  ST_THREAD_CKPT )
77f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 42 20  {.      int nKB 
7800: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
7810: 6c 73 6d 5f 69 6e 66 6f 28 70 57 6f 72 6b 65 72  lsm_info(pWorker
7820: 2c 20 4c 53 4d 5f 49 4e 46 4f 5f 43 48 45 43 4b  , LSM_INFO_CHECK
7830: 50 4f 49 4e 54 5f 53 49 5a 45 2c 20 26 6e 4b 42  POINT_SIZE, &nKB
7840: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
7850: 3d 4c 53 4d 5f 4f 4b 20 26 26 20 6e 4b 42 3e 3d  =LSM_OK && nKB>=
7860: 70 2d 3e 70 44 62 2d 3e 6e 4d 74 4d 69 6e 43 6b  p->pDb->nMtMinCk
7870: 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  pt ){.        rc
7880: 20 3d 20 6c 73 6d 5f 63 68 65 63 6b 70 6f 69 6e   = lsm_checkpoin
7890: 74 28 70 57 6f 72 6b 65 72 2c 20 30 29 3b 0a 20  t(pWorker, 0);. 
78a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
78b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69  {.      int nWri
78c0: 74 65 3b 0a 20 20 20 20 20 20 64 6f 20 7b 0a 0a  te;.      do {..
78d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
78e0: 54 79 70 65 3d 3d 4c 53 4d 54 45 53 54 5f 54 48  Type==LSMTEST_TH
78f0: 52 45 41 44 5f 57 4f 52 4b 45 52 20 29 7b 0a 20  READ_WORKER ){. 
7900: 20 20 20 20 20 20 20 20 20 77 61 69 74 4f 6e 43           waitOnC
7910: 68 65 63 6b 70 6f 69 6e 74 65 72 28 70 2d 3e 70  heckpointer(p->p
7920: 44 62 2c 20 70 57 6f 72 6b 65 72 29 3b 0a 20 20  Db, pWorker);.  
7930: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
7940: 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 20   nWrite = 0;.   
7950: 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f 77 6f       rc = lsm_wo
7960: 72 6b 28 70 57 6f 72 6b 65 72 2c 20 30 2c 20 32  rk(pWorker, 0, 2
7970: 35 36 2c 20 26 6e 57 72 69 74 65 29 3b 0a 0a 20  56, &nWrite);.. 
7980: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 54         if( p->eT
7990: 79 70 65 3d 3d 4c 53 4d 54 45 53 54 5f 54 48 52  ype==LSMTEST_THR
79a0: 45 41 44 5f 57 4f 52 4b 45 52 20 26 26 20 6e 57  EAD_WORKER && nW
79b0: 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  rite ){.        
79c0: 20 20 6d 74 5f 73 69 67 6e 61 6c 5f 77 6f 72 6b    mt_signal_work
79d0: 65 72 28 70 2d 3e 70 44 62 2c 20 31 29 3b 0a 20  er(p->pDb, 1);. 
79e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
79f0: 77 68 69 6c 65 28 20 6e 57 72 69 74 65 20 26 26  while( nWrite &&
7a00: 20 70 2d 3e 70 57 6f 72 6b 65 72 20 29 3b 0a 20   p->pWorker );. 
7a10: 20 20 20 7d 0a 20 20 20 20 70 74 68 72 65 61 64     }.    pthread
7a20: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d 3e  _mutex_lock(&p->
7a30: 77 6f 72 6b 65 72 5f 6d 75 74 65 78 29 3b 0a 0a  worker_mutex);..
7a40: 20 20 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f      if( rc!=LSM_
7a50: 4f 4b 20 26 26 20 72 63 21 3d 4c 53 4d 5f 42 55  OK && rc!=LSM_BU
7a60: 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 77  SY ){.      p->w
7a70: 6f 72 6b 65 72 5f 72 63 20 3d 20 72 63 3b 0a 20  orker_rc = rc;. 
7a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7a90: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 68  }..    /* The th
7aa0: 72 65 61 64 20 77 69 6c 6c 20 77 61 6b 65 20 75  read will wake u
7ab0: 70 20 77 68 65 6e 20 69 74 20 69 73 20 73 69 67  p when it is sig
7ac0: 6e 61 6c 65 64 20 65 69 74 68 65 72 20 62 65 63  naled either bec
7ad0: 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  ause another.   
7ae0: 20 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 63   ** thread has c
7af0: 72 65 61 74 65 64 20 73 6f 6d 65 20 77 6f 72 6b  reated some work
7b00: 20 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6f 72   for this one or
7b10: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 6e   because the con
7b20: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  nection.    ** i
7b30: 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 20  s being closed. 
7b40: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
7b50: 57 6f 72 6b 65 72 20 26 26 20 70 2d 3e 62 44 6f  Worker && p->bDo
7b60: 57 6f 72 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Work==0 ){.     
7b70: 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 77 61   pthread_cond_wa
7b80: 69 74 28 26 70 2d 3e 77 6f 72 6b 65 72 5f 63 6f  it(&p->worker_co
7b90: 6e 64 2c 20 26 70 2d 3e 77 6f 72 6b 65 72 5f 6d  nd, &p->worker_m
7ba0: 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
7bb0: 20 70 2d 3e 62 44 6f 57 6f 72 6b 20 3d 20 30 3b   p->bDoWork = 0;
7bc0: 0a 20 20 7d 0a 20 20 70 74 68 72 65 61 64 5f 6d  .  }.  pthread_m
7bd0: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e  utex_unlock(&p->
7be0: 77 6f 72 6b 65 72 5f 6d 75 74 65 78 29 3b 0a 20  worker_mutex);. 
7bf0: 20 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a   .  return 0;.}.
7c00: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 74  ..static void mt
7c10: 5f 73 74 6f 70 5f 77 6f 72 6b 65 72 28 4c 73 6d  _stop_worker(Lsm
7c20: 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 57 6f  Db *pDb, int iWo
7c30: 72 6b 65 72 29 7b 0a 20 20 4c 73 6d 57 6f 72 6b  rker){.  LsmWork
7c40: 65 72 20 2a 70 20 3d 20 26 70 44 62 2d 3e 61 57  er *p = &pDb->aW
7c50: 6f 72 6b 65 72 5b 69 57 6f 72 6b 65 72 5d 3b 0a  orker[iWorker];.
7c60: 20 20 69 66 28 20 70 2d 3e 70 57 6f 72 6b 65 72    if( p->pWorker
7c70: 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
7c80: 75 6d 6d 79 3b 0a 20 20 20 20 6c 73 6d 5f 64 62  ummy;.    lsm_db
7c90: 20 2a 70 57 6f 72 6b 65 72 3b 0a 0a 20 20 20 20   *pWorker;..    
7ca0: 2f 2a 20 53 69 67 6e 61 6c 20 74 68 65 20 77 6f  /* Signal the wo
7cb0: 72 6b 65 72 20 74 6f 20 73 74 6f 70 20 2a 2f 0a  rker to stop */.
7cc0: 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65      pthread_mute
7cd0: 78 5f 6c 6f 63 6b 28 26 70 2d 3e 77 6f 72 6b 65  x_lock(&p->worke
7ce0: 72 5f 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 57  r_mutex);.    pW
7cf0: 6f 72 6b 65 72 20 3d 20 70 2d 3e 70 57 6f 72 6b  orker = p->pWork
7d00: 65 72 3b 0a 20 20 20 20 70 2d 3e 70 57 6f 72 6b  er;.    p->pWork
7d10: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 74 68 72  er = 0;.    pthr
7d20: 65 61 64 5f 63 6f 6e 64 5f 73 69 67 6e 61 6c 28  ead_cond_signal(
7d30: 26 70 2d 3e 77 6f 72 6b 65 72 5f 63 6f 6e 64 29  &p->worker_cond)
7d40: 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75  ;.    pthread_mu
7d50: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e 77  tex_unlock(&p->w
7d60: 6f 72 6b 65 72 5f 6d 75 74 65 78 29 3b 0a 0a 20  orker_mutex);.. 
7d70: 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 68 65 20 77     /* Join the w
7d80: 6f 72 6b 65 72 20 74 68 72 65 61 64 2e 20 2a 2f  orker thread. */
7d90: 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6a 6f 69  .    pthread_joi
7da0: 6e 28 70 2d 3e 77 6f 72 6b 65 72 5f 74 68 72 65  n(p->worker_thre
7db0: 61 64 2c 20 26 70 44 75 6d 6d 79 29 3b 0a 0a 20  ad, &pDummy);.. 
7dc0: 20 20 20 2f 2a 20 46 72 65 65 20 72 65 73 6f 75     /* Free resou
7dd0: 72 63 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  rces allocated i
7de0: 6e 20 6d 74 5f 73 74 61 72 74 5f 77 6f 72 6b 65  n mt_start_worke
7df0: 72 28 29 20 2a 2f 0a 20 20 20 20 70 74 68 72 65  r() */.    pthre
7e00: 61 64 5f 63 6f 6e 64 5f 64 65 73 74 72 6f 79 28  ad_cond_destroy(
7e10: 26 70 2d 3e 77 6f 72 6b 65 72 5f 63 6f 6e 64 29  &p->worker_cond)
7e20: 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75  ;.    pthread_mu
7e30: 74 65 78 5f 64 65 73 74 72 6f 79 28 26 70 2d 3e  tex_destroy(&p->
7e40: 77 6f 72 6b 65 72 5f 6d 75 74 65 78 29 3b 0a 20  worker_mutex);. 
7e50: 20 20 20 6c 73 6d 5f 63 6c 6f 73 65 28 70 57 6f     lsm_close(pWo
7e60: 72 6b 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  rker);.  }.}..st
7e70: 61 74 69 63 20 76 6f 69 64 20 6d 74 5f 73 68 75  atic void mt_shu
7e80: 74 64 6f 77 6e 28 4c 73 6d 44 62 20 2a 70 44 62  tdown(LsmDb *pDb
7e90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
7ea0: 72 28 69 3d 30 3b 20 69 3c 70 44 62 2d 3e 6e 57  r(i=0; i<pDb->nW
7eb0: 6f 72 6b 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  orker; i++){.   
7ec0: 20 6d 74 5f 73 74 6f 70 5f 77 6f 72 6b 65 72 28   mt_stop_worker(
7ed0: 70 44 62 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pDb, i);.  }.}..
7ee0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 62  /*.** This callb
7ef0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ack is invoked b
7f00: 79 20 4c 53 4d 20 77 68 65 6e 20 74 68 65 20 63  y LSM when the c
7f10: 6c 69 65 6e 74 20 64 61 74 61 62 61 73 65 20 77  lient database w
7f20: 72 69 74 65 73 20 74 6f 0a 2a 2a 20 74 68 65 20  rites to.** the 
7f30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 69  database file (i
7f40: 2e 65 2e 20 74 6f 20 66 6c 75 73 68 20 74 68 65  .e. to flush the
7f50: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
7f60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 29   in-memory tree)
7f70: 2e 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 69 65  ..** This implie
7f80: 73 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 77  s there may be w
7f90: 6f 72 6b 20 74 6f 20 64 6f 20 6f 6e 20 74 68 65  ork to do on the
7fa0: 20 64 61 74 61 62 61 73 65 2c 20 73 6f 20 73 69   database, so si
7fb0: 67 6e 61 6c 0a 2a 2a 20 74 68 65 20 77 6f 72 6b  gnal.** the work
7fc0: 65 72 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 73  er threads..*/.s
7fd0: 74 61 74 69 63 20 76 6f 69 64 20 6d 74 5f 63 6c  tatic void mt_cl
7fe0: 69 65 6e 74 5f 77 6f 72 6b 5f 68 6f 6f 6b 28 6c  ient_work_hook(l
7ff0: 73 6d 5f 64 62 20 2a 64 62 2c 20 76 6f 69 64 20  sm_db *db, void 
8000: 2a 70 41 72 67 29 7b 0a 20 20 4c 73 6d 44 62 20  *pArg){.  LsmDb 
8010: 2a 70 44 62 20 3d 20 28 4c 73 6d 44 62 20 2a 29  *pDb = (LsmDb *)
8020: 70 41 72 67 3b 20 20 20 20 20 2f 2a 20 4c 73 6d  pArg;     /* Lsm
8030: 44 62 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  Db database hand
8040: 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f  le */..  /* Invo
8050: 6b 65 20 74 68 65 20 75 73 65 72 20 6c 65 76 65  ke the user leve
8060: 6c 20 77 6f 72 6b 2d 68 6f 6f 6b 2c 20 69 66 20  l work-hook, if 
8070: 61 6e 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44  any. */.  if( pD
8080: 62 2d 3e 78 57 6f 72 6b 20 29 20 70 44 62 2d 3e  b->xWork ) pDb->
8090: 78 57 6f 72 6b 28 64 62 2c 20 70 44 62 2d 3e 70  xWork(db, pDb->p
80a0: 57 6f 72 6b 43 74 78 29 3b 0a 0a 20 20 2f 2a 20  WorkCtx);..  /* 
80b0: 57 61 6b 65 20 75 70 20 77 6f 72 6b 65 72 20 74  Wake up worker t
80c0: 68 72 65 61 64 20 30 2e 20 2a 2f 0a 20 20 6d 74  hread 0. */.  mt
80d0: 5f 73 69 67 6e 61 6c 5f 77 6f 72 6b 65 72 28 70  _signal_worker(p
80e0: 44 62 2c 20 30 29 3b 0a 7d 0a 0a 73 74 61 74 69  Db, 0);.}..stati
80f0: 63 20 76 6f 69 64 20 6d 74 5f 77 6f 72 6b 65 72  c void mt_worker
8100: 5f 77 6f 72 6b 5f 68 6f 6f 6b 28 6c 73 6d 5f 64  _work_hook(lsm_d
8110: 62 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 41 72  b *db, void *pAr
8120: 67 29 7b 0a 20 20 4c 73 6d 44 62 20 2a 70 44 62  g){.  LsmDb *pDb
8130: 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70 41 72 67   = (LsmDb *)pArg
8140: 3b 20 20 20 20 20 2f 2a 20 4c 73 6d 44 62 20 64  ;     /* LsmDb d
8150: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
8160: 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  /..  /* Invoke t
8170: 68 65 20 75 73 65 72 20 6c 65 76 65 6c 20 77 6f  he user level wo
8180: 72 6b 2d 68 6f 6f 6b 2c 20 69 66 20 61 6e 79 2e  rk-hook, if any.
8190: 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 78   */.  if( pDb->x
81a0: 57 6f 72 6b 20 29 20 70 44 62 2d 3e 78 57 6f 72  Work ) pDb->xWor
81b0: 6b 28 64 62 2c 20 70 44 62 2d 3e 70 57 6f 72 6b  k(db, pDb->pWork
81c0: 43 74 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  Ctx);.}../*.** L
81d0: 61 75 6e 63 68 20 77 6f 72 6b 65 72 20 74 68 72  aunch worker thr
81e0: 65 61 64 20 69 57 6f 72 6b 65 72 20 66 6f 72 20  ead iWorker for 
81f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8200: 69 6f 6e 20 70 44 62 2e 0a 2a 2f 0a 73 74 61 74  ion pDb..*/.stat
8210: 69 63 20 69 6e 74 20 6d 74 5f 73 74 61 72 74 5f  ic int mt_start_
8220: 77 6f 72 6b 65 72 28 0a 20 20 4c 73 6d 44 62 20  worker(.  LsmDb 
8230: 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
8240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
8250: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
8260: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 57  ture */.  int iW
8270: 6f 72 6b 65 72 2c 20 20 20 20 20 20 20 20 20 20  orker,          
8280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 6f 72            /* Wor
8290: 6b 65 72 20 6e 75 6d 62 65 72 20 74 6f 20 73 74  ker number to st
82a0: 61 72 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  art */.  const c
82b0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
82c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
82d0: 20 6e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73   name of databas
82e0: 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 63  e to open */.  c
82f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 66 67 2c  onst char *zCfg,
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8310: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  * Connection con
8320: 66 69 67 75 72 61 74 69 6f 6e 20 73 74 72 69 6e  figuration strin
8330: 67 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  g */.  int eType
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
8360: 66 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 20  f worker thread 
8370: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
8380: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8390: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
83a0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 73 6d 57  n code */.  LsmW
83b0: 6f 72 6b 65 72 20 2a 70 3b 20 20 20 20 20 20 20  orker *p;       
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
83d0: 62 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c  bject to initial
83e0: 69 7a 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ize */..  assert
83f0: 28 20 69 57 6f 72 6b 65 72 3c 70 44 62 2d 3e 6e  ( iWorker<pDb->n
8400: 57 6f 72 6b 65 72 20 29 3b 0a 20 20 61 73 73 65  Worker );.  asse
8410: 72 74 28 20 65 54 79 70 65 3d 3d 4c 53 4d 54 45  rt( eType==LSMTE
8420: 53 54 5f 54 48 52 45 41 44 5f 43 4b 50 54 20 0a  ST_THREAD_CKPT .
8430: 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
8440: 3d 4c 53 4d 54 45 53 54 5f 54 48 52 45 41 44 5f  =LSMTEST_THREAD_
8450: 57 4f 52 4b 45 52 20 0a 20 20 20 20 20 20 20 7c  WORKER .       |
8460: 7c 20 65 54 79 70 65 3d 3d 4c 53 4d 54 45 53 54  | eType==LSMTEST
8470: 5f 54 48 52 45 41 44 5f 57 4f 52 4b 45 52 5f 41  _THREAD_WORKER_A
8480: 43 20 0a 20 20 29 3b 0a 0a 20 20 70 20 3d 20 26  C .  );..  p = &
8490: 70 44 62 2d 3e 61 57 6f 72 6b 65 72 5b 69 57 6f  pDb->aWorker[iWo
84a0: 72 6b 65 72 5d 3b 0a 20 20 70 2d 3e 65 54 79 70  rker];.  p->eTyp
84b0: 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 70 2d 3e  e = eType;.  p->
84c0: 70 44 62 20 3d 20 70 44 62 3b 0a 0a 20 20 2f 2a  pDb = pDb;..  /*
84d0: 20 4f 70 65 6e 20 74 68 65 20 77 6f 72 6b 65 72   Open the worker
84e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
84f0: 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
8500: 3d 20 6c 73 6d 5f 6e 65 77 28 26 70 44 62 2d 3e  = lsm_new(&pDb->
8510: 65 6e 76 2c 20 26 70 2d 3e 70 57 6f 72 6b 65 72  env, &p->pWorker
8520: 29 3b 0a 20 20 69 66 28 20 7a 43 66 67 20 29 7b  );.  if( zCfg ){
8530: 0a 20 20 20 20 74 65 73 74 5f 6c 73 6d 5f 63 6f  .    test_lsm_co
8540: 6e 66 69 67 5f 73 74 72 28 70 44 62 2c 20 70 2d  nfig_str(pDb, p-
8550: 3e 70 57 6f 72 6b 65 72 2c 20 31 2c 20 7a 43 66  >pWorker, 1, zCf
8560: 67 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  g, 0);.  }.  if(
8570: 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6c 73   rc==0 ) rc = ls
8580: 6d 5f 6f 70 65 6e 28 70 2d 3e 70 57 6f 72 6b 65  m_open(p->pWorke
8590: 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r, zFilename);. 
85a0: 20 6c 73 6d 5f 63 6f 6e 66 69 67 5f 6c 6f 67 28   lsm_config_log(
85b0: 70 2d 3e 70 57 6f 72 6b 65 72 2c 20 78 4c 6f 67  p->pWorker, xLog
85c0: 2c 20 28 76 6f 69 64 20 2a 29 22 77 6f 72 6b 65  , (void *)"worke
85d0: 72 22 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 66 69  r");..  /* Confi
85e0: 67 75 72 65 20 74 68 65 20 77 6f 72 6b 2d 68 6f  gure the work-ho
85f0: 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  ok */.  if( rc==
8600: 30 20 29 7b 0a 20 20 20 20 6c 73 6d 5f 63 6f 6e  0 ){.    lsm_con
8610: 66 69 67 5f 77 6f 72 6b 5f 68 6f 6f 6b 28 70 2d  fig_work_hook(p-
8620: 3e 70 57 6f 72 6b 65 72 2c 20 6d 74 5f 77 6f 72  >pWorker, mt_wor
8630: 6b 65 72 5f 77 6f 72 6b 5f 68 6f 6f 6b 2c 20 28  ker_work_hook, (
8640: 76 6f 69 64 20 2a 29 70 44 62 29 3b 0a 20 20 7d  void *)pDb);.  }
8650: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 4c  ..  if( eType==L
8660: 53 4d 54 45 53 54 5f 54 48 52 45 41 44 5f 57 4f  SMTEST_THREAD_WO
8670: 52 4b 45 52 20 29 7b 0a 20 20 20 20 74 65 73 74  RKER ){.    test
8680: 5f 6c 73 6d 5f 63 6f 6e 66 69 67 5f 73 74 72 28  _lsm_config_str(
8690: 30 2c 20 70 2d 3e 70 57 6f 72 6b 65 72 2c 20 31  0, p->pWorker, 1
86a0: 2c 20 22 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  , "autocheckpoin
86b0: 74 3d 30 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  t=0", 0);.  }.. 
86c0: 20 2f 2a 20 4b 69 63 6b 20 6f 66 66 20 74 68 65   /* Kick off the
86d0: 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 2e 20   worker thread. 
86e0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  */.  if( rc==0 )
86f0: 20 72 63 20 3d 20 70 74 68 72 65 61 64 5f 63 6f   rc = pthread_co
8700: 6e 64 5f 69 6e 69 74 28 26 70 2d 3e 77 6f 72 6b  nd_init(&p->work
8710: 65 72 5f 63 6f 6e 64 2c 20 30 29 3b 0a 20 20 69  er_cond, 0);.  i
8720: 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
8730: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
8740: 69 74 28 26 70 2d 3e 77 6f 72 6b 65 72 5f 6d 75  it(&p->worker_mu
8750: 74 65 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tex, 0);.  if( r
8760: 63 3d 3d 30 20 29 20 72 63 20 3d 20 70 74 68 72  c==0 ) rc = pthr
8770: 65 61 64 5f 63 72 65 61 74 65 28 26 70 2d 3e 77  ead_create(&p->w
8780: 6f 72 6b 65 72 5f 74 68 72 65 61 64 2c 20 30 2c  orker_thread, 0,
8790: 20 77 6f 72 6b 65 72 5f 6d 61 69 6e 2c 20 28 76   worker_main, (v
87a0: 6f 69 64 20 2a 29 70 29 3b 0a 0a 20 20 72 65 74  oid *)p);..  ret
87b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74  urn rc;.}...stat
87c0: 69 63 20 69 6e 74 20 74 65 73 74 4c 73 6d 53 74  ic int testLsmSt
87d0: 61 72 74 57 6f 72 6b 65 72 73 28 0a 20 20 4c 73  artWorkers(.  Ls
87e0: 6d 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 65 4d  mDb *pDb, int eM
87f0: 6f 64 65 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  odel, const char
8800: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
8810: 73 74 20 63 68 61 72 20 2a 7a 43 66 67 0a 29 7b  st char *zCfg.){
8820: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
8830: 28 20 65 4d 6f 64 65 6c 3c 31 20 7c 7c 20 65 4d  ( eModel<1 || eM
8840: 6f 64 65 6c 3e 34 20 29 20 72 65 74 75 72 6e 20  odel>4 ) return 
8850: 31 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 6c 3d  1;.  if( eModel=
8860: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =1 ) return 0;..
8870: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 61    /* Configure a
8880: 20 77 6f 72 6b 2d 68 6f 6f 6b 20 66 6f 72 20 74   work-hook for t
8890: 68 65 20 63 6c 69 65 6e 74 20 63 6f 6e 6e 65 63  he client connec
88a0: 74 69 6f 6e 2e 20 57 6f 72 6b 65 72 20 30 20 69  tion. Worker 0 i
88b0: 73 20 73 69 67 6e 61 6c 6c 65 64 0a 20 20 2a 2a  s signalled.  **
88c0: 20 65 76 65 72 79 20 74 69 6d 65 20 74 68 65 20   every time the 
88d0: 75 73 65 72 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  users connection
88e0: 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 64   writes to the d
88f0: 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 6c  atabase.  */.  l
8900: 73 6d 5f 63 6f 6e 66 69 67 5f 77 6f 72 6b 5f 68  sm_config_work_h
8910: 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 6d 74 5f  ook(pDb->db, mt_
8920: 63 6c 69 65 6e 74 5f 77 6f 72 6b 5f 68 6f 6f 6b  client_work_hook
8930: 2c 20 28 76 6f 69 64 20 2a 29 70 44 62 29 3b 0a  , (void *)pDb);.
8940: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
8950: 70 61 63 65 20 66 6f 72 20 74 77 6f 20 77 6f 72  pace for two wor
8960: 6b 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ker connections.
8970: 20 54 68 65 79 20 6d 61 79 20 6e 6f 74 20 62 6f   They may not bo
8980: 74 68 20 62 65 0a 20 20 2a 2a 20 75 73 65 64 2c  th be.  ** used,
8990: 20 62 75 74 20 62 6f 74 68 20 61 72 65 20 61 6c   but both are al
89a0: 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 70  located.  */.  p
89b0: 44 62 2d 3e 61 57 6f 72 6b 65 72 20 3d 20 28 4c  Db->aWorker = (L
89c0: 73 6d 57 6f 72 6b 65 72 20 2a 29 74 65 73 74 4d  smWorker *)testM
89d0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 4c 73 6d  alloc(sizeof(Lsm
89e0: 57 6f 72 6b 65 72 29 20 2a 20 32 29 3b 0a 20 20  Worker) * 2);.  
89f0: 6d 65 6d 73 65 74 28 70 44 62 2d 3e 61 57 6f 72  memset(pDb->aWor
8a00: 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c  ker, 0, sizeof(L
8a10: 73 6d 57 6f 72 6b 65 72 29 20 2a 20 32 29 3b 0a  smWorker) * 2);.
8a20: 0a 20 20 73 77 69 74 63 68 28 20 65 4d 6f 64 65  .  switch( eMode
8a30: 6c 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4c 53  l ){.    case LS
8a40: 4d 54 45 53 54 5f 4d 4f 44 45 5f 42 41 43 4b 47  MTEST_MODE_BACKG
8a50: 52 4f 55 4e 44 5f 43 4b 50 54 3a 0a 20 20 20 20  ROUND_CKPT:.    
8a60: 20 20 70 44 62 2d 3e 6e 57 6f 72 6b 65 72 20 3d    pDb->nWorker =
8a70: 20 31 3b 0a 20 20 20 20 20 20 74 65 73 74 5f 6c   1;.      test_l
8a80: 73 6d 5f 63 6f 6e 66 69 67 5f 73 74 72 28 30 2c  sm_config_str(0,
8a90: 20 70 44 62 2d 3e 64 62 2c 20 30 2c 20 22 61 75   pDb->db, 0, "au
8aa0: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 3d 30 22 2c  tocheckpoint=0",
8ab0: 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
8ac0: 6d 74 5f 73 74 61 72 74 5f 77 6f 72 6b 65 72 28  mt_start_worker(
8ad0: 70 44 62 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  pDb, 0, zFilenam
8ae0: 65 2c 20 7a 43 66 67 2c 20 4c 53 4d 54 45 53 54  e, zCfg, LSMTEST
8af0: 5f 54 48 52 45 41 44 5f 43 4b 50 54 29 3b 0a 20  _THREAD_CKPT);. 
8b00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
8b10: 20 63 61 73 65 20 4c 53 4d 54 45 53 54 5f 4d 4f   case LSMTEST_MO
8b20: 44 45 5f 42 41 43 4b 47 52 4f 55 4e 44 5f 57 4f  DE_BACKGROUND_WO
8b30: 52 4b 3a 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e  RK:.      pDb->n
8b40: 57 6f 72 6b 65 72 20 3d 20 31 3b 0a 20 20 20 20  Worker = 1;.    
8b50: 20 20 74 65 73 74 5f 6c 73 6d 5f 63 6f 6e 66 69    test_lsm_confi
8b60: 67 5f 73 74 72 28 30 2c 20 70 44 62 2d 3e 64 62  g_str(0, pDb->db
8b70: 2c 20 30 2c 20 22 61 75 74 6f 77 6f 72 6b 3d 30  , 0, "autowork=0
8b80: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20  ", 0);.      rc 
8b90: 3d 20 6d 74 5f 73 74 61 72 74 5f 77 6f 72 6b 65  = mt_start_worke
8ba0: 72 28 70 44 62 2c 20 30 2c 20 7a 46 69 6c 65 6e  r(pDb, 0, zFilen
8bb0: 61 6d 65 2c 20 7a 43 66 67 2c 20 4c 53 4d 54 45  ame, zCfg, LSMTE
8bc0: 53 54 5f 54 48 52 45 41 44 5f 57 4f 52 4b 45 52  ST_THREAD_WORKER
8bd0: 5f 41 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  _AC);.      brea
8be0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 4c 53 4d  k;..    case LSM
8bf0: 54 45 53 54 5f 4d 4f 44 45 5f 42 41 43 4b 47 52  TEST_MODE_BACKGR
8c00: 4f 55 4e 44 5f 42 4f 54 48 3a 0a 20 20 20 20 20  OUND_BOTH:.     
8c10: 20 70 44 62 2d 3e 6e 57 6f 72 6b 65 72 20 3d 20   pDb->nWorker = 
8c20: 32 3b 0a 20 20 20 20 20 20 74 65 73 74 5f 6c 73  2;.      test_ls
8c30: 6d 5f 63 6f 6e 66 69 67 5f 73 74 72 28 30 2c 20  m_config_str(0, 
8c40: 70 44 62 2d 3e 64 62 2c 20 30 2c 20 22 61 75 74  pDb->db, 0, "aut
8c50: 6f 77 6f 72 6b 3d 30 22 2c 20 30 29 3b 0a 20 20  owork=0", 0);.  
8c60: 20 20 20 20 72 63 20 3d 20 6d 74 5f 73 74 61 72      rc = mt_star
8c70: 74 5f 77 6f 72 6b 65 72 28 70 44 62 2c 20 30 2c  t_worker(pDb, 0,
8c80: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 43 66 67   zFilename, zCfg
8c90: 2c 20 4c 53 4d 54 45 53 54 5f 54 48 52 45 41 44  , LSMTEST_THREAD
8ca0: 5f 57 4f 52 4b 45 52 29 3b 0a 20 20 20 20 20 20  _WORKER);.      
8cb0: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
8cc0: 20 20 20 20 20 72 63 20 3d 20 6d 74 5f 73 74 61       rc = mt_sta
8cd0: 72 74 5f 77 6f 72 6b 65 72 28 70 44 62 2c 20 31  rt_worker(pDb, 1
8ce0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 43 66  , zFilename, zCf
8cf0: 67 2c 20 4c 53 4d 54 45 53 54 5f 54 48 52 45 41  g, LSMTEST_THREA
8d00: 44 5f 43 4b 50 54 29 3b 0a 20 20 20 20 20 20 7d  D_CKPT);.      }
8d10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8d20: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
8d30: 7d 0a 0a 0a 69 6e 74 20 74 65 73 74 5f 6c 73 6d  }...int test_lsm
8d40: 5f 6d 74 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  _mt2(.  const ch
8d50: 61 72 20 2a 7a 53 70 65 63 2c 20 0a 20 20 63 6f  ar *zSpec, .  co
8d60: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
8d70: 61 6d 65 2c 20 0a 20 20 69 6e 74 20 62 43 6c 65  ame, .  int bCle
8d80: 61 72 2c 20 0a 20 20 54 65 73 74 44 62 20 2a 2a  ar, .  TestDb **
8d90: 70 70 44 62 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  ppDb.){.  const 
8da0: 63 68 61 72 20 2a 7a 43 66 67 20 3d 20 22 6d 74  char *zCfg = "mt
8db0: 5f 6d 6f 64 65 3d 32 22 3b 0a 20 20 72 65 74 75  _mode=2";.  retu
8dc0: 72 6e 20 74 65 73 74 4c 73 6d 4f 70 65 6e 28 7a  rn testLsmOpen(z
8dd0: 43 66 67 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Cfg, zFilename, 
8de0: 62 43 6c 65 61 72 2c 20 70 70 44 62 29 3b 0a 7d  bClear, ppDb);.}
8df0: 0a 0a 69 6e 74 20 74 65 73 74 5f 6c 73 6d 5f 6d  ..int test_lsm_m
8e00: 74 33 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t3(.  const char
8e10: 20 2a 7a 53 70 65 63 2c 20 0a 20 20 63 6f 6e 73   *zSpec, .  cons
8e20: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
8e30: 65 2c 20 0a 20 20 69 6e 74 20 62 43 6c 65 61 72  e, .  int bClear
8e40: 2c 20 0a 20 20 54 65 73 74 44 62 20 2a 2a 70 70  , .  TestDb **pp
8e50: 44 62 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Db.){.  const ch
8e60: 61 72 20 2a 7a 43 66 67 20 3d 20 22 6d 74 5f 6d  ar *zCfg = "mt_m
8e70: 6f 64 65 3d 34 22 3b 0a 20 20 72 65 74 75 72 6e  ode=4";.  return
8e80: 20 74 65 73 74 4c 73 6d 4f 70 65 6e 28 7a 43 66   testLsmOpen(zCf
8e90: 67 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 62 43  g, zFilename, bC
8ea0: 6c 65 61 72 2c 20 70 70 44 62 29 3b 0a 7d 0a 0a  lear, ppDb);.}..
8eb0: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 76 6f 69  #else.static voi
8ec0: 64 20 6d 74 5f 73 68 75 74 64 6f 77 6e 28 4c 73  d mt_shutdown(Ls
8ed0: 6d 44 62 20 2a 70 44 62 29 20 7b 20 0a 20 20 75  mDb *pDb) { .  u
8ee0: 6e 75 73 65 64 5f 70 61 72 61 6d 65 74 65 72 28  nused_parameter(
8ef0: 70 44 62 29 3b 20 0a 7d 0a 69 6e 74 20 74 65 73  pDb); .}.int tes
8f00: 74 5f 6c 73 6d 5f 6d 74 28 63 6f 6e 73 74 20 63  t_lsm_mt(const c
8f10: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
8f20: 69 6e 74 20 62 43 6c 65 61 72 2c 20 54 65 73 74  int bClear, Test
8f30: 44 62 20 2a 2a 70 70 44 62 29 7b 0a 20 20 75 6e  Db **ppDb){.  un
8f40: 75 73 65 64 5f 70 61 72 61 6d 65 74 65 72 28 7a  used_parameter(z
8f50: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 75 6e 75  Filename);.  unu
8f60: 73 65 64 5f 70 61 72 61 6d 65 74 65 72 28 62 43  sed_parameter(bC
8f70: 6c 65 61 72 29 3b 0a 20 20 75 6e 75 73 65 64 5f  lear);.  unused_
8f80: 70 61 72 61 6d 65 74 65 72 28 70 70 44 62 29 3b  parameter(ppDb);
8f90: 0a 20 20 74 65 73 74 50 72 69 6e 74 45 72 72 6f  .  testPrintErro
8fa0: 72 28 22 74 68 72 65 61 64 73 20 75 6e 61 76 61  r("threads unava
8fb0: 69 6c 61 62 6c 65 20 2d 20 72 65 63 6f 6d 70 69  ilable - recompi
8fc0: 6c 65 20 77 69 74 68 20 4c 53 4d 5f 4d 55 54 45  le with LSM_MUTE
8fd0: 58 5f 50 54 48 52 45 41 44 53 5c 6e 22 29 3b 0a  X_PTHREADS\n");.
8fe0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
8ff0: 6e 64 69 66 0a                                   ndif.