summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/test/format/trace.c
diff options
context:
space:
mode:
authorEtienne Petrel <etienne.petrel@mongodb.com>2022-08-18 09:24:04 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-08-18 10:27:12 +0000
commitc5184977a8f02168eda34234d013ae1308cf9295 (patch)
tree0bea59952c73ce7b08b45a2aabf459b1a5a348db /src/third_party/wiredtiger/test/format/trace.c
parentfa9b76cee0ca3ebdc63ac5d54f657b32516e142b (diff)
downloadmongo-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.c121
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;
+ }
}