void fvt_kv_utils_query_empty(ARK *ark, kv_t *db, uint32_t vbuflen,uint32_t LEN) { uint32_t i = 0; int64_t res = 0; uint8_t *gvalue = NULL; if (vbuflen==0) {gvalue=(uint8_t*)malloc(1);} else {gvalue=(uint8_t*)malloc(vbuflen);} ASSERT_TRUE(gvalue != NULL); ASSERT_TRUE(NULL != ark); ASSERT_TRUE(NULL != db); for (i=0; i<LEN; i++) { EXPECT_TRUE(db[i].vlen <= vbuflen); EXPECT_EQ(ENOENT, ark_get(ark, db[i].klen, db[i].key, db[i].vlen, gvalue, 0, &res)); EXPECT_EQ(ENOENT, ark_exists(ark, db[i].klen, db[i].key, &res)); } free(gvalue); }
/** ******************************************************************************** ** \brief ** validate that a k/v database exists in the ark *******************************************************************************/ uint32_t kv_query(ARK *ark, db_t *db) { uint32_t i = 0; uint32_t rc = 0; int64_t res = 0; char *gvalue = NULL; gvalue = malloc(db->vlen); assert(gvalue); for (i=0; i<db->len; i++) { while (EAGAIN == (rc=ark_get(ark, db->klen, db->kv[i].key, db->vlen, gvalue, 0, &res))) usleep(10000); if (rc) KV_ERR("get1", rc); if (db->vlen != res) KV_ERR("get2",0); while (EAGAIN == (rc=ark_exists(ark, db->klen, db->kv[i].key, &res))) usleep(10000); if (rc) KV_ERR("exists1",rc); if (db->vlen != res) KV_ERR("exists2",0); } free(gvalue); return 0; }
void fvt_kv_utils_query_off(ARK *ark, kv_t *db, uint32_t vbuflen, uint32_t LEN) { uint32_t i = 0; int64_t res = 0; uint32_t offset = 7; uint8_t *pval = NULL; uint8_t *gvalue = NULL; if (vbuflen==0) {gvalue=(uint8_t*)malloc(1);} else {gvalue=(uint8_t*)malloc(vbuflen);} ASSERT_TRUE(gvalue != NULL); ASSERT_TRUE(NULL != ark); ASSERT_TRUE(NULL != db); for (i=0; i<LEN; i++) { EXPECT_EQ(0, ark_exists(ark, db[i].klen, db[i].key, &res)); EXPECT_TRUE(db[i].vlen <= vbuflen); EXPECT_EQ(0, ark_get(ark, db[i].klen, db[i].key, db[i].vlen-offset, gvalue, offset, &res)); EXPECT_EQ(db[i].vlen, res); pval = (uint8_t*)db[i].value; EXPECT_EQ(0, memcmp(pval+offset, gvalue, db[i].vlen - offset)); } free(gvalue); }
uint32_t kv_query(ARK *ark, db_t *db) { uint32_t i = 0; uint32_t rc = 0; int64_t res = 0; uint8_t gvalue[db->vlen]; for (i=0; i<db->LEN; i++) { while (EAGAIN == (rc=ark_get(ark, db->klen, db->kv[i].key, db->vlen, gvalue, 0, &res))) usleep(10000); if (rc) KV_ERR("get1", rc); if (db->vlen != res) KV_ERR("get2",0); while (EAGAIN == (rc=ark_exists(ark, db->klen, db->kv[i].key, &res))) usleep(10000); if (rc) KV_ERR("exists1",rc); if (db->vlen != res) KV_ERR("exists2",0); } return 0; }
int main (int argc, char **argv) { if (3 != argc) panic ("usage: ark-get arkfile key"); FILE *f = fopen (argv[1], "rb"); if (!f) sys_panic (argv[1]); ark_get (f, argv[1], argv[2]); fclose (f); return 0; }
/** ******************************************************************************* * \brief ******************************************************************************/ TEST(FVT_KV_GOOD_PATH, PERSIST_FIXED_512x128x50000) { ARK *ark = NULL; kv_t *fdb = NULL; kv_t *mdb = NULL; uint32_t klen = 512; uint32_t vlen = 128; uint32_t LEN = 50000; uint32_t i = 0; int64_t res = 0; char *dev = getenv("FVT_DEV_PERSIST"); uint8_t gvalue[vlen]; struct stat sbuf; if (NULL == dev || stat(dev,&sbuf) != 0) { TESTCASE_SKIP("FVT_DEV_PERSIST==NULL or file not found"); return; } printf("create k/v databases\n"); fflush(stdout); fdb = (kv_t*)kv_db_create_fixed(LEN, klen, vlen); ASSERT_TRUE(fdb != NULL); mdb = (kv_t*)kv_db_create_mixed(LEN, klen-1, vlen); ASSERT_TRUE(mdb != NULL); printf("create ark\n"); fflush(stdout); ARK_CREATE_NEW_PERSIST; printf("run 5 sec mixed REP_LOOP\n"); fflush(stdout); fvt_kv_utils_REP_LOOP(ark, kv_db_create_mixed, kv_db_mixed_regen_values, klen+1, vlen, 1000, 5); printf("load ark with fixed db\n"); fflush(stdout); fvt_kv_utils_load (ark, fdb, LEN); printf("query fixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, fdb, vlen, LEN); printf("persist ark\n"); fflush(stdout); ARK_DELETE; printf("re-open ark and read persisted data\n"); fflush(stdout); ARK_CREATE_PERSIST; printf("query fixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, fdb, vlen, LEN); printf("load ark with the mixed db\n"); fflush(stdout); fvt_kv_utils_load (ark, mdb, LEN); printf("query mixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, mdb, vlen, LEN); printf("query fixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, fdb, vlen, LEN); printf("delete fixed db from ark\n"); fflush(stdout); fvt_kv_utils_del(ark, fdb, LEN); printf("re-load ark with the fixed db\n"); fflush(stdout); fvt_kv_utils_load (ark, fdb, LEN); printf("query db\n"); fflush(stdout); fvt_kv_utils_query(ark, fdb, vlen, LEN); printf("delete mixed db from ark\n"); fflush(stdout); fvt_kv_utils_del(ark, mdb, LEN); printf("persist ark\n"); fflush(stdout); ARK_DELETE; printf("re-open ark without LOAD\n"); fflush(stdout); ARK_CREATE_NEW_PERSIST; printf("verify ark is empty\n"); fflush(stdout); for (i=0; i<LEN; i++) { ASSERT_EQ(ENOENT, ark_get(ark, fdb[i].klen, fdb[i].key, fdb[i].vlen, gvalue, 0, &res)); } kv_db_destroy(fdb, LEN); ARK_DELETE; }
/** ******************************************************************************* * \brief ******************************************************************************/ TEST(FVT_KV_GOOD_PATH, PERSIST) { ARK *ark = NULL; kv_t *fdb = NULL; kv_t *mdb = NULL; kv_t *bdb = NULL; uint32_t klen = 512; uint32_t vlen = 256; uint32_t LEN = 10000; uint32_t BLEN = 1000; uint32_t i = 0; int64_t res = 0; char *dev = getenv("FVT_DEV_PERSIST"); uint8_t gvalue[vlen]; struct stat sbuf; if (NULL == dev || stat(dev,&sbuf) != 0) { TESTCASE_SKIP("FVT_DEV_PERSIST==NULL or file not found"); return; } printf("create k/v databases\n"); fflush(stdout); fdb = (kv_t*)kv_db_create_fixed(LEN, klen, vlen); ASSERT_TRUE(fdb != NULL); bdb = (kv_t*)kv_db_create_fixed(BLEN, klen+1, KV_1M); ASSERT_TRUE(bdb != NULL); mdb = (kv_t*)kv_db_create_mixed(LEN, klen-1, vlen); ASSERT_TRUE(mdb != NULL); printf("create new ark\n"); fflush(stdout); ARK_CREATE_NEW_PERSIST; printf("delete ark\n"); fflush(stdout); ARK_DELETE; printf("re-open empty ark\n"); fflush(stdout); ARK_CREATE_PERSIST; printf("load ark with fixed db\n"); fflush(stdout); fvt_kv_utils_load (ark, fdb, LEN); printf("query fixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, fdb, vlen, LEN); printf("delete ark\n"); fflush(stdout); ARK_DELETE; printf("re-open ark containing fixed db\n"); fflush(stdout); ARK_CREATE_PERSIST; printf("run SGD_LOOP on fixed db\n"); fflush(stdout); fvt_kv_utils_SGD_LOOP(ark, kv_db_create_fixed, klen+10, vlen+10,1000,5); printf("query fixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, fdb, vlen, LEN); printf("delete ark\n"); fflush(stdout); ARK_DELETE; printf("re-open ark containing fixed db\n"); fflush(stdout); ARK_CREATE_PERSIST; printf("load ark with BIG db\n"); fflush(stdout); fvt_kv_utils_load (ark, bdb, BLEN); printf("query BIG db\n"); fflush(stdout); fvt_kv_utils_query(ark, bdb, KV_1M, BLEN); printf("query fixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, fdb, vlen, LEN); printf("run REP_LOOP on fixed db\n"); fflush(stdout); fvt_kv_utils_REP_LOOP(ark, kv_db_create_fixed, kv_db_fixed_regen_values, klen+100, vlen, 5000, 5); printf("delete BIG db from ark\n"); fflush(stdout); fvt_kv_utils_del(ark, bdb, BLEN); printf("load ark with the mixed db\n"); fflush(stdout); fvt_kv_utils_load(ark, mdb, LEN); printf("query mixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, mdb, vlen, LEN); printf("delete ark\n"); fflush(stdout); ARK_DELETE; printf("re-open ark with fixed and mixed db\n"); fflush(stdout); ARK_CREATE_PERSIST; printf("query fixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, fdb, vlen, LEN); printf("delete fixed db from ark\n"); fflush(stdout); fvt_kv_utils_del(ark, fdb, LEN); printf("query mixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, mdb, vlen, LEN); printf("delete mixed db from ark\n"); fflush(stdout); fvt_kv_utils_del(ark, mdb, LEN); printf("run REP_LOOP on mixed db\n"); fflush(stdout); fvt_kv_utils_REP_LOOP(ark, kv_db_create_mixed, kv_db_mixed_regen_values, klen+256, vlen, 100, 5); printf("load ark with the mixed db\n"); fflush(stdout); fvt_kv_utils_load (ark, mdb, LEN); printf("query mixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, mdb, vlen, LEN); printf("delete ark\n"); fflush(stdout); ARK_DELETE; printf("open new ark\n"); fflush(stdout); ARK_CREATE_NEW_PERSIST; printf("verify empty\n"); fflush(stdout); for (i=0; i<LEN; i++) { ASSERT_EQ(ENOENT, ark_get(ark, mdb[i].klen, mdb[i].key, mdb[i].vlen, gvalue, 0, &res)); } printf("delete ark\n"); fflush(stdout); ARK_DELETE; printf("re-open ark as readonly\n"); fflush(stdout); ARK_CREATE_PERSIST_READONLY; printf("load ark with the mixed db\n"); fflush(stdout); fvt_kv_utils_load (ark, mdb, LEN); printf("query mixed db\n"); fflush(stdout); fvt_kv_utils_query(ark, mdb, vlen, LEN); printf("run REP_LOOP on mixed db\n"); fflush(stdout); fvt_kv_utils_REP_LOOP(ark, kv_db_create_mixed, kv_db_mixed_regen_values, klen, vlen, LEN, 5); printf("delete ark\n"); fflush(stdout); ARK_DELETE; printf("open new ark\n"); fflush(stdout); ARK_CREATE_PERSIST; printf("verify empty\n"); fflush(stdout); for (i=0; i<LEN; i++) { ASSERT_EQ(ENOENT, ark_get(ark, mdb[i].klen, mdb[i].key, mdb[i].vlen, gvalue, 0, &res)); } printf("delete ark\n"); fflush(stdout); ARK_DELETE; kv_db_destroy(fdb, LEN); kv_db_destroy(mdb, LEN); kv_db_destroy(bdb, BLEN); }