/** ******************************************************************************* * \brief ******************************************************************************/ void kv_async_init_ark_io(uint32_t num_ctxt, uint32_t jobs, uint32_t vlen, uint32_t secs) { uint32_t klen = 16; uint32_t LEN = 50; uint32_t job = 0; uint32_t ctxt = 0; kv_t *db[jobs]; printf("ctxt:%d jobs:%d ASYNC %dx%dx%d", num_ctxt, jobs, klen, vlen, LEN); fflush(stdout); for (job=0; job<jobs; job++) { db[job] = (kv_t*)kv_db_create_fixed(LEN, klen+job, vlen); } printf("."); fflush(stdout); for (ctxt=0; ctxt<num_ctxt; ctxt++) { kv_async_init_ctxt(ctxt, secs); for (job=0; job<jobs; job++) { kv_async_set_job(KV_ASYNC_CB_SGD | KV_ASYNC_CB_MULTI_CTXT_IO, ctxt, job, db[job], vlen, LEN); KV_TRC(pFT, "CREATE_JOB FIXED %dx%dx%d", klen+job, vlen, LEN); } } printf("> "); fflush(stdout); }
/** ******************************************************************************* * \brief ******************************************************************************/ void kv_async_init_job(uint32_t flags, uint32_t ctxt, uint32_t job, uint32_t klen, uint32_t vlen, uint32_t len) { kv_t *db = (kv_t*)kv_db_create_fixed(len, klen, vlen); ASSERT_TRUE(NULL != db); KV_TRC(pFT, "CREATE_JOB FIXED %dx%dx%d", klen, vlen, len); kv_async_set_job(flags|KV_ASYNC_CB_GTEST, ctxt, job, db, vlen, len); }
void fvt_kv_utils_perf(ARK *ark, uint32_t vlen, uint32_t mb, uint32_t LEN) { kv_t *db = NULL; uint64_t mb64_1 = (uint64_t)KV_1M; uint64_t bytes = mb64_1*mb; uint32_t i = 0; uint32_t klen = 16; uint64_t lchunk = LEN*vlen; uint32_t loops = mb; long int wr_us = 0; long int rd_us = 0; long int mil = 1000000; float wr_s = 0; float rd_s = 0; float wr_mb = 0; uint64_t ops = 0; uint64_t post_ops = 0; uint64_t io = 0; uint64_t post_io = 0; float wr_ops = 0; float wr_ios = 0; float rd_ops = 0; float rd_ios = 0; struct timeval stop, start; ASSERT_TRUE(NULL != ark); loops = (uint32_t)(bytes / lchunk); db = (kv_t*)kv_db_create_fixed(LEN, klen, vlen); ASSERT_TRUE(db != NULL); printf("SYNC %dx%dx%d\n", klen, vlen, LEN); for (i=0; i<loops; i++) { /* write/load all key/value pairs from the db into the ark */ (void)ark_stats(ark, &ops, &io); gettimeofday(&start, NULL); fvt_kv_utils_load(ark, db, LEN); gettimeofday(&stop, NULL); wr_us += (stop.tv_sec*mil + stop.tv_usec) - (start.tv_sec*mil + start.tv_usec); (void)ark_stats(ark, &post_ops, &post_io); wr_ops += post_ops - ops; wr_ios += post_io - io; /* read/query all key/value pairs from the db */ (void)ark_stats(ark, &ops, &io); gettimeofday(&start, NULL); fvt_kv_utils_read(ark, db, vlen, LEN); gettimeofday(&stop, NULL); rd_us += (stop.tv_sec*mil + stop.tv_usec) - (start.tv_sec*mil + start.tv_usec); (void)ark_stats(ark, &post_ops, &post_io); rd_ops += post_ops - ops; rd_ios += post_io - io; /* delete all key/value pairs from the db */ fvt_kv_utils_del(ark, db, LEN); } wr_s = (float)((float)wr_us/(float)mil); rd_s = (float)((float)rd_us/(float)mil); wr_mb = (float)((double)(bytes+(uint64_t)(klen*LEN*loops)) / (double)mb64_1); printf(" writes: %d mb in %.1f secs at %.3f mbps, %.0f op/s, %.0f io/s\n", mb, wr_s, wr_mb/wr_s, wr_ops/wr_s, wr_ios/wr_s); printf(" reads: %d mb in %.1f secs at %.3f mbps, %.0f op/s, %.0f io/s\n", mb, rd_s, (float)mb/rd_s, rd_ops/rd_s, rd_ios/rd_s); kv_db_destroy(db, LEN); }
/** ******************************************************************************* * \brief ******************************************************************************/ void Sync_pth::run_multi_ctxt_wr(uint32_t num_ctxt, uint32_t num_pth, uint32_t npool, uint32_t vlen, uint32_t LEN, uint32_t secs) { uint32_t i = 0; uint32_t ctxt_i = 0; uint32_t pth_i = 0; uint32_t klen = 16; uint32_t tot_pth = num_ctxt * num_pth; set_get_args_t pth_args[tot_pth]; ARK *ark[num_ctxt]; kv_t *db[num_pth]; struct timeval stop, start; uint64_t ops = 0; uint64_t ios = 0; uint32_t t_ops = 0; uint32_t t_ios = 0; if (num_pth > MAX_PTH_PER_CONTEXT) { printf("cannot exceed %d pthreads for sync ops\n", MAX_PTH_PER_CONTEXT); return; } memset(pth_args, 0, sizeof(set_get_args_t) * tot_pth); /* alloc one set of db's, to be used for each context */ for (i=0; i<num_pth; i++) { db[i] = (kv_t*)kv_db_create_fixed(LEN, klen+i, vlen+i); } /* alloc one ark for each context */ for (ctxt_i=0; ctxt_i<num_ctxt; ctxt_i++) { ASSERT_EQ(0, ark_create_verbose(getenv("FVT_DEV"), &ark[ctxt_i], 1048576, 4096, 1048576, npool, 256, 8*1024, ARK_KV_VIRTUAL_LUN)); ASSERT_TRUE(NULL != ark[ctxt_i]); } /* start timer */ gettimeofday(&start, NULL); /* init each pth per context and run the pth */ ctxt_i = 0; i = 0; while (i < tot_pth) { pth_args[i].ark = ark[ctxt_i]; pth_args[i].db = db[pth_i]; pth_args[i].vlen = vlen+pth_i; pth_args[i].LEN = LEN; pth_args[i].secs = secs; run_write_loop(pth_args+i); ++pth_i; ++i; if ((i%num_pth) == 0) { /* reset for next context */ ++ctxt_i; pth_i = 0; } } printf("SYNC %dx%dx%d ctxt:%d pth:%d npool:%d ", klen, vlen, LEN, num_ctxt, num_pth, npool); fflush(stdout); for (i=0; i<tot_pth; i++) { wait(pth_args+i); } /* stop timer */ gettimeofday(&stop, NULL); secs = stop.tv_sec - start.tv_sec; t_ops = 0; t_ios = 0; for (i=0; i<num_ctxt; i++) { (void)ark_stats(ark[i], &ops, &ios); t_ops += (uint32_t)ops; t_ios += (uint32_t)ios; EXPECT_EQ(0, ark_delete(ark[i])); } for (i=0; i<num_pth; i++) { kv_db_destroy(db[i], LEN); } t_ops = t_ops / secs; t_ios = t_ios / secs; printf("op/s:%d io/s:%d secs:%d\n", t_ops, t_ios, secs); }
/** ******************************************************************************* * \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); }