List:Commits« Previous MessageNext Message »
From:marko.makela Date:May 24 2011 8:45am
Subject:bzr push into mysql-5.5 branch (marko.makela:3394 to 3395) Bug#58815
Bug#11765812
View as plain text  
 3395 Marko Mäkelä	2011-05-24
      Backport an InnoDB Bug #58815 (Bug #11765812) work-around from mysql-trunk:
      
      ------------------------------------------------------------
      revno 2876.244.305
      revision id marko.makela@strippedp
      parent  marko.makela@strippedytmc37ye1nt7d9
      committer  Marko Mäkelä <marko.makela@stripped>
      branch nick 5.6-innodb
      timestamp Wed 2011-04-13 11:22:11 +0300
      message:
        Suppress the Bug #58815 (Bug #11765812) assertion failure.
      
        buf_page_get_gen(): Introduce BUF_GET_POSSIBLY_FREED for suppressing the
        check that the file page must not have been freed.
      
        btr_estimate_n_rows_in_range_on_level(): Pass BUF_GET_POSSIBLY_FREED and
        explain in the comments why this is needed and why it should be mostly
        harmless to ignore the problem. If InnoDB had always initialized all
        unused fields in data files, no problem would exist.
      
        This change does not fix the bug, it just "shoots the messenger".
      
        rb:647 approved by Jimmy Yang

    modified:
      storage/innobase/btr/btr0cur.c
      storage/innobase/buf/buf0buf.c
      storage/innobase/include/buf0buf.h
 3394 Luis Soares	2011-05-24 [merge]
      BUG#12558519
      
      Automerged bzr bundle from bug report into latest mysql-5.5.

    modified:
      sql/log_event.cc
      sql/rpl_rli.cc
      sql/table.cc
=== modified file 'storage/innobase/btr/btr0cur.c'
--- a/storage/innobase/btr/btr0cur.c	revid:luis.soares@oracle.com-20110523233355-cubjr2teo7mwqgvs
+++ b/storage/innobase/btr/btr0cur.c	revid:marko.makela@stripped24084131-jtm2pofyd0g75nt3
@@ -3264,9 +3264,14 @@ btr_estimate_n_rows_in_range_on_level(
 
 		mtr_start(&mtr);
 
-		/* fetch the page */
-		block = buf_page_get(space, zip_size, page_no, RW_S_LATCH,
-				     &mtr);
+		/* Fetch the page. Because we are not holding the
+		index->lock, the tree may have changed and we may be
+		attempting to read a page that is no longer part of
+		the B-tree. We pass BUF_GET_POSSIBLY_FREED in order to
+		silence a debug assertion about this. */
+		block = buf_page_get_gen(space, zip_size, page_no, RW_S_LATCH,
+					 NULL, BUF_GET_POSSIBLY_FREED,
+					 __FILE__, __LINE__, &mtr);
 
 		page = buf_block_get_frame(block);
 
@@ -3285,6 +3290,13 @@ btr_estimate_n_rows_in_range_on_level(
 			goto inexact;
 		}
 
+		/* It is possible but highly unlikely that the page was
+		originally written by an old version of InnoDB that did
+		not initialize FIL_PAGE_TYPE on other than B-tree pages.
+		For example, this could be an almost-empty BLOB page
+		that happens to contain the magic values in the fields
+		that we checked above. */
+
 		n_pages_read++;
 
 		if (page_no != slot1->page_no) {

=== modified file 'storage/innobase/buf/buf0buf.c'
--- a/storage/innobase/buf/buf0buf.c	revid:luis.soares@stripped33355-cubjr2teo7mwqgvs
+++ b/storage/innobase/buf/buf0buf.c	revid:marko.makela@stripped0g75nt3
@@ -2747,6 +2747,7 @@ buf_page_get_gen(
 	case BUF_GET_IF_IN_POOL:
 	case BUF_PEEK_IF_IN_POOL:
 	case BUF_GET_IF_IN_POOL_OR_WATCH:
+	case BUF_GET_POSSIBLY_FREED:
 		break;
 	default:
 		ut_error;
@@ -3062,7 +3063,10 @@ wait_until_unfixed:
 #endif /* UNIV_DEBUG || UNIV_IBUF_DEBUG */
 
 	buf_block_buf_fix_inc(block, file, line);
-
+#if defined UNIV_DEBUG_FILE_ACCESSES || defined UNIV_DEBUG
+	ut_a(mode == BUF_GET_POSSIBLY_FREED
+	     || !block->page.file_page_was_freed);
+#endif
 	mutex_exit(&block->mutex);
 
 	/* Check if this is the first access to the page */
@@ -3075,10 +3079,6 @@ wait_until_unfixed:
 		buf_page_set_accessed_make_young(&block->page, access_time);
 	}
 
-#if defined UNIV_DEBUG_FILE_ACCESSES || defined UNIV_DEBUG
-	ut_a(!block->page.file_page_was_freed);
-#endif
-
 #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
 	ut_a(++buf_dbg_counter % 5771 || buf_validate());
 	ut_a(block->page.buf_fix_count > 0);

=== modified file 'storage/innobase/include/buf0buf.h'
--- a/storage/innobase/include/buf0buf.h	revid:luis.soares@strippedubjr2teo7mwqgvs
+++ b/storage/innobase/include/buf0buf.h	revid:marko.makela@stripped5nt3
@@ -53,6 +53,9 @@ Created 11/5/1995 Heikki Tuuri
 					/*!< Get the page only if it's in the
 					buffer pool, if not then set a watch
 					on the page. */
+#define BUF_GET_POSSIBLY_FREED		16
+					/*!< Like BUF_GET, but do not mind
+					if the file page has been freed. */
 /* @} */
 /** @name Modes for buf_page_get_known_nowait */
 /* @{ */

Attachment: [text/bzr-bundle] bzr/marko.makela@oracle.com-20110524084131-jtm2pofyd0g75nt3.bundle
Thread
bzr push into mysql-5.5 branch (marko.makela:3394 to 3395) Bug#58815Bug#11765812marko.makela24 May