diff options
Diffstat (limited to 'src/meta/meta_track.c')
-rw-r--r-- | src/meta/meta_track.c | 64 |
1 files changed, 62 insertions, 2 deletions
diff --git a/src/meta/meta_track.c b/src/meta/meta_track.c index ff1173585b4..b8d7aa930ea 100644 --- a/src/meta/meta_track.c +++ b/src/meta/meta_track.c @@ -261,6 +261,7 @@ __wt_meta_track_off(WT_SESSION_IMPL *session, bool need_sync, bool unroll) { WT_DECL_RET; WT_META_TRACK *trk, *trk_orig; + WT_SESSION_IMPL *ckpt_session; WT_ASSERT(session, WT_META_TRACKING(session) && session->meta_track_nest > 0); @@ -304,8 +305,18 @@ __wt_meta_track_off(WT_SESSION_IMPL *session, bool need_sync, bool unroll) session, false, WT_TXN_LOG_CKPT_SYNC, NULL)); WT_RET(ret); } else { - WT_WITH_DHANDLE(session, session->meta_dhandle, - ret = __wt_checkpoint(session, NULL)); + WT_ASSERT(session, F_ISSET(session, WT_SESSION_LOCKED_SCHEMA)); + ckpt_session = S2C(session)->meta_ckpt_session; + /* + * If this operation is part of a running transaction, that + * should be included in the checkpoint. + */ + ckpt_session->txn.id = session->txn.id; + F_SET(ckpt_session, WT_SESSION_LOCKED_SCHEMA); + 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)); @@ -473,3 +484,52 @@ __wt_meta_track_handle_lock(WT_SESSION_IMPL *session, bool created) trk->created = created; return (0); } + +/* + * __wt_meta_track_init -- + * Intialize metadata tracking. + */ +int +__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)) { + WT_RET(__wt_open_internal_session(conn, + "metadata-ckpt", false, false, + &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); +} + +/* + * __wt_meta_track_destroy -- + * Release resources allocated for metadata tracking. + */ +int +__wt_meta_track_destroy(WT_SESSION_IMPL *session) +{ + WT_CONNECTION_IMPL *conn; + WT_DECL_RET; + WT_SESSION *wt_session; + + conn = S2C(session); + + /* Close the session used for metadata checkpoints. */ + if (conn->meta_ckpt_session != NULL) { + wt_session = &conn->meta_ckpt_session->iface; + WT_TRET(wt_session->close(wt_session, NULL)); + conn->meta_ckpt_session = NULL; + } + + return (ret); +} |