diff options
author | Alex Gorrod <alexander.gorrod@mongodb.com> | 2016-05-27 15:51:43 +1000 |
---|---|---|
committer | Alex Gorrod <alexander.gorrod@mongodb.com> | 2016-05-27 15:51:52 +1000 |
commit | f5be31696774455a67ca8c3f6268252d1d4086a4 (patch) | |
tree | 9ab8d44354f28d9e2db7309ab81fc4ae71dc102e /src/third_party/wiredtiger/test | |
parent | 832d65c6eec6eb4314b2700a18a332185b5baa36 (diff) | |
download | mongo-f5be31696774455a67ca8c3f6268252d1d4086a4.tar.gz |
Import wiredtiger-wiredtiger-2.8.0-441-g6f9a7a4.tar.gz from wiredtiger branch mongodb-3.4
ref: 636a7b2..6f9a7a4
WT-2554 Implement a framework for adding C test cases
WT-2610 Investigate eviction hazard pointer check
WT-2611 wtperf and/or WT_CONFIG_PARSER do not allow escaped double quotes
WT-2617 Bug in pluggable file system example
WT-2624 snprintf unsupported on MSVC 2013
WT-2626 snprintf errors with macro redefinition on MSVC2015
WT-2627 Coverity complaints
WT-2628 reconciliation can return without unlocking the page lock
WT-2629 Introduction of ppc64le crc32c assembly file has made the stack executable
WT-2630 Rename WT_FSTREAM methods to avoid using C99 reserved names
WT-2632 Test format failures due to "checkpoints cannot be dropped when in-use"
WT-2637 The file-extension documentation doesn't cover not-supported cases
WT-2644 'wt load -r' (rename) fails with LSM
WT-2646 Split the lock_wait flag into two, adding a checkpoint_wait flag
WT-2651 Coverity 1355591 resource leak
WT-2653 the custom file-system example should show device configuration
WT-2656 Builds failing on GCC 4.7 builder
WT-2659 csuite tests, assorted lint and cleanup.
WT-2660 Hang between eviction and connection close
WT-2661 Coverity failures: 1356050-1356053
WT-2662 For internal spell checking, strip out double quote literals, they confuse aspell
SERVER-24151 WiredTiger changes for MongoDB 3.3.7
Diffstat (limited to 'src/third_party/wiredtiger/test')
41 files changed, 1088 insertions, 158 deletions
diff --git a/src/third_party/wiredtiger/test/bloom/Makefile.am b/src/third_party/wiredtiger/test/bloom/Makefile.am index 0592cec7e42..81a21f59882 100644 --- a/src/third_party/wiredtiger/test/bloom/Makefile.am +++ b/src/third_party/wiredtiger/test/bloom/Makefile.am @@ -1,9 +1,12 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = t t_SOURCES = test_bloom.c -t_LDADD = $(top_builddir)/libwiredtiger.la + +t_LDADD = $(top_builddir)/test/utility/libtest_util.la +t_LDADD +=$(top_builddir)/libwiredtiger.la t_LDFLAGS = -static # Run this during a "make check" smoke test. diff --git a/src/third_party/wiredtiger/test/bloom/test_bloom.c b/src/third_party/wiredtiger/test/bloom/test_bloom.c index 6955813dc68..e9980cd53cb 100644 --- a/src/third_party/wiredtiger/test/bloom/test_bloom.c +++ b/src/third_party/wiredtiger/test/bloom/test_bloom.c @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" static struct { char *progname; /* Program name */ diff --git a/src/third_party/wiredtiger/test/checkpoint/Makefile.am b/src/third_party/wiredtiger/test/checkpoint/Makefile.am index cf879d046bf..2b5ba800c9c 100644 --- a/src/third_party/wiredtiger/test/checkpoint/Makefile.am +++ b/src/third_party/wiredtiger/test/checkpoint/Makefile.am @@ -1,9 +1,12 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = t -t_LDADD = $(top_builddir)/libwiredtiger.la t_SOURCES = checkpointer.c workers.c test_checkpoint.c + +t_LDADD = $(top_builddir)/test/utility/libtest_util.la +t_LDADD +=$(top_builddir)/libwiredtiger.la t_LDFLAGS = -static TESTS = smoke.sh diff --git a/src/third_party/wiredtiger/test/checkpoint/test_checkpoint.h b/src/third_party/wiredtiger/test/checkpoint/test_checkpoint.h index 10e21289dd3..0d0d02447d5 100644 --- a/src/third_party/wiredtiger/test/checkpoint/test_checkpoint.h +++ b/src/third_party/wiredtiger/test/checkpoint/test_checkpoint.h @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" #include <signal.h> diff --git a/src/third_party/wiredtiger/test/csuite/Makefile.am b/src/third_party/wiredtiger/test/csuite/Makefile.am new file mode 100644 index 00000000000..6058a05431b --- /dev/null +++ b/src/third_party/wiredtiger/test/csuite/Makefile.am @@ -0,0 +1,21 @@ +AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ + -I$(top_srcdir)/test/utility +LDADD = $(top_builddir)/test/utility/libtest_util.la \ + $(top_builddir)/libwiredtiger.la +AM_LDFLAGS = -static + +test_wt1965_col_efficiency_SOURCES = wt1965_col_efficiency/main.c +noinst_PROGRAMS = test_wt1965_col_efficiency + +test_wt2246_col_append_SOURCES = wt2246_col_append/main.c +noinst_PROGRAMS += test_wt2246_col_append + +test_wt2535_insert_race_SOURCES = wt2535_insert_race/main.c +noinst_PROGRAMS += test_wt2535_insert_race + +# Run this during a "make check" smoke test. +TESTS = $(noinst_PROGRAMS) +LOG_COMPILER = $(TEST_WRAPPER) + +clean-local: + rm -rf WT_TEST.* *.core diff --git a/src/third_party/wiredtiger/test/csuite/wt1965_col_efficiency/main.c b/src/third_party/wiredtiger/test/csuite/wt1965_col_efficiency/main.c new file mode 100644 index 00000000000..2882ce9cdf5 --- /dev/null +++ b/src/third_party/wiredtiger/test/csuite/wt1965_col_efficiency/main.c @@ -0,0 +1,186 @@ +/*- + * Public Domain 2014-2016 MongoDB, Inc. + * Public Domain 2008-2014 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "test_util.h" + +/* + * JIRA ticket reference: WT-1965 + * Test case description: The reported issue was that column store tables + * exhibit high CPU usage when populated with sparse record IDs. + * Failure mode: It isn't simple to make this test case failure explicit since + * it is demonstrating an inefficiency rather than a correctness bug. + */ + +void (*custom_die)(void) = NULL; + +/* If changing field count also need to change set_value and get_value calls */ +#define NR_FIELDS 8 +#define NR_OBJECTS 100 +#define NR_THREADS 4 + +static uint64_t g_ts = 0; + +/* + * Each thread inserts a set of keys into the record store database. The keys + * are generated in such a way that there are large gaps in the key range. + */ +static void * +thread_func(void *arg) +{ + TEST_OPTS *opts; + WT_CURSOR *cursor, *idx_cursor; + WT_SESSION *session; + uint64_t i, ins_rotor, ins_thr_idx, thr_idx, ts; + uint64_t *obj_data; + + opts = (TEST_OPTS *)arg; + thr_idx = __wt_atomic_fetch_addv64(&opts->next_threadid, 1); + ts = g_ts; + obj_data = dcalloc( + (NR_OBJECTS/NR_THREADS + 1) * NR_FIELDS, sizeof(*obj_data)); + + testutil_check(opts->conn->open_session( + opts->conn, NULL, NULL, &session)); + + testutil_check(session->open_cursor( + session, opts->uri, NULL, NULL, &cursor)); + testutil_check(session->open_cursor( + session, "table:index", NULL, NULL, &idx_cursor)); + + for (ins_rotor = 1; ins_rotor < 10; ++ins_rotor) { + for (ins_thr_idx = thr_idx, i = 0; ins_thr_idx < NR_OBJECTS; + ins_thr_idx += NR_THREADS, i += NR_FIELDS) { + + testutil_check( + session->begin_transaction(session, "sync=false")); + + cursor->set_key(cursor, ins_thr_idx << 40 | ins_rotor); + cursor->set_value(cursor, ts, + obj_data[i+0], obj_data[i+1], obj_data[i+2], + obj_data[i+3], obj_data[i+4], obj_data[i+5], + obj_data[i+6], obj_data[i+7]); + testutil_check(cursor->insert(cursor)); + + idx_cursor->set_key( + idx_cursor, ins_thr_idx << 40 | ts); + idx_cursor->set_value(idx_cursor, ins_rotor); + testutil_check(idx_cursor->insert(idx_cursor)); + + testutil_check( + session->commit_transaction(session, NULL)); + + /* change object fields */ + ++obj_data[i + ((ins_thr_idx + ins_rotor) % NR_FIELDS)]; + ++obj_data[i + + ((ins_thr_idx + ins_rotor + 1) % NR_FIELDS)]; + + ++g_ts; + /* 5K updates/sec */ + (void)usleep(1000000ULL * NR_THREADS / 5000); + } + } + + testutil_check(session->close(session, NULL)); + free(obj_data); + return (NULL); +} + +int +main(int argc, char *argv[]) +{ + TEST_OPTS *opts, _opts; + WT_CURSOR *cursor; + WT_SESSION *session; + pthread_t thr[NR_THREADS]; + size_t t; + uint64_t f[NR_FIELDS], r, ts; + int i, ret; + char table_format[256]; + + opts = &_opts; + memset(opts, 0, sizeof(*opts)); + testutil_check(testutil_parse_opts(argc, argv, opts)); + testutil_make_work_dir(opts->home); + + testutil_check(wiredtiger_open(opts->home, NULL, + "create,cache_size=1G,checkpoint=(wait=30)," + "eviction_trigger=80,eviction_target=64,eviction_dirty_target=65," + "log=(enabled,file_max=10M)," + "transaction_sync=(enabled=true,method=none)", &opts->conn)); + testutil_check(opts->conn->open_session( + opts->conn, NULL, NULL, &session)); + + sprintf(table_format, "key_format=r,value_format="); + for (i = 0; i < NR_FIELDS; i++) + strcat(table_format, "Q"); + + /* recno -> timestamp + NR_FIELDS * Q */ + testutil_check(session->create( + session, opts->uri, table_format)); + /* timestamp -> recno */ + testutil_check(session->create(session, + "table:index", "key_format=Q,value_format=Q")); + + testutil_check(session->close(session, NULL)); + + for (t = 0; t < NR_THREADS; ++t) + testutil_check(pthread_create( + &thr[t], NULL, thread_func, (void *)opts)); + + for (t = 0; t < NR_THREADS; ++t) + (void)pthread_join(thr[t], NULL); + + testutil_check(opts->conn->open_session( + opts->conn, NULL, NULL, &session)); + + /* recno -> timestamp + NR_FIELDS * Q */ + testutil_check(session->create(session, opts->uri, table_format)); + + testutil_check(session->open_cursor( + session, opts->uri, NULL, NULL, &cursor)); + + while ((ret = cursor->next(cursor)) == 0) { + testutil_check(cursor->get_key(cursor, &r)); + testutil_check(cursor->get_value(cursor, &ts, + &f[0], &f[1], &f[2], &f[3], &f[4], &f[5], &f[6], &f[7])); + + if (!opts->verbose) + continue; + + printf("(%" PRIu64 ",%llu)\t\t%" PRIu64, + (r >> 40), r & ((1ULL << 40) - 1), ts); + + for (i = 0; i < NR_FIELDS; i++) + printf("\t%" PRIu64, f[i]); + printf("\n"); + } + testutil_assert(ret == WT_NOTFOUND); + + testutil_cleanup(opts); + + return (0); +} diff --git a/src/third_party/wiredtiger/test/csuite/wt2246_col_append/main.c b/src/third_party/wiredtiger/test/csuite/wt2246_col_append/main.c new file mode 100644 index 00000000000..3ac96677ed0 --- /dev/null +++ b/src/third_party/wiredtiger/test/csuite/wt2246_col_append/main.c @@ -0,0 +1,158 @@ +/*- + * Public Domain 2014-2016 MongoDB, Inc. + * Public Domain 2008-2014 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "test_util.h" + +/* + * JIRA ticket reference: WT-2246 + * Test case description: The column-store search routine used to search the + * target leaf page even when the cursor is configured with append and we're + * allocating a record number. That was inefficient, this test case + * demonstrates the inefficiency. + * Failure mode: It isn't simple to make this test case failure explicit since + * it is demonstrating an inefficiency rather than a correctness bug. + */ + +/* Don't move into shared function there is a cross platform solution */ +#include <signal.h> + +#define MILLION 1000000 + +void (*custom_die)(void) = NULL; + +/* Needs to be global for signal handling. */ +TEST_OPTS *opts, _opts; + +static void +page_init(uint64_t n) +{ + WT_CONNECTION *conn; + WT_CURSOR *cursor; + WT_SESSION *session; + uint64_t recno, vrecno; + char buf[64]; + + conn = opts->conn; + + testutil_check(conn->open_session(conn, NULL, NULL, &session)); + testutil_check( + session->open_cursor(session, opts->uri, NULL, "append", &cursor)); + + vrecno = 0; + buf[0] = '\2'; + for (recno = 1;; ++recno) { + if (opts->table_type == TABLE_FIX) + cursor->set_value(cursor, buf[0]); + else { + if (recno % 3 == 0) + ++vrecno; + snprintf(buf, + sizeof(buf), "%" PRIu64 " VALUE ------", vrecno); + cursor->set_value(cursor, buf); + } + testutil_check(cursor->insert(cursor)); + testutil_check(cursor->get_key(cursor, &opts->max_inserted_id)); + if (opts->max_inserted_id >= n) + break; + } +} + +/* + * TODO: Platform specific? + */ +static void +onsig(int signo) +{ + WT_UNUSED(signo); + opts->running = false; +} + +#define N_APPEND_THREADS 6 +#define N_RECORDS (20 * WT_MILLION) + +int +main(int argc, char *argv[]) +{ + WT_SESSION *session; + clock_t ce, cs; + pthread_t idlist[100]; + uint64_t i, id; + char buf[100]; + + opts = &_opts; + memset(opts, 0, sizeof(*opts)); + opts->table_type = TABLE_ROW; + opts->n_append_threads = N_APPEND_THREADS; + opts->nrecords = N_RECORDS; + testutil_check(testutil_parse_opts(argc, argv, opts)); + testutil_make_work_dir(opts->home); + + snprintf(buf, sizeof(buf), + "create," + "cache_size=%s," + "eviction=(threads_max=5)," + "statistics=(fast)", + opts->table_type == TABLE_FIX ? "500MB" : "2GB"); + testutil_check(wiredtiger_open(opts->home, NULL, buf, &opts->conn)); + testutil_check( + opts->conn->open_session(opts->conn, NULL, NULL, &session)); + snprintf(buf, sizeof(buf), + "key_format=r,value_format=%s," + "allocation_size=4K,leaf_page_max=64K", + opts->table_type == TABLE_FIX ? "8t" : "S"); + testutil_check(session->create(session, opts->uri, buf)); + testutil_check(session->close(session, NULL)); + + page_init(5000); + + /* Force to disk and re-open. */ + testutil_check(opts->conn->close(opts->conn, NULL)); + testutil_check(wiredtiger_open(opts->home, NULL, NULL, &opts->conn)); + + (void)signal(SIGINT, onsig); + + cs = clock(); + id = 0; + for (i = 0; i < opts->n_append_threads; ++i, ++id) { + printf("append: %" PRIu64 "\n", id); + testutil_check(pthread_create( + &idlist[id], NULL, thread_append, (void *)opts)); + } + + for (i = 0; i < id; ++i) + testutil_check(pthread_join(idlist[i], NULL)); + + ce = clock(); + printf("%" PRIu64 "M records: %.2lf processor seconds\n", + opts->max_inserted_id / MILLION, + (ce - cs) / (double)CLOCKS_PER_SEC); + + testutil_cleanup(opts); + /* NOTREACHED */ + + return (0); +} diff --git a/src/third_party/wiredtiger/test/csuite/wt2535_insert_race/main.c b/src/third_party/wiredtiger/test/csuite/wt2535_insert_race/main.c new file mode 100644 index 00000000000..5eaca3279b6 --- /dev/null +++ b/src/third_party/wiredtiger/test/csuite/wt2535_insert_race/main.c @@ -0,0 +1,159 @@ +/*- + * Public Domain 2014-2016 MongoDB, Inc. + * Public Domain 2008-2014 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "test_util.h" + +/* + * JIRA ticket reference: WT-2535 + * Test case description: This is a test case that looks for lost updates to + * a single record. That is multiple threads each do the same number of read + * modify write operations on a single record. At the end verify that the + * data contains the expected value. + * Failure mode: Check that the data is correct at the end of the run. + */ + +void (*custom_die)(void) = NULL; + +void *thread_insert_race(void *); + +int +main(int argc, char *argv[]) +{ + TEST_OPTS *opts, _opts; + WT_CURSOR *c; + WT_SESSION *session; + clock_t ce, cs; + pthread_t id[100]; + uint64_t current_value; + int i; + + opts = &_opts; + memset(opts, 0, sizeof(*opts)); + opts->nthreads = 10; + opts->nrecords = 1000; + opts->table_type = TABLE_ROW; + testutil_check(testutil_parse_opts(argc, argv, opts)); + testutil_make_work_dir(opts->home); + + testutil_check(wiredtiger_open(opts->home, NULL, + "create," + "cache_size=2G," + "eviction=(threads_max=5)," + "statistics=(fast)", &opts->conn)); + testutil_check( + opts->conn->open_session(opts->conn, NULL, NULL, &session)); + testutil_check(session->create(session, opts->uri, + "key_format=Q,value_format=Q," + "leaf_page_max=32k,")); + + /* Create the single record. */ + testutil_check( + session->open_cursor(session, opts->uri, NULL, NULL, &c)); + c->set_key(c, 1); + c->set_value(c, 0); + testutil_check(c->insert(c)); + testutil_check(c->close(c)); + cs = clock(); + for (i = 0; i < (int)opts->nthreads; ++i) { + testutil_check(pthread_create( + &id[i], NULL, thread_insert_race, (void *)opts)); + } + while (--i >= 0) + testutil_check(pthread_join(id[i], NULL)); + testutil_check( + session->open_cursor(session, opts->uri, NULL, NULL, &c)); + c->set_key(c, 1); + testutil_check(c->search(c)); + testutil_check(c->get_value(c, ¤t_value)); + if (current_value != opts->nthreads * opts->nrecords) { + fprintf(stderr, + "ERROR: didn't get expected number of changes\n"); + fprintf(stderr, "got: %" PRIu64 ", expected: %" PRIu64 "\n", + current_value, opts->nthreads * opts->nrecords); + return (EXIT_FAILURE); + } + testutil_check(session->close(session, NULL)); + ce = clock(); + printf("%" PRIu64 ": %.2lf\n", + opts->nrecords, (ce - cs) / (double)CLOCKS_PER_SEC); + + testutil_cleanup(opts); + return (EXIT_SUCCESS); +} + +/* + * Append to a table in a "racy" fashion - that is attempt to insert the + * same record another thread is likely to also be inserting. + */ +void * +thread_insert_race(void *arg) +{ + TEST_OPTS *opts; + WT_CONNECTION *conn; + WT_CURSOR *cursor; + WT_SESSION *session; + uint64_t i, value; + int ret; + + opts = (TEST_OPTS *)arg; + conn = opts->conn; + + testutil_check(conn->open_session(conn, NULL, NULL, &session)); + testutil_check(session->open_cursor( + session, opts->uri, NULL, NULL, &cursor)); + + printf("Running insert thread\n"); + for (i = 0; i < opts->nrecords; ++i) { + testutil_check( + session->begin_transaction(session, "isolation=snapshot")); + cursor->set_key(cursor, 1); + testutil_check(cursor->search(cursor)); + testutil_check(cursor->get_value(cursor, &value)); + cursor->set_key(cursor, 1); + cursor->set_value(cursor, value + 1); + if ((ret = cursor->update(cursor)) != 0) { + if (ret == WT_ROLLBACK) { + testutil_check(session->rollback_transaction( + session, NULL)); + i--; + continue; + } + printf("Error in update: %d\n", ret); + } + testutil_check(session->commit_transaction(session, NULL)); + if (i % 10000 == 0) { + printf("insert: %" PRIu64 "\r", i); + fflush(stdout); + } + } + if (i > 10000) + printf("\n"); + + opts->running = false; + + return (NULL); +} diff --git a/src/third_party/wiredtiger/test/cursor_order/Makefile.am b/src/third_party/wiredtiger/test/cursor_order/Makefile.am index 8afb8f122d8..c98cf1fa047 100644 --- a/src/third_party/wiredtiger/test/cursor_order/Makefile.am +++ b/src/third_party/wiredtiger/test/cursor_order/Makefile.am @@ -1,10 +1,12 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = cursor_order -cursor_order_LDADD = $(top_builddir)/libwiredtiger.la - cursor_order_SOURCES = cursor_order_file.c cursor_order_ops.c cursor_order.c + +cursor_order_LDADD = $(top_builddir)/test/utility/libtest_util.la +cursor_order_LDADD +=$(top_builddir)/libwiredtiger.la cursor_order_LDFLAGS = -static TESTS = $(noinst_PROGRAMS) diff --git a/src/third_party/wiredtiger/test/cursor_order/cursor_order.h b/src/third_party/wiredtiger/test/cursor_order/cursor_order.h index dd49fce124b..98a7d03c6f3 100644 --- a/src/third_party/wiredtiger/test/cursor_order/cursor_order.h +++ b/src/third_party/wiredtiger/test/cursor_order/cursor_order.h @@ -28,7 +28,7 @@ #include <signal.h> -#include "test_util.i" +#include "test_util.h" #define FNAME "file:cursor_order.%03d" /* File name */ diff --git a/src/third_party/wiredtiger/test/fops/Makefile.am b/src/third_party/wiredtiger/test/fops/Makefile.am index a4fa7175f1b..f8a76de82bc 100644 --- a/src/third_party/wiredtiger/test/fops/Makefile.am +++ b/src/third_party/wiredtiger/test/fops/Makefile.am @@ -1,10 +1,13 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = t -t_LDADD = $(top_builddir)/libwiredtiger.la t_SOURCES = thread.h file.c fops.c t.c + +t_LDADD = $(top_builddir)/test/utility/libtest_util.la +t_LDADD +=$(top_builddir)/libwiredtiger.la t_LDFLAGS = -static # Run this during a "make check" smoke test. diff --git a/src/third_party/wiredtiger/test/fops/thread.h b/src/third_party/wiredtiger/test/fops/thread.h index 630c2061285..89b7984a166 100644 --- a/src/third_party/wiredtiger/test/fops/thread.h +++ b/src/third_party/wiredtiger/test/fops/thread.h @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" #include <signal.h> diff --git a/src/third_party/wiredtiger/test/format/Makefile.am b/src/third_party/wiredtiger/test/format/Makefile.am index 8a2e2b49e4b..5d946e5b63d 100644 --- a/src/third_party/wiredtiger/test/format/Makefile.am +++ b/src/third_party/wiredtiger/test/format/Makefile.am @@ -1,21 +1,24 @@ -AM_CPPFLAGS = -I$(top_builddir) \ - -I$(top_srcdir)/src/include -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility if HAVE_BERKELEY_DB -AM_CPPFLAGS += -DHAVE_BERKELEY_DB \ - -DBERKELEY_DB_PATH=\"$(BERKELEY_DB_PATH)\" -I$(BERKELEY_DB_PATH)/include +AM_CPPFLAGS +=-DHAVE_BERKELEY_DB +AM_CPPFLAGS +=-DBERKELEY_DB_PATH=\"$(BERKELEY_DB_PATH)\" +AM_CPPFLAGS +=-I$(BERKELEY_DB_PATH)/include endif noinst_PROGRAMS = t noinst_SCRIPTS = s_dumpcmp t_SOURCES =\ - config.h format.h backup.c bulk.c compact.c config.c lrt.c ops.c \ - rebalance.c salvage.c t.c util.c wts.c + backup.c bulk.c compact.c config.c lrt.c ops.c rebalance.c \ + salvage.c t.c util.c wts.c if HAVE_BERKELEY_DB t_SOURCES += bdb.c endif -t_LDADD = $(top_builddir)/libwiredtiger.la +t_LDADD = $(top_builddir)/test/utility/libtest_util.la +t_LDADD +=$(top_builddir)/libwiredtiger.la if HAVE_BERKELEY_DB t_LDADD += -L$(BERKELEY_DB_PATH)/lib -ldb endif diff --git a/src/third_party/wiredtiger/test/format/format.h b/src/third_party/wiredtiger/test/format/format.h index beaabe7e83c..8fd9b113311 100644 --- a/src/third_party/wiredtiger/test/format/format.h +++ b/src/third_party/wiredtiger/test/format/format.h @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" #ifdef BDB #include <assert.h> diff --git a/src/third_party/wiredtiger/test/format/ops.c b/src/third_party/wiredtiger/test/format/ops.c index 9275d7f3856..7fd5563f486 100644 --- a/src/third_party/wiredtiger/test/format/ops.c +++ b/src/third_party/wiredtiger/test/format/ops.c @@ -530,9 +530,16 @@ ops(void *arg) ckpt_config = ckpt_name; } - testutil_checkfmt( - session->checkpoint(session, ckpt_config), - "%s", ckpt_config == NULL ? "" : ckpt_config); + ret = session->checkpoint(session, ckpt_config); + /* + * We may be trying to create a named checkpoint while + * we hold a cursor open to the previous checkpoint. + * Tolerate EBUSY. + */ + if (ret != 0 && ret != EBUSY) + testutil_die(ret, "%s", + ckpt_config == NULL ? "" : ckpt_config); + ret = 0; if (ckpt_config != NULL) testutil_check( diff --git a/src/third_party/wiredtiger/test/format/util.c b/src/third_party/wiredtiger/test/format/util.c index f2b4d18029e..cebe2153b3e 100644 --- a/src/third_party/wiredtiger/test/format/util.c +++ b/src/third_party/wiredtiger/test/format/util.c @@ -213,16 +213,10 @@ val_gen(WT_RAND_STATE *rnd, WT_ITEM *value, uint64_t keyno) } /* - * Start the data with a 10-digit number. - * - * For row and non-repeated variable-length column-stores, change the - * leading number to ensure every data item is unique. For repeated - * variable-length column-stores (that is, to test run-length encoding), - * use the same data value all the time. + * Data items have unique leading numbers by default and random lengths; + * variable-length column-stores use a duplicate data value to test RLE. */ - if ((g.type == ROW || g.type == VAR) && - g.c_repeat_data_pct != 0 && - mmrand(rnd, 1, 100) < g.c_repeat_data_pct) { + if (g.type == VAR && mmrand(rnd, 1, 100) < g.c_repeat_data_pct) { (void)strcpy(p, "DUPLICATEV"); p[10] = '/'; value->size = val_dup_data_len; diff --git a/src/third_party/wiredtiger/test/huge/Makefile.am b/src/third_party/wiredtiger/test/huge/Makefile.am index 151d3a40dd4..894bff5eace 100644 --- a/src/third_party/wiredtiger/test/huge/Makefile.am +++ b/src/third_party/wiredtiger/test/huge/Makefile.am @@ -1,9 +1,12 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = t t_SOURCES = huge.c -t_LDADD = $(top_builddir)/libwiredtiger.la + +t_LDADD = $(top_builddir)/test/utility/libtest_util.la +t_LDADD +=$(top_builddir)/libwiredtiger.la t_LDFLAGS = -static # Run this during a "make check" smoke test. diff --git a/src/third_party/wiredtiger/test/huge/huge.c b/src/third_party/wiredtiger/test/huge/huge.c index e7bfd08882f..1e104a705f2 100644 --- a/src/third_party/wiredtiger/test/huge/huge.c +++ b/src/third_party/wiredtiger/test/huge/huge.c @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" static char home[512]; /* Program working dir */ static const char *progname; /* Program name */ diff --git a/src/third_party/wiredtiger/test/manydbs/Makefile.am b/src/third_party/wiredtiger/test/manydbs/Makefile.am index d347868aa4f..2bc47ad7f2e 100644 --- a/src/third_party/wiredtiger/test/manydbs/Makefile.am +++ b/src/third_party/wiredtiger/test/manydbs/Makefile.am @@ -1,9 +1,12 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = t t_SOURCES = manydbs.c -t_LDADD = $(top_builddir)/libwiredtiger.la + +t_LDADD = $(top_builddir)/test/utility/libtest_util.la +t_LDADD +=$(top_builddir)/libwiredtiger.la t_LDFLAGS = -static # Run this during a "make check" smoke test. diff --git a/src/third_party/wiredtiger/test/manydbs/manydbs.c b/src/third_party/wiredtiger/test/manydbs/manydbs.c index 4ab455f3620..d9639198c34 100644 --- a/src/third_party/wiredtiger/test/manydbs/manydbs.c +++ b/src/third_party/wiredtiger/test/manydbs/manydbs.c @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" #define HOME_SIZE 512 #define HOME_BASE "WT_TEST" diff --git a/src/third_party/wiredtiger/test/packing/Makefile.am b/src/third_party/wiredtiger/test/packing/Makefile.am index 0e7c8cc8b2e..c9128100cc3 100644 --- a/src/third_party/wiredtiger/test/packing/Makefile.am +++ b/src/third_party/wiredtiger/test/packing/Makefile.am @@ -1,8 +1,11 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = intpack-test intpack-test2 intpack-test3 packing-test -LDADD = $(top_builddir)/libwiredtiger.la + +LDADD = $(top_builddir)/test/utility/libtest_util.la +LDADD +=$(top_builddir)/libwiredtiger.la LDFLAGS = -static TESTS = smoke.sh diff --git a/src/third_party/wiredtiger/test/packing/intpack-test.c b/src/third_party/wiredtiger/test/packing/intpack-test.c index 6412ed296aa..76851b38e35 100644 --- a/src/third_party/wiredtiger/test/packing/intpack-test.c +++ b/src/third_party/wiredtiger/test/packing/intpack-test.c @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" void (*custom_die)(void) = NULL; diff --git a/src/third_party/wiredtiger/test/packing/intpack-test2.c b/src/third_party/wiredtiger/test/packing/intpack-test2.c index e9443ad7ed1..a7d31329069 100644 --- a/src/third_party/wiredtiger/test/packing/intpack-test2.c +++ b/src/third_party/wiredtiger/test/packing/intpack-test2.c @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" void (*custom_die)(void) = NULL; diff --git a/src/third_party/wiredtiger/test/packing/intpack-test3.c b/src/third_party/wiredtiger/test/packing/intpack-test3.c index 328b45d1bf7..aac0178578f 100644 --- a/src/third_party/wiredtiger/test/packing/intpack-test3.c +++ b/src/third_party/wiredtiger/test/packing/intpack-test3.c @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" void (*custom_die)(void) = NULL; @@ -42,6 +42,7 @@ test_value(int64_t val) uint64_t uinput, uoutput; size_t used_len; + soutput = 0; /* -Werror=maybe-uninitialized */ sinput = val; soutput = 0; /* Make GCC happy. */ p = buf; diff --git a/src/third_party/wiredtiger/test/packing/packing-test.c b/src/third_party/wiredtiger/test/packing/packing-test.c index 706eeb0935c..f251c17eb67 100644 --- a/src/third_party/wiredtiger/test/packing/packing-test.c +++ b/src/third_party/wiredtiger/test/packing/packing-test.c @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" void (*custom_die)(void) = NULL; diff --git a/src/third_party/wiredtiger/test/readonly/Makefile.am b/src/third_party/wiredtiger/test/readonly/Makefile.am index 8028e2ab845..84092e76f02 100644 --- a/src/third_party/wiredtiger/test/readonly/Makefile.am +++ b/src/third_party/wiredtiger/test/readonly/Makefile.am @@ -1,9 +1,12 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = t t_SOURCES = readonly.c -t_LDADD = $(top_builddir)/libwiredtiger.la + +t_LDADD = $(top_builddir)/test/utility/libtest_util.la +t_LDADD +=$(top_builddir)/libwiredtiger.la t_LDFLAGS = -static # Run this during a "make check" smoke test. diff --git a/src/third_party/wiredtiger/test/readonly/readonly.c b/src/third_party/wiredtiger/test/readonly/readonly.c index a35e7ee23fc..402b99d7d29 100644 --- a/src/third_party/wiredtiger/test/readonly/readonly.c +++ b/src/third_party/wiredtiger/test/readonly/readonly.c @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" #include <sys/wait.h> diff --git a/src/third_party/wiredtiger/test/recovery/Makefile.am b/src/third_party/wiredtiger/test/recovery/Makefile.am index 6865d5edf3e..19fc48dce47 100644 --- a/src/third_party/wiredtiger/test/recovery/Makefile.am +++ b/src/third_party/wiredtiger/test/recovery/Makefile.am @@ -1,13 +1,16 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = random-abort truncated-log random_abort_SOURCES = random-abort.c -random_abort_LDADD = $(top_builddir)/libwiredtiger.la +random_abort_LDADD = $(top_builddir)/test/utility/libtest_util.la +random_abort_LDADD +=$(top_builddir)/libwiredtiger.la random_abort_LDFLAGS = -static truncated_log_SOURCES = truncated-log.c -truncated_log_LDADD = $(top_builddir)/libwiredtiger.la +truncated_log_LDADD = $(top_builddir)/test/utility/libtest_util.la +truncated_log_LDADD +=$(top_builddir)/libwiredtiger.la truncated_log_LDFLAGS = -static # Run this during a "make check" smoke test. diff --git a/src/third_party/wiredtiger/test/recovery/random-abort.c b/src/third_party/wiredtiger/test/recovery/random-abort.c index cd7d1b08708..33597245966 100644 --- a/src/third_party/wiredtiger/test/recovery/random-abort.c +++ b/src/third_party/wiredtiger/test/recovery/random-abort.c @@ -26,19 +26,10 @@ * OTHER DEALINGS IN THE SOFTWARE. */ +#include "test_util.h" + #include <sys/wait.h> -#include <errno.h> #include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#ifndef _WIN32 -#include <unistd.h> -#endif - -#include <wiredtiger.h> - -#include "test_util.i" static char home[512]; /* Program working dir */ static const char *progname; /* Program name */ diff --git a/src/third_party/wiredtiger/test/recovery/truncated-log.c b/src/third_party/wiredtiger/test/recovery/truncated-log.c index e099873e5b9..3b99ea2c932 100644 --- a/src/third_party/wiredtiger/test/recovery/truncated-log.c +++ b/src/third_party/wiredtiger/test/recovery/truncated-log.c @@ -26,23 +26,15 @@ * OTHER DEALINGS IN THE SOFTWARE. */ +#include "test_util.h" + #include <sys/wait.h> -#include <errno.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#ifndef _WIN32 -#include <unistd.h> -#else + +#ifdef _WIN32 /* snprintf is not supported on <= VS2013 */ #define snprintf _snprintf #endif -#include <wiredtiger.h> - -#include "test_util.i" - static char home[512]; /* Program working dir */ static const char *progname; /* Program name */ static const char * const uri = "table:main"; diff --git a/src/third_party/wiredtiger/test/salvage/Makefile.am b/src/third_party/wiredtiger/test/salvage/Makefile.am index 0fd46aefcb1..a3c49b9c41a 100644 --- a/src/third_party/wiredtiger/test/salvage/Makefile.am +++ b/src/third_party/wiredtiger/test/salvage/Makefile.am @@ -1,9 +1,12 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = t t_SOURCES = salvage.c -t_LDADD = $(top_builddir)/libwiredtiger.la + +t_LDADD = $(top_builddir)/test/utility/libtest_util.la +t_LDADD +=$(top_builddir)/libwiredtiger.la t_LDFLAGS = -static # Run this during a "make check" smoke test. diff --git a/src/third_party/wiredtiger/test/salvage/salvage.c b/src/third_party/wiredtiger/test/salvage/salvage.c index f264be99e2b..497902e07b8 100644 --- a/src/third_party/wiredtiger/test/salvage/salvage.c +++ b/src/third_party/wiredtiger/test/salvage/salvage.c @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" #include <assert.h> diff --git a/src/third_party/wiredtiger/test/suite/test_dump.py b/src/third_party/wiredtiger/test/suite/test_dump.py index fc1422155e2..d0163066639 100644 --- a/src/third_party/wiredtiger/test/suite/test_dump.py +++ b/src/third_party/wiredtiger/test/suite/test_dump.py @@ -26,7 +26,7 @@ # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. -import os +import os, shutil import wiredtiger, wttest from helper import \ complex_populate, complex_populate_check, \ @@ -42,6 +42,7 @@ class test_dump(wttest.WiredTigerTestCase, suite_subprocess): dir='dump.dir' # Backup directory name name = 'test_dump' + name2 = 'test_dumpb' nentries = 2500 dumpfmt = [ @@ -109,6 +110,7 @@ class test_dump(wttest.WiredTigerTestCase, suite_subprocess): # Create the object. uri = self.uri + self.name + uri2 = self.uri + self.name2 self.populate(self, uri, self.config + ',key_format=' + self.keyfmt, self.nentries) @@ -130,19 +132,15 @@ class test_dump(wttest.WiredTigerTestCase, suite_subprocess): self.assertEqual(not s1.symmetric_difference(s2), True) # Check the object's contents - conn = self.wiredtiger_open(self.dir) - session = conn.open_session() + self.reopen_conn(self.dir) self.populate_check(self, uri, self.nentries) - conn.close() - # Re-load the object again. + # Re-load the object again in the original directory. + self.reopen_conn('.') self.runWt(['-h', self.dir, 'load', '-f', 'dump.out']) # Check the contents, they shouldn't have changed. - conn = self.wiredtiger_open(self.dir) - session = conn.open_session() self.populate_check(self, uri, self.nentries) - conn.close() # Re-load the object again, but confirm -n (no overwrite) fails. self.runWt(['-h', self.dir, @@ -158,5 +156,14 @@ class test_dump(wttest.WiredTigerTestCase, suite_subprocess): self.check_non_empty_file('dumpidx.out') self.compare_dump_values('dump.out', 'dumpidx.out') + # Re-load the object into a different table uri + shutil.rmtree(self.dir) + os.mkdir(self.dir) + self.runWt(['-h', self.dir, 'load', '-r', self.name2, '-f', 'dump.out']) + + # Check the contents in the new table. + self.reopen_conn(self.dir) + self.populate_check(self, uri2, self.nentries) + if __name__ == '__main__': wttest.run() diff --git a/src/third_party/wiredtiger/test/suite/wttest.py b/src/third_party/wiredtiger/test/suite/wttest.py index a1945b4325d..f7a2a5c8890 100644 --- a/src/third_party/wiredtiger/test/suite/wttest.py +++ b/src/third_party/wiredtiger/test/suite/wttest.py @@ -259,20 +259,20 @@ class WiredTigerTestCase(unittest.TestCase): self.conn.close() self.conn = None - def open_conn(self): + def open_conn(self, directory="."): """ Open the connection if already closed. """ if self.conn == None: - self.conn = self.setUpConnectionOpen(".") + self.conn = self.setUpConnectionOpen(directory) self.session = self.setUpSessionOpen(self.conn) - def reopen_conn(self): + def reopen_conn(self, directory="."): """ Reopen the connection. """ self.close_conn() - self.open_conn() + self.open_conn(directory) def setUp(self): if not hasattr(self.__class__, 'wt_ntests'): diff --git a/src/third_party/wiredtiger/test/thread/Makefile.am b/src/third_party/wiredtiger/test/thread/Makefile.am index ead783185f8..58b715d4a80 100644 --- a/src/third_party/wiredtiger/test/thread/Makefile.am +++ b/src/third_party/wiredtiger/test/thread/Makefile.am @@ -1,9 +1,12 @@ -AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include \ - -I$(top_srcdir)/test/utility +AM_CPPFLAGS = -I$(top_builddir) +AM_CPPFLAGS +=-I$(top_srcdir)/src/include +AM_CPPFLAGS +=-I$(top_srcdir)/test/utility noinst_PROGRAMS = t -t_LDADD = $(top_builddir)/libwiredtiger.la -t_SOURCES = thread.h file.c rw.c stats.c t.c +t_SOURCES = file.c rw.c stats.c t.c + +t_LDADD = $(top_builddir)/test/utility/libtest_util.la +t_LDADD +=$(top_builddir)/libwiredtiger.la t_LDFLAGS = -static TESTS = smoke.sh diff --git a/src/third_party/wiredtiger/test/thread/thread.h b/src/third_party/wiredtiger/test/thread/thread.h index d5f0f42ea35..edcb919ec32 100644 --- a/src/third_party/wiredtiger/test/thread/thread.h +++ b/src/third_party/wiredtiger/test/thread/thread.h @@ -26,7 +26,7 @@ * OTHER DEALINGS IN THE SOFTWARE. */ -#include "test_util.i" +#include "test_util.h" #include <signal.h> diff --git a/src/third_party/wiredtiger/test/utility/Makefile.am b/src/third_party/wiredtiger/test/utility/Makefile.am new file mode 100644 index 00000000000..a2923eb41a8 --- /dev/null +++ b/src/third_party/wiredtiger/test/utility/Makefile.am @@ -0,0 +1,4 @@ +AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/include + +libtest_util_la_SOURCES = misc.c parse_opts.c thread.c +noinst_LTLIBRARIES = libtest_util.la diff --git a/src/third_party/wiredtiger/test/utility/test_util.i b/src/third_party/wiredtiger/test/utility/misc.c index 833eddd87aa..dfc655dec1a 100644 --- a/src/third_party/wiredtiger/test/utility/test_util.i +++ b/src/third_party/wiredtiger/test/utility/misc.c @@ -25,37 +25,13 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ -#include "wt_internal.h" /* For __wt_XXX */ - -#ifdef _WIN32 -#include "windows_shim.h" -#endif - -#ifdef _WIN32 - #define DIR_DELIM '\\' - #define RM_COMMAND "rd /s /q " -#else - #define DIR_DELIM '/' - #define RM_COMMAND "rm -rf " -#endif - -#define DEFAULT_DIR "WT_TEST" -#define MKDIR_COMMAND "mkdir " - -/* Allow tests to add their own death handling. */ -extern void (*custom_die)(void); - -static void testutil_die(int, const char *, ...) -#if defined(__GNUC__) -__attribute__((__noreturn__)) -#endif -; +#include "test_util.h" /* * die -- * Report an error and quit. */ -static void +void testutil_die(int e, const char *fmt, ...) { va_list ap; @@ -77,32 +53,11 @@ testutil_die(int e, const char *fmt, ...) } /* - * testutil_check -- - * Complain and quit if a function call fails. - */ -#define testutil_check(call) do { \ - int __r; \ - if ((__r = (call)) != 0) \ - testutil_die(__r, "%s/%d: %s", __func__, __LINE__, #call);\ -} while (0) - -/* - * testutil_checkfmt -- - * Complain and quit if a function call fails, with additional arguments. - */ -#define testutil_checkfmt(call, fmt, ...) do { \ - int __r; \ - if ((__r = (call)) != 0) \ - testutil_die(__r, "%s/%d: %s: " fmt, \ - __func__, __LINE__, #call, __VA_ARGS__); \ -} while (0) - -/* * testutil_work_dir_from_path -- * Takes a buffer, its size and the intended work directory. * Creates the full intended work directory in buffer. */ -static inline void +void testutil_work_dir_from_path(char *buffer, size_t len, const char *dir) { /* If no directory is provided, use the default. */ @@ -120,7 +75,7 @@ testutil_work_dir_from_path(char *buffer, size_t len, const char *dir) * testutil_clean_work_dir -- * Remove the work directory. */ -static inline void +void testutil_clean_work_dir(char *dir) { size_t len; @@ -143,7 +98,7 @@ testutil_clean_work_dir(char *dir) * testutil_make_work_dir -- * Delete the existing work directory, then create a new one. */ -static inline void +void testutil_make_work_dir(char *dir) { size_t len; @@ -165,10 +120,29 @@ testutil_make_work_dir(char *dir) } /* + * testutil_cleanup -- + * Delete the existing work directory and free the options structure. + */ +void +testutil_cleanup(TEST_OPTS *opts) +{ + if (opts->conn != NULL) + testutil_check(opts->conn->close(opts->conn, NULL)); + + if (!opts->preserve) + testutil_clean_work_dir(opts->home); + + free(opts->conn_config); + free(opts->table_config); + free(opts->uri); + free(opts->home); +} + +/* * dcalloc -- * Call calloc, dying on failure. */ -static inline void * +void * dcalloc(size_t number, size_t size) { void *p; @@ -182,7 +156,7 @@ dcalloc(size_t number, size_t size) * dmalloc -- * Call malloc, dying on failure. */ -static inline void * +void * dmalloc(size_t len) { void *p; @@ -196,7 +170,7 @@ dmalloc(size_t len) * drealloc -- * Call realloc, dying on failure. */ -static inline void * +void * drealloc(void *p, size_t len) { void *t; @@ -209,7 +183,7 @@ drealloc(void *p, size_t len) * dstrdup -- * Call strdup, dying on failure. */ -static inline void * +void * dstrdup(const void *str) { char *p; diff --git a/src/third_party/wiredtiger/test/utility/parse_opts.c b/src/third_party/wiredtiger/test/utility/parse_opts.c new file mode 100644 index 00000000000..4054f318259 --- /dev/null +++ b/src/third_party/wiredtiger/test/utility/parse_opts.c @@ -0,0 +1,132 @@ +/*- + * Public Domain 2014-2016 MongoDB, Inc. + * Public Domain 2008-2014 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "test_util.h" + +extern int __wt_opterr; /* if error message should be printed */ +extern int __wt_optind; /* index into parent argv vector */ +extern int __wt_optopt; /* character checked for validity */ +extern int __wt_optreset; /* reset getopt */ +extern char *__wt_optarg; /* argument associated with option */ + +/* + * testutil_parse_opts -- + * Parse command line options for a test case. + */ +int +testutil_parse_opts(int argc, char * const *argv, TEST_OPTS *opts) +{ + int ch; + size_t len; + + opts->preserve = false; + opts->running = true; + opts->verbose = false; + + if ((opts->progname = strrchr(argv[0], '/')) == NULL) + opts->progname = argv[0]; + else + ++opts->progname; + + while ((ch = __wt_getopt(opts->progname, + argc, argv, "A:h:n:o:pR:T:t:vW:")) != EOF) + switch (ch) { + case 'A': /* Number of append threads */ + opts->n_append_threads = (uint64_t)atoll(__wt_optarg); + break; + case 'h': /* Home directory */ + opts->home = __wt_optarg; + break; + case 'n': /* Number of records */ + opts->nrecords = (uint64_t)atoll(__wt_optarg); + break; + case 'o': /* Number of operations */ + opts->nops = (uint64_t)atoll(__wt_optarg); + break; + case 'p': /* Preserve directory contents */ + opts->preserve = true; + break; + case 'R': /* Number of reader threads */ + opts->n_read_threads = (uint64_t)atoll(__wt_optarg); + break; + case 'T': /* Number of threads */ + opts->nthreads = (uint64_t)atoll(__wt_optarg); + break; + case 't': /* Table type */ + switch (__wt_optarg[0]) { + case 'C': + case 'c': + opts->table_type = TABLE_COL; + break; + case 'F': + case 'f': + opts->table_type = TABLE_FIX; + break; + case 'R': + case 'r': + opts->table_type = TABLE_ROW; + break; + } + break; + case 'v': + opts->verbose = true; + break; + case 'W': /* Number of writer threads */ + opts->n_write_threads = (uint64_t)atoll(__wt_optarg); + break; + case '?': + default: + (void)fprintf(stderr, "usage: %s " + "[-A append thread count] " + "[-h home] " + "[-n record count] " + "[-o op count] " + "[-p] " + "[-R read thread count] " + "[-T thread count] " + "[-t c|f|r table type] " + "[-v] " + "[-W write thread count] ", + opts->progname); + return (1); + } + + /* + * Setup the home directory. It needs to be unique for every test + * or the auto make parallel tester gets upset. + */ + len = strlen("WT_TEST.") + strlen(opts->progname) + 10; + opts->home = dmalloc(len); + snprintf(opts->home, len, "WT_TEST.%s", opts->progname); + + /* Setup the default URI string */ + len = strlen("table:") + strlen(opts->progname) + 10; + opts->uri = dmalloc(len); + snprintf(opts->uri, len, "table:%s", opts->progname); + + return (0); +} diff --git a/src/third_party/wiredtiger/test/utility/test_util.h b/src/third_party/wiredtiger/test/utility/test_util.h new file mode 100644 index 00000000000..6417c5a326b --- /dev/null +++ b/src/third_party/wiredtiger/test/utility/test_util.h @@ -0,0 +1,128 @@ +/*- + * Public Domain 2014-2016 MongoDB, Inc. + * Public Domain 2008-2014 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include "wt_internal.h" /* For __wt_XXX */ + +#ifdef _WIN32 + #define DIR_DELIM '\\' + #define RM_COMMAND "rd /s /q " +#else + #define DIR_DELIM '/' + #define RM_COMMAND "rm -rf " +#endif + +#define DEFAULT_DIR "WT_TEST" +#define MKDIR_COMMAND "mkdir " + +#ifdef _WIN32 +#include "windows_shim.h" +#endif + +/* Generic option parsing structure shared by all test cases. */ +typedef struct { + char *home; + char *progname; + enum { TABLE_COL=1, /* Fixed-length column store */ + TABLE_FIX=2, /* Variable-length column store */ + TABLE_ROW=3 /* Row-store */ + } table_type; + bool preserve; /* Don't remove files on exit */ + bool verbose; /* Run in verbose mode */ + uint64_t nrecords; /* Number of records */ + uint64_t nops; /* Number of operations */ + uint64_t nthreads; /* Number of threads */ + uint64_t n_append_threads; /* Number of append threads */ + uint64_t n_read_threads; /* Number of read threads */ + uint64_t n_write_threads; /* Number of write threads */ + + /* + * Fields commonly shared within a test program. The test cleanup + * function will attempt to automatically free and close non-null + * resources. + */ + WT_CONNECTION *conn; + char *conn_config; + WT_SESSION *session; + bool running; + char *table_config; + char *uri; + volatile uint64_t next_threadid; + uint64_t max_inserted_id; +} TEST_OPTS; + +/* + * testutil_assert -- + * Complain and quit if something isn't true. + */ +#define testutil_assert(a) do { \ + if (!(a)) \ + testutil_die(0, "%s/%d: %s", __func__, __LINE__, #a); \ +} while (0) + +/* + * testutil_check -- + * Complain and quit if a function call fails. + */ +#define testutil_check(call) do { \ + int __r; \ + if ((__r = (call)) != 0) \ + testutil_die( \ + __r, "%s/%d: %s", __func__, __LINE__, #call); \ +} while (0) + +/* + * testutil_checkfmt -- + * Complain and quit if a function call fails, with additional arguments. + */ +#define testutil_checkfmt(call, fmt, ...) do { \ + int __r; \ + if ((__r = (call)) != 0) \ + testutil_die(__r, "%s/%d: %s: " fmt, \ + __func__, __LINE__, #call, __VA_ARGS__); \ +} while (0) + +/* Allow tests to add their own death handling. */ +extern void (*custom_die)(void); + +void testutil_die(int, const char *, ...) +#if defined(__GNUC__) +__attribute__((__noreturn__)) +#endif +; + +void *dcalloc(size_t, size_t); +void *dmalloc(size_t); +void *drealloc(void *, size_t); +void *dstrdup(const void *); +void testutil_clean_work_dir(char *); +void testutil_cleanup(TEST_OPTS *); +void testutil_make_work_dir(char *); +int testutil_parse_opts(int, char * const *, TEST_OPTS *); +void testutil_work_dir_from_path(char *, size_t, const char *); +void *thread_append(void *); +void *thread_insert_append(void *); +void *thread_prev(void *); diff --git a/src/third_party/wiredtiger/test/utility/thread.c b/src/third_party/wiredtiger/test/utility/thread.c new file mode 100644 index 00000000000..38465b2f02b --- /dev/null +++ b/src/third_party/wiredtiger/test/utility/thread.c @@ -0,0 +1,141 @@ +/*- + * Public Domain 2014-2016 MongoDB, Inc. + * Public Domain 2008-2014 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "test_util.h" + +/* + * A thread dedicated to appending records into a table. Works with fixed + * length column stores and variable length column stores. + * One thread (the first thread created by an application) checks for a + * terminating condition after each insert. + */ +void * +thread_append(void *arg) +{ + TEST_OPTS *opts; + WT_CONNECTION *conn; + WT_CURSOR *cursor; + WT_SESSION *session; + uint64_t id, recno; + char buf[64]; + + opts = (TEST_OPTS *)arg; + conn = opts->conn; + + id = __wt_atomic_fetch_addv64(&opts->next_threadid, 1); + testutil_check(conn->open_session(conn, NULL, NULL, &session)); + testutil_check( + session->open_cursor(session, opts->uri, NULL, "append", &cursor)); + + buf[0] = '\2'; + for (recno = 1; opts->running; ++recno) { + if (opts->table_type == TABLE_FIX) + cursor->set_value(cursor, buf[0]); + else { + snprintf(buf, sizeof(buf), + "%" PRIu64 " VALUE ------", recno); + cursor->set_value(cursor, buf); + } + testutil_check(cursor->insert(cursor)); + if (id == 0) { + testutil_check( + cursor->get_key(cursor, &opts->max_inserted_id)); + if (opts->max_inserted_id >= opts->nrecords) + opts->running = false; + } + } + + return (NULL); +} + +/* + * Append into a row store table. + */ +void * +thread_insert_append(void *arg) +{ + TEST_OPTS *opts; + WT_CONNECTION *conn; + WT_CURSOR *cursor; + WT_SESSION *session; + uint64_t i; + char kbuf[64]; + + opts = (TEST_OPTS *)arg; + conn = opts->conn; + + testutil_check(conn->open_session(conn, NULL, NULL, &session)); + testutil_check(session->open_cursor( + session, opts->uri, NULL, NULL, &cursor)); + + for (i = 0; i < opts->nrecords; ++i) { + snprintf(kbuf, sizeof(kbuf), "%010d KEY------", (int)i); + cursor->set_key(cursor, kbuf); + cursor->set_value(cursor, "========== VALUE ======="); + testutil_check(cursor->insert(cursor)); + if (i % 100000 == 0) { + printf("insert: %" PRIu64 "\r", i); + fflush(stdout); + } + } + printf("\n"); + + opts->running = false; + + return (NULL); +} + +/* + * Repeatedly walk backwards through the records in a table. + */ +void * +thread_prev(void *arg) +{ + TEST_OPTS *opts; + WT_CURSOR *cursor; + WT_SESSION *session; + int ret; + + opts = (TEST_OPTS *)arg; + ret = 0; + + testutil_check( + opts->conn->open_session(opts->conn, NULL, NULL, &session)); + testutil_check( + session->open_cursor(session, opts->uri, NULL, NULL, &cursor)); + while (opts->running) { + while (opts->running && (ret = cursor->prev(cursor)) == 0) + ; + if (ret == WT_NOTFOUND) + ret = 0; + testutil_check(ret); + } + + testutil_check(session->close(session, NULL)); + return (NULL); +} |