summaryrefslogtreecommitdiff
path: root/src/txn/txn.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/txn/txn.c')
-rw-r--r--src/txn/txn.c45
1 files changed, 17 insertions, 28 deletions
diff --git a/src/txn/txn.c b/src/txn/txn.c
index d488f7929e1..f6f5a695b4f 100644
--- a/src/txn/txn.c
+++ b/src/txn/txn.c
@@ -60,7 +60,6 @@ __wt_txn_release_snapshot(WT_SESSION_IMPL *session)
WT_ASSERT(session,
txn_state->snap_min == WT_TXN_NONE ||
session->txn.isolation == TXN_ISO_READ_UNCOMMITTED ||
- session->id == S2C(session)->txn_global.checkpoint_id ||
!__wt_txn_visible_all(session, txn_state->snap_min));
txn_state->snap_min = WT_TXN_NONE;
@@ -80,13 +79,13 @@ __wt_txn_get_snapshot(WT_SESSION_IMPL *session)
WT_TXN_STATE *s, *txn_state;
uint64_t current_id, id;
uint64_t prev_oldest_id, snap_min;
- uint32_t ckpt_id, i, n, session_cnt;
+ uint32_t i, n, session_cnt;
int32_t count;
conn = S2C(session);
txn = &session->txn;
txn_global = &conn->txn_global;
- txn_state = &txn_global->states[session->id];
+ txn_state = WT_SESSION_TXN_STATE(session);
current_id = snap_min = txn_global->current;
prev_oldest_id = txn_global->oldest_id;
@@ -119,12 +118,7 @@ __wt_txn_get_snapshot(WT_SESSION_IMPL *session)
/* Walk the array of concurrent transactions. */
WT_ORDERED_READ(session_cnt, conn->session_cnt);
- ckpt_id = txn_global->checkpoint_id;
for (i = n = 0, s = txn_global->states; i < session_cnt; i++, s++) {
- /* Skip the checkpoint transaction; it is never read from. */
- if (i == ckpt_id)
- continue;
-
/*
* Build our snapshot of any concurrent transaction IDs.
*
@@ -183,7 +177,7 @@ __wt_txn_update_oldest(WT_SESSION_IMPL *session, int force)
WT_TXN_GLOBAL *txn_global;
WT_TXN_STATE *s;
uint64_t current_id, id, oldest_id, prev_oldest_id, snap_min;
- uint32_t ckpt_id, i, session_cnt;
+ uint32_t i, session_cnt;
int32_t count;
int last_running_moved;
@@ -219,12 +213,7 @@ __wt_txn_update_oldest(WT_SESSION_IMPL *session, int force)
/* Walk the array of concurrent transactions. */
WT_ORDERED_READ(session_cnt, conn->session_cnt);
- ckpt_id = txn_global->checkpoint_id;
for (i = 0, s = txn_global->states; i < session_cnt; i++, s++) {
- /* Skip the checkpoint transaction; it is never read from. */
- if (i == ckpt_id)
- continue;
-
/*
* Update the oldest ID.
*
@@ -266,15 +255,7 @@ __wt_txn_update_oldest(WT_SESSION_IMPL *session, int force)
if (TXNID_LT(prev_oldest_id, oldest_id) &&
WT_ATOMIC_CAS4(txn_global->scan_count, 1, -1)) {
WT_ORDERED_READ(session_cnt, conn->session_cnt);
- ckpt_id = txn_global->checkpoint_id;
for (i = 0, s = txn_global->states; i < session_cnt; i++, s++) {
- /*
- * Skip the checkpoint transaction; it is never read
- * from.
- */
- if (i == ckpt_id)
- continue;
-
if ((id = s->id) != WT_TXN_NONE &&
TXNID_LT(id, oldest_id))
oldest_id = id;
@@ -358,10 +339,17 @@ __wt_txn_release(WT_SESSION_IMPL *session)
txn->notify = NULL;
txn_global = &S2C(session)->txn_global;
- txn_state = &txn_global->states[session->id];
+ txn_state = WT_SESSION_TXN_STATE(session);
/* Clear the transaction's ID from the global table. */
- if (F_ISSET(txn, TXN_HAS_ID)) {
+ if (WT_SESSION_IS_CHECKPOINT(session)) {
+ WT_ASSERT(session, txn_state->id == WT_TXN_NONE);
+ txn->id = WT_TXN_NONE;
+
+ /* Clear the global checkpoint transaction IDs. */
+ txn_global->checkpoint_id = 0;
+ txn_global->checkpoint_pinned = WT_TXN_NONE;
+ } else if (F_ISSET(txn, TXN_HAS_ID)) {
WT_ASSERT(session, txn_state->id != WT_TXN_NONE &&
txn->id != WT_TXN_NONE);
WT_PUBLISH(txn_state->id, WT_TXN_NONE);
@@ -418,6 +406,7 @@ __wt_txn_commit(WT_SESSION_IMPL *session, const char *cfg[])
*/
__wt_txn_release_snapshot(session);
ret = __wt_txn_log_commit(session, cfg);
+ WT_ASSERT(session, ret == 0);
}
/*
@@ -548,19 +537,19 @@ __wt_txn_stats_update(WT_SESSION_IMPL *session)
WT_TXN_GLOBAL *txn_global;
WT_CONNECTION_IMPL *conn;
WT_CONNECTION_STATS *stats;
- uint64_t checkpoint_snap_min;
+ uint64_t checkpoint_pinned;
conn = S2C(session);
txn_global = &conn->txn_global;
stats = &conn->stats;
- checkpoint_snap_min = txn_global->checkpoint_snap_min;
+ checkpoint_pinned = txn_global->checkpoint_pinned;
WT_STAT_SET(stats, txn_pinned_range,
txn_global->current - txn_global->oldest_id);
WT_STAT_SET(stats, txn_pinned_checkpoint_range,
- checkpoint_snap_min == WT_TXN_NONE ?
- 0 : txn_global->current - checkpoint_snap_min);
+ checkpoint_pinned == WT_TXN_NONE ?
+ 0 : txn_global->current - checkpoint_pinned);
}
/*