diff options
author | Etienne Petrel <etienne.petrel@mongodb.com> | 2022-08-18 09:24:04 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-08-18 10:27:12 +0000 |
commit | c5184977a8f02168eda34234d013ae1308cf9295 (patch) | |
tree | 0bea59952c73ce7b08b45a2aabf459b1a5a348db /src/third_party/wiredtiger/test/format/trace.c | |
parent | fa9b76cee0ca3ebdc63ac5d54f657b32516e142b (diff) | |
download | mongo-c5184977a8f02168eda34234d013ae1308cf9295.tar.gz |
Import wiredtiger: addbbad09e823a5c1ed8407eb1e7b861e2bead6e from branch mongodb-master
ref: ffba1bcf0f..addbbad09e
for: 6.1.0-rc0
WT-8372 Enhance test/format to mirror writes across tables and verify correctness (#7662)
Diffstat (limited to 'src/third_party/wiredtiger/test/format/trace.c')
-rw-r--r-- | src/third_party/wiredtiger/test/format/trace.c | 121 |
1 files changed, 58 insertions, 63 deletions
diff --git a/src/third_party/wiredtiger/test/format/trace.c b/src/third_party/wiredtiger/test/format/trace.c index 04a2570ce1f..5ed40764449 100644 --- a/src/third_party/wiredtiger/test/format/trace.c +++ b/src/third_party/wiredtiger/test/format/trace.c @@ -28,8 +28,14 @@ #include "format.h" -#define TRACE_DIR "OPS.TRACE" -#define TRACE_INIT_CMD "rm -rf %s/" TRACE_DIR " && mkdir %s/" TRACE_DIR +#define TRACE_CONFIG_CMD(cmd, flag) \ + if ((p = strstr(copy, cmd)) != NULL) { \ + if (strcmp(cmd, "all") == 0) \ + all = true; \ + FLD_SET(g.trace_flags, flag); \ + memset(p, ' ', strlen(cmd)); \ + continue; \ + } /* * trace_config -- @@ -39,29 +45,48 @@ void trace_config(const char *config) { char *copy, *p; + bool all; copy = dstrdup(config); - for (;;) { - if ((p = strstr(copy, "all")) != NULL) { - g.trace_all = true; - memset(p, ' ', strlen("all")); - continue; - } - if ((p = strstr(copy, "local")) != NULL) { - g.trace_local = true; - memset(p, ' ', strlen("local")); + for (all = false;;) { + TRACE_CONFIG_CMD("all", TRACE_ALL); + TRACE_CONFIG_CMD("bulk", TRACE_BULK); + TRACE_CONFIG_CMD("cursor", TRACE_CURSOR); + TRACE_CONFIG_CMD("mirror_fail", TRACE_MIRROR_FAIL); + TRACE_CONFIG_CMD("read", TRACE_READ); + TRACE_CONFIG_CMD("timestamp", TRACE_TIMESTAMP); + TRACE_CONFIG_CMD("txn", TRACE_TXN); + + if ((p = strstr(copy, "retain=")) != NULL) { + g.trace_retain = atoi(p + strlen("retain=")); + for (; *p != '='; ++p) + *p = ' '; + for (*p++ = ' '; __wt_isdigit((u_char)*p); ++p) + *p = ' '; continue; } break; } + if (all) { + FLD_SET(g.trace_flags, TRACE_BULK); + FLD_SET(g.trace_flags, TRACE_CURSOR); + FLD_SET(g.trace_flags, TRACE_READ); + FLD_SET(g.trace_flags, TRACE_TIMESTAMP); + FLD_SET(g.trace_flags, TRACE_TXN); + } for (p = copy; *p != '\0'; ++p) if (*p != ',' && !__wt_isspace((u_char)*p)) testutil_assertfmt(0, "unexpected trace configuration \"%s\"\n", config); free(copy); + + FLD_SET(g.trace_flags, TRACE); } +#define TRACE_DIR "OPS.TRACE" +#define TRACE_INIT_CMD "rm -rf %s/" TRACE_DIR " && mkdir %s/" TRACE_DIR + /* * trace_init -- * Initialize operation tracing. @@ -69,46 +94,30 @@ trace_config(const char *config) void trace_init(void) { - WT_CONNECTION *conn; - WT_SESSION *session; - size_t len; - char *p; - const char *config; + int retain; + char config[100], tracedir[MAX_FORMAT_PATH * 2]; - if (!g.trace) + if (!FLD_ISSET(g.trace_flags, TRACE)) return; - /* Write traces to a separate database by default, optionally write traces to the primary. */ - if (g.trace_local) { - if (!GV(LOGGING)) - testutil_die(EINVAL, - "operation logging to the primary database requires logging be configured for that " - "database"); - - conn = g.wts_conn; - - /* Keep the last N log files. */ - testutil_check(conn->reconfigure(conn, "debug_mode=(log_retention=10)")); - } else { - len = strlen(g.home) * 2 + strlen(TRACE_INIT_CMD) + 10; - p = dmalloc(len); - testutil_check(__wt_snprintf(p, len, TRACE_INIT_CMD, g.home, g.home)); - testutil_checkfmt(system(p), "%s", "logging directory creation failed"); - free(p); - - /* Configure logging with automatic removal, and keep the last N log files. */ - len = strlen(g.home) * strlen(TRACE_DIR) + 10; - p = dmalloc(len); - testutil_check(__wt_snprintf(p, len, "%s/%s", g.home, TRACE_DIR)); - config = "create,log=(enabled=true,remove=true),debug_mode=(log_retention=10)"; - testutil_checkfmt(wiredtiger_open(p, NULL, config, &conn), "%s: %s", p, config); - free(p); - } + /* Retain a minimum of 10 log files. */ + retain = WT_MAX(g.trace_retain, 10); - testutil_check(conn->open_session(conn, NULL, NULL, &session)); + /* Create the trace directory. */ + testutil_check(__wt_snprintf(tracedir, sizeof(tracedir), TRACE_INIT_CMD, g.home, g.home)); + testutil_checkfmt(system(tracedir), "%s", "logging directory creation failed"); - g.trace_conn = conn; - g.trace_session = session; + /* Configure logging with automatic removal, and keep the last N log files. */ + testutil_check(__wt_snprintf(config, sizeof(config), + "create,log=(enabled=true,remove=true),debug_mode=(log_retention=%d)", retain)); + testutil_check(__wt_snprintf(tracedir, sizeof(tracedir), "%s/%s", g.home, TRACE_DIR)); + testutil_checkfmt( + wiredtiger_open(tracedir, NULL, config, &g.trace_conn), "%s: %s", tracedir, config); + + /* Open a session and give it a lock. */ + testutil_check(g.trace_conn->open_session(g.trace_conn, NULL, NULL, &g.trace_session)); + testutil_check( + __wt_spin_init((WT_SESSION_IMPL *)g.trace_session, &g.trace_lock, "format trace lock")); } /* @@ -123,22 +132,8 @@ trace_teardown(void) conn = g.trace_conn; g.trace_conn = NULL; - if (conn != NULL) + if (conn != NULL) { + __wt_spin_destroy((WT_SESSION_IMPL *)g.trace_session, &g.trace_lock); testutil_check(conn->close(conn, NULL)); -} - -/* - * trace_ops_init -- - * Per thread operation tracing setup. - */ -void -trace_ops_init(TINFO *tinfo) -{ - WT_SESSION *session; - - if (!g.trace) - return; - - testutil_check(g.trace_conn->open_session(g.trace_conn, NULL, NULL, &session)); - tinfo->trace = session; + } } |