summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@mongodb.com>2015-11-03 16:35:53 +1100
committerMichael Cahill <michael.cahill@mongodb.com>2015-11-03 16:35:53 +1100
commitf180b4499cb195727db063aea36dfd6e715133af (patch)
tree7a6369c6fec7480e36c32851d62df79f60e1b923
parentccf58b3992c048b8f46c63f26ffaad2d7d834442 (diff)
downloadmongo-f180b4499cb195727db063aea36dfd6e715133af.tar.gz
WT-2193 Implement @agorrod's review feedback.
-rw-r--r--src/btree/bt_sync.c15
-rw-r--r--src/meta/meta_track.c11
2 files changed, 23 insertions, 3 deletions
diff --git a/src/btree/bt_sync.c b/src/btree/bt_sync.c
index 645f720d38e..110f9f8fb0c 100644
--- a/src/btree/bt_sync.c
+++ b/src/btree/bt_sync.c
@@ -81,6 +81,19 @@ __sync_file(WT_SESSION_IMPL *session, int syncop)
break;
case WT_SYNC_CHECKPOINT:
/*
+ * If we are flushing a file at read-committed isolation, which
+ * is of particular interest for flushing the metadata to make
+ * schema-changing operation durable, get a transactional
+ * snapshot now.
+ *
+ * All changes committed up to this point should be included.
+ * We don't update the snapshot in between pages because (a)
+ * the metadata shouldn't be that big, and (b) if we do ever
+ */
+ if (txn->isolation == WT_ISO_READ_COMMITTED)
+ __wt_txn_get_snapshot(session);
+
+ /*
* We cannot check the tree modified flag in the case of a
* checkpoint, the checkpoint code has already cleared it.
*
@@ -111,8 +124,6 @@ __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;
diff --git a/src/meta/meta_track.c b/src/meta/meta_track.c
index 6fb2cf7ad41..1a773ef67c4 100644
--- a/src/meta/meta_track.c
+++ b/src/meta/meta_track.c
@@ -287,6 +287,7 @@ __wt_meta_track_off(WT_SESSION_IMPL *session, bool need_sync, bool unroll)
WT_WITH_DHANDLE(ckpt_session, session->meta_dhandle, ret =
__wt_checkpoint(ckpt_session, NULL));
F_CLR(ckpt_session, WT_SESSION_LOCKED_SCHEMA);
+ ckpt_session->txn.id = WT_TXN_NONE;
WT_RET(ret);
WT_WITH_DHANDLE(session, session->meta_dhandle,
ret = __wt_checkpoint_sync(session, NULL));
@@ -478,11 +479,19 @@ __wt_meta_track_init(WT_SESSION_IMPL *session)
WT_CONNECTION_IMPL *conn;
conn = S2C(session);
- if (!FLD_ISSET(conn->log_flags, WT_CONN_LOG_ENABLED))
+ if (!FLD_ISSET(conn->log_flags, WT_CONN_LOG_ENABLED)) {
WT_RET(__wt_open_internal_session(conn,
"metadata-ckpt", false, WT_SESSION_NO_DATA_HANDLES,
&conn->meta_ckpt_session));
+ /*
+ * Sessions default to read-committed isolation, we rely on
+ * that for the correctness of metadata checkpoints.
+ */
+ WT_ASSERT(session, conn->meta_ckpt_session->txn.isolation ==
+ WT_ISO_READ_COMMITTED);
+ }
+
return (0);
}