summaryrefslogtreecommitdiff
path: root/src/include/misc.i
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/misc.i')
-rw-r--r--src/include/misc.i45
1 files changed, 44 insertions, 1 deletions
diff --git a/src/include/misc.i b/src/include/misc.i
index 7040886cf82..36a1e1f18eb 100644
--- a/src/include/misc.i
+++ b/src/include/misc.i
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2014-2016 MongoDB, Inc.
+ * Copyright (c) 2014-2017 MongoDB, Inc.
* Copyright (c) 2008-2014 WiredTiger, Inc.
* All rights reserved.
*
@@ -55,6 +55,31 @@ __wt_seconds(WT_SESSION_IMPL *session, time_t *timep)
}
/*
+ * __wt_time_check_monotonic --
+ * Check and prevent time running backward. If we detect that it has, we
+ * set the time structure to the previous values, making time stand still
+ * until we see a time in the future of the highest value seen so far.
+ */
+static inline void
+__wt_time_check_monotonic(WT_SESSION_IMPL *session, struct timespec *tsp)
+{
+ /*
+ * Detect time going backward. If so, use the last
+ * saved timestamp.
+ */
+ if (session == NULL)
+ return;
+
+ if (tsp->tv_sec < session->last_epoch.tv_sec ||
+ (tsp->tv_sec == session->last_epoch.tv_sec &&
+ tsp->tv_nsec < session->last_epoch.tv_nsec)) {
+ WT_STAT_CONN_INCR(session, time_travel);
+ *tsp = session->last_epoch;
+ } else
+ session->last_epoch = *tsp;
+}
+
+/*
* __wt_verbose --
* Verbose message.
*
@@ -177,3 +202,21 @@ __wt_snprintf_len_incr(
va_end(ap);
return (ret);
}
+
+/*
+ * __wt_txn_context_check --
+ * Complain if a transaction is/isn't running.
+ */
+static inline int
+__wt_txn_context_check(WT_SESSION_IMPL *session, bool requires_txn)
+{
+ if (requires_txn && !F_ISSET(&session->txn, WT_TXN_RUNNING))
+ WT_RET_MSG(session, EINVAL,
+ "%s: only permitted in a running transaction",
+ session->name);
+ if (!requires_txn && F_ISSET(&session->txn, WT_TXN_RUNNING))
+ WT_RET_MSG(session, EINVAL,
+ "%s: not permitted in a running transaction",
+ session->name);
+ return (0);
+}