/ Hex Artifact Content
Login

Artifact b4e46b1d2fec553fe4efb44e341b43abd20556fde610db0cfffdc2300b72defe:


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: 72 63 20 3d 20 6c 73 6d 5f 63 73 72 5f 6f 70 65  rc = lsm_csr_ope
4200: 6e 28 70 44 62 2d 3e 64 62 2c 20 26 63 73 72 29  n(pDb->db, &csr)
4210: 3b 0a 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f  ;.  if( rc!=LSM_
4220: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
4230: 0a 20 20 72 63 20 3d 20 6c 73 6d 5f 63 73 72 5f  .  rc = lsm_csr_
4240: 73 65 65 6b 28 63 73 72 2c 20 70 4b 65 79 2c 20  seek(csr, pKey, 
4250: 6e 4b 65 79 2c 20 4c 53 4d 5f 53 45 45 4b 5f 45  nKey, LSM_SEEK_E
4260: 51 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53  Q);.  if( rc==LS
4270: 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  M_OK ){.    if( 
4280: 6c 73 6d 5f 63 73 72 5f 76 61 6c 69 64 28 63 73  lsm_csr_valid(cs
4290: 72 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  r) ){.      cons
42a0: 74 20 76 6f 69 64 20 2a 70 56 61 6c 3b 20 69 6e  t void *pVal; in
42b0: 74 20 6e 56 61 6c 3b 0a 20 20 20 20 20 20 72 63  t nVal;.      rc
42c0: 20 3d 20 6c 73 6d 5f 63 73 72 5f 76 61 6c 75 65   = lsm_csr_value
42d0: 28 63 73 72 2c 20 26 70 56 61 6c 2c 20 26 6e 56  (csr, &pVal, &nV
42e0: 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  al);.      if( n
42f0: 56 61 6c 3e 70 44 62 2d 3e 6e 42 75 66 20 29 7b  Val>pDb->nBuf ){
4300: 0a 20 20 20 20 20 20 20 20 74 65 73 74 46 72 65  .        testFre
4310: 65 28 70 44 62 2d 3e 70 42 75 66 29 3b 0a 20 20  e(pDb->pBuf);.  
4320: 20 20 20 20 20 20 70 44 62 2d 3e 70 42 75 66 20        pDb->pBuf 
4330: 3d 20 74 65 73 74 4d 61 6c 6c 6f 63 28 6e 56 61  = testMalloc(nVa
4340: 6c 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 70 44  l*2);.        pD
4350: 62 2d 3e 6e 42 75 66 20 3d 20 6e 56 61 6c 2a 32  b->nBuf = nVal*2
4360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4370: 6d 65 6d 63 70 79 28 70 44 62 2d 3e 70 42 75 66  memcpy(pDb->pBuf
4380: 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20  , pVal, nVal);. 
4390: 20 20 20 20 20 2a 70 70 56 61 6c 20 3d 20 70 44       *ppVal = pD
43a0: 62 2d 3e 70 42 75 66 3b 0a 20 20 20 20 20 20 2a  b->pBuf;.      *
43b0: 70 6e 56 61 6c 20 3d 20 6e 56 61 6c 3b 0a 20 20  pnVal = nVal;.  
43c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
43d0: 70 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  ppVal = 0;.     
43e0: 20 2a 70 6e 56 61 6c 20 3d 20 2d 31 3b 0a 20 20   *pnVal = -1;.  
43f0: 20 20 7d 0a 20 20 7d 0a 20 20 6c 73 6d 5f 63 73    }.  }.  lsm_cs
4400: 72 5f 63 6c 6f 73 65 28 63 73 72 29 3b 0a 20 20  r_close(csr);.  
4410: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
4420: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 73  atic int test_ls
4430: 6d 5f 73 63 61 6e 28 0a 20 20 54 65 73 74 44 62  m_scan(.  TestDb
4440: 20 2a 70 54 65 73 74 44 62 2c 0a 20 20 76 6f 69   *pTestDb,.  voi
4450: 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 62  d *pCtx,.  int b
4460: 52 65 76 65 72 73 65 2c 0a 20 20 76 6f 69 64 20  Reverse,.  void 
4470: 2a 70 46 69 72 73 74 2c 20 69 6e 74 20 6e 46 69  *pFirst, int nFi
4480: 72 73 74 2c 0a 20 20 76 6f 69 64 20 2a 70 4c 61  rst,.  void *pLa
4490: 73 74 2c 20 69 6e 74 20 6e 4c 61 73 74 2c 0a 20  st, int nLast,. 
44a0: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
44b0: 6b 29 28 76 6f 69 64 20 2a 2c 20 76 6f 69 64 20  k)(void *, void 
44c0: 2a 2c 20 69 6e 74 20 2c 20 76 6f 69 64 20 2a 2c  *, int , void *,
44d0: 20 69 6e 74 29 0a 29 7b 0a 20 20 4c 73 6d 44 62   int).){.  LsmDb
44e0: 20 2a 70 44 62 20 3d 20 28 4c 73 6d 44 62 20 2a   *pDb = (LsmDb *
44f0: 29 70 54 65 73 74 44 62 3b 0a 20 20 6c 73 6d 5f  )pTestDb;.  lsm_
4500: 63 75 72 73 6f 72 20 2a 63 73 72 3b 0a 20 20 69  cursor *csr;.  i
4510: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 6c  nt rc;..  rc = l
4520: 73 6d 5f 63 73 72 5f 6f 70 65 6e 28 70 44 62 2d  sm_csr_open(pDb-
4530: 3e 64 62 2c 20 26 63 73 72 29 3b 0a 20 20 69 66  >db, &csr);.  if
4540: 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72  ( rc!=LSM_OK ) r
4550: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
4560: 20 62 52 65 76 65 72 73 65 20 29 7b 0a 20 20 20   bReverse ){.   
4570: 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20   if( pLast ){.  
4580: 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f 63 73 72      rc = lsm_csr
4590: 5f 73 65 65 6b 28 63 73 72 2c 20 70 4c 61 73 74  _seek(csr, pLast
45a0: 2c 20 6e 4c 61 73 74 2c 20 4c 53 4d 5f 53 45 45  , nLast, LSM_SEE
45b0: 4b 5f 4c 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65  K_LE);.    }else
45c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d  {.      rc = lsm
45d0: 5f 63 73 72 5f 6c 61 73 74 28 63 73 72 29 3b 0a  _csr_last(csr);.
45e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
45f0: 20 20 20 69 66 28 20 70 46 69 72 73 74 20 29 7b     if( pFirst ){
4600: 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f  .      rc = lsm_
4610: 63 73 72 5f 73 65 65 6b 28 63 73 72 2c 20 70 46  csr_seek(csr, pF
4620: 69 72 73 74 2c 20 6e 46 69 72 73 74 2c 20 4c 53  irst, nFirst, LS
4630: 4d 5f 53 45 45 4b 5f 47 45 29 3b 0a 20 20 20 20  M_SEEK_GE);.    
4640: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
4650: 3d 20 6c 73 6d 5f 63 73 72 5f 66 69 72 73 74 28  = lsm_csr_first(
4660: 63 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  csr);.    }.  }.
4670: 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53  .  while( rc==LS
4680: 4d 5f 4f 4b 20 26 26 20 6c 73 6d 5f 63 73 72 5f  M_OK && lsm_csr_
4690: 76 61 6c 69 64 28 63 73 72 29 20 29 7b 0a 20 20  valid(csr) ){.  
46a0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
46b0: 65 79 3b 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ey; int nKey;.  
46c0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 56    const void *pV
46d0: 61 6c 3b 20 69 6e 74 20 6e 56 61 6c 3b 0a 20 20  al; int nVal;.  
46e0: 20 20 69 6e 74 20 63 6d 70 3b 0a 0a 20 20 20 20    int cmp;..    
46f0: 6c 73 6d 5f 63 73 72 5f 6b 65 79 28 63 73 72 2c  lsm_csr_key(csr,
4700: 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79 29 3b 0a   &pKey, &nKey);.
4710: 20 20 20 20 6c 73 6d 5f 63 73 72 5f 76 61 6c 75      lsm_csr_valu
4720: 65 28 63 73 72 2c 20 26 70 56 61 6c 2c 20 26 6e  e(csr, &pVal, &n
4730: 56 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20 62  Val);..    if( b
4740: 52 65 76 65 72 73 65 20 26 26 20 70 46 69 72 73  Reverse && pFirs
4750: 74 20 29 7b 0a 20 20 20 20 20 20 63 6d 70 20 3d  t ){.      cmp =
4760: 20 6d 65 6d 63 6d 70 28 70 46 69 72 73 74 2c 20   memcmp(pFirst, 
4770: 70 4b 65 79 2c 20 4d 49 4e 28 6e 4b 65 79 2c 20  pKey, MIN(nKey, 
4780: 6e 46 69 72 73 74 29 29 3b 0a 20 20 20 20 20 20  nFirst));.      
4790: 69 66 28 20 63 6d 70 3e 30 20 7c 7c 20 28 63 6d  if( cmp>0 || (cm
47a0: 70 3d 3d 30 20 26 26 20 6e 46 69 72 73 74 3e 6e  p==0 && nFirst>n
47b0: 4b 65 79 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  Key) ) break;.  
47c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76    }else if( bRev
47d0: 65 72 73 65 3d 3d 30 20 26 26 20 70 4c 61 73 74  erse==0 && pLast
47e0: 20 29 7b 0a 20 20 20 20 20 20 63 6d 70 20 3d 20   ){.      cmp = 
47f0: 6d 65 6d 63 6d 70 28 70 4c 61 73 74 2c 20 70 4b  memcmp(pLast, pK
4800: 65 79 2c 20 4d 49 4e 28 6e 4b 65 79 2c 20 6e 4c  ey, MIN(nKey, nL
4810: 61 73 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ast));.      if(
4820: 20 63 6d 70 3c 30 20 7c 7c 20 28 63 6d 70 3d 3d   cmp<0 || (cmp==
4830: 30 20 26 26 20 6e 4c 61 73 74 3c 6e 4b 65 79 29  0 && nLast<nKey)
4840: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
4850: 0a 20 20 20 20 78 43 61 6c 6c 62 61 63 6b 28 70  .    xCallback(p
4860: 43 74 78 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  Ctx, (void *)pKe
4870: 79 2c 20 6e 4b 65 79 2c 20 28 76 6f 69 64 20 2a  y, nKey, (void *
4880: 29 70 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 0a 20  )pVal, nVal);.. 
4890: 20 20 20 69 66 28 20 62 52 65 76 65 72 73 65 20     if( bReverse 
48a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73  ){.      rc = ls
48b0: 6d 5f 63 73 72 5f 70 72 65 76 28 63 73 72 29 3b  m_csr_prev(csr);
48c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
48d0: 20 20 72 63 20 3d 20 6c 73 6d 5f 63 73 72 5f 6e    rc = lsm_csr_n
48e0: 65 78 74 28 63 73 72 29 3b 0a 20 20 20 20 7d 0a  ext(csr);.    }.
48f0: 20 20 7d 0a 0a 20 20 6c 73 6d 5f 63 73 72 5f 63    }..  lsm_csr_c
4900: 6c 6f 73 65 28 63 73 72 29 3b 0a 20 20 72 65 74  lose(csr);.  ret
4910: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
4920: 63 20 69 6e 74 20 74 65 73 74 5f 6c 73 6d 5f 62  c int test_lsm_b
4930: 65 67 69 6e 28 54 65 73 74 44 62 20 2a 70 54 65  egin(TestDb *pTe
4940: 73 74 44 62 2c 20 69 6e 74 20 69 4c 65 76 65 6c  stDb, int iLevel
4950: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  ){.  int rc = LS
4960: 4d 5f 4f 4b 3b 0a 20 20 4c 73 6d 44 62 20 2a 70  M_OK;.  LsmDb *p
4970: 44 62 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70 54  Db = (LsmDb *)pT
4980: 65 73 74 44 62 3b 0a 0a 20 20 2f 2a 20 69 4c 65  estDb;..  /* iLe
4990: 76 65 6c 3d 3d 30 20 69 73 20 61 20 6e 6f 2d 6f  vel==0 is a no-o
49a0: 70 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76  p. */.  if( iLev
49b0: 65 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  el==0 ) return 0
49c0: 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 43  ;..  if( pDb->pC
49d0: 73 72 3d 3d 30 20 29 20 72 63 20 3d 20 6c 73 6d  sr==0 ) rc = lsm
49e0: 5f 63 73 72 5f 6f 70 65 6e 28 70 44 62 2d 3e 64  _csr_open(pDb->d
49f0: 62 2c 20 26 70 44 62 2d 3e 70 43 73 72 29 3b 0a  b, &pDb->pCsr);.
4a00: 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
4a10: 20 26 26 20 69 4c 65 76 65 6c 3e 31 20 29 7b 0a   && iLevel>1 ){.
4a20: 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f 62 65 67      rc = lsm_beg
4a30: 69 6e 28 70 44 62 2d 3e 64 62 2c 20 69 4c 65 76  in(pDb->db, iLev
4a40: 65 6c 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  el-1);.  }..  re
4a50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
4a60: 63 20 69 6e 74 20 74 65 73 74 5f 6c 73 6d 5f 63  c int test_lsm_c
4a70: 6f 6d 6d 69 74 28 54 65 73 74 44 62 20 2a 70 54  ommit(TestDb *pT
4a80: 65 73 74 44 62 2c 20 69 6e 74 20 69 4c 65 76 65  estDb, int iLeve
4a90: 6c 29 7b 0a 20 20 4c 73 6d 44 62 20 2a 70 44 62  l){.  LsmDb *pDb
4aa0: 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70 54 65 73   = (LsmDb *)pTes
4ab0: 74 44 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 69 4c  tDb;..  /* If iL
4ac0: 65 76 65 6c 3d 3d 30 2c 20 63 6c 6f 73 65 20 61  evel==0, close a
4ad0: 6e 79 20 6f 70 65 6e 20 72 65 61 64 20 74 72 61  ny open read tra
4ae0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  nsaction */.  if
4af0: 28 20 69 4c 65 76 65 6c 3d 3d 30 20 26 26 20 70  ( iLevel==0 && p
4b00: 44 62 2d 3e 70 43 73 72 20 29 7b 0a 20 20 20 20  Db->pCsr ){.    
4b10: 6c 73 6d 5f 63 73 72 5f 63 6c 6f 73 65 28 70 44  lsm_csr_close(pD
4b20: 62 2d 3e 70 43 73 72 29 3b 0a 20 20 20 20 70 44  b->pCsr);.    pD
4b30: 62 2d 3e 70 43 73 72 20 3d 20 30 3b 0a 20 20 7d  b->pCsr = 0;.  }
4b40: 0a 0a 20 20 2f 2a 20 49 66 20 69 4c 65 76 65 6c  ..  /* If iLevel
4b50: 3d 3d 30 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f  ==0, close any o
4b60: 70 65 6e 20 72 65 61 64 20 74 72 61 6e 73 61 63  pen read transac
4b70: 74 69 6f 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  tion */.  return
4b80: 20 6c 73 6d 5f 63 6f 6d 6d 69 74 28 70 44 62 2d   lsm_commit(pDb-
4b90: 3e 64 62 2c 20 4d 41 58 28 30 2c 20 69 4c 65 76  >db, MAX(0, iLev
4ba0: 65 6c 2d 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63  el-1));.}.static
4bb0: 20 69 6e 74 20 74 65 73 74 5f 6c 73 6d 5f 72 6f   int test_lsm_ro
4bc0: 6c 6c 62 61 63 6b 28 54 65 73 74 44 62 20 2a 70  llback(TestDb *p
4bd0: 54 65 73 74 44 62 2c 20 69 6e 74 20 69 4c 65 76  TestDb, int iLev
4be0: 65 6c 29 7b 0a 20 20 4c 73 6d 44 62 20 2a 70 44  el){.  LsmDb *pD
4bf0: 62 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70 54 65  b = (LsmDb *)pTe
4c00: 73 74 44 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 69  stDb;..  /* If i
4c10: 4c 65 76 65 6c 3d 3d 30 2c 20 63 6c 6f 73 65 20  Level==0, close 
4c20: 61 6e 79 20 6f 70 65 6e 20 72 65 61 64 20 74 72  any open read tr
4c30: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
4c40: 66 28 20 69 4c 65 76 65 6c 3d 3d 30 20 26 26 20  f( iLevel==0 && 
4c50: 70 44 62 2d 3e 70 43 73 72 20 29 7b 0a 20 20 20  pDb->pCsr ){.   
4c60: 20 6c 73 6d 5f 63 73 72 5f 63 6c 6f 73 65 28 70   lsm_csr_close(p
4c70: 44 62 2d 3e 70 43 73 72 29 3b 0a 20 20 20 20 70  Db->pCsr);.    p
4c80: 44 62 2d 3e 70 43 73 72 20 3d 20 30 3b 0a 20 20  Db->pCsr = 0;.  
4c90: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6c 73 6d 5f  }..  return lsm_
4ca0: 72 6f 6c 6c 62 61 63 6b 28 70 44 62 2d 3e 64 62  rollback(pDb->db
4cb0: 2c 20 4d 41 58 28 30 2c 20 69 4c 65 76 65 6c 2d  , MAX(0, iLevel-
4cc0: 31 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  1));.}../*.** A 
4cd0: 6c 6f 67 20 6d 65 73 73 61 67 65 20 63 61 6c 6c  log message call
4ce0: 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
4cf0: 77 69 74 68 20 6c 73 6d 20 63 6f 6e 6e 65 63 74  with lsm connect
4d00: 69 6f 6e 73 2e 20 50 72 69 6e 74 73 20 61 6c 6c  ions. Prints all
4d10: 20 0a 2a 2a 20 6d 65 73 73 61 67 65 73 20 74 6f   .** messages to
4d20: 20 73 74 64 65 72 72 2e 0a 2a 2f 0a 73 74 61 74   stderr..*/.stat
4d30: 69 63 20 76 6f 69 64 20 78 4c 6f 67 28 76 6f 69  ic void xLog(voi
4d40: 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 72 63 2c  d *pCtx, int rc,
4d50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
4d60: 0a 20 20 75 6e 75 73 65 64 5f 70 61 72 61 6d 65  .  unused_parame
4d70: 74 65 72 28 72 63 29 3b 0a 20 20 2f 2a 20 66 70  ter(rc);.  /* fp
4d80: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6c  rintf(stderr, "l
4d90: 73 6d 3a 20 72 63 3d 25 64 20 5c 22 25 73 5c 22  sm: rc=%d \"%s\"
4da0: 5c 6e 22 2c 20 72 63 2c 20 7a 29 3b 20 2a 2f 0a  \n", rc, z); */.
4db0: 20 20 69 66 28 20 70 43 74 78 20 29 20 66 70 72    if( pCtx ) fpr
4dc0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
4dd0: 3a 20 22 2c 20 28 63 68 61 72 20 2a 29 70 43 74  : ", (char *)pCt
4de0: 78 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  x);.  fprintf(st
4df0: 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 7a 29  derr, "%s\n", z)
4e00: 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 65 72  ;.  fflush(stder
4e10: 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  r);.}..static vo
4e20: 69 64 20 78 57 6f 72 6b 48 6f 6f 6b 28 6c 73 6d  id xWorkHook(lsm
4e30: 5f 64 62 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  _db *db, void *p
4e40: 41 72 67 29 7b 0a 20 20 4c 73 6d 44 62 20 2a 70  Arg){.  LsmDb *p
4e50: 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70 41 72 67   = (LsmDb *)pArg
4e60: 3b 0a 20 20 69 66 28 20 70 2d 3e 78 57 6f 72 6b  ;.  if( p->xWork
4e70: 20 29 20 70 2d 3e 78 57 6f 72 6b 28 64 62 2c 20   ) p->xWork(db, 
4e80: 70 2d 3e 70 57 6f 72 6b 43 74 78 29 3b 0a 7d 0a  p->pWorkCtx);.}.
4e90: 0a 23 64 65 66 69 6e 65 20 54 45 53 54 5f 4e 4f  .#define TEST_NO
4ea0: 5f 52 45 43 4f 56 45 52 59 20 2d 31 0a 23 64 65  _RECOVERY -1.#de
4eb0: 66 69 6e 65 20 54 45 53 54 5f 43 4f 4d 50 52 45  fine TEST_COMPRE
4ec0: 53 53 49 4f 4e 20 2d 33 0a 0a 23 64 65 66 69 6e  SSION -3..#defin
4ed0: 65 20 54 45 53 54 5f 4d 54 5f 4d 4f 44 45 20 20  e TEST_MT_MODE  
4ee0: 20 20 20 2d 32 0a 23 64 65 66 69 6e 65 20 54 45     -2.#define TE
4ef0: 53 54 5f 4d 54 5f 4d 49 4e 5f 43 4b 50 54 20 2d  ST_MT_MIN_CKPT -
4f00: 34 0a 23 64 65 66 69 6e 65 20 54 45 53 54 5f 4d  4.#define TEST_M
4f10: 54 5f 4d 41 58 5f 43 4b 50 54 20 2d 35 0a 0a 69  T_MAX_CKPT -5..i
4f20: 6e 74 20 74 65 73 74 5f 6c 73 6d 5f 63 6f 6e 66  nt test_lsm_conf
4f30: 69 67 5f 73 74 72 28 0a 20 20 4c 73 6d 44 62 20  ig_str(.  LsmDb 
4f40: 2a 70 4c 73 6d 2c 0a 20 20 6c 73 6d 5f 64 62 20  *pLsm,.  lsm_db 
4f50: 2a 64 62 2c 20 0a 20 20 69 6e 74 20 62 57 6f 72  *db, .  int bWor
4f60: 6b 65 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ker,.  const cha
4f70: 72 20 2a 7a 53 74 72 2c 0a 20 20 69 6e 74 20 2a  r *zStr,.  int *
4f80: 70 6e 54 68 72 65 61 64 0a 29 7b 0a 20 20 73 74  pnThread.){.  st
4f90: 72 75 63 74 20 43 66 67 50 61 72 61 6d 20 7b 0a  ruct CfgParam {.
4fa0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4fb0: 7a 50 61 72 61 6d 3b 0a 20 20 20 20 69 6e 74 20  zParam;.    int 
4fc0: 62 57 6f 72 6b 65 72 3b 0a 20 20 20 20 69 6e 74  bWorker;.    int
4fd0: 20 65 50 61 72 61 6d 3b 0a 20 20 7d 20 61 50 61   eParam;.  } aPa
4fe0: 72 61 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ram[] = {.    { 
4ff0: 22 61 75 74 6f 66 6c 75 73 68 22 2c 20 20 20 20  "autoflush",    
5000: 20 20 20 20 30 2c 20 4c 53 4d 5f 43 4f 4e 46 49      0, LSM_CONFI
5010: 47 5f 41 55 54 4f 46 4c 55 53 48 20 7d 2c 0a 20  G_AUTOFLUSH },. 
5020: 20 20 20 7b 20 22 70 61 67 65 5f 73 69 7a 65 22     { "page_size"
5030: 2c 20 20 20 20 20 20 20 20 30 2c 20 4c 53 4d 5f  ,        0, LSM_
5040: 43 4f 4e 46 49 47 5f 50 41 47 45 5f 53 49 5a 45  CONFIG_PAGE_SIZE
5050: 20 7d 2c 0a 20 20 20 20 7b 20 22 62 6c 6f 63 6b   },.    { "block
5060: 5f 73 69 7a 65 22 2c 20 20 20 20 20 20 20 30 2c  _size",       0,
5070: 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f 42 4c 4f 43   LSM_CONFIG_BLOC
5080: 4b 5f 53 49 5a 45 20 7d 2c 0a 20 20 20 20 7b 20  K_SIZE },.    { 
5090: 22 73 61 66 65 74 79 22 2c 20 20 20 20 20 20 20  "safety",       
50a0: 20 20 20 20 30 2c 20 4c 53 4d 5f 43 4f 4e 46 49      0, LSM_CONFI
50b0: 47 5f 53 41 46 45 54 59 20 7d 2c 0a 20 20 20 20  G_SAFETY },.    
50c0: 7b 20 22 61 75 74 6f 77 6f 72 6b 22 2c 20 20 20  { "autowork",   
50d0: 20 20 20 20 20 20 30 2c 20 4c 53 4d 5f 43 4f 4e        0, LSM_CON
50e0: 46 49 47 5f 41 55 54 4f 57 4f 52 4b 20 7d 2c 0a  FIG_AUTOWORK },.
50f0: 20 20 20 20 7b 20 22 61 75 74 6f 63 68 65 63 6b      { "autocheck
5100: 70 6f 69 6e 74 22 2c 20 20 20 30 2c 20 4c 53 4d  point",   0, LSM
5110: 5f 43 4f 4e 46 49 47 5f 41 55 54 4f 43 48 45 43  _CONFIG_AUTOCHEC
5120: 4b 50 4f 49 4e 54 20 7d 2c 0a 20 20 20 20 7b 20  KPOINT },.    { 
5130: 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20 20  "mmap",         
5140: 20 20 20 20 30 2c 20 4c 53 4d 5f 43 4f 4e 46 49      0, LSM_CONFI
5150: 47 5f 4d 4d 41 50 20 7d 2c 0a 20 20 20 20 7b 20  G_MMAP },.    { 
5160: 22 75 73 65 5f 6c 6f 67 22 2c 20 20 20 20 20 20  "use_log",      
5170: 20 20 20 20 30 2c 20 4c 53 4d 5f 43 4f 4e 46 49      0, LSM_CONFI
5180: 47 5f 55 53 45 5f 4c 4f 47 20 7d 2c 0a 20 20 20  G_USE_LOG },.   
5190: 20 7b 20 22 61 75 74 6f 6d 65 72 67 65 22 2c 20   { "automerge", 
51a0: 20 20 20 20 20 20 20 30 2c 20 4c 53 4d 5f 43 4f         0, LSM_CO
51b0: 4e 46 49 47 5f 41 55 54 4f 4d 45 52 47 45 20 7d  NFIG_AUTOMERGE }
51c0: 2c 0a 20 20 20 20 7b 20 22 6d 61 78 5f 66 72 65  ,.    { "max_fre
51d0: 65 6c 69 73 74 22 2c 20 20 20 20 20 30 2c 20 4c  elist",     0, L
51e0: 53 4d 5f 43 4f 4e 46 49 47 5f 4d 41 58 5f 46 52  SM_CONFIG_MAX_FR
51f0: 45 45 4c 49 53 54 20 7d 2c 0a 20 20 20 20 7b 20  EELIST },.    { 
5200: 22 6d 75 6c 74 69 5f 70 72 6f 63 22 2c 20 20 20  "multi_proc",   
5210: 20 20 20 20 30 2c 20 4c 53 4d 5f 43 4f 4e 46 49      0, LSM_CONFI
5220: 47 5f 4d 55 4c 54 49 50 4c 45 5f 50 52 4f 43 45  G_MULTIPLE_PROCE
5230: 53 53 45 53 20 7d 2c 0a 20 20 20 20 7b 20 22 77  SSES },.    { "w
5240: 6f 72 6b 65 72 5f 61 75 74 6f 6d 65 72 67 65 22  orker_automerge"
5250: 2c 20 31 2c 20 4c 53 4d 5f 43 4f 4e 46 49 47 5f  , 1, LSM_CONFIG_
5260: 41 55 54 4f 4d 45 52 47 45 20 7d 2c 0a 20 20 20  AUTOMERGE },.   
5270: 20 7b 20 22 74 65 73 74 5f 6e 6f 5f 72 65 63 6f   { "test_no_reco
5280: 76 65 72 79 22 2c 20 30 2c 20 54 45 53 54 5f 4e  very", 0, TEST_N
5290: 4f 5f 52 45 43 4f 56 45 52 59 20 7d 2c 0a 20 20  O_RECOVERY },.  
52a0: 20 20 7b 20 22 62 67 5f 6d 69 6e 5f 63 6b 70 74    { "bg_min_ckpt
52b0: 22 2c 20 20 20 20 20 20 30 2c 20 54 45 53 54 5f  ",      0, TEST_
52c0: 4e 4f 5f 52 45 43 4f 56 45 52 59 20 7d 2c 0a 0a  NO_RECOVERY },..
52d0: 20 20 20 20 7b 20 22 6d 74 5f 6d 6f 64 65 22 2c      { "mt_mode",
52e0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 54 45 53            0, TES
52f0: 54 5f 4d 54 5f 4d 4f 44 45 20 7d 2c 0a 20 20 20  T_MT_MODE },.   
5300: 20 7b 20 22 6d 74 5f 6d 69 6e 5f 63 6b 70 74 22   { "mt_min_ckpt"
5310: 2c 20 20 20 20 20 20 30 2c 20 54 45 53 54 5f 4d  ,      0, TEST_M
5320: 54 5f 4d 49 4e 5f 43 4b 50 54 20 7d 2c 0a 20 20  T_MIN_CKPT },.  
5330: 20 20 7b 20 22 6d 74 5f 6d 61 78 5f 63 6b 70 74    { "mt_max_ckpt
5340: 22 2c 20 20 20 20 20 20 30 2c 20 54 45 53 54 5f  ",      0, TEST_
5350: 4d 54 5f 4d 41 58 5f 43 4b 50 54 20 7d 2c 0a 0a  MT_MAX_CKPT },..
5360: 23 69 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42  #ifdef HAVE_ZLIB
5370: 0a 20 20 20 20 7b 20 22 63 6f 6d 70 72 65 73 73  .    { "compress
5380: 69 6f 6e 22 2c 20 20 20 20 20 20 30 2c 20 54 45  ion",      0, TE
5390: 53 54 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 20 7d  ST_COMPRESSION }
53a0: 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 30  ,.#endif.    { 0
53b0: 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 63 6f 6e  , 0 }.  };.  con
53c0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 53 74  st char *z = zSt
53d0: 72 3b 0a 20 20 69 6e 74 20 6e 54 68 72 65 61 64  r;.  int nThread
53e0: 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 7a 53 74   = 1;..  if( zSt
53f0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
5400: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29  ..  assert( db )
5410: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20  ;.  while( z[0] 
5420: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
5430: 72 20 2a 7a 53 74 61 72 74 3b 0a 0a 20 20 20 20  r *zStart;..    
5440: 2f 2a 20 53 6b 69 70 20 77 68 69 74 65 73 70 61  /* Skip whitespa
5450: 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  ce */.    while(
5460: 20 2a 7a 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a   *z==' ' ) z++;.
5470: 20 20 20 20 7a 53 74 61 72 74 20 3d 20 7a 3b 0a      zStart = z;.
5480: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26  .    while( *z &
5490: 26 20 2a 7a 21 3d 27 3d 27 20 29 20 7a 2b 2b 3b  & *z!='=' ) z++;
54a0: 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 7b 0a 20  .    if( *z ){. 
54b0: 20 20 20 20 20 69 6e 74 20 65 50 61 72 61 6d 3b       int eParam;
54c0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
54d0: 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20      int iVal;.  
54e0: 20 20 20 20 69 6e 74 20 69 4d 75 6c 20 3d 20 31      int iMul = 1
54f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  ;.      int rc;.
5500: 20 20 20 20 20 20 63 68 61 72 20 7a 50 61 72 61        char zPara
5510: 6d 5b 33 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74  m[32];.      int
5520: 20 6e 50 61 72 61 6d 20 3d 20 7a 2d 7a 53 74 61   nParam = z-zSta
5530: 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50  rt;.      if( nP
5540: 61 72 61 6d 3d 3d 30 20 7c 7c 20 6e 50 61 72 61  aram==0 || nPara
5550: 6d 3e 73 69 7a 65 6f 66 28 7a 50 61 72 61 6d 29  m>sizeof(zParam)
5560: 2d 31 20 29 20 67 6f 74 6f 20 73 79 6e 74 61 78  -1 ) goto syntax
5570: 5f 65 72 72 6f 72 3b 0a 0a 20 20 20 20 20 20 6d  _error;..      m
5580: 65 6d 63 70 79 28 7a 50 61 72 61 6d 2c 20 7a 53  emcpy(zParam, zS
5590: 74 61 72 74 2c 20 6e 50 61 72 61 6d 29 3b 0a 20  tart, nParam);. 
55a0: 20 20 20 20 20 7a 50 61 72 61 6d 5b 6e 50 61 72       zParam[nPar
55b0: 61 6d 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  am] = '\0';.    
55c0: 20 20 72 63 20 3d 20 74 65 73 74 41 72 67 53 65    rc = testArgSe
55d0: 6c 65 63 74 28 61 50 61 72 61 6d 2c 20 22 70 61  lect(aParam, "pa
55e0: 72 61 6d 22 2c 20 7a 50 61 72 61 6d 2c 20 26 69  ram", zParam, &i
55f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
5600: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
5610: 20 20 20 20 20 20 65 50 61 72 61 6d 20 3d 20 61        eParam = a
5620: 50 61 72 61 6d 5b 69 5d 2e 65 50 61 72 61 6d 3b  Param[i].eParam;
5630: 0a 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  ..      z++;.   
5640: 20 20 20 7a 53 74 61 72 74 20 3d 20 7a 3b 0a 20     zStart = z;. 
5650: 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3e 3d       while( *z>=
5660: 27 30 27 20 26 26 20 2a 7a 3c 3d 27 39 27 20 29  '0' && *z<='9' )
5670: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
5680: 2a 7a 3d 3d 27 6b 27 20 7c 7c 20 2a 7a 3d 3d 27  *z=='k' || *z=='
5690: 4b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4d  K' ){.        iM
56a0: 75 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ul = 1;.        
56b0: 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  z++;.      }else
56c0: 20 69 66 28 20 2a 7a 3d 3d 27 4d 27 20 7c 7c 20   if( *z=='M' || 
56d0: 2a 7a 3d 3d 27 4d 27 20 29 7b 0a 20 20 20 20 20  *z=='M' ){.     
56e0: 20 20 20 69 4d 75 6c 20 3d 20 31 30 32 34 3b 0a     iMul = 1024;.
56f0: 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
5700: 20 20 20 7d 0a 20 20 20 20 20 20 6e 50 61 72 61     }.      nPara
5710: 6d 20 3d 20 7a 2d 7a 53 74 61 72 74 3b 0a 20 20  m = z-zStart;.  
5720: 20 20 20 20 69 66 28 20 6e 50 61 72 61 6d 3d 3d      if( nParam==
5730: 30 20 7c 7c 20 6e 50 61 72 61 6d 3e 73 69 7a 65  0 || nParam>size
5740: 6f 66 28 7a 50 61 72 61 6d 29 2d 31 20 29 20 67  of(zParam)-1 ) g
5750: 6f 74 6f 20 73 79 6e 74 61 78 5f 65 72 72 6f 72  oto syntax_error
5760: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
5770: 50 61 72 61 6d 2c 20 7a 53 74 61 72 74 2c 20 6e  Param, zStart, n
5780: 50 61 72 61 6d 29 3b 0a 20 20 20 20 20 20 7a 50  Param);.      zP
5790: 61 72 61 6d 5b 6e 50 61 72 61 6d 5d 20 3d 20 27  aram[nParam] = '
57a0: 5c 30 27 3b 0a 20 20 20 20 20 20 69 56 61 6c 20  \0';.      iVal 
57b0: 3d 20 61 74 6f 69 28 7a 50 61 72 61 6d 29 20 2a  = atoi(zParam) *
57c0: 20 69 4d 75 6c 3b 0a 0a 20 20 20 20 20 20 69 66   iMul;..      if
57d0: 28 20 65 50 61 72 61 6d 3e 30 20 29 7b 0a 20 20  ( eParam>0 ){.  
57e0: 20 20 20 20 20 20 69 66 28 20 62 57 6f 72 6b 65        if( bWorke
57f0: 72 20 7c 7c 20 61 50 61 72 61 6d 5b 69 5d 2e 62  r || aParam[i].b
5800: 57 6f 72 6b 65 72 3d 3d 30 20 29 7b 0a 20 20 20  Worker==0 ){.   
5810: 20 20 20 20 20 20 20 6c 73 6d 5f 63 6f 6e 66 69         lsm_confi
5820: 67 28 64 62 2c 20 65 50 61 72 61 6d 2c 20 26 69  g(db, eParam, &i
5830: 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Val);.        }.
5840: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5850: 20 20 20 20 20 73 77 69 74 63 68 28 20 65 50 61       switch( ePa
5860: 72 61 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ram ){.         
5870: 20 63 61 73 65 20 54 45 53 54 5f 4e 4f 5f 52 45   case TEST_NO_RE
5880: 43 4f 56 45 52 59 3a 0a 20 20 20 20 20 20 20 20  COVERY:.        
5890: 20 20 20 20 69 66 28 20 70 4c 73 6d 20 29 20 70      if( pLsm ) p
58a0: 4c 73 6d 2d 3e 62 4e 6f 52 65 63 6f 76 65 72 79  Lsm->bNoRecovery
58b0: 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20   = iVal;.       
58c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
58d0: 20 20 20 20 20 20 63 61 73 65 20 54 45 53 54 5f        case TEST_
58e0: 4d 54 5f 4d 4f 44 45 3a 0a 20 20 20 20 20 20 20  MT_MODE:.       
58f0: 20 20 20 20 20 69 66 28 20 70 4c 73 6d 20 29 20       if( pLsm ) 
5900: 6e 54 68 72 65 61 64 20 3d 20 69 56 61 6c 3b 0a  nThread = iVal;.
5910: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
5920: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  k;.          cas
5930: 65 20 54 45 53 54 5f 4d 54 5f 4d 49 4e 5f 43 4b  e TEST_MT_MIN_CK
5940: 50 54 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT:.            
5950: 69 66 28 20 70 4c 73 6d 20 26 26 20 69 56 61 6c  if( pLsm && iVal
5960: 3e 30 20 29 20 70 4c 73 6d 2d 3e 6e 4d 74 4d 69  >0 ) pLsm->nMtMi
5970: 6e 43 6b 70 74 20 3d 20 69 56 61 6c 2a 31 30 32  nCkpt = iVal*102
5980: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  4;.            b
5990: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
59a0: 63 61 73 65 20 54 45 53 54 5f 4d 54 5f 4d 41 58  case TEST_MT_MAX
59b0: 5f 43 4b 50 54 3a 0a 20 20 20 20 20 20 20 20 20  _CKPT:.         
59c0: 20 20 20 69 66 28 20 70 4c 73 6d 20 26 26 20 69     if( pLsm && i
59d0: 56 61 6c 3e 30 20 29 20 70 4c 73 6d 2d 3e 6e 4d  Val>0 ) pLsm->nM
59e0: 74 4d 61 78 43 6b 70 74 20 3d 20 69 56 61 6c 2a  tMaxCkpt = iVal*
59f0: 31 30 32 34 3b 0a 20 20 20 20 20 20 20 20 20 20  1024;.          
5a00: 20 20 62 72 65 61 6b 3b 0a 23 69 66 64 65 66 20    break;.#ifdef 
5a10: 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 20 20  HAVE_ZLIB.      
5a20: 20 20 20 20 63 61 73 65 20 54 45 53 54 5f 43 4f      case TEST_CO
5a30: 4d 50 52 45 53 53 49 4f 4e 3a 0a 20 20 20 20 20  MPRESSION:.     
5a40: 20 20 20 20 20 20 20 74 65 73 74 43 6f 6e 66 69         testConfi
5a50: 67 75 72 65 43 6f 6d 70 72 65 73 73 69 6f 6e 28  gureCompression(
5a60: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  db);.           
5a70: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20   break;.#endif. 
5a80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5a90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
5aa0: 21 3d 7a 53 74 61 72 74 20 29 7b 0a 20 20 20 20  !=zStart ){.    
5ab0: 20 20 67 6f 74 6f 20 73 79 6e 74 61 78 5f 65 72    goto syntax_er
5ac0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
5ad0: 20 20 69 66 28 20 70 6e 54 68 72 65 61 64 20 29    if( pnThread )
5ae0: 20 2a 70 6e 54 68 72 65 61 64 20 3d 20 6e 54 68   *pnThread = nTh
5af0: 72 65 61 64 3b 0a 20 20 69 66 28 20 70 4c 73 6d  read;.  if( pLsm
5b00: 20 26 26 20 70 4c 73 6d 2d 3e 6e 4d 74 4d 61 78   && pLsm->nMtMax
5b10: 43 6b 70 74 20 3c 20 70 4c 73 6d 2d 3e 6e 4d 74  Ckpt < pLsm->nMt
5b20: 4d 69 6e 43 6b 70 74 20 29 7b 0a 20 20 20 20 70  MinCkpt ){.    p
5b30: 4c 73 6d 2d 3e 6e 4d 74 4d 69 6e 43 6b 70 74 20  Lsm->nMtMinCkpt 
5b40: 3d 20 70 4c 73 6d 2d 3e 6e 4d 74 4d 61 78 43 6b  = pLsm->nMtMaxCk
5b50: 70 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  pt;.  }..  retur
5b60: 6e 20 30 3b 0a 20 73 79 6e 74 61 78 5f 65 72 72  n 0;. syntax_err
5b70: 6f 72 3a 0a 20 20 74 65 73 74 50 72 69 6e 74 45  or:.  testPrintE
5b80: 72 72 6f 72 28 22 73 79 6e 74 61 78 20 65 72 72  rror("syntax err
5b90: 6f 72 20 61 74 3a 20 5c 22 25 73 5c 22 5c 6e 22  or at: \"%s\"\n"
5ba0: 2c 20 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  , z);.  return 1
5bb0: 3b 0a 7d 0a 0a 69 6e 74 20 74 64 62 5f 6c 73 6d  ;.}..int tdb_lsm
5bc0: 5f 63 6f 6e 66 69 67 5f 73 74 72 28 54 65 73 74  _config_str(Test
5bd0: 44 62 20 2a 70 44 62 2c 20 63 6f 6e 73 74 20 63  Db *pDb, const c
5be0: 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20 69 6e  har *zStr){.  in
5bf0: 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  t rc = 0;.  if( 
5c00: 74 64 62 5f 6c 73 6d 28 70 44 62 29 20 29 7b 0a  tdb_lsm(pDb) ){.
5c10: 23 69 66 64 65 66 20 4c 53 4d 5f 4d 55 54 45 58  #ifdef LSM_MUTEX
5c20: 5f 50 54 48 52 45 41 44 53 0a 20 20 20 20 69 6e  _PTHREADS.    in
5c30: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  t i;.#endif.    
5c40: 4c 73 6d 44 62 20 2a 70 4c 73 6d 20 3d 20 28 4c  LsmDb *pLsm = (L
5c50: 73 6d 44 62 20 2a 29 70 44 62 3b 0a 0a 20 20 20  smDb *)pDb;..   
5c60: 20 72 63 20 3d 20 74 65 73 74 5f 6c 73 6d 5f 63   rc = test_lsm_c
5c70: 6f 6e 66 69 67 5f 73 74 72 28 70 4c 73 6d 2c 20  onfig_str(pLsm, 
5c80: 70 4c 73 6d 2d 3e 64 62 2c 20 30 2c 20 7a 53 74  pLsm->db, 0, zSt
5c90: 72 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 4c 53  r, 0);.#ifdef LS
5ca0: 4d 5f 4d 55 54 45 58 5f 50 54 48 52 45 41 44 53  M_MUTEX_PTHREADS
5cb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
5cc0: 3d 3d 30 20 26 26 20 69 3c 70 4c 73 6d 2d 3e 6e  ==0 && i<pLsm->n
5cd0: 57 6f 72 6b 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Worker; i++){.  
5ce0: 20 20 20 20 72 63 20 3d 20 74 65 73 74 5f 6c 73      rc = test_ls
5cf0: 6d 5f 63 6f 6e 66 69 67 5f 73 74 72 28 30 2c 20  m_config_str(0, 
5d00: 70 4c 73 6d 2d 3e 61 57 6f 72 6b 65 72 5b 69 5d  pLsm->aWorker[i]
5d10: 2e 70 57 6f 72 6b 65 72 2c 20 31 2c 20 7a 53 74  .pWorker, 1, zSt
5d20: 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  r, 0);.    }.#en
5d30: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
5d40: 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 74 64 62 5f   rc;.}..int tdb_
5d50: 6c 73 6d 5f 63 6f 6e 66 69 67 75 72 65 28 6c 73  lsm_configure(ls
5d60: 6d 5f 64 62 20 2a 64 62 2c 20 63 6f 6e 73 74 20  m_db *db, const 
5d70: 63 68 61 72 20 2a 7a 43 6f 6e 66 69 67 29 7b 0a  char *zConfig){.
5d80: 20 20 72 65 74 75 72 6e 20 74 65 73 74 5f 6c 73    return test_ls
5d90: 6d 5f 63 6f 6e 66 69 67 5f 73 74 72 28 30 2c 20  m_config_str(0, 
5da0: 64 62 2c 20 30 2c 20 7a 43 6f 6e 66 69 67 2c 20  db, 0, zConfig, 
5db0: 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  0);.}..static in
5dc0: 74 20 74 65 73 74 4c 73 6d 53 74 61 72 74 57 6f  t testLsmStartWo
5dd0: 72 6b 65 72 73 28 4c 73 6d 44 62 20 2a 2c 20 69  rkers(LsmDb *, i
5de0: 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  nt, const char *
5df0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  , const char *);
5e00: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
5e10: 74 4c 73 6d 4f 70 65 6e 28 0a 20 20 63 6f 6e 73  tLsmOpen(.  cons
5e20: 74 20 63 68 61 72 20 2a 7a 43 66 67 2c 0a 20 20  t char *zCfg,.  
5e30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
5e40: 65 6e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 62 43  ename, .  int bC
5e50: 6c 65 61 72 2c 20 0a 20 20 54 65 73 74 44 62 20  lear, .  TestDb 
5e60: 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 73 74 61 74  **ppDb.){.  stat
5e70: 69 63 20 63 6f 6e 73 74 20 44 61 74 61 62 61 73  ic const Databas
5e80: 65 4d 65 74 68 6f 64 73 20 4c 73 6d 4d 65 74 68  eMethods LsmMeth
5e90: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 74 65 73 74  ods = {.    test
5ea0: 5f 6c 73 6d 5f 63 6c 6f 73 65 2c 0a 20 20 20 20  _lsm_close,.    
5eb0: 74 65 73 74 5f 6c 73 6d 5f 77 72 69 74 65 2c 0a  test_lsm_write,.
5ec0: 20 20 20 20 74 65 73 74 5f 6c 73 6d 5f 64 65 6c      test_lsm_del
5ed0: 65 74 65 2c 0a 20 20 20 20 74 65 73 74 5f 6c 73  ete,.    test_ls
5ee0: 6d 5f 64 65 6c 65 74 65 5f 72 61 6e 67 65 2c 0a  m_delete_range,.
5ef0: 20 20 20 20 74 65 73 74 5f 6c 73 6d 5f 66 65 74      test_lsm_fet
5f00: 63 68 2c 0a 20 20 20 20 74 65 73 74 5f 6c 73 6d  ch,.    test_lsm
5f10: 5f 73 63 61 6e 2c 0a 20 20 20 20 74 65 73 74 5f  _scan,.    test_
5f20: 6c 73 6d 5f 62 65 67 69 6e 2c 0a 20 20 20 20 74  lsm_begin,.    t
5f30: 65 73 74 5f 6c 73 6d 5f 63 6f 6d 6d 69 74 2c 0a  est_lsm_commit,.
5f40: 20 20 20 20 74 65 73 74 5f 6c 73 6d 5f 72 6f 6c      test_lsm_rol
5f50: 6c 62 61 63 6b 0a 20 20 7d 3b 0a 0a 20 20 69 6e  lback.  };..  in
5f60: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 46 69 6c  t rc;.  int nFil
5f70: 65 6e 61 6d 65 3b 0a 20 20 4c 73 6d 44 62 20 2a  ename;.  LsmDb *
5f80: 70 44 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  pDb;..  /* If th
5f90: 65 20 62 43 6c 65 61 72 20 66 6c 61 67 20 69 73  e bClear flag is
5fa0: 20 73 65 74 2c 20 64 65 6c 65 74 65 20 61 6e 79   set, delete any
5fb0: 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
5fc0: 73 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  se. */.  assert(
5fd0: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69   zFilename);.  i
5fe0: 66 28 20 62 43 6c 65 61 72 20 29 20 74 65 73 74  f( bClear ) test
5ff0: 44 65 6c 65 74 65 4c 73 6d 64 62 28 7a 46 69 6c  DeleteLsmdb(zFil
6000: 65 6e 61 6d 65 29 3b 0a 20 20 6e 46 69 6c 65 6e  ename);.  nFilen
6010: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69  ame = strlen(zFi
6020: 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 70 44 62 20  lename);..  pDb 
6030: 3d 20 28 4c 73 6d 44 62 20 2a 29 74 65 73 74 4d  = (LsmDb *)testM
6040: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 4c 73 6d  alloc(sizeof(Lsm
6050: 44 62 29 20 2b 20 6e 46 69 6c 65 6e 61 6d 65 20  Db) + nFilename 
6060: 2b 20 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  + 1);.  memset(p
6070: 44 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 73  Db, 0, sizeof(Ls
6080: 6d 44 62 29 29 3b 0a 20 20 70 44 62 2d 3e 62 61  mDb));.  pDb->ba
6090: 73 65 2e 70 4d 65 74 68 6f 64 73 20 3d 20 26 4c  se.pMethods = &L
60a0: 73 6d 4d 65 74 68 6f 64 73 3b 0a 20 20 70 44 62  smMethods;.  pDb
60b0: 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20  ->zName = (char 
60c0: 2a 29 26 70 44 62 5b 31 5d 3b 0a 20 20 6d 65 6d  *)&pDb[1];.  mem
60d0: 63 70 79 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  cpy(pDb->zName, 
60e0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
60f0: 6e 61 6d 65 20 2b 20 31 29 3b 0a 0a 20 20 2f 2a  name + 1);..  /*
6100: 20 44 65 66 61 75 6c 74 20 74 68 65 20 73 65 63   Default the sec
6110: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 66 6f  tor size used fo
6120: 72 20 63 72 61 73 68 20 73 69 6d 75 6c 61 74 69  r crash simulati
6130: 6f 6e 20 74 6f 20 35 31 32 20 62 79 74 65 73 2e  on to 512 bytes.
6140: 20 0a 20 20 2a 2a 20 54 6f 64 6f 3a 20 54 68 65   .  ** Todo: The
6150: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  re should be an 
6160: 4f 53 20 6d 65 74 68 6f 64 20 74 6f 20 6f 62 74  OS method to obt
6170: 61 69 6e 20 74 68 69 73 20 76 61 6c 75 65 20 2d  ain this value -
6180: 20 6a 75 73 74 20 61 73 0a 20 20 2a 2a 20 74 68   just as.  ** th
6190: 65 72 65 20 69 73 20 69 6e 20 53 51 4c 69 74 65  ere is in SQLite
61a0: 2e 20 46 6f 72 20 6e 6f 77 2c 20 4c 53 4d 20 61  . For now, LSM a
61b0: 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
61c0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20  s smaller than. 
61d0: 20 2a 2a 20 74 68 65 20 70 61 67 65 20 73 69 7a   ** the page siz
61e0: 65 20 28 64 65 66 61 75 6c 74 20 34 4b 42 29 2e  e (default 4KB).
61f0: 0a 20 20 2a 2f 0a 20 20 70 44 62 2d 3e 73 7a 53  .  */.  pDb->szS
6200: 65 63 74 6f 72 20 3d 20 32 35 36 3b 0a 0a 20 20  ector = 256;..  
6210: 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  /* Default value
6220: 73 20 66 6f 72 20 74 68 65 20 6d 74 5f 6d 69 6e  s for the mt_min
6230: 5f 63 6b 70 74 20 61 6e 64 20 6d 74 5f 6d 61 78  _ckpt and mt_max
6240: 5f 63 6b 70 74 20 70 61 72 61 6d 65 74 65 72 73  _ckpt parameters
6250: 2e 20 2a 2f 0a 20 20 70 44 62 2d 3e 6e 4d 74 4d  . */.  pDb->nMtM
6260: 69 6e 43 6b 70 74 20 3d 20 4c 53 4d 54 45 53 54  inCkpt = LSMTEST
6270: 5f 44 46 4c 54 5f 4d 54 5f 4d 49 4e 5f 43 4b 50  _DFLT_MT_MIN_CKP
6280: 54 3b 0a 20 20 70 44 62 2d 3e 6e 4d 74 4d 61 78  T;.  pDb->nMtMax
6290: 43 6b 70 74 20 3d 20 4c 53 4d 54 45 53 54 5f 44  Ckpt = LSMTEST_D
62a0: 46 4c 54 5f 4d 54 5f 4d 41 58 5f 43 4b 50 54 3b  FLT_MT_MAX_CKPT;
62b0: 0a 0a 20 20 6d 65 6d 63 70 79 28 26 70 44 62 2d  ..  memcpy(&pDb-
62c0: 3e 65 6e 76 2c 20 74 64 62 5f 6c 73 6d 5f 65 6e  >env, tdb_lsm_en
62d0: 76 28 29 2c 20 73 69 7a 65 6f 66 28 6c 73 6d 5f  v(), sizeof(lsm_
62e0: 65 6e 76 29 29 3b 0a 20 20 70 44 62 2d 3e 65 6e  env));.  pDb->en
62f0: 76 2e 70 56 66 73 43 74 78 20 3d 20 28 76 6f 69  v.pVfsCtx = (voi
6300: 64 20 2a 29 70 44 62 3b 0a 20 20 70 44 62 2d 3e  d *)pDb;.  pDb->
6310: 65 6e 76 2e 78 46 75 6c 6c 70 61 74 68 20 3d 20  env.xFullpath = 
6320: 74 65 73 74 45 6e 76 46 75 6c 6c 70 61 74 68 3b  testEnvFullpath;
6330: 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 4f 70 65  .  pDb->env.xOpe
6340: 6e 20 3d 20 74 65 73 74 45 6e 76 4f 70 65 6e 3b  n = testEnvOpen;
6350: 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 52 65 61  .  pDb->env.xRea
6360: 64 20 3d 20 74 65 73 74 45 6e 76 52 65 61 64 3b  d = testEnvRead;
6370: 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 57 72 69  .  pDb->env.xWri
6380: 74 65 20 3d 20 74 65 73 74 45 6e 76 57 72 69 74  te = testEnvWrit
6390: 65 3b 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 54  e;.  pDb->env.xT
63a0: 72 75 6e 63 61 74 65 20 3d 20 74 65 73 74 45 6e  runcate = testEn
63b0: 76 54 72 75 6e 63 61 74 65 3b 0a 20 20 70 44 62  vTruncate;.  pDb
63c0: 2d 3e 65 6e 76 2e 78 53 79 6e 63 20 3d 20 74 65  ->env.xSync = te
63d0: 73 74 45 6e 76 53 79 6e 63 3b 0a 20 20 70 44 62  stEnvSync;.  pDb
63e0: 2d 3e 65 6e 76 2e 78 53 65 63 74 6f 72 53 69 7a  ->env.xSectorSiz
63f0: 65 20 3d 20 74 65 73 74 45 6e 76 53 65 63 74 6f  e = testEnvSecto
6400: 72 53 69 7a 65 3b 0a 20 20 70 44 62 2d 3e 65 6e  rSize;.  pDb->en
6410: 76 2e 78 52 65 6d 61 70 20 3d 20 74 65 73 74 45  v.xRemap = testE
6420: 6e 76 52 65 6d 61 70 3b 0a 20 20 70 44 62 2d 3e  nvRemap;.  pDb->
6430: 65 6e 76 2e 78 46 69 6c 65 69 64 20 3d 20 74 65  env.xFileid = te
6440: 73 74 45 6e 76 46 69 6c 65 69 64 3b 0a 20 20 70  stEnvFileid;.  p
6450: 44 62 2d 3e 65 6e 76 2e 78 43 6c 6f 73 65 20 3d  Db->env.xClose =
6460: 20 74 65 73 74 45 6e 76 43 6c 6f 73 65 3b 0a 20   testEnvClose;. 
6470: 20 70 44 62 2d 3e 65 6e 76 2e 78 55 6e 6c 69 6e   pDb->env.xUnlin
6480: 6b 20 3d 20 74 65 73 74 45 6e 76 55 6e 6c 69 6e  k = testEnvUnlin
6490: 6b 3b 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 4c  k;.  pDb->env.xL
64a0: 6f 63 6b 20 3d 20 74 65 73 74 45 6e 76 4c 6f 63  ock = testEnvLoc
64b0: 6b 3b 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 54  k;.  pDb->env.xT
64c0: 65 73 74 4c 6f 63 6b 20 3d 20 74 65 73 74 45 6e  estLock = testEn
64d0: 76 54 65 73 74 4c 6f 63 6b 3b 0a 20 20 70 44 62  vTestLock;.  pDb
64e0: 2d 3e 65 6e 76 2e 78 53 68 6d 42 61 72 72 69 65  ->env.xShmBarrie
64f0: 72 20 3d 20 74 65 73 74 45 6e 76 53 68 6d 42 61  r = testEnvShmBa
6500: 72 72 69 65 72 3b 0a 20 20 70 44 62 2d 3e 65 6e  rrier;.  pDb->en
6510: 76 2e 78 53 68 6d 4d 61 70 20 3d 20 74 65 73 74  v.xShmMap = test
6520: 45 6e 76 53 68 6d 4d 61 70 3b 0a 20 20 70 44 62  EnvShmMap;.  pDb
6530: 2d 3e 65 6e 76 2e 78 53 68 6d 55 6e 6d 61 70 20  ->env.xShmUnmap 
6540: 3d 20 74 65 73 74 45 6e 76 53 68 6d 55 6e 6d 61  = testEnvShmUnma
6550: 70 3b 0a 20 20 70 44 62 2d 3e 65 6e 76 2e 78 53  p;.  pDb->env.xS
6560: 6c 65 65 70 20 3d 20 74 65 73 74 45 6e 76 53 6c  leep = testEnvSl
6570: 65 65 70 3b 0a 0a 20 20 72 63 20 3d 20 6c 73 6d  eep;..  rc = lsm
6580: 5f 6e 65 77 28 26 70 44 62 2d 3e 65 6e 76 2c 20  _new(&pDb->env, 
6590: 26 70 44 62 2d 3e 64 62 29 3b 0a 20 20 69 66 28  &pDb->db);.  if(
65a0: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
65b0: 20 20 20 69 6e 74 20 6e 54 68 72 65 61 64 20 3d     int nThread =
65c0: 20 31 3b 0a 20 20 20 20 6c 73 6d 5f 63 6f 6e 66   1;.    lsm_conf
65d0: 69 67 5f 6c 6f 67 28 70 44 62 2d 3e 64 62 2c 20  ig_log(pDb->db, 
65e0: 78 4c 6f 67 2c 20 30 29 3b 0a 20 20 20 20 6c 73  xLog, 0);.    ls
65f0: 6d 5f 63 6f 6e 66 69 67 5f 77 6f 72 6b 5f 68 6f  m_config_work_ho
6600: 6f 6b 28 70 44 62 2d 3e 64 62 2c 20 78 57 6f 72  ok(pDb->db, xWor
6610: 6b 48 6f 6f 6b 2c 20 28 76 6f 69 64 20 2a 29 70  kHook, (void *)p
6620: 44 62 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 74  Db);..    rc = t
6630: 65 73 74 5f 6c 73 6d 5f 63 6f 6e 66 69 67 5f 73  est_lsm_config_s
6640: 74 72 28 70 44 62 2c 20 70 44 62 2d 3e 64 62 2c  tr(pDb, pDb->db,
6650: 20 30 2c 20 7a 43 66 67 2c 20 26 6e 54 68 72 65   0, zCfg, &nThre
6660: 61 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ad);.    if( rc=
6670: 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6c  =LSM_OK ) rc = l
6680: 73 6d 5f 6f 70 65 6e 28 70 44 62 2d 3e 64 62 2c  sm_open(pDb->db,
6690: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20   zFilename);..  
66a0: 20 20 70 44 62 2d 3e 65 4d 6f 64 65 20 3d 20 6e    pDb->eMode = n
66b0: 54 68 72 65 61 64 3b 0a 23 69 66 64 65 66 20 4c  Thread;.#ifdef L
66c0: 53 4d 5f 4d 55 54 45 58 5f 50 54 48 52 45 41 44  SM_MUTEX_PTHREAD
66d0: 53 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  S.    if( rc==LS
66e0: 4d 5f 4f 4b 20 26 26 20 6e 54 68 72 65 61 64 3e  M_OK && nThread>
66f0: 31 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 4c  1 ){.      testL
6700: 73 6d 53 74 61 72 74 57 6f 72 6b 65 72 73 28 70  smStartWorkers(p
6710: 44 62 2c 20 6e 54 68 72 65 61 64 2c 20 7a 46 69  Db, nThread, zFi
6720: 6c 65 6e 61 6d 65 2c 20 7a 43 66 67 29 3b 0a 20  lename, zCfg);. 
6730: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
6740: 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20   if( rc!=LSM_OK 
6750: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 5f 6c 73  ){.      test_ls
6760: 6d 5f 63 6c 6f 73 65 28 28 54 65 73 74 44 62 20  m_close((TestDb 
6770: 2a 29 70 44 62 29 3b 0a 20 20 20 20 20 20 70 44  *)pDb);.      pD
6780: 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  b = 0;.    }.  }
6790: 0a 0a 20 20 2a 70 70 44 62 20 3d 20 28 54 65 73  ..  *ppDb = (Tes
67a0: 74 44 62 20 2a 29 70 44 62 3b 0a 20 20 72 65 74  tDb *)pDb;.  ret
67b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 74  urn rc;.}..int t
67c0: 65 73 74 5f 6c 73 6d 5f 6f 70 65 6e 28 0a 20 20  est_lsm_open(.  
67d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 65  const char *zSpe
67e0: 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c, .  const char
67f0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20   *zFilename, .  
6800: 69 6e 74 20 62 43 6c 65 61 72 2c 20 0a 20 20 54  int bClear, .  T
6810: 65 73 74 44 62 20 2a 2a 70 70 44 62 0a 29 7b 0a  estDb **ppDb.){.
6820: 20 20 72 65 74 75 72 6e 20 74 65 73 74 4c 73 6d    return testLsm
6830: 4f 70 65 6e 28 7a 53 70 65 63 2c 20 7a 46 69 6c  Open(zSpec, zFil
6840: 65 6e 61 6d 65 2c 20 62 43 6c 65 61 72 2c 20 70  ename, bClear, p
6850: 70 44 62 29 3b 0a 7d 0a 0a 69 6e 74 20 74 65 73  pDb);.}..int tes
6860: 74 5f 6c 73 6d 5f 73 6d 61 6c 6c 5f 6f 70 65 6e  t_lsm_small_open
6870: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
6880: 7a 53 70 65 63 2c 20 0a 20 20 63 6f 6e 73 74 20  zSpec, .  const 
6890: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 0a 20 20  char *zFile, .  
68a0: 69 6e 74 20 62 43 6c 65 61 72 2c 20 0a 20 20 54  int bClear, .  T
68b0: 65 73 74 44 62 20 2a 2a 70 70 44 62 0a 29 7b 0a  estDb **ppDb.){.
68c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
68d0: 66 67 20 3d 20 22 70 61 67 65 5f 73 69 7a 65 3d  fg = "page_size=
68e0: 32 35 36 20 62 6c 6f 63 6b 5f 73 69 7a 65 3d 36  256 block_size=6
68f0: 34 20 6d 6d 61 70 3d 31 30 32 34 22 3b 0a 20 20  4 mmap=1024";.  
6900: 72 65 74 75 72 6e 20 74 65 73 74 4c 73 6d 4f 70  return testLsmOp
6910: 65 6e 28 7a 43 66 67 2c 20 7a 46 69 6c 65 2c 20  en(zCfg, zFile, 
6920: 62 43 6c 65 61 72 2c 20 70 70 44 62 29 3b 0a 7d  bClear, ppDb);.}
6930: 0a 0a 69 6e 74 20 74 65 73 74 5f 6c 73 6d 5f 6c  ..int test_lsm_l
6940: 6f 6d 65 6d 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e  omem_open(.  con
6950: 73 74 20 63 68 61 72 20 2a 7a 53 70 65 63 2c 20  st char *zSpec, 
6960: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6970: 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 69 6e 74  Filename, .  int
6980: 20 62 43 6c 65 61 72 2c 20 0a 20 20 54 65 73 74   bClear, .  Test
6990: 44 62 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 20  Db **ppDb.){.   
69a0: 20 2f 2a 20 22 6d 61 78 5f 66 72 65 65 6c 69 73   /* "max_freelis
69b0: 74 3d 34 20 61 75 74 6f 63 68 65 63 6b 70 6f 69  t=4 autocheckpoi
69c0: 6e 74 3d 33 32 22 20 2a 2f 0a 20 20 63 6f 6e 73  nt=32" */.  cons
69d0: 74 20 63 68 61 72 20 2a 7a 43 66 67 20 3d 20 0a  t char *zCfg = .
69e0: 20 20 20 20 22 70 61 67 65 5f 73 69 7a 65 3d 32      "page_size=2
69f0: 35 36 20 62 6c 6f 63 6b 5f 73 69 7a 65 3d 36 34  56 block_size=64
6a00: 20 61 75 74 6f 66 6c 75 73 68 3d 31 36 20 22 0a   autoflush=16 ".
6a10: 20 20 20 20 22 61 75 74 6f 63 68 65 63 6b 70 6f      "autocheckpo
6a20: 69 6e 74 3d 33 32 22 0a 20 20 20 20 22 6d 6d 61  int=32".    "mma
6a30: 70 3d 30 20 22 0a 20 20 3b 0a 20 20 72 65 74 75  p=0 ".  ;.  retu
6a40: 72 6e 20 74 65 73 74 4c 73 6d 4f 70 65 6e 28 7a  rn testLsmOpen(z
6a50: 43 66 67 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Cfg, zFilename, 
6a60: 62 43 6c 65 61 72 2c 20 70 70 44 62 29 3b 0a 7d  bClear, ppDb);.}
6a70: 0a 0a 69 6e 74 20 74 65 73 74 5f 6c 73 6d 5f 6c  ..int test_lsm_l
6a80: 6f 6d 65 6d 32 5f 6f 70 65 6e 28 0a 20 20 63 6f  omem2_open(.  co
6a90: 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 65 63 2c  nst char *zSpec,
6aa0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
6ab0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 69 6e  zFilename, .  in
6ac0: 74 20 62 43 6c 65 61 72 2c 20 0a 20 20 54 65 73  t bClear, .  Tes
6ad0: 74 44 62 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  tDb **ppDb.){.  
6ae0: 20 20 2f 2a 20 22 6d 61 78 5f 66 72 65 65 6c 69    /* "max_freeli
6af0: 73 74 3d 34 20 61 75 74 6f 63 68 65 63 6b 70 6f  st=4 autocheckpo
6b00: 69 6e 74 3d 33 32 22 20 2a 2f 0a 20 20 63 6f 6e  int=32" */.  con
6b10: 73 74 20 63 68 61 72 20 2a 7a 43 66 67 20 3d 20  st char *zCfg = 
6b20: 0a 20 20 20 20 22 70 61 67 65 5f 73 69 7a 65 3d  .    "page_size=
6b30: 35 31 32 20 62 6c 6f 63 6b 5f 73 69 7a 65 3d 36  512 block_size=6
6b40: 34 20 61 75 74 6f 66 6c 75 73 68 3d 30 20 6d 6d  4 autoflush=0 mm
6b50: 61 70 3d 30 20 22 0a 20 20 3b 0a 20 20 72 65 74  ap=0 ".  ;.  ret
6b60: 75 72 6e 20 74 65 73 74 4c 73 6d 4f 70 65 6e 28  urn testLsmOpen(
6b70: 7a 43 66 67 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  zCfg, zFilename,
6b80: 20 62 43 6c 65 61 72 2c 20 70 70 44 62 29 3b 0a   bClear, ppDb);.
6b90: 7d 0a 0a 69 6e 74 20 74 65 73 74 5f 6c 73 6d 5f  }..int test_lsm_
6ba0: 7a 69 70 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  zip_open(.  cons
6bb0: 74 20 63 68 61 72 20 2a 7a 53 70 65 63 2c 20 0a  t char *zSpec, .
6bc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
6bd0: 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 69 6e 74 20  ilename, .  int 
6be0: 62 43 6c 65 61 72 2c 20 0a 20 20 54 65 73 74 44  bClear, .  TestD
6bf0: 62 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 6f  b **ppDb.){.  co
6c00: 6e 73 74 20 63 68 61 72 20 2a 7a 43 66 67 20 3d  nst char *zCfg =
6c10: 20 0a 20 20 20 20 22 70 61 67 65 5f 73 69 7a 65   .    "page_size
6c20: 3d 32 35 36 20 62 6c 6f 63 6b 5f 73 69 7a 65 3d  =256 block_size=
6c30: 36 34 20 61 75 74 6f 66 6c 75 73 68 3d 31 36 20  64 autoflush=16 
6c40: 22 0a 20 20 20 20 22 61 75 74 6f 63 68 65 63 6b  ".    "autocheck
6c50: 70 6f 69 6e 74 3d 33 32 20 63 6f 6d 70 72 65 73  point=32 compres
6c60: 73 69 6f 6e 3d 31 20 6d 6d 61 70 3d 30 20 22 0a  sion=1 mmap=0 ".
6c70: 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 74 65 73    ;.  return tes
6c80: 74 4c 73 6d 4f 70 65 6e 28 7a 43 66 67 2c 20 7a  tLsmOpen(zCfg, z
6c90: 46 69 6c 65 6e 61 6d 65 2c 20 62 43 6c 65 61 72  Filename, bClear
6ca0: 2c 20 70 70 44 62 29 3b 0a 7d 0a 0a 6c 73 6d 5f  , ppDb);.}..lsm_
6cb0: 64 62 20 2a 74 64 62 5f 6c 73 6d 28 54 65 73 74  db *tdb_lsm(Test
6cc0: 44 62 20 2a 70 44 62 29 7b 0a 20 20 69 66 28 20  Db *pDb){.  if( 
6cd0: 70 44 62 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  pDb->pMethods->x
6ce0: 43 6c 6f 73 65 3d 3d 74 65 73 74 5f 6c 73 6d 5f  Close==test_lsm_
6cf0: 63 6c 6f 73 65 20 29 7b 0a 20 20 20 20 72 65 74  close ){.    ret
6d00: 75 72 6e 20 28 28 4c 73 6d 44 62 20 2a 29 70 44  urn ((LsmDb *)pD
6d10: 62 29 2d 3e 64 62 3b 0a 20 20 7d 0a 20 20 72 65  b)->db;.  }.  re
6d20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 74  turn 0;.}..int t
6d30: 64 62 5f 6c 73 6d 5f 6d 75 6c 74 69 74 68 72 65  db_lsm_multithre
6d40: 61 64 28 54 65 73 74 44 62 20 2a 70 44 62 29 7b  ad(TestDb *pDb){
6d50: 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a  .  int ret = 0;.
6d60: 20 20 69 66 28 20 74 64 62 5f 6c 73 6d 28 70 44    if( tdb_lsm(pD
6d70: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20  b) ){.    ret = 
6d80: 28 28 4c 73 6d 44 62 2a 29 70 44 62 29 2d 3e 65  ((LsmDb*)pDb)->e
6d90: 4d 6f 64 65 21 3d 4c 53 4d 54 45 53 54 5f 4d 4f  Mode!=LSMTEST_MO
6da0: 44 45 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3b  DE_SINGLETHREAD;
6db0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
6dc0: 74 3b 0a 7d 0a 0a 76 6f 69 64 20 74 64 62 5f 6c  t;.}..void tdb_l
6dd0: 73 6d 5f 65 6e 61 62 6c 65 5f 6c 6f 67 28 54 65  sm_enable_log(Te
6de0: 73 74 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 62  stDb *pDb, int b
6df0: 45 6e 61 62 6c 65 29 7b 0a 20 20 6c 73 6d 5f 64  Enable){.  lsm_d
6e00: 62 20 2a 64 62 20 3d 20 74 64 62 5f 6c 73 6d 28  b *db = tdb_lsm(
6e10: 70 44 62 29 3b 0a 20 20 69 66 28 20 64 62 20 29  pDb);.  if( db )
6e20: 7b 0a 20 20 20 20 6c 73 6d 5f 63 6f 6e 66 69 67  {.    lsm_config
6e30: 5f 6c 6f 67 28 64 62 2c 20 28 62 45 6e 61 62 6c  _log(db, (bEnabl
6e40: 65 20 3f 20 78 4c 6f 67 20 3a 20 30 29 2c 20 28  e ? xLog : 0), (
6e50: 76 6f 69 64 20 2a 29 22 63 6c 69 65 6e 74 22 29  void *)"client")
6e60: 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 74 64  ;.  }.}..void td
6e70: 62 5f 6c 73 6d 5f 61 70 70 6c 69 63 61 74 69 6f  b_lsm_applicatio
6e80: 6e 5f 63 72 61 73 68 28 54 65 73 74 44 62 20 2a  n_crash(TestDb *
6e90: 70 44 62 29 7b 0a 20 20 69 66 28 20 74 64 62 5f  pDb){.  if( tdb_
6ea0: 6c 73 6d 28 70 44 62 29 20 29 7b 0a 20 20 20 20  lsm(pDb) ){.    
6eb0: 4c 73 6d 44 62 20 2a 70 20 3d 20 28 4c 73 6d 44  LsmDb *p = (LsmD
6ec0: 62 20 2a 29 70 44 62 3b 0a 20 20 20 20 70 2d 3e  b *)pDb;.    p->
6ed0: 62 43 72 61 73 68 65 64 20 3d 20 31 3b 0a 20 20  bCrashed = 1;.  
6ee0: 7d 0a 7d 0a 0a 76 6f 69 64 20 74 64 62 5f 6c 73  }.}..void tdb_ls
6ef0: 6d 5f 70 72 65 70 61 72 65 5f 73 79 73 74 65 6d  m_prepare_system
6f00: 5f 63 72 61 73 68 28 54 65 73 74 44 62 20 2a 70  _crash(TestDb *p
6f10: 44 62 29 7b 0a 20 20 69 66 28 20 74 64 62 5f 6c  Db){.  if( tdb_l
6f20: 73 6d 28 70 44 62 29 20 29 7b 0a 20 20 20 20 4c  sm(pDb) ){.    L
6f30: 73 6d 44 62 20 2a 70 20 3d 20 28 4c 73 6d 44 62  smDb *p = (LsmDb
6f40: 20 2a 29 70 44 62 3b 0a 20 20 20 20 70 2d 3e 62   *)pDb;.    p->b
6f50: 50 72 65 70 61 72 65 43 72 61 73 68 20 3d 20 31  PrepareCrash = 1
6f60: 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 74 64  ;.  }.}..void td
6f70: 62 5f 6c 73 6d 5f 73 79 73 74 65 6d 5f 63 72 61  b_lsm_system_cra
6f80: 73 68 28 54 65 73 74 44 62 20 2a 70 44 62 29 7b  sh(TestDb *pDb){
6f90: 0a 20 20 69 66 28 20 74 64 62 5f 6c 73 6d 28 70  .  if( tdb_lsm(p
6fa0: 44 62 29 20 29 7b 0a 20 20 20 20 4c 73 6d 44 62  Db) ){.    LsmDb
6fb0: 20 2a 70 20 3d 20 28 4c 73 6d 44 62 20 2a 29 70   *p = (LsmDb *)p
6fc0: 44 62 3b 0a 20 20 20 20 70 2d 3e 62 43 72 61 73  Db;.    p->bCras
6fd0: 68 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 6f 53  hed = 1;.    doS
6fe0: 79 73 74 65 6d 43 72 61 73 68 28 70 29 3b 0a 20  ystemCrash(p);. 
6ff0: 20 7d 0a 7d 0a 0a 76 6f 69 64 20 74 64 62 5f 6c   }.}..void tdb_l
7000: 73 6d 5f 73 61 66 65 74 79 28 54 65 73 74 44 62  sm_safety(TestDb
7010: 20 2a 70 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65   *pDb, int eMode
7020: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
7030: 64 65 3d 3d 4c 53 4d 5f 53 41 46 45 54 59 5f 4f  de==LSM_SAFETY_O
7040: 46 46 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4d  FF .       || eM
7050: 6f 64 65 3d 3d 4c 53 4d 5f 53 41 46 45 54 59 5f  ode==LSM_SAFETY_
7060: 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 7c  NORMAL .       |
7070: 7c 20 65 4d 6f 64 65 3d 3d 4c 53 4d 5f 53 41 46  | eMode==LSM_SAF
7080: 45 54 59 5f 46 55 4c 4c 20 0a 20 20 29 3b 0a 20  ETY_FULL .  );. 
7090: 20 69 66 28 20 74 64 62 5f 6c 73 6d 28 70 44 62   if( tdb_lsm(pDb
70a0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61  ) ){.    int iPa
70b0: 72 61 6d 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 20  ram = eMode;.   
70c0: 20 4c 73 6d 44 62 20 2a 70 20 3d 20 28 4c 73 6d   LsmDb *p = (Lsm
70d0: 44 62 20 2a 29 70 44 62 3b 0a 20 20 20 20 6c 73  Db *)pDb;.    ls
70e0: 6d 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20  m_config(p->db, 
70f0: 4c 53 4d 5f 43 4f 4e 46 49 47 5f 53 41 46 45 54  LSM_CONFIG_SAFET
7100: 59 2c 20 26 69 50 61 72 61 6d 29 3b 0a 20 20 7d  Y, &iParam);.  }
7110: 0a 7d 0a 0a 76 6f 69 64 20 74 64 62 5f 6c 73 6d  .}..void tdb_lsm
7120: 5f 70 72 65 70 61 72 65 5f 73 79 6e 63 5f 63 72  _prepare_sync_cr
7130: 61 73 68 28 54 65 73 74 44 62 20 2a 70 44 62 2c  ash(TestDb *pDb,
7140: 20 69 6e 74 20 69 53 79 6e 63 29 7b 0a 20 20 61   int iSync){.  a
7150: 73 73 65 72 74 28 20 69 53 79 6e 63 3e 30 20 29  ssert( iSync>0 )
7160: 3b 0a 20 20 69 66 28 20 74 64 62 5f 6c 73 6d 28  ;.  if( tdb_lsm(
7170: 70 44 62 29 20 29 7b 0a 20 20 20 20 4c 73 6d 44  pDb) ){.    LsmD
7180: 62 20 2a 70 20 3d 20 28 4c 73 6d 44 62 20 2a 29  b *p = (LsmDb *)
7190: 70 44 62 3b 0a 20 20 20 20 70 2d 3e 6e 41 75 74  pDb;.    p->nAut
71a0: 6f 43 72 61 73 68 20 3d 20 69 53 79 6e 63 3b 0a  oCrash = iSync;.
71b0: 20 20 20 20 70 2d 3e 62 50 72 65 70 61 72 65 43      p->bPrepareC
71c0: 72 61 73 68 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  rash = 1;.  }.}.
71d0: 0a 76 6f 69 64 20 74 64 62 5f 6c 73 6d 5f 63 6f  .void tdb_lsm_co
71e0: 6e 66 69 67 5f 77 6f 72 6b 5f 68 6f 6f 6b 28 0a  nfig_work_hook(.
71f0: 20 20 54 65 73 74 44 62 20 2a 70 44 62 2c 20 0a    TestDb *pDb, .
7200: 20 20 76 6f 69 64 20 28 2a 78 57 6f 72 6b 29 28    void (*xWork)(
7210: 6c 73 6d 5f 64 62 20 2a 2c 20 76 6f 69 64 20 2a  lsm_db *, void *
7220: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 57 6f 72  ), .  void *pWor
7230: 6b 43 74 78 0a 29 7b 0a 20 20 69 66 28 20 74 64  kCtx.){.  if( td
7240: 62 5f 6c 73 6d 28 70 44 62 29 20 29 7b 0a 20 20  b_lsm(pDb) ){.  
7250: 20 20 4c 73 6d 44 62 20 2a 70 20 3d 20 28 4c 73    LsmDb *p = (Ls
7260: 6d 44 62 20 2a 29 70 44 62 3b 0a 20 20 20 20 70  mDb *)pDb;.    p
7270: 2d 3e 78 57 6f 72 6b 20 3d 20 78 57 6f 72 6b 3b  ->xWork = xWork;
7280: 0a 20 20 20 20 70 2d 3e 70 57 6f 72 6b 43 74 78  .    p->pWorkCtx
7290: 20 3d 20 70 57 6f 72 6b 43 74 78 3b 0a 20 20 7d   = pWorkCtx;.  }
72a0: 0a 7d 0a 0a 76 6f 69 64 20 74 64 62 5f 6c 73 6d  .}..void tdb_lsm
72b0: 5f 77 72 69 74 65 5f 68 6f 6f 6b 28 0a 20 20 54  _write_hook(.  T
72c0: 65 73 74 44 62 20 2a 70 44 62 2c 20 0a 20 20 76  estDb *pDb, .  v
72d0: 6f 69 64 20 28 2a 78 57 72 69 74 65 29 28 76 6f  oid (*xWrite)(vo
72e0: 69 64 20 2a 2c 20 69 6e 74 2c 20 6c 73 6d 5f 69  id *, int, lsm_i
72f0: 36 34 2c 20 69 6e 74 2c 20 69 6e 74 29 2c 0a 20  64, int, int),. 
7300: 20 76 6f 69 64 20 2a 70 57 72 69 74 65 43 74 78   void *pWriteCtx
7310: 0a 29 7b 0a 20 20 69 66 28 20 74 64 62 5f 6c 73  .){.  if( tdb_ls
7320: 6d 28 70 44 62 29 20 29 7b 0a 20 20 20 20 4c 73  m(pDb) ){.    Ls
7330: 6d 44 62 20 2a 70 20 3d 20 28 4c 73 6d 44 62 20  mDb *p = (LsmDb 
7340: 2a 29 70 44 62 3b 0a 20 20 20 20 70 2d 3e 78 57  *)pDb;.    p->xW
7350: 72 69 74 65 48 6f 6f 6b 20 3d 20 78 57 72 69 74  riteHook = xWrit
7360: 65 3b 0a 20 20 20 20 70 2d 3e 70 57 72 69 74 65  e;.    p->pWrite
7370: 43 74 78 20 3d 20 70 57 72 69 74 65 43 74 78 3b  Ctx = pWriteCtx;
7380: 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20 74 64 62 5f  .  }.}..int tdb_
7390: 6c 73 6d 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  lsm_open(const c
73a0: 68 61 72 20 2a 7a 43 66 67 2c 20 63 6f 6e 73 74  har *zCfg, const
73b0: 20 63 68 61 72 20 2a 7a 44 62 2c 20 69 6e 74 20   char *zDb, int 
73c0: 62 43 6c 65 61 72 2c 20 54 65 73 74 44 62 20 2a  bClear, TestDb *
73d0: 2a 70 70 44 62 29 7b 0a 20 20 72 65 74 75 72 6e  *ppDb){.  return
73e0: 20 74 65 73 74 4c 73 6d 4f 70 65 6e 28 7a 43 66   testLsmOpen(zCf
73f0: 67 2c 20 7a 44 62 2c 20 62 43 6c 65 61 72 2c 20  g, zDb, bClear, 
7400: 70 70 44 62 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  ppDb);.}..#ifdef
7410: 20 4c 53 4d 5f 4d 55 54 45 58 5f 50 54 48 52 45   LSM_MUTEX_PTHRE
7420: 41 44 53 0a 0a 2f 2a 0a 2a 2a 20 53 69 67 6e 61  ADS../*.** Signa
7430: 6c 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 20  l worker thread 
7440: 69 57 6f 72 6b 65 72 20 74 68 61 74 20 74 68 65  iWorker that the
7450: 72 65 20 6d 61 79 20 62 65 20 77 6f 72 6b 20 74  re may be work t
7460: 6f 20 64 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o do..*/.static 
7470: 76 6f 69 64 20 6d 74 5f 73 69 67 6e 61 6c 5f 77  void mt_signal_w
7480: 6f 72 6b 65 72 28 4c 73 6d 44 62 20 2a 70 44 62  orker(LsmDb *pDb
7490: 2c 20 69 6e 74 20 69 57 6f 72 6b 65 72 29 7b 0a  , int iWorker){.
74a0: 20 20 4c 73 6d 57 6f 72 6b 65 72 20 2a 70 20 3d    LsmWorker *p =
74b0: 20 26 70 44 62 2d 3e 61 57 6f 72 6b 65 72 5b 69   &pDb->aWorker[i
74c0: 57 6f 72 6b 65 72 5d 3b 0a 20 20 70 74 68 72 65  Worker];.  pthre
74d0: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70  ad_mutex_lock(&p
74e0: 2d 3e 77 6f 72 6b 65 72 5f 6d 75 74 65 78 29 3b  ->worker_mutex);
74f0: 0a 20 20 70 2d 3e 62 44 6f 57 6f 72 6b 20 3d 20  .  p->bDoWork = 
7500: 31 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 6f 6e  1;.  pthread_con
7510: 64 5f 73 69 67 6e 61 6c 28 26 70 2d 3e 77 6f 72  d_signal(&p->wor
7520: 6b 65 72 5f 63 6f 6e 64 29 3b 0a 20 20 70 74 68  ker_cond);.  pth
7530: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
7540: 6b 28 26 70 2d 3e 77 6f 72 6b 65 72 5f 6d 75 74  k(&p->worker_mut
7550: 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ex);.}../*.** Th
7560: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
7570: 65 64 20 61 73 20 74 68 65 20 6d 61 69 6e 28 29  ed as the main()
7580: 20 66 6f 72 20 61 6c 6c 20 77 6f 72 6b 65 72 20   for all worker 
7590: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 73 74 61 74  threads..*/.stat
75a0: 69 63 20 76 6f 69 64 20 2a 77 6f 72 6b 65 72 5f  ic void *worker_
75b0: 6d 61 69 6e 28 76 6f 69 64 20 2a 70 41 72 67 29  main(void *pArg)
75c0: 7b 0a 20 20 4c 73 6d 57 6f 72 6b 65 72 20 2a 70  {.  LsmWorker *p
75d0: 20 3d 20 28 4c 73 6d 57 6f 72 6b 65 72 20 2a 29   = (LsmWorker *)
75e0: 70 41 72 67 3b 0a 20 20 6c 73 6d 5f 64 62 20 2a  pArg;.  lsm_db *
75f0: 70 57 6f 72 6b 65 72 3b 20 20 20 20 20 20 20 20  pWorker;        
7600: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
7610: 63 74 69 6f 6e 20 74 6f 20 61 63 63 65 73 73 20  ction to access 
7620: 64 62 20 74 68 72 6f 75 67 68 20 2a 2f 0a 0a 20  db through */.. 
7630: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
7640: 6f 63 6b 28 26 70 2d 3e 77 6f 72 6b 65 72 5f 6d  ock(&p->worker_m
7650: 75 74 65 78 29 3b 0a 20 20 77 68 69 6c 65 28 20  utex);.  while( 
7660: 28 70 57 6f 72 6b 65 72 20 3d 20 70 2d 3e 70 57  (pWorker = p->pW
7670: 6f 72 6b 65 72 29 20 29 7b 0a 20 20 20 20 69 6e  orker) ){.    in
7680: 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a  t rc = LSM_OK;..
7690: 20 20 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 77      /* Do some w
76a0: 6f 72 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ork. If an error
76b0: 20 6f 63 63 75 72 73 2c 20 65 78 69 74 2e 20 2a   occurs, exit. *
76c0: 2f 0a 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d  /..    pthread_m
76d0: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 70 2d 3e  utex_unlock(&p->
76e0: 77 6f 72 6b 65 72 5f 6d 75 74 65 78 29 3b 0a 20  worker_mutex);. 
76f0: 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d     if( p->eType=
7700: 3d 4c 53 4d 54 45 53 54 5f 54 48 52 45 41 44 5f  =LSMTEST_THREAD_
7710: 43 4b 50 54 20 29 7b 0a 20 20 20 20 20 20 69 6e  CKPT ){.      in
7720: 74 20 6e 4b 42 20 3d 20 30 3b 0a 20 20 20 20 20  t nKB = 0;.     
7730: 20 72 63 20 3d 20 6c 73 6d 5f 69 6e 66 6f 28 70   rc = lsm_info(p
7740: 57 6f 72 6b 65 72 2c 20 4c 53 4d 5f 49 4e 46 4f  Worker, LSM_INFO
7750: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 53 49 5a 45  _CHECKPOINT_SIZE
7760: 2c 20 26 6e 4b 42 29 3b 0a 20 20 20 20 20 20 69  , &nKB);.      i
7770: 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  f( rc==LSM_OK &&
7780: 20 6e 4b 42 3e 3d 70 2d 3e 70 44 62 2d 3e 6e 4d   nKB>=p->pDb->nM
7790: 74 4d 69 6e 43 6b 70 74 20 29 7b 0a 20 20 20 20  tMinCkpt ){.    
77a0: 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f 63 68 65      rc = lsm_che
77b0: 63 6b 70 6f 69 6e 74 28 70 57 6f 72 6b 65 72 2c  ckpoint(pWorker,
77c0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
77d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
77e0: 74 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  t nWrite;.      
77f0: 64 6f 20 7b 0a 0a 20 20 20 20 20 20 20 20 69 66  do {..        if
7800: 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4c 53 4d 54  ( p->eType==LSMT
7810: 45 53 54 5f 54 48 52 45 41 44 5f 57 4f 52 4b 45  EST_THREAD_WORKE
7820: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  R ){.          w
7830: 61 69 74 4f 6e 43 68 65 63 6b 70 6f 69 6e 74 65  aitOnCheckpointe
7840: 72 28 70 2d 3e 70 44 62 2c 20 70 57 6f 72 6b 65  r(p->pDb, pWorke
7850: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  r);.        }.. 
7860: 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20         nWrite = 
7870: 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
7880: 6c 73 6d 5f 77 6f 72 6b 28 70 57 6f 72 6b 65 72  lsm_work(pWorker
7890: 2c 20 30 2c 20 32 35 36 2c 20 26 6e 57 72 69 74  , 0, 256, &nWrit
78a0: 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  e);..        if(
78b0: 20 70 2d 3e 65 54 79 70 65 3d 3d 4c 53 4d 54 45   p->eType==LSMTE
78c0: 53 54 5f 54 48 52 45 41 44 5f 57 4f 52 4b 45 52  ST_THREAD_WORKER
78d0: 20 26 26 20 6e 57 72 69 74 65 20 29 7b 0a 20 20   && nWrite ){.  
78e0: 20 20 20 20 20 20 20 20 6d 74 5f 73 69 67 6e 61          mt_signa
78f0: 6c 5f 77 6f 72 6b 65 72 28 70 2d 3e 70 44 62 2c  l_worker(p->pDb,
7900: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
7910: 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 57 72       }while( nWr
7920: 69 74 65 20 26 26 20 70 2d 3e 70 57 6f 72 6b 65  ite && p->pWorke
7930: 72 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r );.    }.    p
7940: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
7950: 6b 28 26 70 2d 3e 77 6f 72 6b 65 72 5f 6d 75 74  k(&p->worker_mut
7960: 65 78 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ex);..    if( rc
7970: 21 3d 4c 53 4d 5f 4f 4b 20 26 26 20 72 63 21 3d  !=LSM_OK && rc!=
7980: 4c 53 4d 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  LSM_BUSY ){.    
7990: 20 20 70 2d 3e 77 6f 72 6b 65 72 5f 72 63 20 3d    p->worker_rc =
79a0: 20 72 63 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   rc;.      break
79b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
79c0: 54 68 65 20 74 68 72 65 61 64 20 77 69 6c 6c 20  The thread will 
79d0: 77 61 6b 65 20 75 70 20 77 68 65 6e 20 69 74 20  wake up when it 
79e0: 69 73 20 73 69 67 6e 61 6c 65 64 20 65 69 74 68  is signaled eith
79f0: 65 72 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  er because anoth
7a00: 65 72 0a 20 20 20 20 2a 2a 20 74 68 72 65 61 64  er.    ** thread
7a10: 20 68 61 73 20 63 72 65 61 74 65 64 20 73 6f 6d   has created som
7a20: 65 20 77 6f 72 6b 20 66 6f 72 20 74 68 69 73 20  e work for this 
7a30: 6f 6e 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  one or because t
7a40: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  he connection.  
7a50: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6c    ** is being cl
7a60: 6f 73 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  osed.  */.    if
7a70: 28 20 70 2d 3e 70 57 6f 72 6b 65 72 20 26 26 20  ( p->pWorker && 
7a80: 70 2d 3e 62 44 6f 57 6f 72 6b 3d 3d 30 20 29 7b  p->bDoWork==0 ){
7a90: 0a 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 63  .      pthread_c
7aa0: 6f 6e 64 5f 77 61 69 74 28 26 70 2d 3e 77 6f 72  ond_wait(&p->wor
7ab0: 6b 65 72 5f 63 6f 6e 64 2c 20 26 70 2d 3e 77 6f  ker_cond, &p->wo
7ac0: 72 6b 65 72 5f 6d 75 74 65 78 29 3b 0a 20 20 20  rker_mutex);.   
7ad0: 20 7d 0a 20 20 20 20 70 2d 3e 62 44 6f 57 6f 72   }.    p->bDoWor
7ae0: 6b 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 74 68  k = 0;.  }.  pth
7af0: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
7b00: 6b 28 26 70 2d 3e 77 6f 72 6b 65 72 5f 6d 75 74  k(&p->worker_mut
7b10: 65 78 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  ex);.  .  return
7b20: 20 30 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76   0;.}...static v
7b30: 6f 69 64 20 6d 74 5f 73 74 6f 70 5f 77 6f 72 6b  oid mt_stop_work
7b40: 65 72 28 4c 73 6d 44 62 20 2a 70 44 62 2c 20 69  er(LsmDb *pDb, i
7b50: 6e 74 20 69 57 6f 72 6b 65 72 29 7b 0a 20 20 4c  nt iWorker){.  L
7b60: 73 6d 57 6f 72 6b 65 72 20 2a 70 20 3d 20 26 70  smWorker *p = &p
7b70: 44 62 2d 3e 61 57 6f 72 6b 65 72 5b 69 57 6f 72  Db->aWorker[iWor
7b80: 6b 65 72 5d 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ker];.  if( p->p
7b90: 57 6f 72 6b 65 72 20 29 7b 0a 20 20 20 20 76 6f  Worker ){.    vo
7ba0: 69 64 20 2a 70 44 75 6d 6d 79 3b 0a 20 20 20 20  id *pDummy;.    
7bb0: 6c 73 6d 5f 64 62 20 2a 70 57 6f 72 6b 65 72 3b  lsm_db *pWorker;
7bc0: 0a 0a 20 20 20 20 2f 2a 20 53 69 67 6e 61 6c 20  ..    /* Signal 
7bd0: 74 68 65 20 77 6f 72 6b 65 72 20 74 6f 20 73 74  the worker to st
7be0: 6f 70 20 2a 2f 0a 20 20 20 20 70 74 68 72 65 61  op */.    pthrea
7bf0: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 70 2d  d_mutex_lock(&p-
7c00: 3e 77 6f 72 6b 65 72 5f 6d 75 74 65 78 29 3b 0a  >worker_mutex);.
7c10: 20 20 20 20 70 57 6f 72 6b 65 72 20 3d 20 70 2d      pWorker = p-
7c20: 3e 70 57 6f 72 6b 65 72 3b 0a 20 20 20 20 70 2d  >pWorker;.    p-
7c30: 3e 70 57 6f 72 6b 65 72 20 3d 20 30 3b 0a 20 20  >pWorker = 0;.  
7c40: 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 73    pthread_cond_s
7c50: 69 67 6e 61 6c 28 26 70 2d 3e 77 6f 72 6b 65 72  ignal(&p->worker
7c60: 5f 63 6f 6e 64 29 3b 0a 20 20 20 20 70 74 68 72  _cond);.    pthr
7c70: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
7c80: 28 26 70 2d 3e 77 6f 72 6b 65 72 5f 6d 75 74 65  (&p->worker_mute
7c90: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 4a 6f 69 6e  x);..    /* Join
7ca0: 20 74 68 65 20 77 6f 72 6b 65 72 20 74 68 72 65   the worker thre
7cb0: 61 64 2e 20 2a 2f 0a 20 20 20 20 70 74 68 72 65  ad. */.    pthre
7cc0: 61 64 5f 6a 6f 69 6e 28 70 2d 3e 77 6f 72 6b 65  ad_join(p->worke
7cd0: 72 5f 74 68 72 65 61 64 2c 20 26 70 44 75 6d 6d  r_thread, &pDumm
7ce0: 79 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 72 65 65  y);..    /* Free
7cf0: 20 72 65 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63   resources alloc
7d00: 61 74 65 64 20 69 6e 20 6d 74 5f 73 74 61 72 74  ated in mt_start
7d10: 5f 77 6f 72 6b 65 72 28 29 20 2a 2f 0a 20 20 20  _worker() */.   
7d20: 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 64 65   pthread_cond_de
7d30: 73 74 72 6f 79 28 26 70 2d 3e 77 6f 72 6b 65 72  stroy(&p->worker
7d40: 5f 63 6f 6e 64 29 3b 0a 20 20 20 20 70 74 68 72  _cond);.    pthr
7d50: 65 61 64 5f 6d 75 74 65 78 5f 64 65 73 74 72 6f  ead_mutex_destro
7d60: 79 28 26 70 2d 3e 77 6f 72 6b 65 72 5f 6d 75 74  y(&p->worker_mut
7d70: 65 78 29 3b 0a 20 20 20 20 6c 73 6d 5f 63 6c 6f  ex);.    lsm_clo
7d80: 73 65 28 70 57 6f 72 6b 65 72 29 3b 0a 20 20 7d  se(pWorker);.  }
7d90: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7da0: 6d 74 5f 73 68 75 74 64 6f 77 6e 28 4c 73 6d 44  mt_shutdown(LsmD
7db0: 62 20 2a 70 44 62 29 7b 0a 20 20 69 6e 74 20 69  b *pDb){.  int i
7dc0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7dd0: 44 62 2d 3e 6e 57 6f 72 6b 65 72 3b 20 69 2b 2b  Db->nWorker; i++
7de0: 29 7b 0a 20 20 20 20 6d 74 5f 73 74 6f 70 5f 77  ){.    mt_stop_w
7df0: 6f 72 6b 65 72 28 70 44 62 2c 20 69 29 3b 0a 20  orker(pDb, i);. 
7e00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
7e10: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
7e20: 6f 6b 65 64 20 62 79 20 4c 53 4d 20 77 68 65 6e  oked by LSM when
7e30: 20 74 68 65 20 63 6c 69 65 6e 74 20 64 61 74 61   the client data
7e40: 62 61 73 65 20 77 72 69 74 65 73 20 74 6f 0a 2a  base writes to.*
7e50: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
7e60: 69 6c 65 20 28 69 2e 65 2e 20 74 6f 20 66 6c 75  ile (i.e. to flu
7e70: 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
7e80: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
7e90: 20 74 72 65 65 29 2e 0a 2a 2a 20 54 68 69 73 20   tree)..** This 
7ea0: 69 6d 70 6c 69 65 73 20 74 68 65 72 65 20 6d 61  implies there ma
7eb0: 79 20 62 65 20 77 6f 72 6b 20 74 6f 20 64 6f 20  y be work to do 
7ec0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
7ed0: 20 73 6f 20 73 69 67 6e 61 6c 0a 2a 2a 20 74 68   so signal.** th
7ee0: 65 20 77 6f 72 6b 65 72 20 74 68 72 65 61 64 73  e worker threads
7ef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7f00: 20 6d 74 5f 63 6c 69 65 6e 74 5f 77 6f 72 6b 5f   mt_client_work_
7f10: 68 6f 6f 6b 28 6c 73 6d 5f 64 62 20 2a 64 62 2c  hook(lsm_db *db,
7f20: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
7f30: 4c 73 6d 44 62 20 2a 70 44 62 20 3d 20 28 4c 73  LsmDb *pDb = (Ls
7f40: 6d 44 62 20 2a 29 70 41 72 67 3b 20 20 20 20 20  mDb *)pArg;     
7f50: 2f 2a 20 4c 73 6d 44 62 20 64 61 74 61 62 61 73  /* LsmDb databas
7f60: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 2f  e handle */..  /
7f70: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 73 65  * Invoke the use
7f80: 72 20 6c 65 76 65 6c 20 77 6f 72 6b 2d 68 6f 6f  r level work-hoo
7f90: 6b 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  k, if any. */.  
7fa0: 69 66 28 20 70 44 62 2d 3e 78 57 6f 72 6b 20 29  if( pDb->xWork )
7fb0: 20 70 44 62 2d 3e 78 57 6f 72 6b 28 64 62 2c 20   pDb->xWork(db, 
7fc0: 70 44 62 2d 3e 70 57 6f 72 6b 43 74 78 29 3b 0a  pDb->pWorkCtx);.
7fd0: 0a 20 20 2f 2a 20 57 61 6b 65 20 75 70 20 77 6f  .  /* Wake up wo
7fe0: 72 6b 65 72 20 74 68 72 65 61 64 20 30 2e 20 2a  rker thread 0. *
7ff0: 2f 0a 20 20 6d 74 5f 73 69 67 6e 61 6c 5f 77 6f  /.  mt_signal_wo
8000: 72 6b 65 72 28 70 44 62 2c 20 30 29 3b 0a 7d 0a  rker(pDb, 0);.}.
8010: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 74 5f  .static void mt_
8020: 77 6f 72 6b 65 72 5f 77 6f 72 6b 5f 68 6f 6f 6b  worker_work_hook
8030: 28 6c 73 6d 5f 64 62 20 2a 64 62 2c 20 76 6f 69  (lsm_db *db, voi
8040: 64 20 2a 70 41 72 67 29 7b 0a 20 20 4c 73 6d 44  d *pArg){.  LsmD
8050: 62 20 2a 70 44 62 20 3d 20 28 4c 73 6d 44 62 20  b *pDb = (LsmDb 
8060: 2a 29 70 41 72 67 3b 20 20 20 20 20 2f 2a 20 4c  *)pArg;     /* L
8070: 73 6d 44 62 20 64 61 74 61 62 61 73 65 20 68 61  smDb database ha
8080: 6e 64 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e  ndle */..  /* In
8090: 76 6f 6b 65 20 74 68 65 20 75 73 65 72 20 6c 65  voke the user le
80a0: 76 65 6c 20 77 6f 72 6b 2d 68 6f 6f 6b 2c 20 69  vel work-hook, i
80b0: 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 69 66 28 20  f any. */.  if( 
80c0: 70 44 62 2d 3e 78 57 6f 72 6b 20 29 20 70 44 62  pDb->xWork ) pDb
80d0: 2d 3e 78 57 6f 72 6b 28 64 62 2c 20 70 44 62 2d  ->xWork(db, pDb-
80e0: 3e 70 57 6f 72 6b 43 74 78 29 3b 0a 7d 0a 0a 2f  >pWorkCtx);.}../
80f0: 2a 0a 2a 2a 20 4c 61 75 6e 63 68 20 77 6f 72 6b  *.** Launch work
8100: 65 72 20 74 68 72 65 61 64 20 69 57 6f 72 6b 65  er thread iWorke
8110: 72 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 63  r for database c
8120: 6f 6e 6e 65 63 74 69 6f 6e 20 70 44 62 2e 0a 2a  onnection pDb..*
8130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 74 5f  /.static int mt_
8140: 73 74 61 72 74 5f 77 6f 72 6b 65 72 28 0a 20 20  start_worker(.  
8150: 4c 73 6d 44 62 20 2a 70 44 62 2c 20 20 20 20 20  LsmDb *pDb,     
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65  /* Main database
8180: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
8190: 69 6e 74 20 69 57 6f 72 6b 65 72 2c 20 20 20 20  int iWorker,    
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 2f 2a 20 57 6f 72 6b 65 72 20 6e 75 6d 62 65 72  /* Worker number
81c0: 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 63   to start */.  c
81d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
81e0: 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 2f  name,          /
81f0: 2a 20 46 69 6c 65 20 6e 61 6d 65 20 6f 66 20 64  * File name of d
8200: 61 74 61 62 61 73 65 20 74 6f 20 6f 70 65 6e 20  atabase to open 
8210: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8220: 2a 7a 43 66 67 2c 20 20 20 20 20 20 20 20 20 20  *zCfg,          
8230: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
8240: 6f 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  on configuration
8250: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   string */.  int
8260: 20 65 54 79 70 65 20 20 20 20 20 20 20 20 20 20   eType          
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8280: 54 79 70 65 20 6f 66 20 77 6f 72 6b 65 72 20 74  Type of worker t
8290: 68 72 65 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  hread */.){.  in
82a0: 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82c0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
82d0: 20 20 4c 73 6d 57 6f 72 6b 65 72 20 2a 70 3b 20    LsmWorker *p; 
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 69    /* Object to i
8300: 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 0a 20 20  nitialize */..  
8310: 61 73 73 65 72 74 28 20 69 57 6f 72 6b 65 72 3c  assert( iWorker<
8320: 70 44 62 2d 3e 6e 57 6f 72 6b 65 72 20 29 3b 0a  pDb->nWorker );.
8330: 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
8340: 3d 4c 53 4d 54 45 53 54 5f 54 48 52 45 41 44 5f  =LSMTEST_THREAD_
8350: 43 4b 50 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  CKPT .       || 
8360: 65 54 79 70 65 3d 3d 4c 53 4d 54 45 53 54 5f 54  eType==LSMTEST_T
8370: 48 52 45 41 44 5f 57 4f 52 4b 45 52 20 0a 20 20  HREAD_WORKER .  
8380: 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 4c       || eType==L
8390: 53 4d 54 45 53 54 5f 54 48 52 45 41 44 5f 57 4f  SMTEST_THREAD_WO
83a0: 52 4b 45 52 5f 41 43 20 0a 20 20 29 3b 0a 0a 20  RKER_AC .  );.. 
83b0: 20 70 20 3d 20 26 70 44 62 2d 3e 61 57 6f 72 6b   p = &pDb->aWork
83c0: 65 72 5b 69 57 6f 72 6b 65 72 5d 3b 0a 20 20 70  er[iWorker];.  p
83d0: 2d 3e 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b  ->eType = eType;
83e0: 0a 20 20 70 2d 3e 70 44 62 20 3d 20 70 44 62 3b  .  p->pDb = pDb;
83f0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
8400: 77 6f 72 6b 65 72 20 63 6f 6e 6e 65 63 74 69 6f  worker connectio
8410: 6e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30  n */.  if( rc==0
8420: 20 29 20 72 63 20 3d 20 6c 73 6d 5f 6e 65 77 28   ) rc = lsm_new(
8430: 26 70 44 62 2d 3e 65 6e 76 2c 20 26 70 2d 3e 70  &pDb->env, &p->p
8440: 57 6f 72 6b 65 72 29 3b 0a 20 20 69 66 28 20 7a  Worker);.  if( z
8450: 43 66 67 20 29 7b 0a 20 20 20 20 74 65 73 74 5f  Cfg ){.    test_
8460: 6c 73 6d 5f 63 6f 6e 66 69 67 5f 73 74 72 28 70  lsm_config_str(p
8470: 44 62 2c 20 70 2d 3e 70 57 6f 72 6b 65 72 2c 20  Db, p->pWorker, 
8480: 31 2c 20 7a 43 66 67 2c 20 30 29 3b 0a 20 20 7d  1, zCfg, 0);.  }
8490: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72  .  if( rc==0 ) r
84a0: 63 20 3d 20 6c 73 6d 5f 6f 70 65 6e 28 70 2d 3e  c = lsm_open(p->
84b0: 70 57 6f 72 6b 65 72 2c 20 7a 46 69 6c 65 6e 61  pWorker, zFilena
84c0: 6d 65 29 3b 0a 20 20 6c 73 6d 5f 63 6f 6e 66 69  me);.  lsm_confi
84d0: 67 5f 6c 6f 67 28 70 2d 3e 70 57 6f 72 6b 65 72  g_log(p->pWorker
84e0: 2c 20 78 4c 6f 67 2c 20 28 76 6f 69 64 20 2a 29  , xLog, (void *)
84f0: 22 77 6f 72 6b 65 72 22 29 3b 0a 0a 20 20 2f 2a  "worker");..  /*
8500: 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77   Configure the w
8510: 6f 72 6b 2d 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  ork-hook */.  if
8520: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 6c  ( rc==0 ){.    l
8530: 73 6d 5f 63 6f 6e 66 69 67 5f 77 6f 72 6b 5f 68  sm_config_work_h
8540: 6f 6f 6b 28 70 2d 3e 70 57 6f 72 6b 65 72 2c 20  ook(p->pWorker, 
8550: 6d 74 5f 77 6f 72 6b 65 72 5f 77 6f 72 6b 5f 68  mt_worker_work_h
8560: 6f 6f 6b 2c 20 28 76 6f 69 64 20 2a 29 70 44 62  ook, (void *)pDb
8570: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 54  );.  }..  if( eT
8580: 79 70 65 3d 3d 4c 53 4d 54 45 53 54 5f 54 48 52  ype==LSMTEST_THR
8590: 45 41 44 5f 57 4f 52 4b 45 52 20 29 7b 0a 20 20  EAD_WORKER ){.  
85a0: 20 20 74 65 73 74 5f 6c 73 6d 5f 63 6f 6e 66 69    test_lsm_confi
85b0: 67 5f 73 74 72 28 30 2c 20 70 2d 3e 70 57 6f 72  g_str(0, p->pWor
85c0: 6b 65 72 2c 20 31 2c 20 22 61 75 74 6f 63 68 65  ker, 1, "autoche
85d0: 63 6b 70 6f 69 6e 74 3d 30 22 2c 20 30 29 3b 0a  ckpoint=0", 0);.
85e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4b 69 63 6b 20 6f    }..  /* Kick o
85f0: 66 66 20 74 68 65 20 77 6f 72 6b 65 72 20 74 68  ff the worker th
8600: 72 65 61 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72  read. */.  if( r
8610: 63 3d 3d 30 20 29 20 72 63 20 3d 20 70 74 68 72  c==0 ) rc = pthr
8620: 65 61 64 5f 63 6f 6e 64 5f 69 6e 69 74 28 26 70  ead_cond_init(&p
8630: 2d 3e 77 6f 72 6b 65 72 5f 63 6f 6e 64 2c 20 30  ->worker_cond, 0
8640: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
8650: 20 72 63 20 3d 20 70 74 68 72 65 61 64 5f 6d 75   rc = pthread_mu
8660: 74 65 78 5f 69 6e 69 74 28 26 70 2d 3e 77 6f 72  tex_init(&p->wor
8670: 6b 65 72 5f 6d 75 74 65 78 2c 20 30 29 3b 0a 20  ker_mutex, 0);. 
8680: 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
8690: 3d 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65  = pthread_create
86a0: 28 26 70 2d 3e 77 6f 72 6b 65 72 5f 74 68 72 65  (&p->worker_thre
86b0: 61 64 2c 20 30 2c 20 77 6f 72 6b 65 72 5f 6d 61  ad, 0, worker_ma
86c0: 69 6e 2c 20 28 76 6f 69 64 20 2a 29 70 29 3b 0a  in, (void *)p);.
86d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
86e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
86f0: 74 4c 73 6d 53 74 61 72 74 57 6f 72 6b 65 72 73  tLsmStartWorkers
8700: 28 0a 20 20 4c 73 6d 44 62 20 2a 70 44 62 2c 20  (.  LsmDb *pDb, 
8710: 69 6e 74 20 65 4d 6f 64 65 6c 2c 20 63 6f 6e 73  int eModel, cons
8720: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
8730: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
8740: 43 66 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Cfg.){.  int rc;
8750: 0a 0a 20 20 69 66 28 20 65 4d 6f 64 65 6c 3c 31  ..  if( eModel<1
8760: 20 7c 7c 20 65 4d 6f 64 65 6c 3e 34 20 29 20 72   || eModel>4 ) r
8770: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 65  eturn 1;.  if( e
8780: 4d 6f 64 65 6c 3d 3d 31 20 29 20 72 65 74 75 72  Model==1 ) retur
8790: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 66 69  n 0;..  /* Confi
87a0: 67 75 72 65 20 61 20 77 6f 72 6b 2d 68 6f 6f 6b  gure a work-hook
87b0: 20 66 6f 72 20 74 68 65 20 63 6c 69 65 6e 74 20   for the client 
87c0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 57 6f 72 6b  connection. Work
87d0: 65 72 20 30 20 69 73 20 73 69 67 6e 61 6c 6c 65  er 0 is signalle
87e0: 64 0a 20 20 2a 2a 20 65 76 65 72 79 20 74 69 6d  d.  ** every tim
87f0: 65 20 74 68 65 20 75 73 65 72 73 20 63 6f 6e 6e  e the users conn
8800: 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  ection writes to
8810: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
8820: 2a 2f 0a 20 20 6c 73 6d 5f 63 6f 6e 66 69 67 5f  */.  lsm_config_
8830: 77 6f 72 6b 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64  work_hook(pDb->d
8840: 62 2c 20 6d 74 5f 63 6c 69 65 6e 74 5f 77 6f 72  b, mt_client_wor
8850: 6b 5f 68 6f 6f 6b 2c 20 28 76 6f 69 64 20 2a 29  k_hook, (void *)
8860: 70 44 62 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  pDb);..  /* Allo
8870: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
8880: 77 6f 20 77 6f 72 6b 65 72 20 63 6f 6e 6e 65 63  wo worker connec
8890: 74 69 6f 6e 73 2e 20 54 68 65 79 20 6d 61 79 20  tions. They may 
88a0: 6e 6f 74 20 62 6f 74 68 20 62 65 0a 20 20 2a 2a  not both be.  **
88b0: 20 75 73 65 64 2c 20 62 75 74 20 62 6f 74 68 20   used, but both 
88c0: 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20  are allocated.  
88d0: 2a 2f 0a 20 20 70 44 62 2d 3e 61 57 6f 72 6b 65  */.  pDb->aWorke
88e0: 72 20 3d 20 28 4c 73 6d 57 6f 72 6b 65 72 20 2a  r = (LsmWorker *
88f0: 29 74 65 73 74 4d 61 6c 6c 6f 63 28 73 69 7a 65  )testMalloc(size
8900: 6f 66 28 4c 73 6d 57 6f 72 6b 65 72 29 20 2a 20  of(LsmWorker) * 
8910: 32 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 62  2);.  memset(pDb
8920: 2d 3e 61 57 6f 72 6b 65 72 2c 20 30 2c 20 73 69  ->aWorker, 0, si
8930: 7a 65 6f 66 28 4c 73 6d 57 6f 72 6b 65 72 29 20  zeof(LsmWorker) 
8940: 2a 20 32 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  * 2);..  switch(
8950: 20 65 4d 6f 64 65 6c 20 29 7b 0a 20 20 20 20 63   eModel ){.    c
8960: 61 73 65 20 4c 53 4d 54 45 53 54 5f 4d 4f 44 45  ase LSMTEST_MODE
8970: 5f 42 41 43 4b 47 52 4f 55 4e 44 5f 43 4b 50 54  _BACKGROUND_CKPT
8980: 3a 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 57 6f  :.      pDb->nWo
8990: 72 6b 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  rker = 1;.      
89a0: 74 65 73 74 5f 6c 73 6d 5f 63 6f 6e 66 69 67 5f  test_lsm_config_
89b0: 73 74 72 28 30 2c 20 70 44 62 2d 3e 64 62 2c 20  str(0, pDb->db, 
89c0: 30 2c 20 22 61 75 74 6f 63 68 65 63 6b 70 6f 69  0, "autocheckpoi
89d0: 6e 74 3d 30 22 2c 20 30 29 3b 0a 20 20 20 20 20  nt=0", 0);.     
89e0: 20 72 63 20 3d 20 6d 74 5f 73 74 61 72 74 5f 77   rc = mt_start_w
89f0: 6f 72 6b 65 72 28 70 44 62 2c 20 30 2c 20 7a 46  orker(pDb, 0, zF
8a00: 69 6c 65 6e 61 6d 65 2c 20 7a 43 66 67 2c 20 4c  ilename, zCfg, L
8a10: 53 4d 54 45 53 54 5f 54 48 52 45 41 44 5f 43 4b  SMTEST_THREAD_CK
8a20: 50 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  PT);.      break
8a30: 3b 0a 0a 20 20 20 20 63 61 73 65 20 4c 53 4d 54  ;..    case LSMT
8a40: 45 53 54 5f 4d 4f 44 45 5f 42 41 43 4b 47 52 4f  EST_MODE_BACKGRO
8a50: 55 4e 44 5f 57 4f 52 4b 3a 0a 20 20 20 20 20 20  UND_WORK:.      
8a60: 70 44 62 2d 3e 6e 57 6f 72 6b 65 72 20 3d 20 31  pDb->nWorker = 1
8a70: 3b 0a 20 20 20 20 20 20 74 65 73 74 5f 6c 73 6d  ;.      test_lsm
8a80: 5f 63 6f 6e 66 69 67 5f 73 74 72 28 30 2c 20 70  _config_str(0, p
8a90: 44 62 2d 3e 64 62 2c 20 30 2c 20 22 61 75 74 6f  Db->db, 0, "auto
8aa0: 77 6f 72 6b 3d 30 22 2c 20 30 29 3b 0a 20 20 20  work=0", 0);.   
8ab0: 20 20 20 72 63 20 3d 20 6d 74 5f 73 74 61 72 74     rc = mt_start
8ac0: 5f 77 6f 72 6b 65 72 28 70 44 62 2c 20 30 2c 20  _worker(pDb, 0, 
8ad0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 43 66 67 2c  zFilename, zCfg,
8ae0: 20 4c 53 4d 54 45 53 54 5f 54 48 52 45 41 44 5f   LSMTEST_THREAD_
8af0: 57 4f 52 4b 45 52 5f 41 43 29 3b 0a 20 20 20 20  WORKER_AC);.    
8b00: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
8b10: 73 65 20 4c 53 4d 54 45 53 54 5f 4d 4f 44 45 5f  se LSMTEST_MODE_
8b20: 42 41 43 4b 47 52 4f 55 4e 44 5f 42 4f 54 48 3a  BACKGROUND_BOTH:
8b30: 0a 20 20 20 20 20 20 70 44 62 2d 3e 6e 57 6f 72  .      pDb->nWor
8b40: 6b 65 72 20 3d 20 32 3b 0a 20 20 20 20 20 20 74  ker = 2;.      t
8b50: 65 73 74 5f 6c 73 6d 5f 63 6f 6e 66 69 67 5f 73  est_lsm_config_s
8b60: 74 72 28 30 2c 20 70 44 62 2d 3e 64 62 2c 20 30  tr(0, pDb->db, 0
8b70: 2c 20 22 61 75 74 6f 77 6f 72 6b 3d 30 22 2c 20  , "autowork=0", 
8b80: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  0);.      rc = m
8b90: 74 5f 73 74 61 72 74 5f 77 6f 72 6b 65 72 28 70  t_start_worker(p
8ba0: 44 62 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  Db, 0, zFilename
8bb0: 2c 20 7a 43 66 67 2c 20 4c 53 4d 54 45 53 54 5f  , zCfg, LSMTEST_
8bc0: 54 48 52 45 41 44 5f 57 4f 52 4b 45 52 29 3b 0a  THREAD_WORKER);.
8bd0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
8be0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8bf0: 6d 74 5f 73 74 61 72 74 5f 77 6f 72 6b 65 72 28  mt_start_worker(
8c00: 70 44 62 2c 20 31 2c 20 7a 46 69 6c 65 6e 61 6d  pDb, 1, zFilenam
8c10: 65 2c 20 7a 43 66 67 2c 20 4c 53 4d 54 45 53 54  e, zCfg, LSMTEST
8c20: 5f 54 48 52 45 41 44 5f 43 4b 50 54 29 3b 0a 20  _THREAD_CKPT);. 
8c30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
8c40: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
8c50: 6e 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 74 65  n rc;.}...int te
8c60: 73 74 5f 6c 73 6d 5f 6d 74 32 28 0a 20 20 63 6f  st_lsm_mt2(.  co
8c70: 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 65 63 2c  nst char *zSpec,
8c80: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
8c90: 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 69 6e  zFilename, .  in
8ca0: 74 20 62 43 6c 65 61 72 2c 20 0a 20 20 54 65 73  t bClear, .  Tes
8cb0: 74 44 62 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  tDb **ppDb.){.  
8cc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 66 67  const char *zCfg
8cd0: 20 3d 20 22 6d 74 5f 6d 6f 64 65 3d 32 22 3b 0a   = "mt_mode=2";.
8ce0: 20 20 72 65 74 75 72 6e 20 74 65 73 74 4c 73 6d    return testLsm
8cf0: 4f 70 65 6e 28 7a 43 66 67 2c 20 7a 46 69 6c 65  Open(zCfg, zFile
8d00: 6e 61 6d 65 2c 20 62 43 6c 65 61 72 2c 20 70 70  name, bClear, pp
8d10: 44 62 29 3b 0a 7d 0a 0a 69 6e 74 20 74 65 73 74  Db);.}..int test
8d20: 5f 6c 73 6d 5f 6d 74 33 28 0a 20 20 63 6f 6e 73  _lsm_mt3(.  cons
8d30: 74 20 63 68 61 72 20 2a 7a 53 70 65 63 2c 20 0a  t char *zSpec, .
8d40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8d50: 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 69 6e 74 20  ilename, .  int 
8d60: 62 43 6c 65 61 72 2c 20 0a 20 20 54 65 73 74 44  bClear, .  TestD
8d70: 62 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 6f  b **ppDb.){.  co
8d80: 6e 73 74 20 63 68 61 72 20 2a 7a 43 66 67 20 3d  nst char *zCfg =
8d90: 20 22 6d 74 5f 6d 6f 64 65 3d 34 22 3b 0a 20 20   "mt_mode=4";.  
8da0: 72 65 74 75 72 6e 20 74 65 73 74 4c 73 6d 4f 70  return testLsmOp
8db0: 65 6e 28 7a 43 66 67 2c 20 7a 46 69 6c 65 6e 61  en(zCfg, zFilena
8dc0: 6d 65 2c 20 62 43 6c 65 61 72 2c 20 70 70 44 62  me, bClear, ppDb
8dd0: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 73 74 61 74  );.}..#else.stat
8de0: 69 63 20 76 6f 69 64 20 6d 74 5f 73 68 75 74 64  ic void mt_shutd
8df0: 6f 77 6e 28 4c 73 6d 44 62 20 2a 70 44 62 29 20  own(LsmDb *pDb) 
8e00: 7b 20 0a 20 20 75 6e 75 73 65 64 5f 70 61 72 61  { .  unused_para
8e10: 6d 65 74 65 72 28 70 44 62 29 3b 20 0a 7d 0a 69  meter(pDb); .}.i
8e20: 6e 74 20 74 65 73 74 5f 6c 73 6d 5f 6d 74 28 63  nt test_lsm_mt(c
8e30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
8e40: 6e 61 6d 65 2c 20 69 6e 74 20 62 43 6c 65 61 72  name, int bClear
8e50: 2c 20 54 65 73 74 44 62 20 2a 2a 70 70 44 62 29  , TestDb **ppDb)
8e60: 7b 0a 20 20 75 6e 75 73 65 64 5f 70 61 72 61 6d  {.  unused_param
8e70: 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  eter(zFilename);
8e80: 0a 20 20 75 6e 75 73 65 64 5f 70 61 72 61 6d 65  .  unused_parame
8e90: 74 65 72 28 62 43 6c 65 61 72 29 3b 0a 20 20 75  ter(bClear);.  u
8ea0: 6e 75 73 65 64 5f 70 61 72 61 6d 65 74 65 72 28  nused_parameter(
8eb0: 70 70 44 62 29 3b 0a 20 20 74 65 73 74 50 72 69  ppDb);.  testPri
8ec0: 6e 74 45 72 72 6f 72 28 22 74 68 72 65 61 64 73  ntError("threads
8ed0: 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 2d 20 72   unavailable - r
8ee0: 65 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 4c 53  ecompile with LS
8ef0: 4d 5f 4d 55 54 45 58 5f 50 54 48 52 45 41 44 53  M_MUTEX_PTHREADS
8f00: 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  \n");.  return 1
8f10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.