diff --git a/src/session/session_api.c b/src/session/session_api.c index 857003c7a..935e4866d 100644 --- a/src/session/session_api.c +++ b/src/session/session_api.c @@ -1624,6 +1624,15 @@ __session_commit_transaction(WT_SESSION *wt_session, const char *config) WT_SESSION_IMPL *session; WT_TXN *txn; + WT_CONFIG_ITEM cval; + wt_timestamp_t ts; + char hex_ts[16] = {0}; + char *tmp_prepare_cfg; + const char *prepare_cfg[] = { + WT_CONFIG_BASE((WT_SESSION_IMPL *)wt_session, + WT_SESSION_prepare_transaction), "prepare_timestamp=1", NULL}; + int prepare_tret = 0; + session = (WT_SESSION_IMPL *)wt_session; SESSION_API_CALL_PREPARE_ALLOWED( session, commit_transaction, config, cfg); @@ -1643,9 +1652,31 @@ __session_commit_transaction(WT_SESSION *wt_session, const char *config) txn->rollback_reason == NULL ? "" : ": ", txn->rollback_reason == NULL ? "" : txn->rollback_reason); - if (ret == 0) + if (ret == 0) { + if (!F_ISSET(txn, WT_TXN_PREPARE)) { + tmp_prepare_cfg = NULL; + prepare_tret = __wt_config_gets_def(session, + cfg, "commit_timestamp", 0, &cval); + if (cval.len != 0) { + /* + * Use commit timestamp as prepare timestamp. + */ + prepare_tret = __wt_calloc_def(session, + 30, &tmp_prepare_cfg); + prepare_tret = __wt_txn_parse_timestamp( + session, "commit", &ts, &cval); + prepare_tret = __wt_timestamp_to_hex_string( + session, hex_ts, &ts); + prepare_tret = __wt_snprintf(tmp_prepare_cfg, + 30, "%s%s", "prepare_timestamp=", hex_ts); + prepare_cfg[1] = tmp_prepare_cfg; + prepare_tret = __wt_txn_prepare( + session, prepare_cfg); + __wt_free(session, tmp_prepare_cfg); + } + } ret = __wt_txn_commit(session, cfg); - else { + } else { WT_TRET(__wt_session_reset_cursors(session, false)); WT_TRET(__wt_txn_rollback(session, cfg)); }