diff options
author | unknown <monty@mysql.com/narttu.mysql.fi> | 2007-08-29 09:03:10 +0300 |
---|---|---|
committer | unknown <monty@mysql.com/narttu.mysql.fi> | 2007-08-29 09:03:10 +0300 |
commit | f7b766c029e087900792fa4abd60330f681f20ff (patch) | |
tree | 8d95e987b8fa0d60088e47fd6b3989e6d42db6aa /storage/maria/ma_commit.c | |
parent | d430e5bfc1327de723911aa22f26eb83b46c6592 (diff) | |
download | mariadb-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.c | 72 |
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); } |