/* ** Test case "api2" tests that the default page and block sizes of a ** database may only be modified before lsm_open() is called. And that ** after lsm_open() is called lsm_config() may be used to read the ** actual page and block size of the db. */ static void do_test_api2(const char *zPattern, int *pRc){ if( *pRc==0 && testCaseBegin(pRc, zPattern, "api2.lsm") ){ lsm_db *db1 = 0; lsm_db *db2 = 0; testDeleteLsmdb("testdb.lsm"); db1 = newLsmConnection("testdb.lsm", 0, 0, pRc); testPagesize(db1, 4096, 1024, pRc); db2 = newLsmConnection("testdb.lsm", 1024, 64*1024, pRc); testPagesize(db2, 4096, 1024, pRc); lsm_close(db1); lsm_close(db2); testDeleteLsmdb("testdb.lsm"); db1 = newLsmConnection("testdb.lsm", 1024, 64*1024, pRc); testPagesize(db1, 1024, 64*1024, pRc); db2 = newLsmConnection("testdb.lsm", 0, 0, pRc); testPagesize(db2, 1024, 64*1024, pRc); lsm_close(db1); lsm_close(db2); testDeleteLsmdb("testdb.lsm"); db1 = newLsmConnection("testdb.lsm", 8192, 2*1024, pRc); testPagesize(db1, 8192, 2*1024, pRc); db2 = newLsmConnection("testdb.lsm", 1024, 64*1024, pRc); testPagesize(db2, 8192, 2*1024, pRc); lsm_close(db1); lsm_close(db2); testCaseFinish(*pRc); } }
/* ** Set up a database file with the following properties: ** ** * Page size is 1024 bytes. ** * Block size is 64 KB. ** * Contains 5000 key-value pairs starting at 0 from the ** datasource returned getDatasource(). */ static void setup_populate_db2(){ Datasource *pData; int ii; int rc; int nBlocksize = 64*1024; int nPagesize = 1024; int nWritebuffer = 4*1024; lsm_db *pDb; testDeleteLsmdb(LSMTEST6_TESTDB); rc = lsm_new(tdb_lsm_env(), &pDb); if( rc==LSM_OK ) rc = lsm_open(pDb, LSMTEST6_TESTDB); lsm_config(pDb, LSM_CONFIG_BLOCK_SIZE, &nBlocksize); lsm_config(pDb, LSM_CONFIG_PAGE_SIZE, &nPagesize); lsm_config(pDb, LSM_CONFIG_AUTOFLUSH, &nWritebuffer); pData = getDatasource(); for(ii=0; rc==LSM_OK && ii<5000; ii++){ void *pKey; int nKey; void *pVal; int nVal; testDatasourceEntry(pData, ii, &pKey, &nKey, &pVal, &nVal); lsm_insert(pDb, pKey, nKey, pVal, nVal); } testDatasourceFree(pData); lsm_close(pDb); testSaveDb(LSMTEST6_TESTDB, "log"); assert( rc==LSM_OK ); }
/* ** Create a small database. With the following content: ** ** "one" -> "one" ** "two" -> "four" ** "three" -> "nine" ** "four" -> "sixteen" ** "five" -> "twentyfive" ** "six" -> "thirtysix" ** "seven" -> "fourtynine" ** "eight" -> "sixtyfour" */ static void setup_populate_db(){ const char *azStr[] = { "one", "one", "two", "four", "three", "nine", "four", "sixteen", "five", "twentyfive", "six", "thirtysix", "seven", "fourtynine", "eight", "sixtyfour", }; int rc; int ii; lsm_db *pDb; testDeleteLsmdb(LSMTEST6_TESTDB); rc = lsm_new(tdb_lsm_env(), &pDb); if( rc==LSM_OK ) rc = lsm_open(pDb, LSMTEST6_TESTDB); for(ii=0; rc==LSM_OK && ii<ArraySize(azStr); ii+=2){ rc = lsmWriteStr(pDb, azStr[ii], azStr[ii+1]); } lsm_close(pDb); testSaveDb(LSMTEST6_TESTDB, "log"); assert( rc==LSM_OK ); }
/* ** Test the results of OOM conditions in simple write operations. */ static void simple_oom_4(OomTest *pOom){ int rc = LSM_OK; lsm_db *pDb; testDeleteLsmdb(LSMTEST6_TESTDB); testOomOpen(pOom, LSMTEST6_TESTDB, &pDb, &rc); testOomWriteStr(pOom, pDb, "123", "onetwothree", &rc); testOomWriteStr(pOom, pDb, "456", "fourfivesix", &rc); testOomWriteStr(pOom, pDb, "789", "seveneightnine", &rc); testOomWriteStr(pOom, pDb, "123", "teneleventwelve", &rc); testOomWriteStr(pOom, pDb, "456", "fourteenfifteensixteen", &rc); lsm_close(pDb); }
/* ** This test case has two clients connected to a database. The first client ** hits an OOM while writing to the database. Check that the second ** connection is still able to query the db following the OOM. */ static void simple_oom2_1(OomTest *pOom){ const int nRecord = 100; /* Number of records initially in db */ const int nIns = 10; /* Number of records inserted with OOM */ Datasource *pData = getDatasource(); int rc = LSM_OK; lsm_db *pDb1; lsm_db *pDb2; int i; testDeleteLsmdb(LSMTEST6_TESTDB); /* Open the two connections. Initialize the in-memory tree so that it ** contains 100 records. Do all this with OOM injection disabled. */ testOomEnable(pOom, 0); testOomOpen(pOom, LSMTEST6_TESTDB, &pDb1, &rc); testOomOpen(pOom, LSMTEST6_TESTDB, &pDb2, &rc); for(i=0; i<nRecord; i++){ testOomWriteData(pOom, pDb1, pData, i, &rc); } testOomEnable(pOom, 1); assert( rc==0 ); /* Insert 10 more records using pDb1. Stop when an OOM is encountered. */ for(i=nRecord; i<nRecord+nIns; i++){ testOomWriteData(pOom, pDb1, pData, i, &rc); if( rc ) break; } testOomAssertRc(pOom, rc); /* Switch off OOM injection. Write a few rows using pDb2. Then check ** that the database may be successfully queried. */ testOomEnable(pOom, 0); rc = 0; for(; i<nRecord+nIns && rc==0; i++){ testOomWriteData(pOom, pDb2, pData, i, &rc); } for(i=0; i<nRecord+nIns; i++) testOomFetchData(pOom, pDb2, pData, i, &rc); testOomEnable(pOom, 1); lsm_close(pDb1); lsm_close(pDb2); testDatasourceFree(pData); }
static void setup_delete_db(){ testDeleteLsmdb(LSMTEST6_TESTDB); }