/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ // vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: #ident "Copyright (c) 2007 Tokutek Inc. All rights reserved." #ident "$Id$" #include "test.h" #include <stdio.h> #include <stdlib.h> #include <toku_pthread.h> #include <unistd.h> #include <memory.h> #include <sys/stat.h> #include <db.h> #include "threaded_stress_test_helpers.h" static int ptquery_op2(DB_TXN *txn, ARG arg, void* operation_extra, void *stats_extra) { int db_index = *(int *)operation_extra; DB* db = arg->dbp[db_index]; int r = ptquery_and_maybe_check_op(db, txn, arg, true); increment_counter(stats_extra, PTQUERIES, 1); return r; } // // This test is a form of stress that does operations on a single dictionary: // We create a dictionary bigger than the cachetable (around 4x greater). // Then, we spawn a bunch of pthreads that do the following: // - scan dictionary forward with bulk fetch // - scan dictionary forward slowly // - scan dictionary backward with bulk fetch // - scan dictionary backward slowly // - Grow the dictionary with insertions // - do random point queries into the dictionary // With the small cachetable, this should produce quite a bit of churn in reading in and evicting nodes. // If the test runs to completion without crashing, we consider it a success. It also tests that snapshots // work correctly by verifying that table scans sum their vals to 0. // // This does NOT test: // - splits and merges // - multiple DBs // // Variables that are interesting to tweak and run: // - small cachetable // - number of elements // static void stress_table(DB_ENV* env, DB** dbp, struct cli_args *cli_args) { // // the threads that we want: // - some threads constantly updating random values // - one thread doing table scan with bulk fetch // - one thread doing table scan without bulk fetch // - some threads doing random point queries // if (verbose) printf("starting creation of pthreads\n"); const int num_threads = cli_args->num_ptquery_threads; struct arg myargs[num_threads]; int thread_ids[num_threads]; for (int i = 0; i < num_threads; i++) { arg_init(&myargs[i], dbp, env, cli_args); thread_ids[i] = i % cli_args->num_DBs; myargs[i].operation = ptquery_op2; myargs[i].operation_extra = &thread_ids[i]; } run_workers(myargs, num_threads, cli_args->num_seconds, false, cli_args); } int test_main(int argc, char *const argv[]) { struct cli_args args = get_default_args_for_perf(); parse_stress_test_args(argc, argv, &args); stress_test_main(&args); return 0; }