• Michael Widenius's avatar
    Fixed some bugs in the Maria storage engine · ec281a3c
    Michael Widenius authored
    - Changed default recovery mode from OFF to NORMAL to get automatic repair of not properly closed tables.
    - Fixed a rase condition when two threads calls external_lock and thr_lock() in different order. When this happend the transaction that called external lock first
      and thr_lock() last did not see see the rows from the other transaction, even if if it had to wait in thr_lock() for other to complete.
    - Fixed that one can run maria_chk on an automatcally recovered tables without warnings about too small transaction id
    - Don't give warning that crashed table could not be repaired if repair was disabled (and thus not run)
    - Fixed a error result from flush_key_cache() which caused a DBUG_ASSERT() when one was using concurrent reads on non transactional tables that was updated.
    
    client/mysqldump.c:
      Add "" around error message to make it more readable
    client/mysqltest.cc:
      Free environment variables
    mysql-test/r/mysqldump.result:
      Updated results
    mysql-test/r/openssl_1.result:
      Updated results
    mysql-test/suite/maria/r/maria-recover.result:
      Updated results
    mysql-test/suite/maria/r/maria3.result:
      Updated results
    mysql-test/suite/maria/t/maria3.test:
      Added more test of temporary tables
    storage/maria/ha_maria.cc:
      Changed default recovery mode from OFF to NORMAL to get automatic repair of not properly closed tables.
      Start transaction in ma_block_get_status() instead of in ha_maria::external_lock().
      - This fixes a rase condition when two threads calls external lock and thr_lock() in different order. When this happend the transaction that called external lock first and thr_lock() last did not see see the rows from the other transaction, even if if it had to wait in thr_lock() for other to complete.
      Store latest transaction id in controll file if recovery was done.
      - This allows one to run maria_chk on an automatcally recovered tables without warnings about too small transaction id
    storage/maria/ha_maria.h:
      Don't give warning that crashed table could not be repaired if repair was disabled (and thus not run)
    storage/maria/ma_blockrec.h:
      Added new function "_ma_block_get_status_no_versioning()"
    storage/maria/ma_init.c:
      Added hook to create trn in ma_block_get_status() if we are using MariaDB
    storage/maria/ma_open.c:
      Ensure we call _ma_block_get_status_no_versioning() for transactional tables without versioning (like tables with fulltext)
    storage/maria/ma_pagecache.c:
      Allow one to flush blocks that are pinned for read.
      This fixed a error result from flush_key_cache() which caused a DBUG_ASSERT() when one was using concurrent reads on non transactional tables that was updated.
    storage/maria/ma_recovery.c:
      Set maria_recovery_changed_data to 1 if recover changed something.
      Set max_trid_in_control_file to max found trn if we found a bigger trn.
      The allows will ensure that the control file is up to date after recovery which allows one to run maria_chk on the tables without warnings about too big trn
    storage/maria/ma_state.c:
      Call maria_create_trn_hook() in _ma_setup_live_state() instead of ha_maria::external_lock()
      This ensures that 'state' and trn are in sync and thus fixes the race condition mentioned for ha_maria.cc
    storage/maria/ma_static.c:
      Added maria_create_trn_hook() and maria_recovery_changed_data
    storage/maria/maria_def.h:
      Added MARIA_HANDLER->external_ptr, which is used to hold MariaDB thd.
      Added some new external variables
      Removed reference to non existing function: maria_concurrent_inserts()
    ec281a3c
ha_maria.cc 109 KB