1 
2 #include "lsmtest.h"
3 
4 #define DATA_SEQUENTIAL TEST_DATASOURCE_SEQUENCE
5 #define DATA_RANDOM     TEST_DATASOURCE_RANDOM
6 
7 typedef struct Datatest4 Datatest4;
8 
9 /*
10 ** Test overview:
11 **
12 **   1. Insert (Datatest4.nRec) records into a database.
13 **
14 **   2. Repeat (Datatest4.nRepeat) times:
15 **
16 **      2a. Delete 2/3 of the records in the database.
17 **
18 **      2b. Run lsm_work(nMerge=1).
19 **
20 **      2c. Insert as many records as were deleted in 2a.
21 **
22 **      2d. Check database content is as expected.
23 **
24 **      2e. If (Datatest4.bReopen) is true, close and reopen the database.
25 */
26 struct Datatest4 {
27   /* Datasource definition */
28   DatasourceDefn defn;
29 
30   int nRec;
31   int nRepeat;
32   int bReopen;
33 };
34 
doDataTest4(const char * zSystem,Datatest4 * p,int * pRc)35 static void doDataTest4(
36   const char *zSystem,            /* Database system to test */
37   Datatest4 *p,                   /* Structure containing test parameters */
38   int *pRc                        /* OUT: Error code */
39 ){
40   lsm_db *db = 0;
41   TestDb *pDb;
42   TestDb *pControl;
43   Datasource *pData;
44   int i;
45   int rc = 0;
46   int iDot = 0;
47   int bMultiThreaded = 0;         /* True for MT LSM database */
48 
49   int nRecOn3 = (p->nRec / 3);
50   int iData = 0;
51 
52   /* Start the test case, open a database and allocate the datasource. */
53   rc = testControlDb(&pControl);
54   pDb = testOpen(zSystem, 1, &rc);
55   pData = testDatasourceNew(&p->defn);
56   if( rc==0 ){
57     db = tdb_lsm(pDb);
58     bMultiThreaded = tdb_lsm_multithread(pDb);
59   }
60 
61   testWriteDatasourceRange(pControl, pData, iData, nRecOn3*3, &rc);
62   testWriteDatasourceRange(pDb,      pData, iData, nRecOn3*3, &rc);
63 
64   for(i=0; rc==0 && i<p->nRepeat; i++){
65 
66     testDeleteDatasourceRange(pControl, pData, iData, nRecOn3*2, &rc);
67     testDeleteDatasourceRange(pDb,      pData, iData, nRecOn3*2, &rc);
68 
69     if( db ){
70       int nDone;
71 #if 0
72       fprintf(stderr, "lsm_work() start...\n"); fflush(stderr);
73 #endif
74       do {
75         nDone = 0;
76         rc = lsm_work(db, 1, (1<<30), &nDone);
77       }while( rc==0 && nDone>0 );
78       if( bMultiThreaded && rc==LSM_BUSY ) rc = LSM_OK;
79 #if 0
80       fprintf(stderr, "lsm_work() done...\n"); fflush(stderr);
81 #endif
82     }
83 
84 if( i+1<p->nRepeat ){
85     iData += (nRecOn3*2);
86     testWriteDatasourceRange(pControl, pData, iData+nRecOn3, nRecOn3*2, &rc);
87     testWriteDatasourceRange(pDb,      pData, iData+nRecOn3, nRecOn3*2, &rc);
88 
89     testCompareDb(pData, nRecOn3*3, iData, pControl, pDb, &rc);
90 
91     /* If Datatest4.bReopen is true, close and reopen the database */
92     if( p->bReopen ){
93       testReopen(&pDb, &rc);
94       if( rc==0 ) db = tdb_lsm(pDb);
95     }
96 }
97 
98     /* Update the progress dots... */
99     testCaseProgress(i, p->nRepeat, testCaseNDot(), &iDot);
100   }
101 
102   testClose(&pDb);
103   testClose(&pControl);
104   testDatasourceFree(pData);
105   testCaseFinish(rc);
106   *pRc = rc;
107 }
108 
getName4(const char * zSystem,Datatest4 * pTest)109 static char *getName4(const char *zSystem, Datatest4 *pTest){
110   char *zRet;
111   char *zData;
112   zData = testDatasourceName(&pTest->defn);
113   zRet = testMallocPrintf("data4.%s.%s.%d.%d.%d",
114       zSystem, zData, pTest->nRec, pTest->nRepeat, pTest->bReopen
115   );
116   testFree(zData);
117   return zRet;
118 }
119 
test_data_4(const char * zSystem,const char * zPattern,int * pRc)120 void test_data_4(
121   const char *zSystem,            /* Database system name */
122   const char *zPattern,           /* Run test cases that match this pattern */
123   int *pRc                        /* IN/OUT: Error code */
124 ){
125   Datatest4 aTest[] = {
126       /* defn,                                 nRec, nRepeat, bReopen */
127     { {DATA_RANDOM,     20,25,     500,600}, 10000,      10,       0   },
128     { {DATA_RANDOM,     20,25,     500,600}, 10000,      10,       1   },
129   };
130 
131   int i;
132 
133   for(i=0; *pRc==LSM_OK && i<ArraySize(aTest); i++){
134     char *zName = getName4(zSystem, &aTest[i]);
135     if( testCaseBegin(pRc, zPattern, "%s", zName) ){
136       doDataTest4(zSystem, &aTest[i], pRc);
137     }
138     testFree(zName);
139   }
140 }
141