Skip to content

Commit

Permalink
WT-2193 Handle read-committed metadata checkpoints during snapshot tr…
Browse files Browse the repository at this point in the history
…ansactions.
  • Loading branch information
michaelcahill committed Nov 2, 2015
1 parent 4ba5698 commit f4aab28
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
16 changes: 12 additions & 4 deletions src/btree/bt_sync.c
Expand Up @@ -22,16 +22,17 @@ __sync_file(WT_SESSION_IMPL *session, int syncop)
WT_PAGE_MODIFY *mod;
WT_REF *walk;
WT_TXN *txn;
uint64_t internal_bytes, leaf_bytes;
uint64_t internal_pages, leaf_pages;
uint64_t internal_bytes, internal_pages, leaf_bytes, leaf_pages;
uint64_t saved_snap_min;
uint32_t flags;
bool evict_reset;

btree = S2BT(session);

flags = WT_READ_CACHE | WT_READ_NO_GEN;
walk = NULL;
txn = &session->txn;
saved_snap_min = WT_SESSION_TXN_STATE(session)->snap_min;
flags = WT_READ_CACHE | WT_READ_NO_GEN;

internal_bytes = leaf_bytes = 0;
internal_pages = leaf_pages = 0;
Expand Down Expand Up @@ -110,6 +111,8 @@ __sync_file(WT_SESSION_IMPL *session, int syncop)
/* Write all dirty in-cache pages. */
flags |= WT_READ_NO_EVICT;
for (walk = NULL;;) {
if (txn->isolation == WT_ISO_READ_COMMITTED)
__wt_txn_get_snapshot(session);
WT_ERR(__wt_tree_walk(session, &walk, NULL, flags));
if (walk == NULL)
break;
Expand Down Expand Up @@ -174,7 +177,12 @@ __sync_file(WT_SESSION_IMPL *session, int syncop)
if (walk != NULL)
WT_TRET(__wt_page_release(session, walk, flags));

if (txn->isolation == WT_ISO_READ_COMMITTED && session->ncursors == 0)
/*
* If we got a snapshot in order to write pages, and there was no
* snapshot active when we started, release it.
*/
if (txn->isolation == WT_ISO_READ_COMMITTED &&
saved_snap_min == WT_TXN_NONE)
__wt_txn_release_snapshot(session);

if (btree->checkpointing != WT_CKPT_OFF) {
Expand Down
3 changes: 2 additions & 1 deletion src/txn/txn.c
Expand Up @@ -180,7 +180,8 @@ __wt_txn_get_snapshot(WT_SESSION_IMPL *session)
*/
WT_ASSERT(session, WT_TXNID_LE(prev_oldest_id, snap_min));
WT_ASSERT(session, prev_oldest_id == txn_global->oldest_id);
txn_state->snap_min = snap_min;
if (txn->forced_iso == 0 || txn_state->snap_min == WT_TXN_NONE)
txn_state->snap_min = snap_min;

WT_ASSERT(session, txn_global->scan_count > 0);
(void)__wt_atomic_subiv32(&txn_global->scan_count, 1);
Expand Down

0 comments on commit f4aab28

Please sign in to comment.