mariadb/storage/maria
unknown d0b9387b88 WL#3072 - Maria recovery.
* Recovery of the table's live checksum (CREATE TABLE ... CHECKSUM=1)
is achieved in this patch. The table's live checksum
(info->s->state.state.checksum) is updated in inwrite_rec_hook's
under the log mutex when writing UNDO_ROW_INSERT|UPDATE|DELETE
and REDO_DELETE_ALL. The checksum variation caused by the operation
is stored in these UNDOs, so that the REDO phase, when it sees such
UNDOs, can update the live checksum if it is older (state.is_of_lsn is
lower) than the record. It is also used, as a nice add-on with no
cost, to do less row checksum computation during the UNDO phase
(as we have it in the record already).
Doing this work, it became pressing to move in-write hooks
(write_hook_for_redo() et al) to ma_blockrec.c.
The 'parts' argument of inwrite_rec_hook is unpredictable (it comes
mangled at this stage, for example by LSN compression) so it is
replaced by a 'void* hook_arg', which is used to pass down information,
currently only to write_hook_for_clr_end() (previous undo_lsn and
type of undone record).
* If from ha_maria, we print to stderr how many seconds (with one
fractional digit) the REDO phase took, same for UNDO phase and for
final table close. Just to give an indication for debugging and maybe
also for Support.


storage/maria/ha_maria.cc:
  question for Monty
storage/maria/ma_blockrec.c:
  * log in-write hooks (write_hook_for_redo() etc) move from
  ma_loghandler.c to here; this is natural: the hooks are coupled
  to their callers (functions in ma_blockrec.c).
  * translog_write_record() now has a new argument "hook_arg";
  using it to pass down to write_hook_for_clr_end() the transaction's
  previous_undo_lsn and the type of the being undone record, and also
  to pass down to all UNDOs the live checksum variation caused by the
  operation.
  * If table has live checksum, store in UNDO_ROW_INSERT|UPDATE|DELETE
  and in CLR_END the checksum variation ("delta") caused by the
  operation. For example if a DELETE caused the table's live checksum
  to change from 123 to 456, we store in the UNDO_ROW_DELETE, in 4 bytes,
  the value 333 (456-123).
  * Instead of hard-coded "1" as length of the place where we store
  the undone record's type in CLR_END, use a symbol CLR_TYPE_STORE_SIZE;
  use macros clr_type_store and clr_type_korr.
  * write_block_record() has a new parameter 'old_record_checksum'
  which is the pre-computed checksum of old_record; that value is used
  to update the table's live checksum when writing UNDO_ROW_UPDATE|CLR_END.
  * In allocate_write_block_record(), if we are executing UNDO_ROW_DELETE
  the row's checksum is already computed.
  * _ma_update_block_record2() now expect the new row's checksum into
  cur_row.checksum (was already true) and the old row's checksum into
  new_row.checksum (that's new). Its two callers, maria_update() and
  _ma_apply_undo_row_update(), honour this.
  * When executing an UNDO_ROW_INSERT|UPDATE|DELETE in UNDO phase, pick
  up the checksum delta from the log record. It is then used to update
  the table's live checksum when writing CLR_END, and saves us a
  computation of record.
storage/maria/ma_blockrec.h:
  in-write hooks move from ma_loghandler.c
storage/maria/ma_check.c:
  more straightforward size of buffer
storage/maria/ma_checkpoint.c:
  <= is enough
storage/maria/ma_commit.c:
  new prototype of translog_write_record()
storage/maria/ma_create.c:
  new prototype of translog_write_record()
storage/maria/ma_delete.c:
  The row's checksum must be computed before calling(*delete_record)(),
  not after, because it must be known inside _ma_delete_block_record()
  (to update the table's live checksum when writing UNDO_ROW_DELETE).
  If deleting from a transactional table, live checksum was already updated
  when writing UNDO_ROW_DELETE.
storage/maria/ma_delete_all.c:
  @todo is now done (in ma_loghandler.c)
storage/maria/ma_delete_table.c:
  new prototype of translog_write_record()
storage/maria/ma_loghandler.c:
  * in-write hooks move to ma_blockrec.c.
  * translog_write_record() gets a new argument 'hook_arg' which is
  passed down to pre|inwrite_rec_hook. It is more useful that 'parts'
  for those hooks, because when those hooks are called, 'parts' has
  possibly been mangled (like with LSN compression) and is so
  unpredictable.
  * fix for compiler warning (unused buffer_start when compiling without
  debug support)
  * Because checksum delta is stored into UNDO_ROW_INSERT|UPDATE|DELETE
  and CLR_END, but only if the table has live checksum, these records
  are not PSEUDOFIXEDLENGTH anymore, they are now VARIABLE_LENGTH (their
  length is X if no live checksum and X+4 otherwise).
  * add an inwrite_rec_hook for UNDO_ROW_UPDATE, which updates the
  table's live checksum. Update it also in hooks of UNDO_ROW_INSERT|
  DELETE and REDO_DELETE_ALL and CLR_END.
  * Bugfix: when reading a record in translog_read_record(), it happened
  that "length" became negative, because the function assumed that
  the record extended beyond the page's end, whereas it may be shorter.
storage/maria/ma_loghandler.h:
  * Instead of hard-coded "1" and "4", use symbols and macros
  to store/retrieve the type of record which the CLR_END corresponds
  to, and the checksum variation caused by the operation which logs the
  record
  * translog_write_record() gets a new argument 'hook_arg' which is
  passed down to pre|inwrite_rec_hook. It is more useful that 'parts'
  for those hooks, because when those hooks are called, 'parts' has
  possibly been mangled (like with LSN compression) and is so
  unpredictable.
storage/maria/ma_open.c:
  fix for "empty body in if() statement" (when compiling without safemutex)
storage/maria/ma_pagecache.c:
  <= is enough
storage/maria/ma_recovery.c:
  * print the time that each recovery phase (REDO/UNDO/flush) took;
  this is enabled only when recovering from ha_maria. Is it printed
  n seconds with a fractional part of one digit (like 123.4 seconds).
  * In the REDO phase, update the table's live checksum by using
  the checksum delta stored in UNDO_ROW_INSERT|DELETE|UPDATE and CLR_END.
  Update it too when seeing REDO_DELETE_ALL.
  * In the UNDO phase, when executing UNDO_ROW_INSERT, if the table does
  not have live checksum then reading the record's header (as done by
  the master loop of run_undo_phase()) is enough; otherwise we
  do a translog_read_record() to have the checksum delta ready
  for _ma_apply_undo_row_insert().
  * When at the end of the REDO phase we notice that there is an unfinished
  group of REDOs, don't assert in debug binaries, as I verified that it
  can happen in real life (with kill -9)
  * removing ' in #error as it confuses gcc3
storage/maria/ma_rename.c:
  new prototype of translog_write_record()
storage/maria/ma_test_recovery.expected:
  Change in output of ma_test_recovery: now all live checksums of
  original tables equal those of tables recreated by the REDO phase
  and those of tables fixed by the UNDO phase. I.e. recovery of
  the live checksum looks like working (which was after all the only
  goal of this changeset).
  I checked by hand that it's not just all live checksums which are
  now 0 and that's why they match. They are the old values like
  3757530372. maria.test has hard-coded checksum values in its result
  file so checks this too.
storage/maria/ma_update.c:
  * It's useless to put up HA_STATE_CHANGED in 'key_changed',
  as we put up HA_STATE_CHANGED in info->update anyway.
  * We need to compute the old and new rows' checksum before calling
  (*update_record)(), as checksum delta must be known when logging
  UNDO_ROW_UPDATE which is done by _ma_update_block_record(). Note that
  some functions change the 'newrec' record (at least _ma_check_unique()
  does) so we cannot move the checksum computation too early in the
  function.
storage/maria/ma_write.c:
  If inserting into a transactional table, live's checksum was
  already updated when writing UNDO_ROW_INSERT. The multiplication
  is a trick to save an if().
storage/maria/unittest/ma_test_loghandler-t.c:
  new prototype of translog_write_record()
storage/maria/unittest/ma_test_loghandler_first_lsn-t.c:
  new prototype of translog_write_record()
storage/maria/unittest/ma_test_loghandler_max_lsn-t.c:
  new prototype of translog_write_record()
storage/maria/unittest/ma_test_loghandler_multigroup-t.c:
  new prototype of translog_write_record()
storage/maria/unittest/ma_test_loghandler_multithread-t.c:
  new prototype of translog_write_record()
storage/maria/unittest/ma_test_loghandler_noflush-t.c:
  new prototype of translog_write_record()
storage/maria/unittest/ma_test_loghandler_pagecache-t.c:
  new prototype of translog_write_record()
storage/maria/unittest/ma_test_loghandler_purge-t.c:
  new prototype of translog_write_record()
storage/myisam/sort.c:
  fix for compiler warnings in pushbuild (write_merge_key* functions
  didn't have their declaration match MARIA_HA::write_key).
2007-10-02 18:02:09 +02:00
..
unittest WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
CMakeLists.txt fixed typo 2006-11-15 12:58:37 +02:00
ft_maria.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ha_maria.cc WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ha_maria.h merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
lockman.c This patch is a collection of patches from from Sanja, Sergei and Monty. 2007-05-29 20:13:56 +03:00
lockman.h GPL license update (same change as was done for all files in 5.1). 2007-03-02 11:20:23 +01:00
ma_bitmap.c - speed optimization: 2007-09-06 16:53:26 +02:00
ma_blockrec.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_blockrec.h WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_cache.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_changed.c GPL license update (same change as was done for all files in 5.1). 2007-03-02 11:20:23 +01:00
ma_check.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_checkpoint.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_checkpoint.h fix for non-debug compilation errors. 2007-09-20 16:11:46 +02:00
ma_checksum.c Added applying of undo for updates 2007-09-09 19:15:10 +03:00
ma_close.c - WL#3072 Maria Recovery: 2007-09-07 15:02:30 +02:00
ma_commit.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_commit.h - WL#3239 "log CREATE TABLE in Maria" 2007-06-22 14:49:37 +02:00
ma_control_file.c WL#3072 Maria recovery 2007-08-29 16:43:01 +02:00
ma_control_file.h WL#3072 Maria recovery 2007-08-29 16:43:01 +02:00
ma_create.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_dbug.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_delete.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_delete_all.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_delete_table.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_dynrec.c Added applying of undo for updates 2007-09-09 19:15:10 +03:00
ma_extra.c WL#3071 Maria checkpoint 2007-09-12 11:27:34 +02:00
ma_ft_boolean_search.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_ft_eval.c Fixes after review of guilhem of block record patch 2007-04-19 13:18:56 +03:00
ma_ft_eval.h GPL license update (same change as was done for all files in 5.1). 2007-03-02 11:20:23 +01:00
ma_ft_nlq_search.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_ft_parser.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_ft_stem.c GPL license update (same change as was done for all files in 5.1). 2007-03-02 11:20:23 +01:00
ma_ft_test1.c Fixes after review of guilhem of block record patch 2007-04-19 13:18:56 +03:00
ma_ft_test1.h GPL license update (same change as was done for all files in 5.1). 2007-03-02 11:20:23 +01:00
ma_ft_update.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_ftdefs.h Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_fulltext.h Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_info.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_init.c WL#3071 Maria checkpoint 2007-09-12 11:27:34 +02:00
ma_key.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_keycache.c Merge desktop.sanja.is.com.ua:/home/bell/mysql/bk/work-maria.bak 2007-04-16 13:19:43 +03:00
ma_locking.c Merge bk-internal.mysql.com:/home/bk/mysql-maria 2007-09-09 19:22:20 +03:00
ma_loghandler.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_loghandler.h WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_loghandler_lsn.h Fixes of the empty log problem. 2007-09-13 10:37:51 +03:00
ma_open.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_packrec.c Added applying of undo for updates 2007-09-09 19:15:10 +03:00
ma_page.c Ability to read unflushed data added (only problem with CRC left and have to be fixed). 2007-08-13 15:17:49 +03:00
ma_pagecache.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_pagecache.h Faster translog_filename_by_fileno 2007-09-27 17:41:21 +03:00
ma_pagecaches.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_panic.c - WL#3239 "log CREATE TABLE in Maria" 2007-06-22 14:49:37 +02:00
ma_preload.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_range.c fixes of bad merge (probably). Less duplication in ma_test_recovery. 2007-08-06 16:13:42 +02:00
ma_recovery.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_recovery.h fix for non-debug compilation errors. 2007-09-20 16:11:46 +02:00
ma_rename.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_rfirst.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rkey.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_rlast.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rnext.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rnext_same.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rprev.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rrnd.c Fixes for bugs found by maria.test and event*tests: 2007-08-21 20:54:11 +03:00
ma_rsame.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rsamepos.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rt_index.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_rt_index.h Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rt_key.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_rt_key.h Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rt_mbr.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rt_mbr.h Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_rt_split.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_rt_test.c GPL license update (same change as was done for all files in 5.1). 2007-03-02 11:20:23 +01:00
ma_scan.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_search.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_sort.c merging MyISAM changes into Maria (not done in 5.1->maria merge of 2007-07-27 12:06:39 +02:00
ma_sp_defs.h Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_sp_key.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_sp_test.c Fixes after review of guilhem of block record patch 2007-04-19 13:18:56 +03:00
ma_static.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_statrec.c Added applying of undo for updates 2007-09-09 19:15:10 +03:00
ma_test1.c WL#3072 Maria recovery 2007-09-11 11:11:22 +02:00
ma_test2.c WL#3071 Maria checkpoint 2007-09-12 11:27:34 +02:00
ma_test3.c porting Serg's fix for BUG#30094 to Maria. Now ma_test_all passes. 2007-07-27 16:11:40 +02:00
ma_test_all.res After merge fixes 2007-01-26 13:32:02 +02:00
ma_test_all.sh Generalized the way update and redo extends the size of a directory record. 2007-08-31 10:19:54 +03:00
ma_test_recovery WL#3072 Maria recovery 2007-09-25 11:54:35 +02:00
ma_test_recovery.expected WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_unique.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
ma_update.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
ma_write.c WL#3072 - Maria recovery. 2007-10-02 18:02:09 +02:00
Makefile.am WL#3071 Maria checkpoint 2007-09-12 11:27:34 +02:00
maria_chk.c Remove SAFE_MODE for opt_range as it disables UPDATE to use keys 2007-09-27 14:18:28 +03:00
maria_def.h Faster translog_filename_by_fileno 2007-09-27 17:41:21 +03:00
maria_ftdump.c Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
maria_pack.c - WL#3072 Maria Recovery: 2007-09-07 15:02:30 +02:00
maria_read_log.c Remove SAFE_MODE for opt_range as it disables UPDATE to use keys 2007-09-27 14:18:28 +03:00
maria_rename.sh Added storage/maria (based on MyISAM). WL#3245 2006-04-11 16:45:10 +03:00
plug.in enable --with-maria-storage-engine 2007-09-07 19:45:33 +02:00
tablockman.c WL#3072 Maria recovery: 2007-08-01 15:52:57 +02:00
tablockman.h GPL license update (same change as was done for all files in 5.1). 2007-03-02 11:20:23 +01:00
test_pack Added storage/maria (based on MyISAM). WL#3245 2006-04-11 16:45:10 +03:00
trnman.c WL#3071 Maria checkpoint 2007-09-12 11:27:34 +02:00
trnman.h Merged with mysql-5.1 main tree. 2007-07-02 20:45:15 +03:00
trnman_public.h WL#3072 - Maria Recovery 2007-09-07 15:52:25 +02:00