summaryrefslogtreecommitdiff
path: root/storage/maria/ma_commit.c
diff options
context:
space:
mode:
authorunknown <monty@mysql.com/narttu.mysql.fi>2007-08-29 09:03:10 +0300
committerunknown <monty@mysql.com/narttu.mysql.fi>2007-08-29 09:03:10 +0300
commitf7b766c029e087900792fa4abd60330f681f20ff (patch)
tree8d95e987b8fa0d60088e47fd6b3989e6d42db6aa /storage/maria/ma_commit.c
parentd430e5bfc1327de723911aa22f26eb83b46c6592 (diff)
downloadmariadb-git-f7b766c029e087900792fa4abd60330f681f20ff.tar.gz
Added maria_commit() and maria_begin() to be used with external tests
Now ma_test1 -M -T and ma_test2 -M -T produces readable, applyable logs Note: The .MAD file is not binary identical after applying redo compare to a an original file. (This is becasue we don't have full information which function called PURGE_REDO_BLOCKS). To verify if a file was correctly applied, we now instead compare row checksums BitKeeper/etc/ignore: added storage/maria/tmp/* include/maria.h: Added maria_commit() and maria_begin() to be used with external tests storage/maria/ha_maria.cc: Ensure maria_def. is read in C mode storage/maria/ma_blockrec.c: Fixed redo handling. _ma_apply_redo_purge_blocks() updated to handle any number of purged blocks Removed code to make data file idenitcal after redo (can't easily be done). See changeset comments Now ma_test1 -M -T and ma_test2 -M -T produces readable, applyable logs storage/maria/ma_commit.c: More DBUG statements Moved variable declaration to start of function (portability fix) Added helper functions 'maria_commit()' and 'maria_begin()' storage/maria/ma_loghandler.c: Fixed wrong REDO_PURGE_BLOCKS initialization storage/maria/ma_recovery.c: Added UNDO_ROW_UPDATE Removed wrong setting of lsn (there was no lsn at the used position) Fixed REDO_PURGE_BLOCKS to handle any number of blocks storage/maria/ma_test1.c: Added transaction support (via maria_begin() & maria_commit()) to get a log that can be applied with maria_read_log storage/maria/ma_test2.c: Added transaction support (via maria_begin() & maria_commit()) to get a log that can be applied with maria_read_log storage/maria/ma_test_recovery: Create temporary files in maria/tmp Verify files with checksums instead of byte comparisons storage/maria/maria_chk.c: When using with -dss we only get filename, records and checksum. This is useful to do a quick comparision if a files is identical to another one. storage/maria/maria_def.h: Added ma_commit() storage/maria/maria_read_log.c: Added --help
Diffstat (limited to 'storage/maria/ma_commit.c')
-rw-r--r--storage/maria/ma_commit.c72
1 files changed, 63 insertions, 9 deletions
diff --git a/storage/maria/ma_commit.c b/storage/maria/ma_commit.c
index 88aaee0509f..c8c37ae67db 100644
--- a/storage/maria/ma_commit.c
+++ b/storage/maria/ma_commit.c
@@ -28,8 +28,13 @@
int ma_commit(TRN *trn)
{
+ int res;
+ LSN commit_lsn;
+ LEX_STRING log_array[TRANSLOG_INTERNAL_PARTS];
+ DBUG_ENTER("ma_commit");
+
if (trn->undo_lsn == 0) /* no work done, rollback (cheaper than commit) */
- return trnman_rollback_trn(trn);
+ DBUG_RETURN(trnman_rollback_trn(trn));
/*
- if COMMIT record is written before trnman_commit_trn():
if Checkpoint comes in the middle it will see trn is not committed,
@@ -45,27 +50,76 @@ int ma_commit(TRN *trn)
issue (transaction's updates were made visible to other transactions).
So we need to go the first way.
*/
+
/**
@todo RECOVERY share's state is written to disk only in
maria_lock_database(), so COMMIT record is not the last record of the
transaction! It is probably an issue. Recovery of the state is a problem
not yet solved.
*/
- LSN commit_lsn;
- LEX_STRING log_array[TRANSLOG_INTERNAL_PARTS];
/*
We do not store "thd->transaction.xid_state.xid" for now, it will be
needed only when we support XA.
*/
- return
- translog_write_record(&commit_lsn, LOGREC_COMMIT,
- trn, NULL, 0,
- sizeof(log_array)/sizeof(log_array[0]),
- log_array, NULL) ||
- translog_flush(commit_lsn) || trnman_commit_trn(trn);
+ res= (translog_write_record(&commit_lsn, LOGREC_COMMIT,
+ trn, NULL, 0,
+ sizeof(log_array)/sizeof(log_array[0]),
+ log_array, NULL) ||
+ translog_flush(commit_lsn) ||
+ trnman_commit_trn(trn));
+ trn->undo_lsn= 0;
/*
Note: if trnman_commit_trn() fails above, we have already
written the COMMIT record, so Checkpoint and Recovery will see the
transaction as committed.
*/
+ DBUG_RETURN(res);
+}
+
+
+/**
+ @brief Writes a COMMIT record for a transaciton associated with a file
+
+ @param info Maria handler
+
+ @return Operation status
+ @retval 0 ok
+ @retval # error (disk error or out of memory)
+*/
+
+int maria_commit(MARIA_HA *info)
+{
+ return info->s->now_transactional ? ma_commit(info->trn) : 0;
+}
+
+
+/**
+ @brief Starts a transaction on a file handle
+
+ @param info Maria handler
+
+ @return Operation status
+ @retval 0 ok
+ @retval # Error code.
+*/
+
+
+int maria_begin(MARIA_HA *info)
+{
+ DBUG_ENTER("maria_begin");
+
+ if (info->s->now_transactional)
+ {
+ TRN *trn;
+ struct st_my_thread_var *mysys_var= my_thread_var;
+ trn= trnman_new_trn(&mysys_var->mutex,
+ &mysys_var->suspend,
+ (char*) &mysys_var + STACK_DIRECTION *1024*128);
+ if (unlikely(!trn))
+ DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+
+ DBUG_PRINT("info", ("TRN set to 0x%lx", (ulong) trn));
+ info->trn= trn;
+ }
+ DBUG_RETURN(0);
}