1. 24 Nov, 2008 1 commit
    • unknown's avatar
      Prevent reenabling logging by thread which tries to lock table used by bulk insert. · 094d92e2
      unknown authored
            Scenario of the BUG#40731 ("Maria: hang (probably in page cache) under concurrency"):
            T1: Disable logging for the table
            T1: Start inserting into the table
            T2: Tries to lock the table so waits.
            T2: Tries unlock and relock during the process see that the table has disabled logging and reenables it
            T1: Got DBUG_ASSERT because suddenly start use table with transaction switched on which is not expected during bulk insert
      
      storage/maria/ma_pagecache.c:
        Page type print added for debugging purposes.
      storage/maria/ma_recovery.c:
        Check that it was this thred which switched off logging (transactional mode).
      storage/maria/maria_def.h:
        Flag for controling which thread switched off transactiona mode for the table added.
      094d92e2
  2. 12 Nov, 2008 2 commits
  3. 10 Nov, 2008 1 commit
  4. 07 Nov, 2008 1 commit
  5. 05 Nov, 2008 1 commit
    • Michael Widenius's avatar
      Fix for bug: Bug #40391 Maria deadlock in trnman_get_min_trid , trnman_end_trn · 4150dfda
      Michael Widenius authored
      storage/maria/trnman.c:
        Store min used trid in a global variable and change trnman_get_min_trid() to return this variable without using a mutex.
        This is safe as trnman_get_min_trid() is used for trid optimization and all algoritms will work even if it returns a slightly older trid.
        
        Also ensure that LOCK_trn_list is unlocked in trnman_new_trn() in the very unlikely case that lf_hash_get_pins() fails
      4150dfda
  6. 04 Nov, 2008 2 commits
    • Sergei Golubchik's avatar
      comment · 8a655c60
      Sergei Golubchik authored
      include/waiting_threads.h:
        comment with a deadlock example
      8a655c60
    • Michael Widenius's avatar
      Fixed that packed transid can be compared byte per byte and we get them in increasing order · e4febda8
      Michael Widenius authored
      The old way to store the length prefix was (256 - length); This is now changed to (length -249)
      Fixed also that some defines to have a MARIA_ prefix
      
      storage/maria/ma_control_file.c:
        Added comment
      storage/maria/ma_key.c:
        Added MARIA_ prefix to some defines
        Changed how packed transid length was stored
      storage/maria/ma_open.c:
        Added MARIA_ prefix to some defines
      storage/maria/maria_def.h:
        Added MARIA_ prefix to some defines
        Changed how packed transid length was stored
      e4febda8
  7. 03 Nov, 2008 3 commits
    • Sergei Golubchik's avatar
      don't use #pragma pack · f91219ed
      Sergei Golubchik authored
      include/waiting_threads.h:
        don't #pragma pack
      mysys/lf_hash.c:
        typo in a comment
      mysys/waiting_threads.c:
        use the size of data, not the size of (possibly padded) structure
      f91219ed
    • Michael Widenius's avatar
      Automatic merge · cc684c34
      Michael Widenius authored
      cc684c34
    • Michael Widenius's avatar
      Fixed bug introduced in last push. · d5456c5d
      Michael Widenius authored
      storage/maria/ha_maria.cc:
        Use file->s->lock_key_trees instead of file->s->lock.get_status to detect if we are using versioning
      storage/maria/ma_state.c:
        Fixed function prototype
      storage/maria/ma_state.h:
        Fixed function prototype
      d5456c5d
  8. 02 Nov, 2008 1 commit
  9. 31 Oct, 2008 2 commits
    • Michael Widenius's avatar
      Added ha_maria::is_changed() (needed for Query cache) · 2b521320
      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
      2b521320
    • unknown's avatar
      merge · 24d1df1a
      unknown authored
      24d1df1a
  10. 30 Oct, 2008 1 commit
  11. 27 Oct, 2008 2 commits
  12. 24 Oct, 2008 2 commits
    • Guilhem Bichot's avatar
      Backport of fix made in 6.0-maria in revision guilhem@mysql.com-20081020202418-yay1h55w9ffagp42 · f2d8af59
      Guilhem Bichot authored
      sql/sql_class.cc:
        Backport of fix made in 6.0-maria in revision guilhem@mysql.com-20081020202418-yay1h55w9ffagp42
        (this undoes a change made in WL 3064 (the deadlock detector patch) which asserted in
        "./mtr --embedded innodb_mysql" in 6.0-maria)
      f2d8af59
    • Sergei Golubchik's avatar
      wt needs to use its own implementation of rwlocks with · 14c14661
      Sergei Golubchik authored
      reader preference, at least where system rwlocks are fair.
      
      include/my_global.h:
        wt uses mutex-based rwlock implementation unless on linux
      include/waiting_threads.h:
        mutex-based rwlock implementation with reader preference
      mysys/thr_rwlock.c:
        revert the change. make my_rw_locks fair
      mysys/waiting_threads.c:
        mutex-based rwlock implementation with reader preference.
        convert complex multi-line macros to static functions
      14c14661
  13. 22 Oct, 2008 2 commits
  14. 21 Oct, 2008 5 commits
  15. 17 Oct, 2008 2 commits
    • Guilhem Bichot's avatar
      calling make_lock_and_pin() without cache's mutex is wrong (patch from Sanja). · d40f3fc3
      Guilhem Bichot authored
      storage/maria/ma_pagecache.c:
        calling make_lock_and_pin() without cache's mutex is wrong (patch from Sanja)
      d40f3fc3
    • Guilhem Bichot's avatar
      Fix for BUG#39363 "Concurent inserts in the same table lead to hang in maria engine" · 8b87da7f
      Guilhem Bichot authored
      (need a mutex when modifying bitmap->non_flushable), which I hit when running maria_bulk_insert.yy.
      After fixing this, I hit an assertion in check_and_set_lsn() saying that the page was PAGECACHE_PLAIN_PAGE.
      This could be caused by pages left by an operation which had transactions disabled (like a bulk insert with repair):
      in this patch we remove those pages out of the cache when we re-enable transactions.
      After fixing this, I get page cache deadlocks, pushbuild2 also has some, to be looked at.
      No testcase, requires concurrency and running for 15 minutes, but automatically tested by pushbuild2.
      
      
      storage/maria/ma_bitmap.c:
        Doing bitmap->non_flushable++ without mutex was wrong. If this ++ happened while another ++ or -- was happening
        in another thread, one ++ or -- could be missed and the bitmap code would behave wrongly. For example, if a ++
        was missed, the DBUG_ASSERT(((int) (bitmap->non_flushable)) >= 0) in _ma_bitmap_release_unused() could fire.
        I saw this assertion happen in practice in maria_bulk_insert.yy. Adding this mutex lock eliminated
        the assertion problem.
        The >=0 was wrong, should be >0 (or the variable could go negative).
      storage/maria/ma_recovery.c:
        When we re-enable transactionality, as we may have created pages of type PAGECACHE_PLAIN_PAGE before,
        we need to remove them from the cache (FLUSH_RELEASE). Or they would stay this way, and later when we
        maria_write() to them, we would try to tag them with a LSN (ma_unpin_all_pages()), which is incorrect
        for a plain page (and causes assertion in the page cache at start of check_and_set_lsn()).
        I saw the assertion fire with maria_bulk_insert.yy, and this seems to cure it.
        page cache
      8b87da7f
  16. 16 Oct, 2008 4 commits
    • unknown's avatar
      Merge · edf84296
      unknown authored
      edf84296
    • Guilhem Bichot's avatar
      Fix for BUG#39710 "Maria assertion in maria_disable_non_unique_index". · 421973ec
      Guilhem Bichot authored
      No testcase, this requires concurrency and is automatically tested by
      maria_bulk_insert.yy in pushbuild2.
      
      storage/maria/ha_maria.cc:
        The case of BUG#39710 is:
        two threads want to INSERT SELECT into the same table.
        Thread1 (T1) starts, does external_lock, thr_lock (store_lock sees 0 records so
        upgrades to TL_WRITE), goes into bulk insert, starts writes
        T2 starts, external_lock, thr_lock (store_lock sees 0 records so
        upgrades to TL_WRITE), blocks on existing thr_lock of T1.
        T1 ends writes, ends bulk insert, commits (ha_maria::implicit_commit()
        at end of dispatch_command()), external_lock and thr_unlock
        (close_thread_tables() at end of dispatch_command()).
        T2 wakes up, gets thr_lock, goes into start_bulk_insert() where
        file->state is out-of-date and still says that file->state->records==0,
        so maria_disable_non_unique_index() is called, which asserts because
        the actual number of records (share->state.state.records) is >0.
        The solution, maybe temporary, is to also check share->state.state.records==0
        when deciding to do bulk insert, with the idea that such operation cannot
        rely on the view of the start of the transaction, as it uses repair,
        and can safely read share->state as it has acquired the exclusive
        TL_WRITE.
        Question for reviewer: if we enter the if() branch, do we also need to do:
        *(file->state)= share->state.state;
        or even call some existing function which does that?
      421973ec
    • unknown's avatar
      Fixed ability to read without read lock acquiring. (BUG#39665 related) · b70f7317
      unknown authored
      storage/maria/ma_pagecache.c:
        Fixed ability to read without read lock acquiring.
      storage/maria/unittest/CMakeLists.txt:
        New unit test which tests simple read and prolonged writes consistency added.
      storage/maria/unittest/Makefile.am:
        New unit test which tests simple read and prolonged writes consistency added.
      storage/maria/unittest/ma_pagecache_rwconsist2.c:
        New unit test which tests simple read and prolonged writes consistency added.
      b70f7317
    • Guilhem Bichot's avatar
      Fix for Windows build failure: __attribute__ does not exist under Windows · d44e00e7
      Guilhem Bichot authored
      storage/maria/ma_static.c:
        __attribute__ does not exist under Windows, so it can be used only afer my_global.h which defines it to nothing.
      d44e00e7
  17. 15 Oct, 2008 3 commits
    • Guilhem Bichot's avatar
      Merge of my revision · a184d6b0
      Guilhem Bichot authored
      a184d6b0
    • Guilhem Bichot's avatar
      Small fixes for pushbuild: compiler warnings, checking that partitioning is... · 5aa1e3b3
      Guilhem Bichot authored
      Small fixes for pushbuild: compiler warnings, checking that partitioning is enabled when testing it.
      Don't fsync() index file when closing Maria table if not transactional.
      
      mysql-test/suite/maria/r/maria.result:
        piece moved
      mysql-test/suite/maria/r/maria_partition.result:
        result
      mysql-test/suite/maria/t/maria.test:
        - reset default storage engine at end of test, not in the middle
        - move piece which requires partitioning, to maria_partition.test, otherwise test fails
        on builds without partitioning compiled in
      mysql-test/suite/maria/t/maria_partition.test:
        new test for those Maria bugs which are specific of partitioning
      mysys/my_uuid.c:
        compiler warning fix (fix imported from latest 5.1-main)
      storage/maria/ma_close.c:
        don't fsync() index file when closing table if not transactional
        (same test as in _ma_once_end_block_record() when fsync-ing data file)
      storage/maria/ma_create.c:
        compiler warning fix (char* assigned to uchar*)
      storage/maria/ma_loghandler.c:
        compiler warning fix (char* assigned to uchar*)
      5aa1e3b3
    • Michael Widenius's avatar
      Automatic merge with main tree · 2faf503e
      Michael Widenius authored
      Fixed that mysql-test-run --skip-from starts from the given test
      
      mysql-test/lib/mtr_cases.pl:
        Moved testing of $opt_start_from to mysql-test-run.pl because tests are now run per suite and the old way would rerun not wanted tests
      mysql-test/mysql-test-run.pl:
        Fixed that mysql-test-run --skip-from starts from the given test
      2faf503e
  18. 14 Oct, 2008 4 commits
    • Michael Widenius's avatar
      Merging of changes from myisam -> maria missing in last 5.1 - 5.1->maria merge · 32718418
      Michael Widenius authored
      MARIA_MAX_MSG_BUF -> HA_MAX_MSG_BUF
      
      include/maria.h:
        Remove MARIA_MAX_MSG_BUF; We are now using HA_MAX_MSG_BUF
        Added maria_test_invalid_symlink
      storage/maria/ha_maria.cc:
        MARIA_MAX_MSG_BUF -> HA_MAX_MSG_BUF
      storage/maria/ma_check.c:
        Removed tab in string constant
        Add extra argument to ma_open_datafile()
      storage/maria/ma_create.c:
        Set error number if table is in use
      storage/maria/ma_open.c:
        Added name argument to open functions for security check if filename is linked to another file in database directory
      storage/maria/ma_static.c:
        Default functions for checking if wrong symlink
      storage/maria/maria_chk.c:
        Add extra argument to _ma_open_datafile()
      storage/maria/maria_def.h:
        Add extra argument to _ma_open_datafile()
      32718418
    • Guilhem Bichot's avatar
      _ma_bitmap_unpin_all() needs to unpin not-locked pages which were pinned by other threads · 8ecda6cd
      Guilhem Bichot authored
      in write_changed_bitmap(), and page cache forbids that. Here we make the page
      cache more relaxed. Original patch by Sanja, simplified by me as limited to
      not-locked. See comment of ma_bitmap.c.
      With that, maria_stress.yy runs until hitting BUG 39665.
      
      storage/maria/ma_bitmap.c:
        A thread which unpins bitmap pages in _ma_bitmap_unpin_all() sometimes
        hit an assertion in the page cache (info!=0 in remove_pin()) which states
        that you can unpin/unlock only what *you* have pinned/locked.
        Fixed by setting the new last parameter of pagecache_unlock_by_link()
        to TRUE in _ma_bitmap_unpin_all().
      storage/maria/ma_blockrec.c:
        new prototype and splitting assertion in three (3rd one fires: BUG 39665)
      storage/maria/ma_check.c:
        new prototype
      storage/maria/ma_key_recover.c:
        new prototype
      storage/maria/ma_loghandler.c:
        new prototype
      storage/maria/ma_pagecache.c:
        Allow a thread to unpin, with pagecache_unlock_by_link(), a non-locked page pinned by others.
        This is a hack for _ma_bitmap_unpin_all() which needs to unpin pages which were
        pinned by other threads in write_changed_bitmap().
      storage/maria/ma_pagecache.h:
        new prototype
      storage/maria/ma_preload.c:
        new prototype
      storage/maria/unittest/ma_pagecache_rwconsist.c:
        new prototype
      storage/maria/unittest/ma_pagecache_single.c:
        new prototype
      8ecda6cd
    • Guilhem Bichot's avatar
      WL#4595 "Maria - no write-lock when pinning bitmap pages": turns out that page cache · 8dc87e3e
      Guilhem Bichot authored
      already supports pin-without-lock so implementation of this WL is instant and
      done here. This could improve concurrency. No testcase, this requires
      multiple threads and is automatically tested at push time by maria_stress.yy (pushbuild2).
      
      storage/maria/ma_bitmap.c:
        As the page cache supports pinning without write-locking, we don't take write lock
        in write_changed_bitmap(), only a pin; this could improve concurrency (WL#4595).
      8dc87e3e
    • Guilhem Bichot's avatar
      Fix for BUG#39210 "Maria deadlock in _ma_bitmap_wait_or_flush". It was a thread · ed567bd2
      Guilhem Bichot authored
      which nobody woke up (see comment of ma_bitmap.c). No testcase, this requires
      multiple threads and is automatically tested at push time by maria_stress.yy (pushbuild2).
      
      storage/maria/ma_bitmap.c:
        * _ma_bitmap_wait_or_flush() didn't publish that it was waiting for bitmap to not
        be over-allocated (i.e. didn't modify bitmap->flush_all_requested) so nobody
        (_ma_bitmap_flushable(), _ma_bitmap_release_unused()) knew it had to wake it up
        => it stalled (BUG#39210). In fact the wait in _ma_bitmap_wait_or_flush()
        is not needed, it's ok if this function sends the over-allocated bitmap to page
        cache and keeps pin on it (_ma_bitmap_unpin_all() will unpin it later, and
        the one who added _ma_bitmap_wait_or_flush() didn't know it). Function
        is thus deleted, as _ma_bitmap_flush() can do its job.
        * After fixing that, test runs longer and BUG 39665 happens, which looks like
        a separate page cache bug.
        * Smaller changes: _ma_bitmap_flush_all() called write_changed_bitmap() even
        though it might not be changed; added some DBUG calls in functions; split
        assertions.
        * In _ma_bitmap_release_unused(), it's more logical to test non_flushable_state
        than now_transactional to know if we have to decrement non_flushable
        (it's exactly per the definition of non_flushable_state).
      storage/maria/ma_blockrec.c:
        _ma_bitmap_wait_or_flush() is not needed.
        ******
        new prototype and splitting assertion in three (3rd one fires: BUG 39665)
      storage/maria/ma_blockrec.h:
        _ma_bitmap_wait_or_flush() is not needed.
      ed567bd2
  19. 12 Oct, 2008 1 commit
    • Michael Widenius's avatar
      Fix for bug#39226 Maria: crash with FLUSH TABLES WITH READ LOCK after LOCK TABLES · 058916ae
      Michael Widenius authored
      - The problem was that we didn't inform the handler that we are going to close tables that are locked and may have (at least in Maria) be part of an active transaction.
      Fix for Bug#39227 Maria: crash with ALTER TABLE PARTITION
      Fix for Bug #39987 main.partition_not_windows fails under debug build
      Fixed some compiler errors & warnings found by pushbuild
      
      include/my_base.h:
        Added HA_EXTRA_PREPARE_FOR_FORCED_CLOSE for signaling the handler that the file will be forced closed
      include/my_global.h:
        Removed 'register' from 'swap_variables' as this gives a warnings when the variables are structs. Compilers should also now be smart enough to figure out this themselves
      mysql-test/r/subselect_debug.result:
        Reset value of the debug variable;  Without setting this the subselect_innodb test will fail when run after this one
      mysql-test/suite/maria/r/maria.result:
        Merged test with myisam.test
        Added tests for new fixed bugs
      mysql-test/suite/maria/t/maria.test:
        Merged test with myisam.test
        Added tests for new fixed bugs
      mysql-test/t/subselect_debug.test:
        Reset value of the debug variable;  Without setting this the subselect_innodb test will fail when run after this one
      mysys/my_uuid.c:
        Fixed compiler error on windows
      sql/ha_partition.cc:
        Added support for the new extra flag: HA_EXTRA_PREPARE_FOR_FORCED_CLOSE (Bug #39226)
        Ensure that we call extra() for HA_EXTRA_PREPARE_FOR_DROP (Bug#39227)
      sql/mysqld.cc:
        Fix for Bug #39987 main.partition_not_windows fails under debug build
        The problem was that when compiling for purify/valgrind realpath() is not used, which causes test_if_data_home_dir to fail when it shouldn't
      sql/sql_base.cc:
        Call HA_EXTRA_PREPARE_FOR_FORCED_CLOSE for tables that are locked but we are going to force close without doing a commit
      sql/sql_parse.cc:
        More DBUG_PRINT. Fixed comments
      storage/maria/ma_extra.c:
        If HA_EXTRA_PREPARE_FOR_FORCED_CLOSE is called and the table is part of a transaction, remove the table from beeing part of a transaction.
        This is safe as this is only used as part of flush tables or when the table is not part of a transaction
      storage/myisam/mi_open.c:
        Indentation fix
      unittest/mysys/waiting_threads-t.c:
        Remove not needed 'volatile' to get rid of compiler warnings on windows
      058916ae