/* * __wt_txn_log_commit -- * Write the operations of a transaction to the log at commit time. */ int __wt_txn_log_commit(WT_SESSION_IMPL *session, const char *cfg[]) { WT_DECL_RET; WT_DECL_ITEM(logrec); WT_TXN *txn; WT_TXN_OP *op; const char *fmt = WT_UNCHECKED_STRING(Iq); size_t header_size; uint32_t rectype = WT_LOGREC_COMMIT; u_int i; WT_UNUSED(cfg); txn = &session->txn; WT_RET(__wt_struct_size(session, &header_size, fmt, rectype, txn->id)); WT_RET(__wt_logrec_alloc(session, header_size, &logrec)); WT_ERR(__wt_struct_pack(session, (uint8_t *)logrec->data + logrec->size, header_size, fmt, rectype, txn->id)); logrec->size += (uint32_t)header_size; /* Write updates to the log. */ for (i = 0, op = txn->mod; i < txn->mod_count; i++, op++) switch (op->type) { case TXN_OP_BASIC: WT_ERR(__txn_op_log(session, logrec, op)); break; case TXN_OP_INMEM: case TXN_OP_REF: /* Nothing to log, we're done. */ break; case TXN_OP_TRUNCATE_COL: WT_ERR(__wt_logop_col_truncate_pack(session, logrec, op->fileid, op->u.truncate_col.start, op->u.truncate_col.stop)); break; case TXN_OP_TRUNCATE_ROW: WT_ERR(__wt_logop_row_truncate_pack(session, logrec, op->fileid, &op->u.truncate_row.start, &op->u.truncate_row.stop, (uint32_t)op->u.truncate_row.mode)); break; } WT_ERR(__wt_log_write(session, logrec, NULL, S2C(session)->txn_logsync)); err: __wt_logrec_free(session, &logrec); return (ret); }
/* * __wt_txn_log_op -- * Write the last logged operation into the in-memory buffer. */ int __wt_txn_log_op(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt) { WT_DECL_RET; WT_ITEM *logrec; WT_TXN *txn; WT_TXN_OP *op; txn = &session->txn; if (!FLD_ISSET(S2C(session)->log_flags, WT_CONN_LOG_ENABLED) || F_ISSET(session, WT_SESSION_NO_LOGGING) || F_ISSET(S2BT(session), WT_BTREE_NO_LOGGING)) return (0); /* We'd better have a transaction. */ WT_ASSERT(session, F_ISSET(txn, WT_TXN_RUNNING) && F_ISSET(txn, WT_TXN_HAS_ID)); WT_ASSERT(session, txn->mod_count > 0); op = txn->mod + txn->mod_count - 1; WT_RET(__txn_logrec_init(session)); logrec = txn->logrec; switch (op->type) { case WT_TXN_OP_BASIC: case WT_TXN_OP_BASIC_TS: ret = __txn_op_log(session, logrec, op, cbt); break; case WT_TXN_OP_INMEM: case WT_TXN_OP_REF: /* Nothing to log, we're done. */ break; case WT_TXN_OP_TRUNCATE_COL: ret = __wt_logop_col_truncate_pack(session, logrec, op->fileid, op->u.truncate_col.start, op->u.truncate_col.stop); break; case WT_TXN_OP_TRUNCATE_ROW: ret = __wt_logop_row_truncate_pack(session, txn->logrec, op->fileid, &op->u.truncate_row.start, &op->u.truncate_row.stop, (uint32_t)op->u.truncate_row.mode); break; } return (ret); }