1. 22 Dec, 2011 1 commit
    • Vasil Dimov's avatar
      Fix Bug#13510739 63775: SERVER CRASH ON HANDLER READ NEXT AFTER DELETE RECORD. · 41f309dd
      Vasil Dimov authored
      CREATE TABLE bug13510739 (c INTEGER NOT NULL, PRIMARY KEY (c)) ENGINE=INNODB;
      INSERT INTO bug13510739 VALUES (1), (2), (3), (4);
      DELETE FROM bug13510739 WHERE c=2;
      HANDLER bug13510739 OPEN;
      HANDLER bug13510739 READ `primary` = (2);
      HANDLER bug13510739 READ `primary` NEXT;  <-- crash
      
      The bug is that in the particular testcase row_search_for_mysql() picked up
      a delete-marked record and quit, leaving the cursor non-positioned state and
      on the subsequent 'get next' call the code crashed because of the
      non-positioned cursor.
      
      In row0sel.cc (line numbers from mysql-trunk):
      
      4653         if (rec_get_deleted_flag(rec, comp)) {
      ...
      4679                 if (index == clust_index && unique_search) {
      4680 
      4681                         err = DB_RECORD_NOT_FOUND;
      4682                         
      4683                         goto normal_return;
      4684                 }       
      
      it quit from here, not storing the cursor position.
      
      In contrast, if the record=2 is not found at all (e.g. sleep(1) after DELETE
      to let the purge wipe it away completely) then 'get = 2' does find record=3
      and quits from here:
      
      4366                 if (0 != cmp_dtuple_rec(search_tuple, rec, offsets)) {
      ...
      4394                         btr_pcur_store_position(pcur, &mtr);
      4395 
      4396                         err = DB_RECORD_NOT_FOUND;
      4397 #if 0
      4398                         ut_print_name(stderr, trx, FALSE, index->name);
      4399                         fputs(" record not found 3\n", stderr);
      4400 #endif
      4401 
      4402                         goto normal_return;
      
      Another fix could be to extend the condition on line 4366 to hold only if
      seach_tuple matches rec AND if rec is not delete marked.
      
      Notice that in the above test case if we wait about 1 second somewhere after
      DELETE and before 'get = 2', then the testcase does not crash and returns 4
      instead. Not sure if this is the correct behavior, but this bugfix removes
      the crash and makes the code return what it also returns in the non-crashing
      case (if rec=2 is not found during 'get = 2', e.g. we have sleep(1) there).
      
      Approved by:	Marko (http://bur03.no.oracle.com/rb/r/863/)
      41f309dd
  2. 16 Dec, 2011 8 commits
  3. 15 Dec, 2011 2 commits
  4. 14 Dec, 2011 2 commits
  5. 13 Dec, 2011 1 commit
    • Annamalai Gurusami's avatar
      Bug #13117023: Innodb increments handler_read_key when it should not · f080e98e
      Annamalai Gurusami authored
      The counter handler_read_key (SSV::ha_read_key_count) is incremented 
      incorrectly.
      
      The mysql server maintains a per thread system_status_var (SSV)
      object.  This object contains among other things the counter
      SSV::ha_read_key_count. The purpose of this counter is to measure the
      number of requests to read a row based on a key (or the number of
      index lookups).
      
      This counter was wrongly incremented in the
      ha_innobase::innobase_get_index(). The fix removes
      this increment statement (for both innodb and innodb_plugin).
      
      The various callers of the innobase_get_index() was checked to
      determine if anybody must increment this counter (if they first call
      innobase_get_index() and then perform an index lookup).  It was found
      that no caller of innobase_get_index() needs to worry about the
      SSV::ha_read_key_count counter.
      f080e98e
  6. 12 Dec, 2011 3 commits
  7. 30 Nov, 2011 2 commits
    • Tor Didriksen's avatar
      Bug#11761576 54082: HANDLE_SEGFAULT MAKES USE OF UNSAFE FUNCTIONS · 2a87c579
      Tor Didriksen authored
      Post-push fix: build break on windows/optimized
      2a87c579
    • Tor Didriksen's avatar
      Bug#11761576 54082: HANDLE_SEGFAULT MAKES USE OF UNSAFE FUNCTIONS · 8c3181b6
      Tor Didriksen authored
      handle_segfault is the signal handler code of mysqld.  however, it makes
      calls to potentially unsafe functions localtime_r, fprintf, fflush.
      
      
      
      include/my_stacktrace.h:
        Add safe versions of itoa() write() and snprintf().
      libmysqld/CMakeLists.txt:
        Move signal handler to separate file.
      mysys/stacktrace.c:
        Remove unsafe function calls.
      sql/CMakeLists.txt:
        Move signal handler to separate file.
      sql/Makefile.am:
        Move signal handler to separate file.
      sql/mysqld.cc:
        Move signal handler to separate file.
      sql/signal_handler.cc:
        Remove unsafe function calls.
      8c3181b6
  8. 29 Nov, 2011 2 commits
    • Tor Didriksen's avatar
      Build broken for gcc 4.5.1 in optimized mode. · 4775084b
      Tor Didriksen authored
      readline.cc: In function char* batch_readline(LINE_BUFFER*):
      readline.cc:60:9: error: out_length may be used uninitialized in this function
      log.cc: In function int find_uniq_filename(char*):
      log.cc:1857:8: error: number may be used uninitialized in this function
      4775084b
    • Nirbhay Choubey's avatar
      Bug#11756764 48726: MYSQLD KEEPS CRASHING WITH SIGSEGV · 11b2a2fe
      Nirbhay Choubey authored
                          WITH MYISAM_USE_MMAP ENABLED
      
      MySQL server can crash due to segmentation fault when
      started with myisam_use_mmap.
      
      The reason behind this being, while making a request to
      unmap (munmap) the previously mapped memory (mmap), the
      size passed was 7 bytes larger than the size requested at
      the time of mapping. This can eventually unmap the adjacent
      memory mapped block, belonging to some other memory-map pool.
      Hence the subsequent call to mmap can map a region which was
      still a valid memory mapped area.
      
      Fixed by removing the extra 7-byte margin which was erroneously
      added to the size, used for unmappping.
      
      
      storage/myisam/mi_close.c:
        Bug#11756764 48726: MYSQLD KEEPS CRASHING WITH SIGSEGV
                            WITH MYISAM_USE_MMAP ENABLED
        
        Added a condition to call _mi_unmap_file() in case
        of compressed records. mi_munmap_file() is called
        otherwise.
      storage/myisam/mi_packrec.c:
        Bug#11756764 48726: MYSQLD KEEPS CRASHING WITH SIGSEGV
                            WITH MYISAM_USE_MMAP ENABLED
        
        mi_dynmap_file() function, after successfully executing
        mmap, stores the total size in info->s->mapped_length
        variable. Now, if mi_dynmap_file() is invoked with a size
        with an extra 7-byte margin (MEMMAP_EXTRA_MARGIN),
        the margin will eventually also get stored in mapped_length.
        So, un-mapping function can simply use the value stored in
        mapped_length in order to unmap the previously mapped
        region.
      11b2a2fe
  9. 23 Nov, 2011 1 commit
    • Ashish Agarwal's avatar
      BUG#11751793 - 42784: ARCHIVE TABLES CAUSE 100% CPU USAGE · cb660cc3
      Ashish Agarwal authored
                            AND HANG IN SHOW TABLE STATUS.
      
      ISSUE: Table corruption due to concurrent queries.
             Different threads running insert and check
             query leads to table corruption. Not properly locked,
             rows are inserted in between check query.
      
      SOLUTION: In check query mutex lock is acquired
                for a longer time to handle concurrent
                insert and check query.
      
      NOTE: Additionally we backported the fix for CHECKSUM
            issue(bug#11758979).
      cb660cc3
  10. 22 Nov, 2011 1 commit
  11. 18 Nov, 2011 2 commits
  12. 16 Nov, 2011 1 commit
  13. 10 Nov, 2011 2 commits
    • Marko Mäkelä's avatar
      Bug #12842206 INNODB LOCKING REGRESSION FOR INSERT IGNORE: Add a test case. · 0d0924e3
      Marko Mäkelä authored
      The bug was accidentally fixed by fixing
      Bug#11759688 52020: InnoDB can still deadlock on just INSERT...ON DUPLICATE KEY
      a.k.a. the reintroduction of
      Bug#7975 deadlock without any locking, simple select and update
      0d0924e3
    • Marko Mäkelä's avatar
      Bug#11759688 52020: InnoDB can still deadlock on just INSERT...ON DUPLICATE KEY · 87593f55
      Marko Mäkelä authored
      a.k.a. Bug#7975 deadlock without any locking, simple select and update
      
      Bug#7975 was reintroduced when the storage engine API was made
      pluggable in MySQL 5.1. Instead of looking at thd->lex directly, we
      rely on handler::extra(). But, we were looking at the wrong extra()
      flag, and we were ignoring the TRX_DUP_REPLACE flag in places where we
      should obey it.
      
      innodb_replace.test: Add tests for hopefully all affected statement
      types, so that bug should never ever resurface. This kind of tests
      should have been added when fixing Bug#7975 in MySQL 5.0.3 in the
      first place.
      
      rb:806 approved by Sunny Bains
      87593f55
  14. 08 Nov, 2011 1 commit
    • Marko Mäkelä's avatar
      Bug#13358468 ASSERTION FAILURE IN BTR_PCUR_GET_BLOCK · c75c8ce8
      Marko Mäkelä authored
      btr_pcur_restore_position_func(): When the cursor was positioned at
      the tree infimum or supremum, initialize pos_state and latch_mode. The
      assertion failed, because pos_state was BTR_PCUR_WAS_POSITIONED.  In
      the test failure of WL#5874, the purge thread attempted to restore the
      cursor position on the infimum record (the clustered index was empty).
      
      btr_pcur_detach(), btr_pcur_is_detached(): Unused functions, remove.
      
      rb:804 approved by Inaam Rana
      c75c8ce8
  15. 07 Nov, 2011 1 commit
  16. 04 Nov, 2011 1 commit
  17. 01 Nov, 2011 1 commit
  18. 31 Oct, 2011 1 commit
  19. 29 Oct, 2011 1 commit
  20. 28 Oct, 2011 1 commit
  21. 27 Oct, 2011 2 commits
  22. 26 Oct, 2011 3 commits