/**
 *******************************************************************************
 * \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);
}
Example #3
0
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);
}