An error occurred fetching the project authors.
  1. 06 Feb, 2009 1 commit
  2. 15 Jan, 2009 1 commit
    • Sergei Golubchik's avatar
      post-review fixes · e68445cf
      Sergei Golubchik authored
      include/atomic/generic-msvc.h:
        prevent possible compiler warnings
      include/lf.h:
        comments, better definition for LF_HASH_OVERHEAD
      include/maria.h:
        define MARIA_CANNOT_ROLLBACK here
      include/my_pthread.h:
        avoid possible name clash
      include/waiting_threads.h:
        comments, const, move WT_RESOURCE to waiting_threads.c
      mysql-test/suite/maria/r/maria_notembedded.result:
        new test
      mysql-test/suite/maria/t/maria_notembedded.test:
        new test - 5-way deadlock
      mysys/lf_hash.c:
        better definition for LF_HASH_OVERHEAD
      mysys/my_static.c:
        comment
      mysys/my_thr_init.c:
        casts
      mysys/waiting_threads.c:
        comments, asserts, etc
      server-tools/instance-manager/parse.cc:
        fix my_init_dynamic_array() to follow new calling conventions
      sql/mysqld.cc:
        call wt_init after set_proper_floating_point_mode
      sql/sql_class.h:
        comment
      storage/maria/ha_maria.cc:
        move MARIA_CANNOT_ROLLBACK to a common header
      storage/maria/ma_commit.c:
        comment
      storage/maria/ma_write.c:
        comments, check for HA_ERR_FOUND_DUPP_KEY
      storage/maria/trnman.c:
        comments, assert
      storage/maria/trnman.h:
        comments
      storage/maria/unittest/trnman-t.c:
        be paranoid
      unittest/mysys/lf-t.c:
        comments
      unittest/mysys/waiting_threads-t.c:
        comments, safety, memory leak
      e68445cf
  3. 22 Dec, 2008 1 commit
    • Michael Widenius's avatar
      Fix for Bug#40311 Assert in MARIA_RECORD_POS during pushbuild 2 test: · 4dd42a6f
      Michael Widenius authored
      Fixed bug when removing a newly inserted record (in case of duplicate key).
      The bug caused a crash for rows with several blobs and the first blob was small enough to fit into the head page.
      Don't change state_history if nothing changed (speed optimization that also simplifies logic).
      Reset state_history if we added/deleted or updated rows without versioning.
      Fixed wrong test in trnman_exists_active_transactions() if state is visible or not.
      
      Other bugs fixed:
      Fixed wrong argument to (lock->get_status) when we had to wait for TL_WRITE_CONCURRENT_INSERT.
      Item_equal::update_used_tables() didn't calculate const_item_cache properly.
      Added assert's to detect if join_read_const_table() was called under wrong assumptions..
      Fixed that _ma_setup_live_state() is called from thr_lock() instead of handler::external_lock().
      This was needed to get versioning information to be setup correctly.
      Fixed error in debug binaries during a call to _ma_check_table_is_closed() when another thread was opening/closing a table.
      Fixed wrong test when finding right history_state to use.
      
      mysql-test/suite/maria/r/maria.result:
        Added test for Bug#40311 Assert in MARIA_RECORD_POS during pushbuild 2 test
      mysql-test/suite/maria/t/maria.test:
        Added test for Bug#40311 Assert in MARIA_RECORD_POS during pushbuild 2 test
      mysys/thr_lock.c:
        Fixed wrong argument to (lock->get_status) when we had to wait for TL_WRITE_CONCURRENT_INSERT
      sql/item_cmpfunc.cc:
        Item_equal::update_used_tables() didn't calculate const_item_cache properly, which later caused a wrong result for item->const_item()
      sql/sql_base.cc:
        In debug mode, Initilize record buffer with unexpected data to catch usage of uninitialized memory
      sql/sql_select.cc:
        Fixed indentation
        Added assert's to detect if join_read_const_table() was called under wrong assumptions.
        One assert() is disabled for now as Item_equal() doesn't behave as expected.
      storage/maria/ha_maria.cc:
        Move calling to _ma_setup_live_state() to ma_state.c::_ma_block_get_status()
        This was needed as _ma_setup_live_state() needed to know if the table will be used concurrently or not
      storage/maria/ma_blockrec.c:
        Fixed bug when removing a newly inserted record (in case of duplicate key).
        The bug caused a crash for rows with several blobs and the first blob was small enough to fit into the head page.
      storage/maria/ma_dbug.c:
        Added mutex to protect the open table list during _ma_check_table_is_closed().
        Without the protection we could get a error in debug binaries during a call to _ma_check_table_is_closed()
      storage/maria/ma_delete_table.c:
        Removed not used code
      storage/maria/ma_rename.c:
        Removed not used code
      storage/maria/ma_state.c:
        Fixed wrong test when finding right history_state to use
        Mark in tables->state_current.no_transid if we are using transid's or not.
        Don't change state_history if nothing changed (speed optimization that also simplifies logic)
        Reset state_history if we added/deleted or updated rows without versioning.
        More DBUG_ASSERT's and more DBUG
        Updated maria_versioning() to initialize environment before calling _ma_blok_get_status(). This was needed because of the new logic in _ma_block_get_status()
      storage/maria/ma_state.h:
        Added flags to detect if table changed and/or if we changed table without versioning
      storage/maria/ma_write.c:
        Simple cleanups (No logic changes)
      storage/maria/trnman.c:
        Fixed wrong test in trnman_exists_active_transactions() if state is visible or not.
      4dd42a6f
  4. 31 Oct, 2008 1 commit
    • Michael Widenius's avatar
      Added ha_maria::is_changed() (needed for Query cache) · 5dfba5e2
      Michael Widenius authored
      storage/maria/ha_maria.cc:
        Added ha_maria::is_changed()
      storage/maria/ha_maria.h:
        Added ha_maria::is_changed()
      storage/maria/ma_delete.c:
        Mark that table changed
      storage/maria/ma_open.c:
        Ensure that info->state->changed is always reset from thr_lock()
      storage/maria/ma_state.c:
        Reset handler->state->changed at first usage of transactional table
        Reset handler->state->changed when taking lock for not transactional table
      storage/maria/ma_state.h:
        Added variable and function to track changes of table
      storage/maria/ma_update.c:
        Mark that table changed
      storage/maria/ma_write.c:
        Mark that table changed
      5dfba5e2
  5. 09 Oct, 2008 1 commit
    • Guilhem Bichot's avatar
      Fix for BUG#39697 "Maria: hang when failing to insert due to UNIQUE (seen in pushbuild2 too)" · 395ff6d0
      Guilhem Bichot authored
      It was a forgotten rw_unlock(), due to the deadlock detector feature (so bug was only in 5.1-maria, not
      6.0-maria).
      
      mysql-test/suite/maria/r/maria3.result:
        result, all fine
      mysql-test/suite/maria/t/maria3.test:
        Test of BUG#39697: two scenarios (transactional tables, and non-transactional table but dynamic row format so still taking the rwlock) where the hang happened.
        t2 added by this test was masked by a temporary table created earlier in the test, which we forgot to drop.
      storage/maria/ha_maria.cc:
        use new macro
      storage/maria/ma_blockrec.c:
        use new macro
      storage/maria/ma_commit.c:
        use new macro
      storage/maria/ma_init.c:
        putting address of dummy_transaction_object in --debug trace can be useful
      storage/maria/ma_open.c:
        use new macro
      storage/maria/ma_write.c:
        if local_lock_tree is true, we have acquired keyinfo->root_lock so need to release it before "goto err".
        A pair of assertions so that our usage of TrIDs is kept sensible.
      storage/maria/maria_def.h:
        A macro so that changes of MARIA_HA::trn can be tracked with --debug. It helped to understand in what cases,
        in maria_write(), we could have !(info->dup_key_trid == info->trn->trid) && !share->now_transactional
        (answer: ALTER TABLE adding UNIQUE index on transactional table).
      395ff6d0
  6. 01 Sep, 2008 1 commit
    • Sergei Golubchik's avatar
      wt: don't support a key as a union { ulonglong, void* }. Although convenient, · 4b3c3218
      Sergei Golubchik authored
      it forces the user to bzero a key before setting it as a pointer, otherwise
      it'll have random content on architectures where
      sizeof(void*) < sizeof(ulonglong).
      
      Declaring a key as ulonglong only (not a union) makes this user mistake
      impossible.
      
      include/waiting_threads.h:
        WT_RESOURCE_ID::value is an ulonglong, not a union
      mysys/waiting_threads.c:
        WT_RESOURCE_ID::value is an ulonglong, not a union
      storage/maria/ma_write.c:
        WT_RESOURCE_ID::value is an ulonglong, not a union
      storage/maria/trnman.c:
        WT_RESOURCE_ID::value is an ulonglong, not a union
      unittest/mysys/waiting_threads-t.c:
        WT_RESOURCE_ID::value is an ulonglong, not a union
      4b3c3218
  7. 28 Aug, 2008 1 commit
    • Sergei Golubchik's avatar
      wt: comments, OOM checks, test case for deadlock detection · b0870404
      Sergei Golubchik authored
      include/waiting_threads.h:
        make wt_thd_dontwait private
      mysql-test/r/maria.result:
        deadlock example
      mysql-test/t/maria.test:
        deadlock example
      mysys/waiting_threads.c:
        comments, OOM checks
      sql/mysqld.cc:
        fix variables
      sql/sql_class.cc:
        move wt_lazy_init to THD constructor
      sql/sql_class.h:
        move wt_lazy_init to THD constructor
      storage/maria/ha_maria.cc:
        backport from 6.0
      storage/maria/ma_write.c:
        poset-review fixes, set thd->proc_info
      storage/maria/trnman.c:
        bugfixing
      storage/myisam/mi_check.c:
        warnings
      storage/myisam/mi_page.c:
        warnings
      storage/myisam/mi_search.c:
        warnings
      storage/myisammrg/myrg_create.c:
        warnings
      unittest/mysys/waiting_threads-t.c:
        fixes
      b0870404
  8. 26 Aug, 2008 1 commit
    • Michael Widenius's avatar
      Fix for Bug#36499 Maria: potential deadlock · 3cc4babd
      Michael Widenius authored
      This was done by introducing another mutex for handling the key_del link
      I also renamed all key_del variables to start with key_del prefix
      
      
      storage/maria/ma_close.c:
        Rename of key_del variables
      storage/maria/ma_key_recover.c:
        Changed key_del to be protexted by it's own mutex: key_del_lock
        Rename of key_del variables
        Removed comment for old bug
      storage/maria/ma_key_recover.h:
        Rename of key_del variables
      storage/maria/ma_open.c:
        Initialization for new key_del_lock mutex
        Renamed intern_cond to key_del_cond as it was only used for protection of key_del
      storage/maria/ma_page.c:
        Rename of key_del variables
      storage/maria/ma_write.c:
        Rename of key_del variables
      storage/maria/maria_def.h:
        Rename of key_del variables
        Added key_del_lock
      3cc4babd
  9. 25 Aug, 2008 1 commit
    • Michael Widenius's avatar
      Changed all file names in maria to LEX_STRING and removed some calls to strlen() · 42f2e104
      Michael Widenius authored
      Ensure that pagecache gives correct error number even if error for block happend
      
      
      mysys/my_pread.c:
        Indentation fix
      storage/maria/ha_maria.cc:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_check.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_checkpoint.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_create.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_dbug.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_delete.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_info.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_keycache.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_locking.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_loghandler.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_open.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_pagecache.c:
        Store error number for last failed operation in the page block
        This should fix some asserts() when errno was not properly set after failure to read block in another thread
      storage/maria/ma_recovery.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_update.c:
        filenames changed to be of type LEX_STRING
      storage/maria/ma_write.c:
        filenames changed to be of type LEX_STRING
      storage/maria/maria_def.h:
        filenames changed to be of type LEX_STRING
      storage/maria/maria_ftdump.c:
        filenames changed to be of type LEX_STRING
      storage/maria/maria_pack.c:
        filenames changed to be of type LEX_STRING
      42f2e104
  10. 07 Aug, 2008 1 commit
    • Sergei Golubchik's avatar
      move wt* maintainance from maria to the server · 521dd0f2
      Sergei Golubchik authored
      include/waiting_threads.h:
        C_MODE_START/END
      mysys/waiting_threads.c:
        relax the checks - auto init thd in will_wait_for,
        allow to destroy uninited thd (=noop),
        allow a "release" an unexistent resource (=noop),
      sql/sql_class.cc:
        move wt* maintainance from maria to the server.
        do THD::cleanup after ha_close_connection() and plugin_thdvar_cleanup().
      storage/maria/unittest/trnman-t.c:
        update to new prototype
      521dd0f2
  11. 06 Aug, 2008 2 commits
    • Sergei Golubchik's avatar
      fixes for failing test suite · e8b0d677
      Sergei Golubchik authored
      storage/maria/ma_write.c:
        select ... group by ... - take temporary tables into account, they have TRN->pins == 0
      storage/maria/trnman.c:
        one cannot modify TRN->trid, it's a key in the trid_to_trn
        hash, if trid is modified, TRN won't be found (and deleted in
        trnman_free_trn) from the hash.
      e8b0d677
    • Sergei Golubchik's avatar
      maria: deadlock detection when waiting on unique key (useless until we can rollback) · 9423c79b
      Sergei Golubchik authored
      include/my_pthread.h:
        cleanup
      include/waiting_threads.h:
        header guard
      mysys/waiting_threads.c:
        bug - kill strategy were not applied to deadlocks of length 1.
        cast timeout to ulonglong.
      storage/maria/ma_static.c:
        declare WT_RESOURCE_TYPE ma_rc_dup_unique
      storage/maria/ma_write.c:
        deadlock detection when waiting on unique key (useless until we can rollback)
      storage/maria/maria_def.h:
        deadlock detection when waiting on unique key (useless until we can rollback)
      storage/maria/trnman.c:
        use deadlock detector.
        protect state transitions of a TRN with a mutex.
        trnman_trid_to_trn() function.
      storage/maria/trnman.h:
        trnman_trid_to_trn() function
        protect state transitions of a TRN with a mutex
        use deadlock detector.
      storage/maria/trnman_public.h:
        trnman_trid_to_trn()
      9423c79b
  12. 04 Aug, 2008 1 commit
    • Sergei Golubchik's avatar
      compiler warnings · 9dc11507
      Sergei Golubchik authored
      trnman: remove old lockman code
      trnman: replace trid_to_committed_trn hash with trid_to_trn
      
      storage/maria/ma_blockrec.c:
        compiler warnings
      storage/maria/ma_loghandler.c:
        compiler warnings
      storage/maria/ma_write.c:
        compiler warnings
      storage/maria/trnman.c:
        remove old lockman code
        replace trid_to_committed_trn hash with trid_to_trn
      storage/maria/trnman.h:
        remove old lockman code
        replace trid_to_committed_trn hash with trid_to_trn
      storage/maria/unittest/ma_test_loghandler-t.c:
        compiler warnings
      storage/maria/unittest/ma_test_loghandler_multigroup-t.c:
        compiler warnings
      storage/maria/unittest/ma_test_loghandler_multithread-t.c:
        compiler warnings
      9dc11507
  13. 09 Jul, 2008 1 commit
    • Michael Widenius's avatar
      Fixes for bug#37276: · ffd2cd89
      Michael Widenius authored
      - Fixes key corruption where pages wasn't marked that they contained transid.
      - Fixed bug in block record that could create too small rows when transid was removed. This fixed some asserts() when testing block length
      
      Added --abort-source-on-error to the mysql client. (Very helpfull when debugging wrong .sql files)
      
      client/client_priv.h:
        Added enum for new option to mysql
      client/mysql.cc:
        Added new option --abort-source-on-error to allow one to get 'source' to stop on error. This is 0 by default, to keep old behaviour.
        Print file name and line number when getting an error when doing source filename
      sql/field.cc:
        Removed old dead code
      sql/sql_class.cc:
        Removed old dead code
      storage/maria/ma_blockrec.c:
        Added checking of min block length to check_directory()
        When creating new directory entry, set length to 0; This ensures that the assert checks() on block lengths works properly.
        Added more DBUG_ASSERT() and more calls to check_directory()
        In get_head_or_tail_page(), send in correct min_block_length. This is now safe as the length of new blocks are now 0
      storage/maria/ma_delete.c:
        When moving key to parent page, mark page if key has transid
      storage/maria/ma_write.c:
        Fixed bug where _ma_find_last_pos() didn't set int_key->flag.
        Simpilifed code by unrolling loop.
      ffd2cd89
  14. 26 Jun, 2008 2 commits
    • Guilhem Bichot's avatar
      Fixes for build errors under Windows and compiler warning under Linux · d6524ad0
      Guilhem Bichot authored
      include/m_string.h:
        new macro like LINT_INIT but for struct. In m_string.h because bzero() becomes available only there
      storage/maria/ma_check.c:
        compiler error under Windows (declaration after statements...)
      storage/maria/ma_key.c:
        trnman.h is not in include/ but in storage/maria
      storage/maria/ma_sp_key.c:
        trnman.h is not in include/ but in storage/maria
      storage/maria/ma_write.c:
        avoid compiler warning (org_key.flag may be used uninitialized)
      d6524ad0
    • Michael Widenius's avatar
      Added versioning of Maria index · 53500e50
      Michael Widenius authored
      Store max_trid in index file as state.create_trid. This is used to pack all transids in the index pages relative to max possible transid for file.
      Enable versioning for transactional tables with index. Tables with an auto-increment key, rtree or fulltext keys are not versioned.
      Changed info->lastkey to type MARIA_KEY. Removed info->lastkey_length as this is now part of info->lastkey
      Renamed old info->lastkey to info->lastkey_buff
      Use exact key lenghts for keys, not USE_WHOLE_KEY
      For partial key searches, use SEARCH_PART_KEY
      When searching to insert new key on page, use SEARCH_INSERT to mark that key has rowid
      
      Changes done in a lot of files:
      - Modified functions to use MARIA_KEY instead of key pointer and key length
      - Use keyinfo->root_lock instead of share->key_root_lock[keynr]
      - Simplify code by using local variable keyinfo instead if share->keyinfo[i]
      - Added #fdef EXTERNAL_LOCKING around removed state elements
      - HA_MAX_KEY_BUFF -> MARIA_MAX_KEY_BUFF (to reserve space for transid)
      - Changed type of 'nextflag' to uint32 to ensure all SEARCH_xxx flags fits into it
      
      .bzrignore:
        Added missing temporary directory
      extra/Makefile.am:
        comp_err is now deleted on make distclean
      include/maria.h:
        Added structure MARIA_KEY, which is used for intern key objects in Maria.
        Changed functions to take MARIA_KEY as an argument instead of pointer to packed key.
        Changed some functions that always return true or false to my_bool.
        Added virtual function make_key() to avoid if in _ma_make_key()
        Moved rw_lock_t for locking trees from share->key_root_lock to MARIA_KEYDEF. This makes usage of the locks simpler and faster
      include/my_base.h:
        Added HA_RTREE_INDEX flag to mark rtree index. Used for easier checks in ma_check()
        Added SEARCH_INSERT to be used when inserting new keys
        Added SEARCH_PART_KEY for partial searches
        Added SEARCH_USER_KEY_HAS_TRANSID to be used when key we use for searching in btree has a TRANSID
        Added SEARCH_PAGE_KEY_HAS_TRANSID to be used when key we found in btree has a transid
      include/my_handler.h:
        Make next_flag 32 bit to make sure we can handle all SEARCH_ bits
      mysql-test/include/maria_empty_logs.inc:
        Read and restore current database; Don't assume we are using mysqltest.
        Don't log use databasename to log. Using this include should not cause any result changes.
      mysql-test/r/maria-gis-rtree-dynamic.result:
        Updated results after adding some check table commands to help pinpoint errors
      mysql-test/r/maria-mvcc.result:
        New tests
      mysql-test/r/maria-purge.result:
        New result after adding removal of logs
      mysql-test/r/maria-recovery-big.result:
        maria_empty_logs doesn't log 'use mysqltest' anymore
      mysql-test/r/maria-recovery-bitmap.result:
        maria_empty_logs doesn't log 'use mysqltest' anymore
      mysql-test/r/maria-recovery-rtree-ft.result:
        maria_empty_logs doesn't log 'use mysqltest' anymore
      mysql-test/r/maria-recovery.result:
        maria_empty_logs doesn't log 'use mysqltest' anymore
      mysql-test/r/maria.result:
        New tests
      mysql-test/r/variables-big.result:
        Don't log id as it's not predictable
      mysql-test/suite/rpl_ndb/r/rpl_truncate_7ndb_2.result:
        Updated results to new binlog results. (Test has not been run in a long time as it requires --big)
      mysql-test/suite/rpl_ndb/t/rpl_truncate_7ndb_2-master.opt:
        Moved file to ndb replication test directory
      mysql-test/suite/rpl_ndb/t/rpl_truncate_7ndb_2.test:
        Fixed wrong path to included tests
      mysql-test/t/maria-gis-rtree-dynamic.test:
        Added some check table commands to help pinpoint errors
      mysql-test/t/maria-mvcc.test:
        New tests
      mysql-test/t/maria-purge.test:
        Remove logs to make test results predictable
      mysql-test/t/maria.test:
        New tests for some possible problems
      mysql-test/t/variables-big.test:
        Don't log id as it's not predictable
      mysys/my_handler.c:
        Updated function comment to reflect old code
        Changed nextflag to be uint32 to ensure we can have flags > 16 bit
        Changed checking if we are in insert with NULL keys as next_flag can now include additional bits that have to be ignored.
        Added SEARCH_INSERT flag to be used when inserting new keys in btree. This flag tells us the that the keys includes row position and it's thus safe to remove SEARCH_FIND
        Added comparision of transid. This is only done if the keys actually have a transid, which is indicated by nextflag
      mysys/my_lock.c:
        Fixed wrong test (Found by Guilhem)
      scripts/Makefile.am:
        Ensure that test programs are deleted by make clean
      sql/rpl_rli.cc:
        Moved assignment order to fix compiler warning
      storage/heap/hp_write.c:
        Add SEARCH_INSERT to signal ha_key_cmp that we we should also compare rowid for keys
      storage/maria/Makefile.am:
        Remove also maria log files when doing make distclean
      storage/maria/ha_maria.cc:
        Use 'file->start_state' as default state for transactional tables without versioning
        At table unlock, set file->state to point to live state. (Needed for information schema to pick up right number of rows)
        In ha_maria::implicit_commit() move all locked (ie open) tables to new transaction. This is needed to ensure ha_maria->info doesn't point to a deleted history event.
        Disable concurrent inserts for insert ... select and table changes with subqueries if statement based replication as this would cause wrong results on slave
      storage/maria/ma_blockrec.c:
        Updated comment
      storage/maria/ma_check.c:
        Compact key pages (removes transid) when doing --zerofill
        Check that 'page_flag' on key pages contains KEYPAGE_FLAG_HAS_TRANSID if there is a single key on the page with a transid
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Use new interface to _ma_rec_pos(), _ma_dpointer(), _ma_ft_del(), ma_update_state_lsn()
        Removed not needed argument from get_record_for_key()
        Fixed that we check doesn't give errors for RTREE; We now treath these like SPATIAL
        Remove some SPATIAL specific code where the virtual functions can handle this in a general manner
        Use info->lastkey_buff instead of info->lastkey
        _ma_dpos() -> _ma_row_pos_from_key()
        _ma_make_key() -> keyinfo->make_key()
        _ma_print_key() -> _ma_print_keydata()
        _ma_move_key() -> ma_copy_copy()
        Add SEARCH_INSERT to signal ha_key_cmp that we we should also compare rowid for keys
        Ensure that data on page doesn't overwrite page checksum position
        Use DBUG_DUMP_KEY instead of DBUG_DUMP
        Use exact key lengths instead of USE_WHOLE_KEY to ha_key_cmp()
        Fixed check if rowid points outside of BLOCK_RECORD data file
        Use info->lastkey_buff instead of key on stack in some safe places
        Added #fdef EXTERNAL_LOCKING around removed state elements
      storage/maria/ma_close.c:
        Use keyinfo->root_lock instead of share->key_root_lock[keynr]
      storage/maria/ma_create.c:
        Removed assert that is already checked in maria_init()
        Force transactinal tables to be of type BLOCK_RECORD
        Fixed wrong usage of HA_PACK_RECORD (should be HA_OPTION_PACK_RECORD)
        Mark keys that uses HA_KEY_ALG_RTREE with HA_RTREE_INDEX for easier handling of these in ma_check
        Store max_trid in index file as state.create_trid. This is used to pack all transids in the index pages relative to max possible transid for file.
      storage/maria/ma_dbug.c:
        Changed _ma_print_key() to use MARIA_KEY
      storage/maria/ma_delete.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        info->lastkey2-> info->lastkey_buff2
        Added SEARCH_INSERT to signal ha_key_cmp that we we should also compare rowid for keys
        Use new interface for get_key(), _ma_get_last_key() and others
        _ma_dpos() -> ma_row_pos_from_key()
        Simplify setting of prev_key in del()
        Ensure that KEYPAGE_FLAG_HAS_TRANSID is set in page_flag if key page has transid
        Treath key pages that may have a transid as if keys would be of variable length
      storage/maria/ma_delete_all.c:
        Reset history state if maria_delete_all_rows() are called
        Update parameters to _ma_update_state_lsns() call
      storage/maria/ma_extra.c:
        Store and restore info->lastkey
      storage/maria/ma_ft_boolean_search.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_ft_nlq_search.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Use lastkey_buff2 instead of info->lastkey+info->s->base.max_key_length (same thing)
      storage/maria/ma_ft_update.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_ftdefs.h:
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_fulltext.h:
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_init.c:
        Check if blocksize is legal
        (Moved test here from ma_open())
      storage/maria/ma_key.c:
        Added functions for storing/reading of transid 
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Moved _ma_sp_make_key() out of _ma_make_key() as we now use keyinfo->make_key to create keys
        Add transid to keys if table is versioned
        Added _ma_copy_key()
      storage/maria/ma_key_recover.c:
        Add logging of page_flag (holds information if there are keys with transid on page)
        Changed DBUG_PRINT("info" -> DBUG_PRINT("redo" as the redo logging can be quite extensive
        Added lots of DBUG_PRINT()
        Added support for index page operations: KEY_OP_SET_PAGEFLAG and KEY_OP_COMPACT_PAGE
      storage/maria/ma_key_recover.h:
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_locking.c:
        Added new arguments to _ma_update_state_lsns_sub()
      storage/maria/ma_loghandler.c:
        Fixed all logging of LSN to look similar in DBUG log
        Changed if (left != 0) to if (left) as the later is used also later in the code
      storage/maria/ma_loghandler.h:
        Added new index page operations
      storage/maria/ma_open.c:
        Removed allocated "state_dummy" and instead use share->state.common for transactional tables that are not versioned
        This is needed to not get double increments of state.records (one in ma_write.c and on when log is written)
        Changed info->lastkey to MARIA_KEY type
        Removed resetting of MARIA_HA variables that have 0 as default value (as info is zerofilled)
        Enable versioning for transactional tables with index. Tables with an auto-increment key, rtree or fulltext keys are not versioned.
        Check on open that state.create_trid is correct
        Extend share->base.max_key_length in case of transactional table so that it can hold transid
        Removed 4.0 compatible fulltext key mode as this is not relevant for Maria
        Removed old and wrong #ifdef ENABLE_WHEN_WE_HAVE_TRANS_ROW_ID code block
        Initialize all new virtual function pointers
        Removed storing of state->unique, state->process and store state->create_trid instead
      storage/maria/ma_page.c:
        Added comment to describe key page structure
        Added functions to compact key page and log the compact operation
      storage/maria/ma_range.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Use SEARCH_PART_KEY indicator instead of USE_WHOLE_KEY to detect if we are doing a part key search
        Added handling of pages with transid
      storage/maria/ma_recovery.c:
        Don't assert if table we opened are not transactional. This may be a table which has been changed from transactional to not transactinal
        Added new arguments to _ma_update_state_lsns()
      storage/maria/ma_rename.c:
        Added new arguments to _ma_update_state_lsns()
      storage/maria/ma_rkey.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Don't use USE_WHOLE_KEY, use real length of key
        Use share->row_is_visible() to test if row is visible
        Moved search_flag == HA_READ_KEY_EXACT out of 'read-next-row' loop as this only need to be tested once
        Removed test if last_used_keyseg != 0 as this is always true
      storage/maria/ma_rnext.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Simplify code by using local variable keyinfo instead if share->keyinfo[i]
        Use share->row_is_visible() to test if row is visible
      storage/maria/ma_rnext_same.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        lastkey2 -> lastkey_buff2
      storage/maria/ma_rprev.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Simplify code by using local variable keyinfo instead if share->keyinfo[i]
        Use share->row_is_visible() to test if row is visible
      storage/maria/ma_rsame.c:
        Updated comment
        Simplify code by using local variable keyinfo instead if share->keyinfo[i]
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_rsamepos.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_rt_index.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Use better variable names
        Removed not needed casts
        _ma_dpos() -> _ma_row_pos_from_key()
        Use info->last_rtree_keypos to save position to key instead of info->int_keypos
        Simplify err: condition
        Changed return type for maria_rtree_insert() to my_bool as we are only intressed in ok/fail from this function
      storage/maria/ma_rt_index.h:
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_rt_key.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Simplify maria_rtree_add_key by combining idenitcal code and removing added_len
      storage/maria/ma_rt_key.h:
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_rt_mbr.c:
        Changed type of 'nextflag' to uint32
        Added 'to' argument to RT_PAGE_MBR_XXX functions to more clearly see which variables changes value
      storage/maria/ma_rt_mbr.h:
        Changed type of 'nextflag' to uint32
      storage/maria/ma_rt_split.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        key_length -> key_data_length to catch possible errors
      storage/maria/ma_rt_test.c:
        Fixed wrong comment
        Reset recinfo to avoid valgrind varnings
        Fixed wrong argument to create_record() that caused test to fail
      storage/maria/ma_search.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Added support of keys with optional trid
        Test for SEARCH_PART_KEY instead of USE_WHOLE_KEY to detect part key reads
        _ma_dpos() -> _ma_row_pos_from_key()
        If there may be keys with transid on the page, have _ma_bin_search() call _ma_seq_search()
        Add _ma_skip_xxx() functions to quickly step over keys (faster than calling get_key() in most cases as we don't have to copy key data)
        Combine similar code at end of _ma_get_binary_pack_key()
        Removed not used function _ma_move_key()
        In _ma_search_next() don't call _ma_search() if we aren't on a nod page.
        Update info->cur_row.trid with trid for found key
        
        
        
        Removed some not needed casts
        Added _ma_trid_from_key()
        Use MARIA_SHARE instead of MARIA_HA as arguments to _ma_rec_pos(), _ma_dpointer() and _ma_xxx_keypos_to_recpos() to make functions faster and smaller
      storage/maria/ma_sort.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_sp_defs.h:
        _ma_sp_make_key() now fills in and returns (MARIA_KEY *) value
      storage/maria/ma_sp_key.c:
        _ma_sp_make_key() now fills in and returns (MARIA_KEY *) value
        Don't test sizeof(double), test against 8 as we are using float8store()
        Use mi_float8store() instead of doing swap of value (same thing but faster)
      storage/maria/ma_state.c:
        maria_versioning() now only calls _ma_block_get_status() if table supports versioning
        Added _ma_row_visible_xxx() functions for different occasions
        When emptying history, set info->state to point to the first history event.
      storage/maria/ma_state.h:
        Added _ma_row_visible_xxx() prototypes
      storage/maria/ma_static.c:
        Indentation changes
      storage/maria/ma_statrec.c:
        Fixed arguments to _ma_dpointer() and _ma_rec_pos()
      storage/maria/ma_test1.c:
        Call init_thr_lock() if we have versioning
      storage/maria/ma_test2.c:
        Call init_thr_lock() if we have versioning
      storage/maria/ma_unique.c:
        Modified functions to use MARIA_KEY
      storage/maria/ma_update.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
      storage/maria/ma_write.c:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Simplify code by using local variable keyinfo instead if share->keyinfo[i]
        In _ma_enlarge_root(), mark in page_flag if new key has transid
        _ma_dpos() -> _ma_row_pos_from_key()
        Changed return type of _ma_ck_write_tree() to my_bool as we are only testing if result is true or not
        Moved 'reversed' to outside block as area was used later
      storage/maria/maria_chk.c:
        Added error if trying to sort with HA_BINARY_PACK_KEY
        Use new interface to get_key() and _ma_dpointer()
        _ma_dpos() -> _ma_row_pos_from_key()
      storage/maria/maria_def.h:
        Modified functions to use MARIA_KEY instead of key pointer and key length
        Added 'common' to MARIA_SHARE->state for storing state for transactional tables without versioning
        Added create_trid to MARIA_SHARE
        Removed not used state variables 'process' and 'unique'
        Added defines for handling TRID's in index pages
        Changed to use MARIA_SHARE instead of MARIA_HA for some functions
        Added 'have_versioning' flag if table supports versioning
        Moved key_root_lock from MARIA_SHARE to MARIA_KEYDEF
        Changed last_key to be of type MARIA_KEY. Removed lastkey_length
        lastkey -> lastkey_buff, lastkey2 -> lastkey_buff2
        Added _ma_get_used_and_nod_with_flag() for faster access to page data when page_flag is read
        Added DBUG_DUMP_KEY for easier DBUG_DUMP of a key
        Changed 'nextflag' and assocaited variables to uint32
      storage/maria/maria_ftdump.c:
        lastkey -> lastkey_buff
      storage/maria/trnman.c:
        Fixed wrong initialization of min_read_from and max_commit_trid
        Added trnman_get_min_safe_trid()
      storage/maria/unittest/ma_test_all-t:
        Added --start-from
      storage/myisam/mi_check.c:
        Added SEARCH_INSERT, as ha_key_cmp() needs it when doing key comparision for inserting key on page in rowid order
      storage/myisam/mi_delete.c:
        Added SEARCH_INSERT, as ha_key_cmp() needs it when doing key comparision for inserting key on page in rowid order
      storage/myisam/mi_range.c:
        Updated comment
      storage/myisam/mi_write.c:
        Added SEARCH_INSERT, as ha_key_cmp() needs it when doing key comparision for inserting key on page in rowid order
      storage/myisam/rt_index.c:
        Fixed wrong parameter to rtree_get_req() which could cause crash
      53500e50
  15. 29 May, 2008 1 commit
    • unknown's avatar
      WL#3138: Maria - fast "SELECT COUNT(*) FROM t;" and "CHECKSUM TABLE t" · a8ba9cb9
      unknown authored
      Added argument to maria_end_bulk_insert() to know if the table will be deleted after the operation
      Fixed wrong call to strmake
      Don't call bulk insert in case of inserting only one row (speed optimization as starting/stopping bulk insert
      Allow storing year 2155 in year field
      When running with purify/valgrind avoid copying structures over themself
      Added hook 'trnnam_end_trans_hook' that is called when transaction ends
      Added trn->used_tables that is used to an entry for all tables used by transaction
      Fixed that ndb doesn't crash on duplicate key error when start_bulk_insert/end_bulk_insert are not called
      
      
      include/maria.h:
        Added argument to maria_end_bulk_insert() to know if the table will be deleted after the operation
      include/my_tree.h:
        Added macro 'reset_free_element()' to be able to ignore calls to the external free function.
        Is used to optimize end-bulk-insert in case of failures, in which case we don't want write the remaining keys in the tree
      mysql-test/install_test_db.sh:
        Upgrade to new mysql_install_db options
      mysql-test/r/maria-mvcc.result:
        New tests
      mysql-test/r/maria.result:
        New tests
      mysql-test/suite/ndb/r/ndb_auto_increment.result:
        Fixed error message now when bulk insert is not always called
      mysql-test/suite/ndb/t/ndb_auto_increment.test:
        Fixed error message now when bulk insert is not always called
      mysql-test/t/maria-mvcc.test:
        Added testing of versioning of count(*)
      mysql-test/t/maria-page-checksum.test:
        Added comment
      mysql-test/t/maria.test:
        More tests
      mysys/hash.c:
        Code style change
      sql/field.cc:
        Allow storing year 2155 in year field
      sql/ha_ndbcluster.cc:
        Added new argument to end_bulk_insert() to signal if the bulk insert should ignored
      sql/ha_ndbcluster.h:
        Added new argument to end_bulk_insert() to signal if the bulk insert should ignored
      sql/ha_partition.cc:
        Added new argument to end_bulk_insert() to signal if the bulk insert should ignored
      sql/ha_partition.h:
        Added new argument to end_bulk_insert() to signal if the bulk insert should ignored
      sql/handler.cc:
        Don't call get_dup_key() if there is no table object. This can happen if the handler generates a duplicate key error on commit
      sql/handler.h:
        Added new argument to end_bulk_insert() to signal if the bulk insert should ignored (ie, the table will be deleted)
      sql/item.cc:
        Style fix
        Removed compiler warning
      sql/log_event.cc:
        Added new argument to ha_end_bulk_insert()
      sql/log_event_old.cc:
        Added new argument to ha_end_bulk_insert()
      sql/mysqld.cc:
        Removed compiler warning
      sql/protocol.cc:
        Added DBUG
      sql/sql_class.cc:
        Added DBUG
        Fixed wrong call to strmake
      sql/sql_insert.cc:
        Don't call bulk insert in case of inserting only one row (speed optimization as starting/stopping bulk insert involves a lot of if's)
        Added new argument to ha_end_bulk_insert()
      sql/sql_load.cc:
        Added new argument to ha_end_bulk_insert()
      sql/sql_parse.cc:
        Style fixes
        Avoid goto in common senario
      sql/sql_select.cc:
        When running with purify/valgrind avoid copying structures over themself.  This is not a real bug in itself, but it's a waste of cycles and causes valgrind warnings
      sql/sql_select.h:
        Avoid copying structures over themself.  This is not a real bug in itself, but it's a waste of cycles and causes valgrind warnings
      sql/sql_table.cc:
        Call HA_EXTRA_PREPARE_FOR_DROP if table created by ALTER TABLE is going to be dropped
        Added new argument to ha_end_bulk_insert()
      storage/archive/ha_archive.cc:
        Added new argument to end_bulk_insert()
      storage/archive/ha_archive.h:
        Added new argument to end_bulk_insert()
      storage/federated/ha_federated.cc:
        Added new argument to end_bulk_insert()
      storage/federated/ha_federated.h:
        Added new argument to end_bulk_insert()
      storage/maria/Makefile.am:
        Added ma_state.c and ma_state.h
      storage/maria/ha_maria.cc:
        Versioning of count(*) and checksum
        - share->state.state is now assumed to be correct, not handler->state
        - Call _ma_setup_live_state() in external lock to get count(*)/checksum versioning. In case of
          not versioned and not concurrent insertable table, file->s->state.state contains the correct state information
        
        Other things:
        - file->s -> share
        - Added DBUG_ASSERT() for unlikely case
        - Optimized end_bulk_insert() to not write anything if table is going to be deleted (as in failed alter table)
        - Indentation changes in external_lock becasue of removed 'goto' caused a big conflict even if very little was changed
      storage/maria/ha_maria.h:
        New argument to end_bulk_insert()
      storage/maria/ma_blockrec.c:
        Update for versioning of count(*) and checksum
        Keep share->state.state.data_file_length up to date (not info->state->data_file_length)
        Moved _ma_block_xxxx_status() and maria_versioning() functions to ma_state.c
      storage/maria/ma_check.c:
        Update and use share->state.state instead of info->state
        info->s to share
        Update info->state at end of repair
        Call _ma_reset_state() to update share->state_history at end of repair
      storage/maria/ma_checkpoint.c:
        Call _ma_remove_not_visible_states() on checkpoint to clean up not visible state history from tables
      storage/maria/ma_close.c:
        Remember state history for running transaction even if table is closed
      storage/maria/ma_commit.c:
        Ensure we always call trnman_commit_trn() even if other calls fails. If we don't do that, the translog and state structures will not be freed
      storage/maria/ma_delete.c:
        Versioning of count(*) and checksum:
        - Always update info->state->checksum and info->state->records
      storage/maria/ma_delete_all.c:
        Versioning of count(*) and checksum:
        - Ensure that share->state.state is updated, as here is where we store the primary information
      storage/maria/ma_dynrec.c:
        Use lock_key_trees instead of concurrent_insert to check if trees should be locked.
        This allows us to lock trees both for concurrent_insert and for index versioning.
      storage/maria/ma_extra.c:
        Versioning of count(*) and checksum:
        - Use share->state.state instead of info->state
        - share->concurrent_insert -> share->non_transactional_concurrent_insert
        - Don't update share->state.state from info->state if transactional table
        
        Optimization:
        - Don't flush io_cache or bitmap if we are using FLUSH_IGNORE_CHANGED
      storage/maria/ma_info.c:
        Get most state information from current state
      storage/maria/ma_init.c:
        Add hash table and free function to store states for closed tables
        Install hook for transaction commit/rollback to update history state
      storage/maria/ma_key_recover.c:
        Versioning of count(*) and checksum:
        - Use share->state.state instead of info->state
      storage/maria/ma_locking.c:
        Versioning of count(*) and checksum:
        - Call virtual functions (if exists) to restore/update status
        - Move _ma_xxx_status() functions to ma_state.c
        
        info->s -> share
      storage/maria/ma_open.c:
        Versioning of count(*) and checksum:
        - For not transactional tables, set info->state to point to new allocated state structure.
        - Initialize new info->state_start variable that points to state at start of transaction
        - Copy old history states from hash table (maria_stored_states) first time the table is opened
        - Split flag share->concurrent_insert to non_transactional_concurrent_insert & lock_key_tree
        - For now, only enable versioning of tables without keys (to be fixed in soon!)
        - Added new virtual function to restore status in maria_lock_database)
        
        More DBUG
      storage/maria/ma_page.c:
        Versioning of count(*) and checksum:
        - Use share->state.state instead of info->state
        - Modify share->state.state.key_file_length under share->intern_lock
      storage/maria/ma_range.c:
        Versioning of count(*) and checksum:
        - Lock trees based on share->lock_key_trees
        
        info->s -> share
      storage/maria/ma_recovery.c:
        Versioning of count(*) and checksum:
        - Use share->state.state instead of info->state
        - Update state information on close and when reenabling logging
      storage/maria/ma_rkey.c:
        Versioning of count(*) and checksum:
        - Lock trees based on share->lock_key_trees
      storage/maria/ma_rnext.c:
        Versioning of count(*) and checksum:
        - Lock trees based on share->lock_key_trees
      storage/maria/ma_rnext_same.c:
        Versioning of count(*) and checksum:
        - Lock trees based on share->lock_key_trees
        - Only skip rows based on file length if non_transactional_concurrent_insert is set
      storage/maria/ma_rprev.c:
        Versioning of count(*) and checksum:
        - Lock trees based on share->lock_key_trees
      storage/maria/ma_rsame.c:
        Versioning of count(*) and checksum:
        - Lock trees based on share->lock_key_trees
      storage/maria/ma_sort.c:
        Use share->state.state instead of info->state
        Fixed indentation
      storage/maria/ma_static.c:
        Added maria_stored_state
      storage/maria/ma_update.c:
        Versioning of count(*) and checksum:
        - Always update info->state->checksum and info->state->records
        - Remove optimization for index file update as it doesn't work for transactional tables
      storage/maria/ma_write.c:
        Versioning of count(*) and checksum:
        - Always update info->state->checksum and info->state->records
      storage/maria/maria_def.h:
        Move MARIA_STATUS_INFO to ma_state.h
        
        Changes to MARIA_SHARE:
        - Added state_history to store count(*)/checksum states
        - Added in_trans as counter if table is used by running transactions
        - Split concurrent_insert into lock_key_trees and on_transactional_concurrent_insert.
        - Added virtual function lock_restore_status
        
        Changes to MARIA_HA:
        - save_state -> state_save
        - Added state_start to store state at start of transaction
      storage/maria/maria_pack.c:
        Versioning of count(*) and checksum:
        - Use share->state.state instead of info->state
        
        Indentation fixes
      storage/maria/trnman.c:
        Added hook 'trnnam_end_trans_hook' that is called when transaction ends
        Added trn->used_tables that is used to an entry for all tables used by transaction
        More DBUG
        Changed return type of trnman_end_trn() to my_bool
        Added trnman_get_min_trid() to get minimum trid in use.
        Added trnman_exists_active_transactions() to check if there exist a running transaction started between two commit id
      storage/maria/trnman.h:
        Added 'used_tables'
        Moved all pointers into same groups to get better memory alignment
      storage/maria/trnman_public.h:
        Added prototypes for new functions and variables
        Chagned return type of trnman_end_trn() to my_bool
      storage/myisam/ha_myisam.cc:
        Added argument to end_bulk_insert() if operation should be aborted
      storage/myisam/ha_myisam.h:
        Added argument to end_bulk_insert() if operation should be aborted
      storage/maria/ma_state.c:
        Functions to handle state of count(*) and checksum
      storage/maria/ma_state.h:
        Structures and declarations to handle state of count(*) and checksum
      a8ba9cb9
  16. 24 Apr, 2008 1 commit
    • unknown's avatar
      WL#3072 - Maria Recovery · 84b174df
      unknown authored
      Recovery of R-tree and fulltext indices.
      Fix for BUG#35551 "Maria: crash in REPAIR TABLE/ENABLE KEYS if using
      repair-with-keycache method".
      Fix for bug (see ma_rt_index.c) where we could have a wrong
      page_link pointer causing wrong memory access during some R-tree
      index insert/delete.
      Making ma_rt_test work again (it had been neglected over time) and
      adding options (record type etc) to prepare it for integration into
      ma_test_all-t (but there is BUG#36321 about "ma_rt_test -M" crash)
      
      
      mysql-test/r/maria.result:
        correct result
      mysql-test/t/maria.test:
        now we get no error
      storage/maria/ma_blockrec.c:
        delete_dir_entry() and delete_head_or_tail() don't use info->keyread_buff.
        ma_get_length() does not change **packet, marking it with 'const' to
        remove some casts in callers of this function. The
        (const uchar**)&header casts will be removed when Monty changes 'header'
        to const uchar*.
        _ma_apply_redo_purge_row_head_or_tail() sets 'buff' from pagecache_read()
        so its initialization was superfluous.
      storage/maria/ma_check.c:
        Fix for BUG#35551 "Maria: crash in REPAIR TABLE/ENABLE KEYS if using repair-with-keycache method"
        (see comment in code)
      storage/maria/ma_create.c:
        FULLTEXT and SPATIAL indices have logging now, they are recoverable.
      storage/maria/ma_delete.c:
        Logging done by _ma_ck_delete() is moved to a function
        (_ma_write_undo_key_delete()), for reusal by R-tree logging.
        _ma_log_delete() is made non-static for same
        reason, and some of its parameters are made pointers to const.
        Removed wrong comment ("Note that for delete key" etc, contradicted by
        code and comment "Log also position to row" a few lines above)
      storage/maria/ma_ft_update.c:
        unneeded cast, comment for future
      storage/maria/ma_key_recover.c:
        Comment about possible deadlock.
        Write bad page to DBUG trace if KEY_OP_CHECK founds bad CRC.
        Support operation KEY_OP_MULTI_COPY.
        When we execute, in UNDO phase, UNDO_KEY_DELETE|INSERT, we must call
        the proper key insertion|deletion depending on if this is R-tree
        or B-tree.
        Explanation of of _ma_[un]lock_key_del() work, maybe useful for
        mortals like me.
      storage/maria/ma_key_recover.h:
        change of prototypes
      storage/maria/ma_loghandler.h:
        New operation which can be stored in REDO_INDEX log records: KEY_OP_MULTI_COPY
      storage/maria/ma_page.c:
        Comments
      storage/maria/ma_pagecache.c:
        typo
      storage/maria/ma_rt_index.c:
        Fix for bug: the page_link pointer in maria_rtree_insert_req()
        could be wrong when we set its 'changed' member; for the solution
        see ma_key_recover.h. It is needed only in cases when we manipulate
        several pages.
        Logging of changes done to pages by key insert/delete.
        maria_rtree_delete()'s main work is moved to a new function
        maria_rtree_real_delete(), which is used by maria_rtree_delete()
        and by applying of UNDO_KEY_INSERT.
      storage/maria/ma_rt_index.h:
        new prototypes and macros for ma_rt_index.c
      storage/maria/ma_rt_key.c:
        Logging of maria_rtree_add_key() and maria_rtree_delete_key().
        When inserting, split is necessary if there is not enough room for key:
        take checksum's occupied space in this calculation.
      storage/maria/ma_rt_key.h:
        new prototypes (those functions need to know the page's id
        because they do logging)
      storage/maria/ma_rt_mbr.c:
        Comments about what the functions change.
      storage/maria/ma_rt_split.c:
        maria_rtree_split_page() needs to know the page's id, because
        it does logging.
        Logging of what a split operation does to the split page (see
        comment of _ma_log_rt_split(): moves of keys inside the page,
        sometimes insertion of the new key, and shrinking of the page)
        and to the new page (receives some keys from split page, and
        sometimes the new key).
      storage/maria/ma_rt_test.c:
        ma_rt_test had been forgotten when maria_rkey() was changed some months ago
        (0->HA_WHOLE_KEY change), and when calls to maria_rnd(,,HA_OFFSET_ERROR)
        were rewritten to maria_scan() calls (which implies maria_scan_init()).
        The 'max_i' change is to adapt to the fact that maria_scan() does
        not return deleted records for BLOCK_RECORD but does so for other formats;
        the initial code assumed a certain number of deleted records would be
        returned, we change it to rather count only non-deleted ones.
        We also add more features to this test, like ma_test1 (the plan
        is to run ma_rt_test in ma_test_all-t):
        options to choose records' format, table checksum, transactions,
        checkpoints, end at specific stages, abort without committing,
        and debug trace.
      storage/maria/ma_test1.c:
        MY_INIT() does my_init().
      storage/maria/ma_write.c:
        Logging done by _ma_ck_write_btree_with_log() is moved to a function
        (_ma_write_undo_key_insert()), for reusal by R-tree logging.
        _ma_log_new() and _ma_log_change() are made non-static for same
        reason. Some parameters of logging functions are made pointers to const.
        If EXTRA_DEBUG_KEY_CHANGES, we now log CRC in _ma_log_change() too
        (better checks, bigger record).
      storage/maria/maria_read_log.c:
        Program takes no arguments, bail out if any, instead of silently discarding them
      storage/myisam/rt_test.c:
        rt_test had been forgotten when mi_rkey() was changed some months ago
        (0->HA_WHOLE_KEY change).
        The 'max_i' change is to make it symmetric with ma_rt_test.c
      mysql-test/r/maria-gis-rtree-dynamic.result:
        correct result
      mysql-test/r/maria-gis-rtree-trans.result:
        correct result
      mysql-test/r/maria-recovery-rtree-ft.result:
        almost correct result (hitting BUG# in the end)
      mysql-test/t/maria-gis-rtree-dynamic.test:
        test R-tree & dynamic row format
      mysql-test/t/maria-gis-rtree-trans.test:
        Test R-tree and page row format and transactional
      mysql-test/t/maria-recovery-rtree-ft-master.opt:
        usual options for recovery testing
      mysql-test/t/maria-recovery-rtree-ft.test:
        test of recovery of R-tree and fulltext indices.
      84b174df
  17. 10 Apr, 2008 1 commit
    • unknown's avatar
      Added versioning of row data · 716a3493
      unknown authored
      Will in future changeset (soon) av versioning of status variables (number of rows) and index
      Changed some LEX_STRING to LEX_CUSTRING to avoid casts and warnings
      Removed some not needed variables (as noticed by Guilhem)
      
      
      include/maria.h:
        Added prototypes for maria_chk_init_for_check(), maria_versioning() and maria_ignore_trids()
      include/my_base.h:
        Add new error HA_ERR_ROW_NOT_VISIBLE
      include/myisamchk.h:
        Added variables for checking visibility of rows during maria_chk
      include/thr_lock.h:
        Changed argument type from int to my_bool for get_status
        Added variable allow_multiple_concurrent_insert, to signal if table supports multiple concurrent inserts
      mysql-test/r/maria-page-checksum.result:
        Added missing drop table
      mysql-test/t/maria-page-checksum.test:
        Added missing drop table
      mysys/my_handler.c:
        Added new error messages
      mysys/thr_lock.c:
        Added support for multiple concurrent inserts, if table handler supports it
      sql/sql_yacc.yy:
        Added LOCK TABLE table_name WRITE CONCURRENT
        This was added (temporarly?) to be able to check versioning with Maria
      storage/csv/ha_tina.cc:
        Updated parameter for get_status
      storage/maria/ha_maria.cc:
        Added calls to maria_chk_init_status()
        Fixed call to ma_control_file_open()
      storage/maria/ma_blockrec.c:
        Changed some LEX_STRING to LEX_CUSTRING to avoid casts and warnings
        Changed back some 'header' parameters to const char*
        Removed some casts
        
        Added support for versioning:
        - If info->row_flag & ROW_FLAG_TRANSID is set, store transaction id together with the row
        - When reading rows, check if rows are visible. Give error if not
        - When scanning table, ignore not visible rows
        - Added function parameters to some functions, to be able to call _ma_compact_block_page() with different parameters depending of if the page is a HEAD or TAIL page
        - _ma_compact_block_page() deletes transaction id's that are visible by all running transactions
        - Added functions for thr_lock() to enable multiple concurrent inserts
        - Added helper function 'mysql_versioning()' to enable/disable versioning
        - Added helper function maria_ignore_trids(), used by maria_chk and maria_pack to see all rows.
      storage/maria/ma_blockrec.h:
        Updated parameters for some functions.
        Added new functions to read/store state with thr_lock
      storage/maria/ma_check.c:
        Enable handling of transaction id's in rows
        Give a readable error if a table contains a transation id that makes rows not visible
      storage/maria/ma_control_file.c:
        Added option to not give warning if control file doesn't exists.
      storage/maria/ma_control_file.h:
        Updated parameter lists for ma_control_file_open()
      storage/maria/ma_delete.c:
        Removed not used variable (suggestion by Guilhem)
      storage/maria/ma_locking.c:
        Changed type of argument from int -> my_bool
      storage/maria/ma_open.c:
        Removed not used variables 'key_write_undo_lsn' and 'key_delete_undo_lsn'
        Added new thr_lock interface functions for BLOCK_RECORD to enable multiple concurrent insert
      storage/maria/ma_test1.c:
        Added option --versioning (-C) to check versioning
      storage/maria/ma_test2.c:
        Added option -C to check versioning
      storage/maria/ma_test_recovery:
        Forward argumetns to ma_test_recovery.pl
      storage/maria/ma_write.c:
        Removed not used variable key_write_undo_lsn
      storage/maria/maria_chk.c:
        Always read control file (if exist) at start
        Initialize checking of tables by calling maria_chk_init_for_check()
        In verbose mode and in case of error, print max found transaction id
      storage/maria/maria_def.h:
        Added Trid to MARIA_ROW to be able to check transaction id for found row
        Moved 'base_length' from MARIA_ROW to MARIA_HA to be able to handle different base length (with and without TRANSID) without if's
        Added default row_flag to MARIA_HA for the same reason
        Changed LEX_STRING -> LEX_CUSTRING to avoid casts in ma_blockrec.c
        Removed not needed variables key_write_undo_lsn and key_delete_undo_lsn
        Added prototypes for new functions and fixed those that had changed
      storage/maria/maria_pack.c:
        Ensure we can read all rows from the file, independent of the used transaction id
      storage/maria/maria_read_log.c:
        Updated arguments to ma_control_file_open()
      storage/maria/trnman.c:
        If we have only one transaction, fixed that min_read_from contains current transaction
        Fixed that trnman_can_read_from() returns that row is readable if it was written by current transaction
      storage/maria/unittest/ma_control_file-t.c:
        Updated arguments to ma_control_file_open()
      storage/maria/unittest/ma_test_all-t:
        Added test of versioning
        Removed printing of one extra space
      storage/maria/unittest/ma_test_loghandler-t.c:
        Updated arguments to ma_control_file_open()
      storage/maria/unittest/ma_test_loghandler_first_lsn-t.c:
        Updated arguments to ma_control_file_open()
      storage/maria/unittest/ma_test_loghandler_max_lsn-t.c:
        Updated arguments to ma_control_file_open()
      storage/maria/unittest/ma_test_loghandler_multigroup-t.c:
        Updated arguments to ma_control_file_open()
      storage/maria/unittest/ma_test_loghandler_multithread-t.c:
        Updated arguments to ma_control_file_open()
      storage/maria/unittest/ma_test_loghandler_noflush-t.c:
        Updated arguments to ma_control_file_open()
      storage/maria/unittest/ma_test_loghandler_nologs-t.c:
        Updated arguments to ma_control_file_open()
      storage/maria/unittest/ma_test_loghandler_pagecache-t.c:
        Updated arguments to ma_control_file_open()
      storage/maria/unittest/ma_test_loghandler_purge-t.c:
        Updated arguments to ma_control_file_open()
      storage/maria/unittest/ma_test_recovery.expected:
        Updated file with result from new tests
      storage/maria/unittest/ma_test_recovery.pl:
        Added options --abort-on-error and --verbose
        In case of --verbose, print all excuted shell commands
        Added test of versioning
      storage/myisam/mi_locking.c:
        Updated type of parameter
      storage/myisam/myisamdef.h:
        Updated type of parameter
      mysql-test/r/maria-mvcc.result:
        New BitKeeper file ``mysql-test/r/maria-mvcc.result''
      mysql-test/t/maria-mvcc.test:
        New BitKeeper file ``mysql-test/t/maria-mvcc.test''
      716a3493
  18. 03 Apr, 2008 1 commit
    • unknown's avatar
      Injecting more "const" declarations into code which does not change · d68922e6
      unknown authored
      pointed data.
      I ran gcc -Wcast-qual on storage/maria, this identified un-needed casts,
      a couple of functions which said they had a const parameter though
      they changed the pointed content! This is fixed here. Some suspicious
      places receive a comment.
      The original intention of running -Wcast-qual was to find what code
      changes R-tree keys: I added const words, but hidden casts
      like those of int2store (casts target to (uint16*)) removed const
      checking; -Wcast-qual helped find those hidden casts.
      Log handler does not change the content pointed by LEX_STRING::str it
      receives, so we now use a struct which has a const inside, to emphasize
      this and be able to pass "const uchar*" buffers to log handler
      without fear of their content being changed by it.
      One-line fix for a merge glitch (when merging from MyISAM).
      
      
      include/m_string.h:
        As Maria's log handler uses LEX_STRING but never changes the content
        pointed by LEX_STRING::str, and assigns uchar* into this member most
        of the time, we introduce a new struct LEX_CUSTRING
        (C const U unsigned) for the log handler.
      include/my_global.h:
        In macros which read pointed content: use const pointers so that
        gcc -Wcast-qual does not warn about casting a const pointer to non-const.
      include/my_handler.h:
        In macros which read pointed content: use const pointers so that
        gcc -Wcast-qual does not warn about casting a const pointer to non-const.
        ha_find_null() does not change *a.
      include/my_sys.h:
        insert_dynamic() does not change *element.
      include/myisampack.h:
        In macros which read pointed content: use const pointers so that
        gcc -Wcast-qual does not warn about casting a const pointer to non-const.
      mysys/array.c:
        insert_dynamic() does not change *element
      mysys/my_handler.c:
        ha_find_null() does not change *a
      storage/maria/ma_bitmap.c:
        Log handler receives const strings now
      storage/maria/ma_blockrec.c:
        Log handler receives const strings now.
        _ma_apply_undo_row_delete/update() do change *header.
      storage/maria/ma_blockrec.h:
        correct prototype
      storage/maria/ma_check.c:
        Log handler receives const strings now. Un-needed casts
      storage/maria/ma_checkpoint.c:
        Log handler receives const strings now
      storage/maria/ma_checksum.c:
        unneeded cast
      storage/maria/ma_commit.c:
        Log handler receives const strings now
      storage/maria/ma_create.c:
        Log handler receives const strings now
      storage/maria/ma_dbug.c:
        fixing warning of gcc -Wcast-qual
      storage/maria/ma_delete.c:
        Log handler receives const strings now
      storage/maria/ma_delete_all.c:
        Log handler receives const strings now
      storage/maria/ma_delete_table.c:
        Log handler receives const strings now
      storage/maria/ma_dynrec.c:
        fixing some warnings of gcc -Wcast-qual. Unneeded casts removed.
        Comment about function which lies.
      storage/maria/ma_ft_parser.c:
        fix for warnings of gcc -Wcast-qual, removing unneeded casts
      storage/maria/ma_ft_update.c:
        less casts, comment
      storage/maria/ma_key.c:
        less casts, stay const (warnings of gcc -Wcast-qual)
      storage/maria/ma_key_recover.c:
        Log handler receives const strings now
      storage/maria/ma_loghandler.c:
        Log handler receives const strings now
      storage/maria/ma_loghandler.h:
        Log handler receives const strings now
      storage/maria/ma_loghandler_lsn.h:
        In macros which read pointed content: use const pointers so that
        gcc -Wcast-qual does not warn about casting a const pointer to non-const.
      storage/maria/ma_page.c:
        Log handler receives const strings now; more const
      storage/maria/ma_recovery.c:
        Log handler receives const strings now
      storage/maria/ma_rename.c:
        Log handler receives const strings now
      storage/maria/ma_rt_index.c:
        more const, to emphasize that functions don't change pointed content.
        best_key= NULL was forgotten during merge from MyISAM a few days ago,
        was causing a Valgrind warning
      storage/maria/ma_rt_index.h:
        new proto
      storage/maria/ma_rt_key.c:
        more const
      storage/maria/ma_rt_key.h:
        new proto
      storage/maria/ma_rt_mbr.c:
        more const for functions which deserve it
      storage/maria/ma_rt_mbr.h:
        new prototype
      storage/maria/ma_rt_split.c:
        make const what is not changed.
      storage/maria/ma_search.c:
        un-needed casts, more const
      storage/maria/ma_sp_key.c:
        more const
      storage/maria/ma_unique.c:
        un-needed casts.
      storage/maria/ma_write.c:
        Log handler receives const strings now
      storage/maria/maria_def.h:
        some more const
      storage/maria/unittest/ma_test_loghandler-t.c:
        Log handler receives const strings now
      storage/maria/unittest/ma_test_loghandler_first_lsn-t.c:
        Log handler receives const strings now
      storage/maria/unittest/ma_test_loghandler_max_lsn-t.c:
        Log handler receives const strings now
      storage/maria/unittest/ma_test_loghandler_multigroup-t.c:
        Log handler receives const strings now
      storage/maria/unittest/ma_test_loghandler_multithread-t.c:
        Log handler receives const strings now
      storage/maria/unittest/ma_test_loghandler_noflush-t.c:
        Log handler receives const strings now
      storage/maria/unittest/ma_test_loghandler_nologs-t.c:
        Log handler receives const strings now
      storage/maria/unittest/ma_test_loghandler_pagecache-t.c:
        Log handler receives const strings now
      storage/maria/unittest/ma_test_loghandler_purge-t.c:
        Log handler receives const strings now
      d68922e6
  19. 18 Feb, 2008 1 commit
    • unknown's avatar
      Merge from 5.1-build of the "my_bool for C" changeset. · 340f3369
      unknown authored
      Removing "#define bool BOOL" as it's dangerous.
      
      
      include/config-win.h:
        This #define was confusing: a) it changes the semantics of bool but
        only on Windows (C++ standard says that casting int to bool to int
        yields 0 or 1, but if using BOOL (which is int) this breaks, see
        old BUG 11567 "Variable 'foreign_key_checks', and other variables,
        differs binlog tests") b) it is not needed in C++ which has a bool type
        c) it is not needed in C where we must use my_bool as bool either does
        not exist or changes size between C and C++.
      storage/maria/ma_check.c:
        my_bool for C
      storage/maria/ma_dynrec.c:
        my_bool for C
      storage/maria/ma_search.c:
        my_bool for C
      storage/maria/ma_write.c:
        my_bool for C
      storage/maria/maria_def.h:
        my_bool for C
      storage/maria/maria_pack.c:
        my_bool for C
      340f3369
  20. 07 Feb, 2008 1 commit
    • unknown's avatar
      Mac compiler warnings fixed. · 1dec5f9e
      unknown authored
      include/maria.h:
        mac compiler warnings fixed.
      storage/maria/ma_bitmap.c:
        mac compiler warnings fixed.
      storage/maria/ma_blockrec.c:
        mac compiler warnings fixed.
      storage/maria/ma_check.c:
        mac compiler warnings fixed.
      storage/maria/ma_control_file.c:
        mac compiler warnings fixed.
      storage/maria/ma_create.c:
        mac compiler warnings fixed.
      storage/maria/ma_delete.c:
        mac compiler warnings fixed.
      storage/maria/ma_ft_boolean_search.c:
        mac compiler warnings fixed.
      storage/maria/ma_page.c:
        mac compiler warnings fixed.
      storage/maria/ma_pagecache.c:
        mac compiler warnings fixed.
      storage/maria/ma_recovery.c:
        mac compiler warning fixed.
      storage/maria/ma_rt_test.c:
        mac compiler warnings fixed.
      storage/maria/ma_search.c:
        mac compiler warning fixed.
      storage/maria/ma_write.c:
        mac compiler warnings fixed.
      storage/maria/unittest/ma_control_file-t.c:
        mac compiler warnings fixed.
      storage/maria/unittest/ma_pagecache_consist.c:
        mac compiler warnings fixed.
      storage/maria/unittest/ma_pagecache_single.c:
        mac compiler warnings fixed.
      storage/maria/unittest/ma_test_loghandler_pagecache-t.c:
        mac compiler warning fixed.
      storage/maria/unittest/test_file.c:
        mac compiler warning fixed.
      1dec5f9e
  21. 31 Jan, 2008 1 commit
    • unknown's avatar
      Fixed bug in restoring auto-increment value in case of duplicate key with insert or update · c83dee07
      unknown authored
      Fixed bug when calculating max_key_length that caused some ALTER TABLE to fail if MAX_ROWS was used.
      Use maria_block_size instead of MARIA_MIN_KEY_BLOCK_LENGTH
      Fixed bug when scanning table with BLOCK format for repair; If table was > bitmap coverage one page block was read twice which caused a lot of duplicate key errors
      Could not repeat Bug#34106 "auto_increment is reset to 1 when table is recovered from crash" after this patch.
      
      NOTE: This is an incompatible change, so one must do maria_chk -r on ones old Maria tables!
      Sorry, but this was needed to fix the bug with max_key_length and to be able to handle bigger key files with smaller key references
      
      
      cmd-line-utils/readline/readline.c:
        Fixed compiler warnings
      mysql-test/r/maria.result:
        Added more test of auto-increment handling
      mysql-test/t/maria.test:
        Added more test of auto-increment handling
      mysys/my_pread.c:
        Fixed wrong test
        Removed not needed tests (error is always 1 if readbytes != Count)
      mysys/my_read.c:
        Fixed wrong test
      storage/maria/ha_maria.cc:
        Disable LOAD INDEX until I got Sanja's extension to pagecache interface
      storage/maria/ma_blockrec.c:
        Ensure that info->last_auto_increment is reset properly
      storage/maria/ma_check.c:
        Fixed wrong printing of row number in case of duplicate key for --safe-repair
        Safety fix in recreate table so that Column numbers are given to maria_create() in original order
        Added missing HA_OPEN_FOR_REPAIR to maria_open()
        Fixed bug when scanning table with BLOCK format for repair; If table was > bitmap coverage one page block was read twice which caused a lot of duplicate key errors
      storage/maria/ma_create.c:
        Use correct value for how much free space there is on a key page
        Remember some missing table option when doing re-create.
        Removed optimization where last packed fields is unpacked; Caused problems for re-create.
      storage/maria/ma_delete.c:
        Ensure that info->last_auto_increment is reset properly
        Fix for update to restore autoincrement value on duplicate key
      storage/maria/ma_key_recover.c:
        Moved handling of restoring value of auto-increment in case of duplicate key from clr to undo
        This ensures the restoring works both for insert and update and also that this is symetrical to how the auto_increment value is stored
      storage/maria/ma_key_recover.h:
        Added new prototype
      storage/maria/ma_loghandler.c:
        Added hook to write_hook_for_undo_key_delete()
      storage/maria/ma_open.c:
        Fixed wrong calculation of max_key_file_length
      storage/maria/ma_page.c:
        Use maria_block_size instead of MARIA_MIN_KEY_BLOCK_LENGTH
        Increase internal buffer (safety fix)
      storage/maria/ma_search.c:
        Use maria_block_size instead of MARIA_MIN_KEY_BLOCK_LENGTH
        Note that this is an incompatible change, so one must do maria_chk -r on ones old Maria tables (sorry)
      storage/maria/ma_update.c:
        Ensure that info->last_auto_increment is reset properly
      storage/maria/ma_write.c:
        Ensure that info->last_auto_increment is reset properly
        Fix for update to restore autoincrement value on duplicate key
      storage/maria/maria_chk.c:
        Allow small page_buffer_size
        Fixed printing for --describe to better fit into 80 characters
      storage/maria/maria_def.h:
        Added comments
      c83dee07
  22. 29 Jan, 2008 1 commit
    • unknown's avatar
      Fix for BUG#34114 "maria_chk reports false error when several tables on · f5c820cd
      unknown authored
      command-line" and BUG#34062 "Maria table corruption on master".
      Use 5 bytes (instead of 4) to store page's number in the checkpoint
      record, to allow bigger table (1PB with maria-block-size=1kB).
      Help pushbuild not run out of memory by moving the portion of
      maria-recovery.test which generates lots of data into a -big.test.
      
      
      mysql-test/r/maria-recovery.result:
        result moved
      mysql-test/t/maria-recovery.test:
        piece which generates much data moved to maria-recovery-big.test
      mysys/my_pread.c:
        To fix BUG#34062, where a 1.1TB file was generated due to a wrong
        pwrite offset, it was useful to not lose precision on 'offset' in
        DBUG_PRINT, so that the crazy value is visible.
      mysys/my_read.c:
        To fix BUG#34062, where a 1.1TB file was generated due to a wrong
        pwrite offset, it was useful to not lose precision on 'offset' in
        DBUG_PRINT, so that the crazy value is visible.
      mysys/my_write.c:
        To fix BUG#34062, where a 1.1TB file was generated due to a wrong
        pwrite offset, it was useful to not lose precision on 'offset' in
        DBUG_PRINT, so that the crazy value is visible.
      storage/maria/ha_maria.cc:
        When starting a bulk insert, we throw away dirty index pages from the
        cache. Unique (non disabled) key insertions thus read out-of-date
        pages from the disk leading to BUG#34062 "Maria table corruption on
        master": a DELETE in procedure viewer_sp() had deleted all rows of
        viewer_tbl2 one by one, putting index page 1 into key_del; that page
        was thrown away at start of INSERT SELECT, then the INSERT SELECT
        needed a page to insert keys, looked at key_del, found 1, read page 1
        from disk, and its out-of-date content was used to set the new value of
        key_del (crazy value of 1TB), then a later insertion needed another
        index page, tried to read page at this crazy offset and failed, leading
        to corruption mark.
        The fix is to destroy out-of-date pages and make the state consistent
        with that, i.e. call maria_delete_all_rows().
      storage/maria/ma_blockrec.c:
        Special hook for UNDO_BULK_INSERT
      storage/maria/ma_blockrec.h:
        special hook for UNDO_BULK_INSERT
      storage/maria/ma_check.c:
        Fix for BUG#34114 "maria_chk reports false error when several tables on
        command-line": if the Nth (on the command line) table was BLOCK_RECORD
        it would start checks by using the param->record_checksum computed by
        checks of table N-1.
      storage/maria/ma_delete_all.c:
        comment
      storage/maria/ma_loghandler.c:
        special hook for UNDO_BULK_INSERT
      storage/maria/ma_page.c:
        comment
      storage/maria/ma_pagecache.c:
        page number is 5 bytes in checkpoint record now (allows bigger tables)
      storage/maria/ma_recovery.c:
        page number is 5 bytes in checkpoint record now
      storage/maria/ma_recovery_util.c:
        page number is 5 bytes now
      storage/maria/ma_write.c:
        typo
      mysql-test/r/maria-recovery-big.result:
        result is correct
      mysql-test/t/maria-recovery-big-master.opt:
        usual options for recovery tests
      mysql-test/t/maria-recovery-big.test:
        Moving out the big blob test to a -big test (it exhausts memory when
        using /dev/shm on certain machines)
      f5c820cd
  23. 12 Jan, 2008 1 commit
    • unknown's avatar
      Fixed compiler warnings · 24ce0838
      unknown authored
      Fixed type that caused windows builds to fail
      
      
      include/my_alloc.h:
        Use size_t for memory areas instead of uint
      mysys/mf_iocache.c:
        Fixed compiler warnings by adding casts
      mysys/my_compress.c:
        Fixed compiler warnings by adding casts
      mysys/my_getsystime.c:
        Fixed typo
      mysys/my_static.h:
        Use size_t for memory areas
      mysys/safemalloc.c:
        Use size_t for memory areas
      storage/maria/ma_bitmap.c:
        Fixed compiler warnings by adding casts
      storage/maria/ma_blockrec.c:
        Fixed compiler warnings by adding casts
      storage/maria/ma_cache.c:
        Use size_t for memory areas
      storage/maria/ma_info.c:
        Use size_t for memory areas
      storage/maria/ma_key.c:
        Fixed compiler warnings by adding casts
      storage/maria/ma_locking.c:
        Fixed compiler warnings by adding casts
      storage/maria/ma_open.c:
        Fixed compiler warnings by adding casts
      storage/maria/ma_packrec.c:
        Fixed compiler warnings by fixing type for variable
      storage/maria/ma_statrec.c:
        Fixed compiler warnings by adding casts
      storage/maria/ma_write.c:
        Fixed compiler warnings by adding casts
      storage/maria/maria_def.h:
        Use size_t for memory areas
      storage/myisam/mi_search.c:
        Fixed compiler warnings by adding casts
      24ce0838
  24. 10 Jan, 2008 1 commit
    • unknown's avatar
      Added --loose-skip-maria to MYSQLD_BOOTSTRAP_CMD to get bootstrap.test to work · 156c81b6
      unknown authored
      Allow one to run bootstrap even if --skip-maria is used (needed for bootstrap.test)
      Fixed lots of compiler warnings
      
      NOTE:
      maria-big and maria-recover tests failes becasue of bugs in transaction log handling.
      Sanja knows about this and is working on it!
      
      
      mysql-test/mysql-test-run.pl:
        Added --loose-skip-maria to MYSQLD_BOOTSTRAP_CMD to get bootstrap.test to work
      mysql-test/r/maria-recovery.result:
        Updated results
      mysql-test/t/bootstrap.test:
        Removed not needed empty line
      mysql-test/t/change_user.test:
        Fixed results for 32 bit systems
      mysql-test/t/maria-big.test:
        Only run this when you use --big
      mysql-test/t/maria-recovery.test:
        Added test case for recovery with big blobs
      mysys/my_uuid.c:
        Fixed compiler warning
      sql/mysqld.cc:
        Allow one to run bootstrap even if --skip-maria is used (needed for bootstrap.test)
      sql/set_var.cc:
        Compare max_join_size with ULONG_MAX instead of HA_POS_ERROR as we set max_join_size to ULONG_MAX by default
      storage/maria/ma_bitmap.c:
        Added __attribute((unused)) to fix compiler warning
      storage/maria/ma_blockrec.c:
        Added casts to remove compiler warnings
        Change variable types to avoid compiler warnings
      storage/maria/ma_check.c:
        Added casts to remove compiler warnings
      storage/maria/ma_checkpoint.c:
        Change variable types to avoid compiler warnings
      storage/maria/ma_create.c:
        Change variable types to avoid compiler warnings
      storage/maria/ma_delete.c:
        Added casts to remove compiler warnings
      storage/maria/ma_key_recover.c:
        Added casts to remove compiler warnings
      storage/maria/ma_loghandler.c:
        Moved initiazation of prev_buffer first as this could otherwise not be set in case of errors
      storage/maria/ma_page.c:
        Added casts to remove compiler warnings
      storage/maria/ma_pagecache.c:
        Added __attribute((unused)) to fix compiler warning
      storage/maria/ma_pagecrc.c:
        Added #ifndef DBUG_OFF to remove compiler warning
      storage/maria/ma_recovery.c:
        Added casts to remove compiler warnings
      storage/maria/ma_write.c:
        Added casts to remove compiler warnings
      storage/maria/maria_chk.c:
        Split long string into two to avoid compiler warnings
      storage/myisam/ft_boolean_search.c:
        Added LINT_INIT() to remove compiler warning
      support-files/compiler_warnings.supp:
        Suppress wrong compiler warning
      unittest/mytap/tap.c:
        Fixed declaration to match prototypes to remove compiler warnings
      156c81b6
  25. 07 Jan, 2008 1 commit
    • unknown's avatar
      Bugs fixed: · cd9c75c3
      unknown authored
      - If not in autocommit mode, delete rows one by one so that we can roll back if necessary
      - bitmap->used_size was not correctly set, which caused bitmap pages to be overwritten
      - Fixed bug in bitmap handling when allocation tail pages
      - Ensure we reserve place for directory entry when calculation place for head and tail pages
      - Fixed wrong value in bitmap->size[0]
      - Fixed wrong assert in flush_log_for_bitmap
      - Fixed bug in _ma_bitmap_release_unused() where tail blocks could be wrongly reset
      - Mark new pages as changed (Required to get repair() to work)
      - Fixed problem with advancing log horizon pointer within one page bounds
      - Fixed DBUG_ASSERT() when enable_indexes failes for end_bulk_insert()
      - Fixed bug in logging of rows with more than one big blob
      - Fixed DBUG_ASSERTS() in pagecache to allow change of WRITE_LOCK to READ_LOCK in unlock() calls
      - Flush pagecache when we change from logging to not logging (if not, pagecache code breaks)
      - Ensure my_errno is set on return from write/delete/update
      - Fixed bug when using FIELD_SKIP_PRESPACE
      
      New features:
      - mysql_fix_privilege_tables now first uses binaries and scripts from source distribution, then in installed distribution
      - Fix that optimize works for Maria tables
      - maria_check --zerofill now also clear freed blob pages
      - maria_check -di now prints more information about record page utilization
      
      Optimizations:
      - Use pagecache_unlock_by_link() instead of pagecache_write() if possible. (Avoids a memory copy and a find_block)
      - Simplify code to abort when we found optimal bit pattern
      - Skip also full head page bit patterns when searching for tail
      - Increase default repair buffer to 128M for maria_chk and maria_read_log
      - Increase default sort buffer for maria_chk to 64M
      - Increase size of sortbuffer and pagecache for mysqld to 64M
      - VARCHAR/CHAR fields are stored in increasing length order for BLOCK_RECORD tables
      
      Better reporting:
      - Fixed test of error condition for flush (for better error code)
      - More error messages to mysqld if Maria recovery fails
      - Always print warning if rows are deleted in repair
      - Added global function _db_force_flush() that is usable when doing debugging in gdb
      - Added call to my_debug_put_break_here() in case of some errors (for debugging)
      - Remove used testfiles in unittest as these was written in different directories depending on from where the test was started
      
      This should fix the bugs found when importing a big table with many varchars and one/many blobs to Maria
      
      
      dbug/dbug.c:
        Added global function _db_force_flush() that is usable when doing debugging in gdbine
      extra/replace.c:
        Fixed memory leak
      include/my_dbug.h:
        Prototype for _db_force_flush()
      include/my_global.h:
        Added stdarg.h as my_sys.h now depends on it.
      include/my_sys.h:
        Make my_dbug_put_break_here() a NOP if not DBUG build
        Added my_printv_error()
      include/myisamchk.h:
        Added entry 'lost' to be able to count space that is lost forever
      mysql-test/r/maria.result:
        Updated results
      mysql-test/t/maria.test:
        Reset autocommit after test
        New test to check if delete_all_rows is used (verified with --debug)
      mysys/my_error.c:
        Added my_printv_error()
      scripts/mysql_fix_privilege_tables.sh:
        First use binaries and scripts from source distribution, then in installed distribution
        This ensures that a development branch doesn't pick up wrong scripts)
      sql/mysqld.cc:
        Fix that one can break maria recovery with ^C when debugging
      sql/sql_class.cc:
        Removed #ifdef that has no effect
        (The preceeding DBUG_ASSERT() ensures that the following code will not be exectued)
      storage/maria/ha_maria.cc:
        Increase size of sortbuffer and pagecache to 64M
        Fix that optimize works for Maria tables
        Fixed DBUG_ASSERT() when enable_indexes failes for end_bulk_insert()
        If not in autocommit mode, delete rows one by one so that we can roll back if necessary
        Fixed variable comments
      storage/maria/ma_bitmap.c:
        More ASSERTS to detect overwrite of bitmap pages
        bitmap->used_size was not correctly set, which caused bitmap pages to be overwritten
        Ensure we reserve place for directory entry when calculation place for head and tail pages
        bitmap->size[0] should not include space for directory entry
        Simplify code to abort when we found optimal bit pattern
        Skip also full head page bit patterns when searching for tail (should speed up some common cases)
        Fixed bug in allocate_tail() when block->used was not aligned on 6 bytes
        Fixed wrong assert in flush_log_for_bitmap
        Fixed bug in _ma_bitmap_release_unused() where tail blocks could be wrongly reset
      storage/maria/ma_blockrec.c:
        Ensure my_errno is set on return
        Fixed not optimal setting of row->min_length if we don't have variable length fields
        Use pagecache_unlock_by_link() instead of pagecache_write() if possible. (Avoids a memory copy and a find_block)
        Added DBUG_ASSERT() if we read or write wrong VARCHAR data
        Added DBUG_ASSERT() to find out if row sizes are calculated wrong
        Fixed bug in logging of rows with more than one big blob
      storage/maria/ma_check.c:
        Disable logging while normal repair is done to avoid logging of index changes
        Fixed bug that caused CHECKSUM part of key page to be used
        Fixed that deleted of wrong records also works for BLOCK_RECORD
        Clear unallocated pages:
        - BLOB pages are not automaticly cleared on delete, so we need to use the bitmap to know if page is used or not
        Better error reporting
        More information about record page utilization
        Change printing of file position to printing of pages to make output more readable
        Always print warning if rows are deleted
      storage/maria/ma_create.c:
        Calculate share.base_max_pack_length more accurately for BLOCK_RECORD pages (for future)
        Fixed that FIELD_SKIP_PRESPACE is recorded as FIELD_NORMAL; Fixed bug where fields could be used in wrong order
        Store FIELD_SKIP_ZERO fields before CHAR and VARCHAR fields (optimization)
        Store other fields in length order (to get better utilization of head block)
      storage/maria/ma_delete.c:
        Ensure my_errno is set on return
      storage/maria/ma_dynrec.c:
        Indentation fix
      storage/maria/ma_locking.c:
        Set changed if open_count is counted down.
        (To avoid getting error "client is using or hasn't closed the table properly" with transactional tables
      storage/maria/ma_loghandler.c:
        Fixed problem with advancing log horizon pointer within one page bounds (Patch from Sanja)
        Added more DBUG
        Indentation fixes
      storage/maria/ma_open.c:
        Removed wrong casts
      storage/maria/ma_page.c:
        Fixed usage of PAGECACHE_LOCK_WRITE_UNLOCK with _ma_new()
        Mark new pages as changed (Required to get repair() to work)
      storage/maria/ma_pagecache.c:
        Fixed test of error condition for flush
        Fixed problem when using PAGECACHE_LOCK_WRITE_TO_READ with unlock()
        Added call to my_debug_put_break_here() in case of errors (for debugging)
      storage/maria/ma_pagecrc.c:
        Ensure we get same crc for 32 and 64 bit systems by forcing argument to maria_page_crc to uint32
      storage/maria/ma_recovery.c:
        Call my_printv_error() from eprint() to get critical errors to mysqld log
        Removed \n from error strings to eprint() to get nicer output in mysqld
        Added simple test in _ma_reenable_logging_for_table() to not do any work if not needed
      storage/maria/ma_update.c:
        Ensure my_errno is set on return
      storage/maria/ma_write.c:
        Ensure my_errno is set on return
      storage/maria/maria_chk.c:
        Use DEBUGGER_OFF if --debug is not use (to get slightly faster execution for debug binaries)
        Added option --skip-safemalloc
        Don't write exponents for rec/key
      storage/maria/maria_def.h:
        Increase default repair buffer to 128M for maria_chk and maria_read_log
        Increase default sort buffer for maria_chk to 64M
      storage/maria/unittest/Makefile.am:
        Don't update files automaticly from bitkeeper
      storage/maria/unittest/ma_pagecache_consist.c:
        Remove testfile at end
      storage/maria/unittest/ma_pagecache_single.c:
        Remove testfile at end
      storage/maria/unittest/ma_test_all-t:
        More tests
        Safer checking if test caused error
      cd9c75c3
  26. 31 Dec, 2007 1 commit
    • unknown's avatar
      Added maria_zerofill() · 9a036c25
      unknown authored
      This is used to bzero all not used parts of the index pages and compact and bzero the not used parts of the data pages of block-record type
      Added --zerofill (-z) option to maria_chk (Mostly code from Jani)
      Added now table states ZEROFILLED and MOVEABLE
      Set state.changed with new states when things changes
      
      
      include/maria.h:
        Added maria_zerofill
      include/myisamchk.h:
        Added option for zerofill
        Extend testflag to be 64 to allow for more flags
      mysql-test/r/create.result:
        Updated results after merge
      mysql-test/r/maria.result:
        Updated results after merge
      mysys/my_getopt.c:
        Removed not used variable
      sql/sql_show.cc:
        Fixed wrong page type
      storage/maria/ma_blockrec.c:
        Renamed compact_page() to ma_compact_block_page() and made it global
        Always zerofill half filled blob pages
        Set share.state.changed on REDO
      storage/maria/ma_blockrec.h:
        Added _ma_compact_block_page()
      storage/maria/ma_check.c:
        Added maria_zerofill()
        This is used to bzero all not used parts of the index pages and compact and bzero the not used parts of the data pages of block-record type
        This gives the following benefits:
        - Table is smaller if compressed
        - All LSN are removed for transactinal tables and this makes them movable between systems
        Dont set table states of we are using --quick
        Changed log entry for repair to use 8 bytes for flag
      storage/maria/ma_delete.c:
        Simplify code
        Update state.changed
      storage/maria/ma_key_recover.c:
        Update state.changed
      storage/maria/ma_locking.c:
        Set uuid for file on first change if it's not set (table was cleared with zerofill)
      storage/maria/ma_loghandler.c:
        Updated log entry for REDO_REPAIR_TABLE
      storage/maria/ma_recovery.c:
        Updated log entry for REDO_REPAIR_TABLE (flag is now 8 bytes)
        Set new bits in state.changed
      storage/maria/ma_test_all.sh:
        Nicer output
      storage/maria/ma_test_recovery.expected:
        Updated results (now states flags are visible)
      storage/maria/ma_update.c:
        Update state.changed
      storage/maria/ma_write.c:
        Simplify code
        Set state.changed
      storage/maria/maria_chk.c:
        Added option --zerofill
        Added printing of states for MOVABLE and ZEROFILLED
        MYD -> MAD
        MYI -> MAI
      storage/maria/maria_def.h:
        Added states STATE_NOT_MOVABLE and STATE_NOT_ZEROFILLED
        Added prototype for new functions
      storage/maria/unittest/ma_test_all-t:
        More tests, including tests for zerofill
        Removed some not needed 'print' statements
      storage/maria/unittest/ma_test_loghandler_multithread-t.c:
        Smaller buffer to not trash devlopment machines totally
      9a036c25
  27. 30 Dec, 2007 1 commit
    • unknown's avatar
      WL#3072 - Maria Recovery · 62e6c9f6
      unknown authored
      * to honour WAL we now force the whole log when flushing a bitmap page.
      * ability to intentionally crash in various places for recovery testing
      * bugfix (dirty pages list found in checkpoint record was ignored)
      * smaller checkpoint record
      * misc small cleanups and comments
      
      
      mysql-test/include/maria_empty_logs.inc:
        maria-purge.test creates ~11 logs, remove them all
      mysql-test/r/maria-recovery-bitmap.result:
        result is good; without the _ma_bitmap_get_log_address() call,
        we got
        check   error   Bitmap at 0 has pages reserved outside of data file length
      mysql-test/r/maria-recovery.result:
        result update
      mysql-test/t/maria-recovery-bitmap.test:
        enable test of "bitmap-flush should flush whole log otherwise
        corrupted data file (bitmap ahead of data pages)".
      mysql-test/t/maria-recovery.test:
        test of checkpoint
      sql/sql_table.cc:
        comment
      storage/maria/ha_maria.cc:
        _ma_reenable_logging_for_table() now includes file->trn=0.
        At the end of repair() we don't need to re-enable logging, it is
        done already by caller (like copy_data_between_tables()); it sounds
        strange that this function could decide to re-enable, it should be
        up to caller who knows what other operations it plans. Removing this
        line led to assertion failure in maria_lock_database(F_UNLCK), fixed
        by removing the assertion: maria_lock_database()
        is here called in a context where F_UNLCK does not make the
        table visible to others so assertion is excessive, and external_lock()
        is already designed to honour the asserted condition.
        Ability to crash at the end of bulk insert when indices
        have been enabled.
      storage/maria/ma_bitmap.c:
        Better use pagecache_file_init() than set pagecache callbacks directly;
        and a new function to set those callbacks for bitmap so that we can
        reuse it.
        _ma_bitmap_get_log_address() is a pagecache get_log_address callback
        which causes the whole log to be flushed when a bitmap page
        is flushed by the page cache. This was required by WAL.
      storage/maria/ma_blockrec.c:
        get_log_address pagecache callback for data (non bitmap) pages:
        just reads the LSN from the page's content, like was hard-coded
        before in ma_pagecache.c.
      storage/maria/ma_blockrec.h:
        functions which need to be exported
      storage/maria/ma_check.c:
        create_new_data_handle() can be static.
        Ability to crash after rebuilding the index in OPTIMIZE,
        in REPAIR. my_lock() implemented already.
      storage/maria/ma_checkpoint.c:
        As MARIA_SHARE* is now accessible to pagecache_collect_changed_blocks_LSN(),
        we don't need to store kfile/dfile descriptors in checkpoint record,
        2-byte-id of the table plus one byte to say if this is data or index
        file is enough. So we go from 4+4 bytes per table down to 2+1.
      storage/maria/ma_commit.c:
        removing duplicate functions (see _ma_tmp_disable_logging_for_table())
      storage/maria/ma_extra.c:
        Monty fixed
      storage/maria/ma_key_recover.c:
        comment
      storage/maria/ma_locking.c:
        Sometimes other code does funny things with maria_lock_database(),
        like ha_maria::repair() calling it at start and end without going
        through ha_maria::external_lock(). So it happens that maria_lock_database()
        is called with now_transactional!=born_transactional.
      storage/maria/ma_loghandler.c:
        update to new prototype
      storage/maria/ma_open.c:
        set_data|index_pagecache_callbacks() need to be exported as
        they are now called when disabling/enabling transactionality.
      storage/maria/ma_pagecache.c:
        Removing PAGE_LSN_OFFSET, as much of the code relies on it being
        0 anyway (let's not give impression we can just change this constant).
        When flushing a page to disk, call the get_log_address callback to
        know up to which LSN the log should be flushed.
        As we now can access MARIA_SHARE* we can know share->id and store
        it into the checkpoint record; we thus go from 4 bytes per dirty page
        to 2+1.
      storage/maria/ma_pagecache.h:
        get_log_address callback
      storage/maria/ma_panic.c:
        No reason to reset pagecache callbacks in HA_PANIC_READ:
        all we do is reopen files if they were closed; callbacks should
        be in place already as 'info' exists; we just want to modify
        the file descriptors, not the full PAGECACHE_FILE structure.
        If we open data file and it was closed, share->bitmap.file needs
        to be set.
        Note that the modified code is disabled anyway.
      storage/maria/ma_recovery.c:
        Checkpoint record does not contain kfile/dfile descriptors anymore
        so code can be simplified. Hash key in all_dirty_pages is 
        not made from file_descriptor & pageno anymore, but
        index_or_data & table-short-id & pageno.
        If a table's create_rename_lsn is higher than record's LSN,
        we skip the table and don't fail if it's corrupted (because the LSNs
        say that we don't have to look at this table).
        If a table is skipped (for example due to create_rename_lsn),
        its UNDOs still cause undo_lsn to advance; this is so that if later
        we notice the transaction has to rollback we fail (as table should
        not be skipped in this case).
        Fixing a bug: the dirty_pages list was never used, because
        the LSN below which it was used was the minimum rec_lsn of dirty pages!
        It is now the min(checkpoint_start_log_horizon, min(trn's rec_lsn)).
        When we disable/reenable transactionality, we modify pagecache
        callbacks (needed for example for get_log_address: changing
        share->page_type is not enough anymore).
      storage/maria/ma_write.c:
        'records' and 'checksum' are protected: they are updated under
        log's mutex in write-hooks when UNDO is written.
      storage/maria/maria_chk.c:
        remove use of duplicate functions.
      storage/maria/maria_def.h:
        set_data|index_pagecache_callbacks() need to be exported;
        _ma_reenable_logging_for_table() changes to a real function.
      storage/maria/unittest/ma_pagecache_consist.c:
        new prototype
      storage/maria/unittest/ma_pagecache_single.c:
        new prototype
      storage/maria/unittest/ma_test_loghandler_pagecache-t.c:
        new prototype
      62e6c9f6
  28. 12 Dec, 2007 1 commit
    • unknown's avatar
      WL#3072 - Maria Recovery: recovery of state.auto_increment. · aa9c6e80
      unknown authored
      When we log UNDO_KEY_INSERT for an auto_inc key, we update
      state.auto_increment (not anymore at the end of maria_write() except
      if this is a non-transactional table). When Recovery sees UNDO_KEY_INSERT
      in the REDO phase, it reads the auto_inc value from it and updates
      state.auto_increment.
      
      
      mysql-test/r/maria-recovery.result:
        Without the code fix, there would be in CHECK TABLE:
        "Auto-increment value: 0 is smaller than max used value: 3"
        and no AUTO_INCREMENT= clause in SHOW CREATE TABLE.
      mysql-test/t/maria-recovery.test:
        Test of recovery of state.auto_increment: from an old table,
        does the replaying of the log set state.auto_increment to
        what it should be.
      storage/maria/ma_check.c:
        new way of calling ma_retrieve_auto_increment(): pass key
      storage/maria/ma_key.c:
        ma_retrieve_auto_increment() now operates directly with a pointer
        to the key and not on the record.
      storage/maria/ma_key_recover.c:
        dedicated write_hook_for_undo_key_insert(): sets state.auto_increment
        under log's mutex.
      storage/maria/ma_key_recover.h:
        Dedicated hook for UNDO_KEY_INSERT, to set state.auto_increment.
        Such hook needs a new member st_msg_write_hook_for_undo_key::auto_increment,
        which contains the auto_increment value inserted.
      storage/maria/ma_loghandler.c:
        UNDO_KEY_INSERT gets a dedicated write_hook, to set auto_increment.
      storage/maria/ma_recovery.c:
        When in the REDO phase we see UNDO_KEY_INSERT: if the state is older
        than this record, and the key is the auto_increment one, read
        the key's value from the log record and update state.auto_increment.
      storage/maria/ma_test_all.sh:
        use $maria_path to be able to run from /dev/shm (faster)
      storage/maria/ma_update.c:
        bool is more of C++, using my_bool.
        If table is transactional, state.auto_increment is already updated
        in write_hook_for_undo_key_insert().
      storage/maria/ma_write.c:
        If table is transactional, state.auto_increment is not updated at
        the end of maria_write() but rather in write_hook_for_undo_key_insert()
        (under log's mutex, so that a concurrent checkpoint does not read
        state.auto_increment while it is changing - corrupted).
        _ma_ck_write_btree_with_log() extracts the auto_increment value
        from the key, puts it into msg.auto_increment, and this is passed
        to write_hook_for_undo_key_insert().
      storage/maria/maria_def.h:
        change of prototype of ma_retrieve_auto_increment()
      storage/maria/maria_read_log.c:
        use default log file size. Use separate page caches for table
        and logs (needed if maria_block_size!=TRANSLOG_PAGE_SIZE).
      aa9c6e80
  29. 10 Dec, 2007 1 commit
    • unknown's avatar
      Added MARIA_SHARE *share to a lot of places to make code simpler · 05b1ea83
      unknown authored
      Changed info->s -> share to get more efficent code
      Updated arguments to page accessor functions to use MARIA_SHARE * instead of MARIA_HA *.
      Tested running tests in quick mode (no balance page on insert and only when critical on delete)
      Fixed bug in underflow handling in quick mode
      Fixed bug in log handler where it accessed not initialized variable
      Fixed bug in log handler where it didn't free mutex in unlikely error condition
      Removed double write of page in case of of some underflow conditions
      Added DBUG_PRINT in safemutex lock/unlock
      
      
      dbug/dbug.c:
        Compile without SAFE_MUTEX (to be able to use DBUG_PRINT in safe_mutex code)
        Use calls to get/set my_thread_var->dbug. (Make dbug independent of compile time options for mysys)
      include/my_pthread.h:
        Added prototypes for my_thread_var_get_dbug() & my_thread_var_set_dbug()
      mysql-test/lib/mtr_report.pl:
        Don't check warnings in log files if we are using --extern
      mysys/my_thr_init.c:
        Added my_thread_var_get_dbug() & my_thread_var_set_dbug()
      mysys/thr_mutex.c:
        Added DBUG printing of addresses to mutex for lock/unlock
      storage/maria/ma_blockrec.c:
        Fixed comment
      storage/maria/ma_check.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
      storage/maria/ma_close.c:
        Indentation fixes
      storage/maria/ma_create.c:
        Calculate min_key_length correctly
      storage/maria/ma_dbug.c:
        Indentation fixes
      storage/maria/ma_delete.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
        Removed some writing of key pages that underflow (will be written by caller)
        Fixed crashing bug in underflow handling when using quick mode
      storage/maria/ma_delete_all.c:
        Indentation fixes
      storage/maria/ma_dynrec.c:
        Indentation fixes
      storage/maria/ma_extra.c:
        Fixed indentation
        Removed old useless code
        Reset share->changed if we have written state
      storage/maria/ma_ft_update.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
      storage/maria/ma_info.c:
        Indentation fixes
      storage/maria/ma_key_recover.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
      storage/maria/ma_locking.c:
        Indentation fixes
      storage/maria/ma_loghandler.c:
        Removed wrapper functions translog_mutex_lock and translog_mutex_unlock (safemutex now does same kind of printing)
        Renamed LOGREC_REDO_INSERT_ROW_BLOB to LOGREC_REDO_INSERT_NOT_USED to mark it free
        Fixed some DBUG_PRINT to ensure that convert-dbug-for-diff works
        Fixed bug in translog_flush() that caused log to stop syncing to disk
        Added missing mutex_unlock in case of error
      storage/maria/ma_loghandler.h:
        Renamed LOGREC_REDO_INSERT_ROW_BLOB to LOGREC_REDO_INSERT_NOT_USED to mark it free
      storage/maria/ma_open.c:
        Indentation fixes
      storage/maria/ma_packrec.c:
        Indentation fixes
      storage/maria/ma_page.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
        Added check that we never write a key page without content (except in recovery where a key page may temporary be without content)
      storage/maria/ma_preload.c:
        Updated arguments to page accessor functions
      storage/maria/ma_range.c:
        Updated arguments to page accessor functions
      storage/maria/ma_rkey.c:
        Indentation fixes
      storage/maria/ma_rprev.c:
        Indentation fixes
      storage/maria/ma_rt_index.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
      storage/maria/ma_rt_index.h:
        Updated arguments to page accessor functions
      storage/maria/ma_rt_key.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
      storage/maria/ma_rt_mbr.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
      storage/maria/ma_rt_split.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
      storage/maria/ma_search.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
      storage/maria/ma_sort.c:
        Indentation fixes
      storage/maria/ma_statrec.c:
        Indentation fixes
      storage/maria/ma_test1.c:
        Added extra undo test
        Flush also keys in -u1, to ensure that the full log is flushed
      storage/maria/ma_test2.c:
        Added extra undo test
        Flush also keys in -u1, to ensure that the full log is flushed
      storage/maria/ma_test_recovery.expected:
        Updated results
      storage/maria/ma_test_recovery:
        Added extra undo test
      storage/maria/ma_update.c:
        Indentation fixes
      storage/maria/ma_write.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
        Prepare for quick mode for insert (don't balance page)
      storage/maria/maria_chk.c:
        Added MARIA_SHARE *share to a lot of places to make code simpler
        info->s -> share
        Updated arguments to page accessor functions
      storage/maria/maria_def.h:
        Updated arguments to page accessor functions
      05b1ea83
  30. 04 Dec, 2007 1 commit
    • unknown's avatar
      Added error HA_ERR_FILE_TOO_SHORT to be used when files are shorter than... · 47348f6f
      unknown authored
      Added error HA_ERR_FILE_TOO_SHORT to be used when files are shorter than expected (by my_read/my_pread)
      Added debugger hook _my_dbug_put_break_here() that is called if we get a CRC that matches --debug-crc-break (my_crc_dbug_break)
      Fixed REDO_REPAIR to use all repair modes (repair, repair_by_sort, repair_paralell
      REDO_REPAIR now also logs used key map
      Fixed some bugs in REDO logging of key pages
      Better error messages from maria_read_log
      Added my_readwrite_flags to init_pagecache() to be able to get better error messages and simplify code.
      Don't allow pagecaches with less than 8 blocks (Causes strange crashes)
      Added EXTRA_DEBUG_KEY_CHANGES. When this is defined some REDO_INDEX entries contains page checksums (these are calculated and checked in DBUG mode, ignored otherwise)
      Fixed bug in ma_pagecache unit tests that caused program to sometimes fail
      Added some missing calls to MY_INIT() that caused some unit tests to fail
      Fixed that TRUNCATE works properly on temporary MyISAM files
      Updates some result files to new table checksums results (checksum when NULL fields are ignored)
      perl test-insert can be replayed with maria_read_log!
      
      
      sql/share/Makefile.am:
        Change mode to -rw-rw-r--
      BitKeeper/etc/ignore:
        added storage/maria/unittest/page_cache_test_file_1 storage/maria/unittest/pagecache_debug.log
      include/maria.h:
        Added maria_tmpdir
      include/my_base.h:
        Added error HA_ERR_FILE_TOO_SHORT
      include/my_sys.h:
        Added variable my_crc_dbug_check
        Added function my_dbug_put_break_here()
      include/myisamchk.h:
        Added org_key_map (Needed for writing REDO record for REPAIR)
      mysql-test/r/innodb.result:
        Updated to new checksum algorithm (NULL ignored)
      mysql-test/r/mix2_myisam.result:
        Updated to new checksum algorithm (NULL ignored)
      mysql-test/r/myisam.result:
        Updated to new checksum algorithm (NULL ignored)
      mysql-test/t/myisam.test:
        Added used table
      mysys/checksum.c:
        Added DBUG for checksum results
        Added debugger hook so that _my_dbug_put_break_here() is called if we get matching CRC
      mysys/lf_alloc-pin.c:
        Fixed compiler warning
      mysys/my_handler.c:
        Added new error message
      mysys/my_init.c:
        If my_progname is not given, use 'unknown' form my_progname_short
        Added debugger function my_debug_put_break_here()
      mysys/my_pread.c:
        In case of too short file when MY_NABP or MY_FNABP is specified, give error HA_ERR_FILE_TO_SHORT
      mysys/my_read.c:
        In case of too short file when MY_NABP or MY_FNABP is specified, give error HA_ERR_FILE_TO_SHORT
      sql/mysqld.cc:
        Added debug option --debug-crc-break
      sql/sql_parse.cc:
        Trivial optimization
      storage/maria/ha_maria.cc:
        Renamed variable to be more logical
        Ensure that param.testflag is correct when calling repair
        Added extra argument to init_pagecache
        Set default value for maria_tempdir
      storage/maria/ma_blockrec.c:
        Test for HA_ERR_FILE_TOO_SHORT instead for -1
      storage/maria/ma_cache.c:
        Test for HA_ERR_FILE_TOO_SHORT instead for -1
      storage/maria/ma_check.c:
        Set param->testflag to match how repair is run (needed for REDO logging)
        Simple optimization
        Moved flag if page is node from pagelength to keypage-flag byte
        Log used key map in REDO log.
      storage/maria/ma_delete.c:
        Remember previous UNDO entry when writing undo (for future CLR records)
        Moved flag if page is node from pagelength to keypage-flag byte
        Fixed some bugs in redo logging
        Added CRC for some translog REDO_INDEX entries
      storage/maria/ma_dynrec.c:
        Test for HA_ERR_FILE_TOO_SHORT instead for -1
      storage/maria/ma_ft_update.c:
        Fixed call to _ma_store_page_used()
      storage/maria/ma_key_recover.c:
        Added CRC for some translog REDO_INDEX entries
        Removed not needed pagecache_write() in _ma_apply_redo_index()
      storage/maria/ma_locking.c:
        Test for HA_ERR_FILE_TOO_SHORT instead for -1
      storage/maria/ma_loghandler.c:
        Added used key map to REDO_REPAIR_TABLE
      storage/maria/ma_loghandler.h:
        Added operation for checksum of key pages
      storage/maria/ma_open.c:
        Allocate storage for undo lsn pointers
      storage/maria/ma_pagecache.c:
        Remove not needed include file
        Change logging to use fd: for file descritors as other code
        Added my_readwrite_flags to init_pagecache() to be able to get better error messages for maria_chk/maria_read_log
        Don't allow pagecaches with less than 8 blocks
        Remove wrong DBUG_ASSERT()
      storage/maria/ma_pagecache.h:
        Added readwrite_flags
      storage/maria/ma_recovery.c:
        Better error messages for maria_read_log:
        - Added eprint() for printing error messages
        - Print extra \n before error message if we are printing %0 %10 ...
        
        Added used key_map to REDO_REPAIR log entry
        More DBUG
        Call same repair method that was used by mysqld
      storage/maria/ma_rt_index.c:
        Moved flag if page is node from pagelength to keypage-flag byte
      storage/maria/ma_rt_key.c:
        Fixed call to _ma_store_page_used()
      storage/maria/ma_rt_split.c:
        Moved flag if page is node from pagelength to keypage-flag byte
      storage/maria/ma_static.c:
        Added maria_tmpdir
      storage/maria/ma_test1.c:
        Updated call to init_pagecache()
      storage/maria/ma_test2.c:
        Updated call to init_pagecache()
      storage/maria/ma_test3.c:
        Updated call to init_pagecache()
      storage/maria/ma_write.c:
        Removed #ifdef NOT_YET
        Moved flag if page is node from pagelength to keypage-flag byte
        Fixed bug in  _ma_log_del_prefix()
      storage/maria/maria_chk.c:
        Fixed wrong min limit for page_buffer_size
        Updated call to init_pagecache()
      storage/maria/maria_def.h:
        Added EXTRA_DEBUG_KEY_CHANGES. When this is defined some REDO_INDEX entries contains page checksums
        Moved flag if page is node from pagelength to keypage-flag byte
      storage/maria/maria_ftdump.c:
        Updated call to init_pagecache()
      storage/maria/maria_pack.c:
        Updated call to init_pagecache()
        Reset share->state.create_rename_lsn & share->state.is_of_horizon
      storage/maria/maria_read_log.c:
        Better error messages
        Added --tmpdir option (needed to set temporary directory for REDO_REPAIR)
        Added --start-from-lsn
        Changed option for --display-only to 'd' (wanted to use -o for 'offset')
      storage/maria/unittest/lockman2-t.c:
        Added missing call to MY_INIT()
      storage/maria/unittest/ma_pagecache_consist.c:
        Updated call to init_pagecache()
      storage/maria/unittest/ma_pagecache_single.c:
        Fixed bug that caused program to sometimes fail
        Added some DBUG_ASSERTS()
        Changed some calls to malloc()/free() to my_malloc()/my_free()
        Create extra file to expose original hard-to-find bug
      storage/maria/unittest/ma_test_loghandler-t.c:
        Updated call to init_pagecache()
      storage/maria/unittest/ma_test_loghandler_first_lsn-t.c:
        Updated call to init_pagecache()
      storage/maria/unittest/ma_test_loghandler_max_lsn-t.c:
        Updated call to init_pagecache()
      storage/maria/unittest/ma_test_loghandler_multigroup-t.c:
        Updated call to init_pagecache()
      storage/maria/unittest/ma_test_loghandler_multithread-t.c:
        Updated call to init_pagecache()
      storage/maria/unittest/ma_test_loghandler_noflush-t.c:
        Updated call to init_pagecache()
      storage/maria/unittest/ma_test_loghandler_pagecache-t.c:
        Updated call to init_pagecache()
      storage/maria/unittest/ma_test_loghandler_purge-t.c:
        Updated call to init_pagecache()
      storage/maria/unittest/test_file.c:
        Changed malloc()/free() to my_malloc()/my_free()
        Fixed memory leak
        Changd logic a bit while trying to find bug in reset_file()
      storage/maria/unittest/trnman-t.c:
        Added missing call to MY_INIT()
      storage/myisam/mi_cache.c:
        Test for HA_ERR_FILE_TOO_SHORT instead for -1
      storage/myisam/mi_create.c:
        Removed O_EXCL to get TRUNCATE to work for temporary files
      storage/myisam/mi_dynrec.c:
        Test for HA_ERR_FILE_TOO_SHORT instead for -1
      storage/myisam/mi_locking.c:
        Test for HA_ERR_FILE_TOO_SHORT instead for -1
      mysql-test/r/old-mode.result:
        New BitKeeper file ``mysql-test/r/old-mode.result''
      mysql-test/t/old-mode-master.opt:
        New BitKeeper file ``mysql-test/t/old-mode-master.opt''
      mysql-test/t/old-mode.test:
        New BitKeeper file ``mysql-test/t/old-mode.test''
      47348f6f
  31. 20 Nov, 2007 1 commit
    • unknown's avatar
      Fixes for redo/undo logging of key pages · ea6ec89e
      unknown authored
      New extendable format for maria_log_control file
      Fixed some compiler warnings
      
      
      include/maria.h:
        Added maria_disable_logging() and maria_enable_logging()
      mysql-test/include/maria_verify_recovery.inc:
        Updated tests now when key redo/undo works
      mysql-test/r/maria-recovery.result:
        Updated tests now when key redo/undo works
      storage/maria/ma_blockrec.c:
        Use unified CLR code
        Added rec_lsn for full pages
        Moved clr write hook to ma_key_recover.c
        Changed REDO code to keep pages pinned until undo
        Mark page_link's as changed
      storage/maria/ma_blockrec.h:
        Moved write_hook_for_clr_end() to ma_key_recover.c
      storage/maria/ma_check.c:
        Changed key check code to use PAGECACHE_READ_UNKNOWN_PAGE
        Fixed wrong warning when checking files after maria_pack
        When unpacking files, we have to use new keypos_to_recpos method
        When doing repair, we can disregard index key file pages in page cache
      storage/maria/ma_commit.c:
        Added simple enable/disable logging functions
        (Needed for recovery)
      storage/maria/ma_control_file.c:
        Make maria control file extendable without having to make it incompatible for older versions
      storage/maria/ma_control_file.h:
        New error messages
        Added CONTROL_FILE_VERSION
      storage/maria/ma_delete.c:
        Added redo/undo for key pages
        change_length -> changed_length to make things similar
        More comments & more DBUG
      storage/maria/ma_key_recover.c:
        Unified CLR method
        Moved here write_hook_for_clr_end() and common keypage log functions
        Changed REDO to keep pages pinned until undo
        Changed UNDO code to change key_root under log mutex
      storage/maria/ma_key_recover.h:
        New structures and functions
      storage/maria/ma_loghandler.c:
        Include needed files
      storage/maria/ma_open.c:
        Change maria_open() to use pread() instead of read()
      storage/maria/ma_page.c:
        Fixed bug in key_del handling
        Clear pages if IDENTICAL_PAGES_AFTER_RECOVERY is defined
      storage/maria/ma_pagecache.c:
        Indentation and spelling fixes
        More DBUG
        Added helper function: pagecache_block_link_to_buffer()
      storage/maria/ma_pagecache.h:
        Added pagecache_block_link_to_buffer()
      storage/maria/ma_recovery.c:
        Fixed state.changed
        Fixed that REDO keeps pages pinned until UNDO
        Some bug fixes from previous commit
        Fixes for UNDO/REDO of key pages
      storage/maria/ma_search.c:
        Fixed packing and storing of keys to provide more information to caller so
        that we can do efficent REDO logging of the changes.
      storage/maria/ma_test1.c:
        Fixed bug with not initialized variable
      storage/maria/ma_test2.c:
        Removed not used code
      storage/maria/ma_test_all.res:
        Updated results
      storage/maria/ma_test_all.sh:
        Changed one test to test more
        Removed timing tests as not relevant here
      storage/maria/ma_test_recovery.expected:
        Updated test result after redo/undo if key pages works
      storage/maria/ma_test_recovery:
        Updated test after redo/undo if key pages works
      storage/maria/ma_write.c:
        Moved some general log functions to ma_key_recover.c
        Fixed some bugs in undo
        Moved ma_log_split() to _ma_split_page()
        Small changes in some function arguments to be able to do redo logging
      storage/maria/maria_chk.c:
        disable logging while doing repair table
      storage/maria/maria_def.h:
        New function prototypes
        Move some structs and functions to ma_key_recover.c
      storage/maria/unittest/ma_control_file-t.c:
        Updated with patch from Sanja
        NOTE: This is not complete and need to be updated to new control file format
      storage/maria/unittest/ma_test_loghandler-t.c:
        Fixed compiler warning
      ea6ec89e
  32. 14 Nov, 2007 1 commit
    • unknown's avatar
      First part of redo/undo for key pages · 5d6ee443
      unknown authored
      Added key_nr to st_maria_keydef for faster keyinfo->keynr conversion
      For transactional tables, shift record number in keys up with 1 bit to have place to indicate if transid follows
      Checksum for MyISAM now ignores NULL and not used part of VARCHAR
      Renamed some variables that caused shadow compiler warnings
      Moved extra() call when waiting for tables to not be used to after tables are removed from cache.
      Fixed crashing bugs when using Maria TEMPORARY tables with TRUNCATE. Removed 'hack' code in sql directory to go around this bug.
      pagecache_unlock_by_ulink() now has extra argument to say if page was changed.
      Give error message if we fail to open control file
      Mark page cache variables as not flushable
      
      
      include/maria.h:
        Made min page cache larger (needed for pinning key page)
        Added key_nr to st_maria_keydef for faster keyinfo->keynr conversion
        Added write_comp_flag to move some runtime code to maria_open()
      include/my_base.h:
        Added new error message to be used when handler initialization failed
      include/my_global.h:
        Renamed dummy to swap_dummy to avoid conflicts with local 'dummy' variables
      include/my_handler.h:
        Added const to some parameters
      mysys/array.c:
        More DBUG
      mysys/my_error.c:
        Fixed indentation
      mysys/my_handler.c:
        Added const to some parameters
        Added missing error messages
      sql/field.h:
        Renamed variables to avoid variable shadowing
      sql/handler.h:
        Renamed parameter to avoid variable name conflict
      sql/item.h:
        Renamed variables to avoid variable shadowing
      sql/log_event_old.h:
        Renamed variables to avoid variable shadowing
      sql/set_var.h:
        Renamed variables to avoid variable shadowing
      sql/sql_delete.cc:
        Removed maria hack for temporary tables
        Fixed indentation
      sql/sql_table.cc:
        Moved extra() call when waiting for tables to not be used to after tables are removed from cache.
        This was needed to ensure we don't do a PREPARE_FOR_DROP or similar call while the table is still in use.
      sql/table.cc:
        Copy page_checksum from share
        Removed Maria hack
      storage/maria/Makefile.am:
        Added new files
      storage/maria/ha_maria.cc:
        Renamed records -> record_count and info -> create_info to avoid variable name conflicts
        Mark page cache variables as not flushable
      storage/maria/ma_blockrec.c:
        Moved _ma_unpin_all_pages() to ma_key_recover.c
        Moved init of info->pinned_pages to ma_open.c
        Moved _ma_finalize_row() to maria_key_recover.h
        Renamed some variables to avoid variable name conflicts
        Mark page_link.changed for blocks we change directly
        Simplify handling of undo link when writing LOGREC_UNDO_ROW_INSERT (old code crashed when having redo for index)
      storage/maria/ma_blockrec.h:
        Removed extra empty line
      storage/maria/ma_checkpoint.c:
        Remove not needed trnman.h
      storage/maria/ma_close.c:
        Free pinned pages (which are now always allocated)
      storage/maria/ma_control_file.c:
        Give error message if we fail to open control file
      storage/maria/ma_delete.c:
        Changes for redo logging (first part, logging of underflow not yet done)
        - Log undo-key-delete
        - Log delete of key
        - Updated arguments to _ma_fetch_keypage(), _ma_dispose(), _ma_write_keypage(), _ma_insert()
        - Added new arguments to some functions to be able to write redo information
        - Mark key pages as changed when we write with PAGECACHE_LOCK_LEFT_WRITELOCKED
        
        Remove one not needed _ma_write_keypage() in d_search() when upper level will do the write anyway
        Changed 2 bmove_upp() to bmove() as this made code easer to understand
        More function comments
        Indentation fixes
      storage/maria/ma_ft_update.c:
        New arguments to _ma_write_keypage()
      storage/maria/ma_loghandler.c:
        Fixed some DBUG_PRINT messages
        Simplify code
        Added new log entrys for key page redo
        Renamed some variables to avoid variable name shadowing
      storage/maria/ma_loghandler.h:
        Moved some defines here
        Added define for storing key number on key pages
        Added new translog record types
        Added enum for type of operations in LOGREC_REDO_INDEX
      storage/maria/ma_open.c:
        Always allocate info.pinned_pages (we need now also for normal key page usage)
        Update keyinfo->key_nr
        Added virtual functions to convert record position o number to be stored on key pages
        Update keyinfo->write_comp_flag to value of search flag to be used when writing key
      storage/maria/ma_page.c:
        Added redo for key pages
        - Extended _ma_fetch_keypage() with type of lock to put on page and address to used MARIA_PINNED_PAGE
        - _ma_fetch_keypage() now pin's pages if needed
        - Extended _ma_write_keypage() with type of locks to be used
        - ma_dispose() now locks info->s->state.key_del from other threads
        - ma_dispose() writes redo log record
        - ma_new() locks info->s->state.key_del from other threads if it was used
        - ma_new() now pins read page
        
        Other things:
        - Removed some not needed arguments from _ma_new() and _ma_dispose)
        - Added some new variables to simplify code
        - If EXTRA_DEBUG is used, do crc on full page to catch not unitialized bytes
      storage/maria/ma_pagecache.h:
        Applied patch from Sanja to add extra argument to pagecache_unlock_by_ulink() to mark if page was changed
        Added some defines for pagecache priority levels that one can use
      storage/maria/ma_range.c:
        Added new arguments for call to _ma_fetch_keypage()
      storage/maria/ma_recovery.c:
        - Added hooks for new translog types:
          REDO_INDEX, REDO_INDEX_NEW_PAGE, REDO_INDEX_FREE_PAGE, UNDO_KEY_INSERT, UNDO_KEY_DELETE and
          UNDO_KEY_DELETE_WITH_ROOT.
        - Moved variable declarations to start of function (portability fixes)
        - Removed some not needed initializations
        - Set only relevant state changes for each redo/undo entry
      storage/maria/lockman.c:
        Removed end space
      storage/maria/ma_check.c:
        Removed end space
      storage/maria/ma_create.c:
        Removed end space
      storage/maria/ma_locking.c:
        Removed end space
      storage/maria/ma_packrec.c:
        Removed end space
      storage/maria/ma_pagecache.c:
        Removed end space
      storage/maria/ma_panic.c:
        Removed end space
      storage/maria/ma_rt_index.c:
        Added new arguments for call to _ma_fetch_keypage(), _ma_write_keypage(), _ma_dispose() and _ma_new()
        Fixed indentation
      storage/maria/ma_rt_key.c:
        Added new arguments for call to _ma_fetch_keypage()
      storage/maria/ma_rt_split.c:
        Added new arguments for call to _ma_new()
        Use new keypage header
        Added new arguments for call to _ma_write_keypage()
      storage/maria/ma_search.c:
        Updated comments & indentation
        Added new arguments for call to _ma_fetch_keypage()
        Made some variables and arguments const
        Added virtual functions for converting row position to number to be stored in key
        use MARIA_RECORD_POS of record position instead of my_off_t
        Record in MARIA_KEY_PARAM how page was changed one key insert (needed for REDO)
      storage/maria/ma_sort.c:
        Removed end space
      storage/maria/ma_statrec.c:
        Updated arguments for call to _ma_rec_pos()
      storage/maria/ma_test1.c:
        Fixed too small buffer to init_pagecache()
        Fixed bug when using insert_count and test_flag
      storage/maria/ma_test2.c:
        Use more resonable pagecache size
        Remove not used code
        Reset blob_length to fix wrong output message
      storage/maria/ma_test_all.sh:
        Fixed wrong test
      storage/maria/ma_write.c:
        Lots of new code to handle REDO of key pages
        No logic changes because of REDO code, mostly adding new arguments and adding new code for logging 
        
        Added new arguments for calls to _ma_fetch_keypage(), _ma_write_keypage() and similar functions
        Move setting of comp_flag in ma_ck_wrte_btree() from runtime to maria_open()
        Zerofill new used pages for:
        - To remove possible sensitive data left in buffer
        - To get idenitical data on pages after running redo
        - Better compression of pages if archived
      storage/maria/maria_chk.c:
        Added information if table is crash safe
      storage/maria/maria_def.h:
        New virtual function to convert between record position on key and normal record position
        Aded mutex and extra variables to handle locking of share->state.key_del
        Moved some structure variables to get things more aligned
        Added extra arguments to MARIA_KEY_PARAM to be able to remember what was changed on key page on key insert
        Added argument to MARIA_PINNED_PAGE to indicate if page was changed
        Updated prototypes for functions
        Added some structures for signaling changes in REDO handling
      storage/maria/unittest/ma_pagecache_single.c:
        Updated arguments for changed function calls
      storage/myisam/mi_check.c:
        Made calc_check_checksum virtual
      storage/myisam/mi_checksum.c:
        Update checksums to ignore null columns
      storage/myisam/mi_create.c:
        Mark if table has null column (to know when we have to use mi_checksum())
      storage/myisam/mi_open.c:
        Added virtual function for calculating checksum to be able to easily ignore NULL fields
      storage/myisam/mi_test2.c:
        Fixed bug
      storage/myisam/myisamdef.h:
        Added virtual function for calculating checksum during check table
        Removed ha_key_cmp() as this is in handler.h
      storage/maria/ma_key_recover.c:
        New BitKeeper file ``storage/maria/ma_key_recover.c''
      storage/maria/ma_key_recover.h:
        New BitKeeper file ``storage/maria/ma_key_recover.h''
      storage/maria/ma_key_redo.c:
        New BitKeeper file ``storage/maria/ma_key_redo.c''
      5d6ee443
  33. 11 Nov, 2007 1 commit
  34. 09 Oct, 2007 1 commit
    • unknown's avatar
      Moved randomize and my_rnd under mysys · baad15ae
      unknown authored
      Added my_uuid
      Added pre-support for PAGE_CHECKSUM
      Added syntax for CREATE ... PAGE_CHECKSUM=# TABLE_CHECKSUM=#
      Reserved place for page checksums on index, bitmap and block pages
      Added index number to header of index pages
      Added linked list for free directory entries (speeds up inserts with BLOCK format)
      Calculate checksums in original column order (fixes bug with checksum on rows with BLOCK format)
      Cleaned up all index handling to use 'info->s->keypage_header' (variable size) as the header for index pages (before this was '2')
      Added 0xffffffff to end of index and block data bases and 0xfffffffe at end of bitmap pages when page checksums are not enabled
      Added _ma_get_page_used() and _ma_get_used_and_node() to simplify index page header handling
      rec_per_key_part is now in double precision
      Reserved place in index file for my_guid and nulls_per_key_part
      Give error HA_ERR_NEW_FILE if trying to open a Maria file with new, not yet supported extensions
      
      Lots of renames to increase readability:
      
      randomize() -> my_rnd_init()
      st_maria_info -> st_maria_handler
      st_maria_info -> MARIA_HA
      st_maria_isaminfo -> st_maria_info
      rand_struct -> my_rand_struct
      rec_per_key_rows -> records_at_analyze
      
      
      client/mysqladmin.cc:
        rand_struct -> my_rrnd_struct
      include/maria.h:
        st_maria_info -> MARIA_HA
        st_maria_isaminfo -> st_maria_info
        Changed analyze statistics to be of double precission
        Changed offset to field to be 32bits instead of 64 (safe as a record without blobs can't be that big)
      include/my_base.h:
        Added HA_OPTION_PAGE_CHECKSUM & HA_CREATE_PAGE_CHECKSUM
        Fixed comments
        Added HA_ERR_NEW_FILE
      include/my_sys.h:
        Added prototypes and structures for my_uuid() and my_rnd()
      include/myisamchk.h:
        Changed some buffers to size_t
        Added possibility to have key statistics with double precission
      include/mysql_com.h:
        Move rand functions to mysys
      libmysql/Makefile.shared:
        Added my_rnd
      mysql-test/r/maria.result:
        Updated results
      mysql-test/t/maria.test:
        More tests for checksum
      mysys/Makefile.am:
        Added my_rnd.c and my_uuid.c
      server-tools/instance-manager/listener.cc:
        Fixed include order (my_global.h should always be first)
      server-tools/instance-manager/mysql_connection.cc:
        Fixed include order (my_global.h should always be first)
        Use my_rnd_init()
      server-tools/instance-manager/mysql_connection.h:
        rand_struct -> my_rand_struct
      sql/handler.h:
        Added flag for page checksums
      sql/item_func.cc:
        Use new my_rnd() interface
      sql/item_func.h:
        Use new my_rnd() interface
      sql/item_strfunc.cc:
        Use new my_rnd() interface
      sql/lex.h:
        Added PAGE_CHECKSUM and TABLE_CHECKSUM
      sql/mysql_priv.h:
        Use new my_rnd() interface
      sql/mysqld.cc:
        Use new my_rnd() interface
      sql/password.c:
        Move my_rnd() to mysys
        Use new my_rnd() interface
      sql/sql_class.cc:
        Use new my_rnd() interface
      sql/sql_class.h:
        Use new my_rnd() interface
      sql/sql_crypt.cc:
        Use new my_rnd() interface
      sql/sql_crypt.h:
        Use new my_rnd() interface
      sql/sql_show.cc:
        Simpler handling of ha_choice_values
        Added PAGE_CHECKSUM
      sql/sql_table.cc:
        Enable correct checksum handling (for now) if not running in compatible mode
      sql/sql_yacc.yy:
        Added table option PAGE_CHECKSUM
        Added future compatible table option TABLE_CHECKSUM (alias for CHECKSUM)
        Added 'choice' target to simplify code
      sql/table.cc:
        Store flag for PAGE_CHECKSUM
      sql/table.h:
        Added support for PAGE_CHECKSUM
      storage/maria/ha_maria.cc:
        Remove protection for incompatbile frm and MAI
        (Slow, not needed test)
        Rec_per_key is now in double
        Remember row type for table
        Give warning if one Maria uses another row type than requested
        Removed some old ASK_MONTY entries (added comments instead)
        Added handling of PAGE_CHECKSUM flags
      storage/maria/ma_bitmap.c:
        Added page checksums to bitmap pages
        Added special bitmap marker for bitmap pages
        (Used to find bugs when running without page checksums)
      storage/maria/ma_blockrec.c:
        Added a free-link list over directory entries. This makes insert of small rows faster as we don't
        have to scan the whole directory to find a not used entry.
        Moved SANITY_CHECKS to maria_def.h
        Simplify code by introducing dir_entry_pos()
        Added support for PAGE_CHECKSUM
      storage/maria/ma_blockrec.h:
        Added DIR_FREE_SIZE (linked list of free directory entries)
        Added PAGE_CHECKSUM
        Added 'dir_entry_pos()'
      storage/maria/ma_check.c:
        Check that index pages has correct index number
        Calculate rec_per_key with double precission
        Simplify code by using '_ma_get_used_and_node()'
        Check free directory list
        Remove wrong end \n from messages
        maria_data_on_page() -> _ma_get_page_used()
        maria_putint() -> _ma_store_page_used()
        rec_per_key_rows -> records_at_analyze
      storage/maria/ma_checksum.c:
        Calculate checksum in original column order
      storage/maria/ma_create.c:
        Store original column order in index file
        Reserve place for nulls_per_key_part (future)
        Added support for PAGE_CHECKSUM
      storage/maria/ma_dbug.c:
        Fixed wrong debug output of key of type 'ulong'
      storage/maria/ma_delete.c:
        maria_data_on_page() -> _ma_get_used_and_node()
        maria_data_on_page() -> _ma_get_page_used()
        maria_putint() -> _ma_store_page_used()
        Added page header (index key number) to all index pages
        Reserved page for checksum on index pages
        Use keypage_header
      storage/maria/ma_ft_update.c:
        maria_putint() -> _ma_store_page_used()
        Store key number at start of page
      storage/maria/ma_loghandler.h:
        st_maria_info -> MARIA_HA
      storage/maria/ma_open.c:
        rec_per_key is now in double precission
        Added 'nulls_per_key_part'
        Added 'extra_options' (flags for future)
        Added support for PAGE_CHECKSUM
        Give error HA_ERR_NEW_FILE when using unsupported maria extensions
        Added comments
        Add maria_uuid to index file
        Added functions to store and read column_nr map.
        Changed some functions to return my_bool instead of uint
      storage/maria/ma_page.c:
        Added checks that pages has correct key nr
        Store 0xffffffff in checksum position if page checksums are not enabled
        Moved key-page-delete link to take into account keypage header
      storage/maria/ma_preload.c:
        Remove old MyISAM dependent code
        When scanning pages, only add pages to page cache for the requested index
      storage/maria/ma_range.c:
        maria_data_on_page() -> _ma_get_used_and_node()
        Use keypage_header
      storage/maria/ma_rt_index.c:
        Fixed indentation
      storage/maria/ma_rt_index.h:
        Added support for dynamic index page header
        Reserved place for PAGE_CHECKSUM
      storage/maria/ma_rt_key.c:
        Fixed indentation
        maria_data_on_page() -> _ma_get_page_used()
        maria_putint() -> maria_store_page_used()
      storage/maria/ma_rt_mbr.c:
        Fixed indentation
      storage/maria/ma_rt_split.c:
        Fixed indentation
        maria_data_on_page () -> _ma_get_page_used()
      storage/maria/ma_rt_test.c:
        Fixed indentation
      storage/maria/ma_search.c:
        Remove support of using -1 as 'last used index' to _ma_check_index()
        maria_data_on_page() -> _ma_get_page_used()
        maria_data_on_page() -> _ma_get_used_and_node()
        Use keypage_header
      storage/maria/ma_sort.c:
        Changed some buffers to size_t
        Changed rec_per_key_part to double
      storage/maria/ma_static.c:
        Removed NEAR
        Added maria_uuid
      storage/maria/ma_test2.c:
        Moevd testflag == 2 to correct place
        Remove test of reading with index number -1 (not supported anymore)
      storage/maria/ma_test_recovery.expected:
        Updated results
      storage/maria/ma_test_recovery:
        Changed tmp table names so that one can run maria_chk on them
      storage/maria/ma_write.c:
        Fixed indentation
        Use keypage_header
        Store index number on index pages
        maria_putint() -> _ma_store_page_used()
        maria_data_on_page() -> ma_get_used_and_node()
        maria_data_on_page() -> _ma_get_page_used()
        Added PAGE_CHECKSUM
        Added Maria handler to some functions
        Removed some not needed casts
      storage/maria/maria_chk.c:
        Added error handling for HA_ERR_NEW_FILE
        Added information about page checksums
        rec_per_key_part changed to double
        maria_data_on_page() -> _ma_get_page_used()
        Use keypage_header
      storage/maria/maria_def.h:
        Added IDENTICAL_PAGES_AFTER_RECOVERY and SANITY_CHECKS
        Changed rec_per_key_part to double
        Added nulls_per_key_part
        rec_per_key_rows -> records_at_analyze
        st_maria_info -> MARIA_HA
        Reserve place for new statistics variables, uuid, checksums per page etc.
        Removed NEAR tags
        Changed some prototypes to use my_bool and size_t
      storage/maria/maria_pack.c:
        st_maria_info -> MARIA_HA
        Fixed indentation
      storage/myisam/mi_dbug.c:
        Fix wrong debug output for ULONG
      mysys/my_rnd.c:
        New BitKeeper file ``mysys/my_rnd.c''
      mysys/my_uuid.c:
        New BitKeeper file ``mysys/my_uuid.c''
      baad15ae
  35. 04 Oct, 2007 1 commit
  36. 02 Oct, 2007 1 commit
    • unknown's avatar
      WL#3072 - Maria recovery. · 198a1b6f
      unknown authored
      * 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).
      198a1b6f
  37. 12 Sep, 2007 1 commit
    • unknown's avatar
      WL#3071 Maria checkpoint · cd275413
      unknown authored
      Finally this is the real checkpoint code.
      It however exhibits unstabilities when a checkpoint runs concurrently
      with data-modifying clients (table corruption, transaction log's
      assertions) so for now a checkpoint is taken only at startup after
      recovery and at shutdown, i.e. not in concurrent situations. Later
      we will let it run periodically, as well as flush dirty pages
      periodically (almost all needed code is there already, only pagecache
      code is written but not committed).
      WL#3072 Maria recovery
      * replacing UNDO_ROW_PURGE with CLR_END; testing of those CLR_END via
      ma_test2 which has INSERTs failing with duplicate keys.
      * replaying of REDO_RENAME_TABLE
      Now, off to test Recovery in ha_maria :)
      
      
      BitKeeper/deleted/.del-ma_least_recently_dirtied.c:
        Delete: storage/maria/ma_least_recently_dirtied.c
      BitKeeper/deleted/.del-ma_least_recently_dirtied.h:
        Delete: storage/maria/ma_least_recently_dirtied.h
      storage/maria/Makefile.am:
        compile Checkpoint module
      storage/maria/ha_maria.cc:
        When ha_maria starts, do a recovery from last checkpoint.
        Take a checkpoint when that recovery has ended and when ha_maria
        shuts down cleanly.
      storage/maria/ma_blockrec.c:
        * even if my_sync() fails we have to my_close() (otherwise we leak
        a descriptor)
        * UNDO_ROW_PURGE is replaced by a simple CLR_END for UNDO_ROW_INSERT,
        as promised in the old comment; it gives us skipping during the
        UNDO phase.
      storage/maria/ma_check.c:
        All REDOs before create_rename_lsn are ignored by Recovery. So
        create_rename_lsn must be set only after all data/index has been
        flushed and forced to disk. We thus move write_log_record_for_repair()
        to after _ma_flush_tables_files_after_repair().
      storage/maria/ma_checkpoint.c:
        Checkpoint module.
      storage/maria/ma_checkpoint.h:
        optional argument if caller wants a thread to periodically take
        checkpoints and flush dirty pages.
      storage/maria/ma_create.c:
        * no need to init some vars as the initial bzero(share) takes care of this.
        * update to new function's name
        * even if we fail in my_sync() we have to my_close()
      storage/maria/ma_extra.c:
        Checkpoint reads share->last_version under intern_lock, so we make
        maria_extra() update it under intern_lock. THR_LOCK_maria still needed
        because of _ma_test_if_reopen().
      storage/maria/ma_init.c:
        destroy checkpoint module when Maria shuts down.
      storage/maria/ma_loghandler.c:
        * UNDO_ROW_PURGE gone (see ma_blockrec.c)
        * we need to remember the LSN of the LOGREC_FILE_ID for a share,
        because this LSN is needed into the checkpoint record (Recovery wants
        to know the validity domain of an id->name mapping)
        * translog_get_horizon_no_lock() needed for Checkpoint
        * comment about failing assertion (Sanja knows)
        * translog_init_reader_data() thought that translog_read_record_header_scan()
        returns 0 in case of error, but 0 just means "0-length header".
        * translog_assign_id_to_share() now needs the MARIA_HA because
        LOGREC_FILE_ID uses a log-write hook.
        * Verify that (de)assignment of share->id happens only under intern_lock,
        as Checkpoint reads this id with intern_lock.
        * translog_purge() can accept TRANSLOG_ADDRESS, not necessarily
        a real LSN.
      storage/maria/ma_loghandler.h:
        prototype updates
      storage/maria/ma_open.c:
        no need to initialize "res"
      storage/maria/ma_pagecache.c:
        When taking a checkpoint, we don't need to know the maximum rec_lsn
        of dirty pages; this LSN was intended to be used in the two-checkpoint
        rule, but last_checkpoint_lsn is as good.
        4 bytes for stored_list_size is enough as PAGECACHE::blocks (number
        of blocks which the pagecache can contain) is int.
      storage/maria/ma_pagecache.h:
        new prototype
      storage/maria/ma_recovery.c:
        * added replaying of REDO_RENAME_TABLE
        * UNDO_ROW_PURGE gone (see ma_blockrec.c), replaced by CLR_END
        * Recovery from the last checkpoint record now possible
        * In new_table() we skip the table if the id->name mapping is older than
        create_rename_lsn (mapping dates from lsn_of_file_id).
        * in get_MARIA_HA_from_REDO_record() we skip the record
        if the id->name mapping is newer than the record (can happen if processing
        a record which is before the checkpoint record).
        * parse_checkpoint_record() has to return a LSN, that's what caller expects
      storage/maria/ma_rename.c:
        new function's name; log end zeroes of tables' names (ease recovery)
      storage/maria/ma_test2.c:
        * equivalent of ma_test1's --test-undo added (named -u here).
        * -t=1 now stops right after creating the table, so that
        we can test undoing of INSERTs with duplicate keys (which tests the
        CLR_END logged by _ma_write_abort_block_record()).
      storage/maria/ma_test_recovery.expected:
        Result of testing undoing of INSERTs with duplicate keys; there are
        some differences in maria_chk -dvv but they are normal (removing
        records does not shrink data/index file, does not put back the
        "analyzed, optimized keys"(etc) index state.
      storage/maria/ma_test_recovery:
        Test undoing of INSERTs with duplicate keys, using ma_test2;
        when such INSERT happens, it logs REDO_INSERT, UNDO_INSERT, REDO_DELETE,
        CLR_END; we abort after that, and test that CLR_END causes recovery
        to jump over UNDO_INSERT.
      storage/maria/ma_write.c:
        comment
      storage/maria/maria_chk.c:
        comment
      storage/maria/maria_def.h:
        * a new bit in MARIA_SHARE::in_checkpoint, used to build a list
        of unique shares during Checkpoint.
        * MARIA_SHARE::lsn_of_file_id added: the LSN of the last LOGREC_FILE_ID
        for this share; needed to know to which LSN domain the mappings
        found in the Checkpoint record apply (new mappings should not apply
        to old REDOs).
      storage/maria/trnman.c:
        * small changes to how trnman_collect_transactions() fills its buffer;
        it also uses a non-dummy lsn_read_non_atomic() found in ma_checkpoint.h
      cd275413
  38. 07 Sep, 2007 1 commit
    • unknown's avatar
      - WL#3072 Maria Recovery: · 753ee49f
      unknown authored
      Recovery of state.records (the count of records which is stored into
      the header of the index file). For that, state.is_of_lsn is introduced;
      logic is explained in ma_recovery.c (look for "Recovery of the state").
      The net gain is that in case of crash, we now recover state.records,
      and it is idempotent (ma_test_recovery tests it).
      state.checksum is not recovered yet, mail sent for discussion.
      - WL#3071 Maria Checkpoint: preparation for it, by protecting
      all modifications of the state in memory or on disk with intern_lock
      (with the exception of the really-often-modified state.records,
      which is now protected with the log's lock, see ma_recovery.c
      (look for "Recovery of the state"). Also, if maria_close() sees that
      Checkpoint is looking at this table it will not my_free() the share.
      - don't compute row's checksum twice in case of UPDATE (correction
      to a bugfix I made yesterday).
      
      
      storage/maria/ha_maria.cc:
        protect state write with intern_lock (against Checkpoint)
      storage/maria/ma_blockrec.c:
        * don't reset trn->rec_lsn in _ma_unpin_all_pages(), because it
        should wait until we have corrected the allocation in the bitmap
        (as the REDO can serve to correct the allocation during Recovery);
        introducing _ma_finalize_row() for that.
        * In a changeset yesterday I moved computation of the checksum
        into write_block_record(), to fix a bug in UPDATE. Now I notice
        that maria_update() already computes the checksum, it's just that
        it puts it into info->cur_row while _ma_update_block_record()
        uses info->new_row; so, removing the checksum computation from
        write_block_record(), putting it back into allocate_and_write_block_record()
        (which is called only by INSERT and UNDO_DELETE), and copying
        cur_row->checksum into new_row->checksum in _ma_update_block_record().
      storage/maria/ma_check.c:
        new prototypes, they will take intern_lock when writing the state;
        also take intern_lock when changing share->kfile. In both cases
        this is to protect against Checkpoint reading/writing the state or reading
        kfile at the same time.
        Not updating create_rename_lsn directly at end of write_log_record_for_repair()
        as it wouldn't have intern_lock.
      storage/maria/ma_close.c:
        Checkpoint builds a list of shares (under THR_LOCK_maria), then it
        handles each such share (under intern_lock) (doing flushing etc);
        if maria_close() freed this share between the two, Checkpoint
        would see a bad pointer. To avoid this, when building the list Checkpoint
        marks each share, so that maria_close() knows it should not free it
        and Checkpoint will free it itself.
        Extending the zone covered by intern_lock to protect against
        Checkpoint reading kfile, writing state.
      storage/maria/ma_create.c:
        When we update create_rename_lsn, we also update is_of_lsn to
        the same value: it is logical, and allows us to test in maria_open()
        that the former is not bigger than the latter (the contrary is a sign
        of index header corruption, or severe logging bug which hinders
        Recovery, table needs a repair).
        _ma_update_create_rename_lsn_on_disk() also writes is_of_lsn;
        it now operates under intern_lock (protect against Checkpoint),
        a shortcut function is available for cases where acquiring
        intern_lock is not needed (table's creation or first open).
      storage/maria/ma_delete.c:
        if table is transactional, "records" is already decremented
        when logging UNDO_ROW_DELETE.
      storage/maria/ma_delete_all.c:
        comments
      storage/maria/ma_extra.c:
        Protect modifications of the state, in memory and/or on disk,
        with intern_lock, against a concurrent Checkpoint.
        When state goes to disk, update it's is_of_lsn (by calling
        the new _ma_state_info_write()).
        In HA_EXTRA_FORCE_REOPEN, don't set share->changed to 0 (undoing
        a change I made a few days ago) and ASK_MONTY
      storage/maria/ma_locking.c:
        no real code change here.
      storage/maria/ma_loghandler.c:
        Log-write-hooks for updating "state.records" under log's mutex
        when writing/updating/deleting a row or deleting all rows.
      storage/maria/ma_loghandler_lsn.h:
        merge (make LSN_ERROR and LSN_REPAIRED_BY_MARIA_CHK different)
      storage/maria/ma_open.c:
        When opening a table verify that is_of_lsn >= create_rename_lsn; if
        false the header must be corrupted.
        _ma_state_info_write() is split in two: _ma_state_info_write_sub()
        which is the old _ma_state_info_write(), and _ma_state_info_write()
        which additionally takes intern_lock if requested (to protect
        against Checkpoint) and updates is_of_lsn.
        _ma_open_keyfile() should change kfile.file under intern_lock
        to protect Checkpoint from reading a wrong kfile.file.
      storage/maria/ma_recovery.c:
        Recovery of state.records: when the REDO phase sees UNDO_ROW_INSERT
        which has a LSN > state.is_of_lsn it increments state.records.
        Same for UNDO_ROW_DELETE and UNDO_ROW_PURGE.
        When closing a table during Recovery, we know its state is at least
        as new as the current log record we are looking at, so increase
        is_of_lsn to the LSN of the current log record.
      storage/maria/ma_rename.c:
        update for new behaviour of _ma_update_create_rename_lsn_on_disk().
      storage/maria/ma_test1.c:
        update to new prototype
      storage/maria/ma_test2.c:
        update to new prototype (actually prototype was changed days ago,
        but compiler does not complain about the extra argument??)
      storage/maria/ma_test_recovery.expected:
        new result file of ma_test_recovery. Improvements: record
        count read from index's header is now always correct.
      storage/maria/ma_test_recovery:
        "rm" fails if file does not exist. Redirect stderr of script.
      storage/maria/ma_write.c:
        if table is transactional, "records" is already incremented when
        logging UNDO_ROW_INSERT. Comments.
      storage/maria/maria_chk.c:
        update is_of_lsn too
      storage/maria/maria_def.h:
        - MARIA_STATE_INFO::is_of_lsn which is used by Recovery. It is stored
        into the index file's header.
        - Checkpoint can now mark a table as "don't free this", and maria_close()
        can reply "ok then you will free it".
        - new functions
      storage/maria/maria_pack.c:
        update for new name
      753ee49f