Ejemplo n.º 1
0
static void createdb(const char * filename, uint16_t order)
{
    itzam_btree btree;
    itzam_state state;

    /* create an empty database file
     */
    state = itzam_btree_create(&btree, filename, order, sizeof(int32_t), itzam_comparator_int32, error_handler);

    if (state != ITZAM_OKAY)
    {
        printf("Unable to create B-tree index file %s\n", filename);
        exit(1);
    }

    itzam_btree_close(&btree);
}
Ejemplo n.º 2
0
bool test_btree_insert() {
    itzam_btree  btree;
    itzam_state  state;
    record       rec;
    int n;
    char * filename      = "insert.itz";
    itzam_int test_size  = 10000000;
    int order            = 25;

    time_t start = time(NULL);

    memset(&rec.m_data,0,REC_SIZE * sizeof(uint32_t));
    rec.m_key = 0;

    // banner for this test
    printf("\nItzam/C B-Tree Test\nStraight Insertion Performance\n");
    printf("Please wait while I insert %d records of %d bytes...\n", (int)test_size, (int)(REC_SIZE * sizeof(uint32_t)));

    state = itzam_btree_create(&btree, filename, order, sizeof(record), compare_recs, error_handler);

    if (state != ITZAM_OKAY) {
        not_okay(state);
        return false;
    }

    for (n = 1; n <= test_size; ++ n)  {
        rec.m_key = n;
        rec.m_data[0] = n;
        rec.m_data[REC_SIZE - 1] = n;

        state = itzam_btree_insert(&btree,(const void *)&rec);

        if (state != ITZAM_OKAY) {
            not_okay(state);
            return false;
        }
    }

    time_t elapsed = time(NULL) - start;

    printf("      database  count: %d\n", (int)btree.m_header->m_count);
    printf("      database ticker: %d\n", (int)btree.m_header->m_ticker);
    printf("       total run time: %d seconds\n", (int)elapsed);
    printf("insertions per second: %f\n", ((double)test_size / (double)elapsed));

    // verify database after benchmark
    itzam_btree_cursor cursor;
    state = itzam_btree_cursor_create(&cursor, &btree);

    if (state == ITZAM_OKAY) {
        do {
            // get the key pointed to by the cursor
            state = itzam_btree_cursor_read(&cursor,(void *)&rec);

            if (state == ITZAM_OKAY) {
                if ((rec.m_key != rec.m_data[0]) || (rec.m_key != rec.m_data[REC_SIZE - 1])) {
                    printf("ERROR: record retrieved for %u does not match %u or %u\n",rec.m_key,rec.m_data[0],rec.m_data[REC_SIZE - 1]);
                    break;
                }
            }
            else
                not_okay(state);
        }
        while (itzam_btree_cursor_next(&cursor));

        state = itzam_btree_cursor_free(&cursor);

        if (state != ITZAM_OKAY)
            return false;
    }

    state = itzam_btree_close(&btree);

    if (state != ITZAM_OKAY) {
        not_okay(state);
        return false;
    }

    return true;
}
Ejemplo n.º 3
0
static itzam_bool test_threaded()
{
    const uint16_t order = 7;
    char * sfilename = "threaded.single";
    char * mfilename = "threaded.multi";
    time_t start;
    int maxkey = 5000;
    int test_size = 1000000;
    pthread_attr_t attr;
    pthread_t * thread;
    struct threadArgs * args;
    int completed = 0;
    int32_t key;
    int n;

    itzam_btree btree;
    itzam_state state;

    /* get number of processors available
     */
    int num_threads = (int)sysconf(_SC_NPROCESSORS_CONF) - 1;

    if (num_threads < 2)
        num_threads = 2;

    thread = (pthread_t *)malloc(num_threads * sizeof(pthread_t));
    args = (struct threadArgs *)malloc(num_threads * sizeof(struct threadArgs));

    printf("\nItzam/C B-Tree Test\nMultiple threads, simultaneously using the same Itzam index\n\n");
    printf("Parameters:\n%8d B-tree order\n%8d unique keys\n%8d threads\n%8d insert & remove operations\n",
           order, maxkey, num_threads, test_size);

    /* create threads and test simultaneous access to the database
     */
    createdb(mfilename, order);

    test_size /= num_threads;

    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    pthread_attr_setschedpolicy(&attr, SCHED_RR);

    state = itzam_btree_open(&btree, mfilename, itzam_comparator_int32, error_handler, false, false);

    if (state != ITZAM_OKAY)
    {
        printf("Unable to open B-tree index file %s\n",mfilename);
        return itzam_false;
    }

    printf("\nPerforming multi-thread test... ");
    fflush(stdout);

    start = time(NULL);

    for (n = 0; n < num_threads; ++n)
    {
        args[n].btree = &btree;
        args[n].maxkey = maxkey;
        args[n].test_size = test_size;
        args[n].completed = &completed;
        pthread_create(&thread[n], &attr, threadProc, &args[n]);
    }

    while (completed < num_threads)
        usleep(100000);

    itzam_btree_close(&btree);

    free(thread);
    free(args);

    /* stats
     */
    time_t melapsed = time(NULL) - start;

    printf("done\n\n%8d seconds run time\n\n", (int)melapsed);

    return itzam_true;
}