diff options
author | Michael Cahill <michael.cahill@mongodb.com> | 2015-11-03 16:35:53 +1100 |
---|---|---|
committer | Michael Cahill <michael.cahill@mongodb.com> | 2015-11-03 16:35:53 +1100 |
commit | f180b4499cb195727db063aea36dfd6e715133af (patch) | |
tree | 7a6369c6fec7480e36c32851d62df79f60e1b923 | |
parent | ccf58b3992c048b8f46c63f26ffaad2d7d834442 (diff) | |
download | mongo-f180b4499cb195727db063aea36dfd6e715133af.tar.gz |
WT-2193 Implement @agorrod's review feedback.
-rw-r--r-- | src/btree/bt_sync.c | 15 | ||||
-rw-r--r-- | src/meta/meta_track.c | 11 |
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); } |