diff options
author | Inaam Rana <inaam.rana@oracle.com> | 2012-12-14 11:24:57 +0500 |
---|---|---|
committer | Inaam Rana <inaam.rana@oracle.com> | 2012-12-14 11:24:57 +0500 |
commit | 0b10e6d03f8733f66eaf764e237250a4cc934900 (patch) | |
tree | 4e1c057b50c52041efc4e35332bca439aab83a80 /storage | |
parent | 9258223200047222e52463b49f6f1c83ca042075 (diff) | |
download | mariadb-git-0b10e6d03f8733f66eaf764e237250a4cc934900.tar.gz |
Bug#14329288 IS THE CALL TO IBUF_MERGE_OR_DELETE_FOR_PAGE FROM
BUF_PAGE_GET_GEN REDUNDANT?
rb://1711
approved by: Marko Makela
When decompressing a compressed page that had already been accessed
in the buffer pool, do not attempt to merge buffered changes.
Diffstat (limited to 'storage')
-rw-r--r-- | storage/innodb_plugin/ChangeLog | 6 | ||||
-rw-r--r-- | storage/innodb_plugin/buf/buf0buf.c | 21 |
2 files changed, 20 insertions, 7 deletions
diff --git a/storage/innodb_plugin/ChangeLog b/storage/innodb_plugin/ChangeLog index 5387555d24f..a8e54f6dc30 100644 --- a/storage/innodb_plugin/ChangeLog +++ b/storage/innodb_plugin/ChangeLog @@ -1,3 +1,9 @@ +2012-12-13 The InnoDB Team + + * buf/buf0buf.c: + Fix Bug#14329288 IS THE CALL TO IBUF_MERGE_OR_DELETE_FOR_PAGE FROM + BUF_PAGE_GET_GEN REDUNDANT? + 2012-11-15 The InnoDB Team * include/data0type.ic, include/rem0rec.h, diff --git a/storage/innodb_plugin/buf/buf0buf.c b/storage/innodb_plugin/buf/buf0buf.c index 755fa947c8f..e7e60fb2b2a 100644 --- a/storage/innodb_plugin/buf/buf0buf.c +++ b/storage/innodb_plugin/buf/buf0buf.c @@ -1778,22 +1778,29 @@ wait_until_unfixed: UNIV_MEM_INVALID(bpage, sizeof *bpage); - mutex_exit(&block->mutex); - mutex_exit(&buf_pool_zip_mutex); buf_pool->n_pend_unzip++; - buf_pool_mutex_exit(); + access_time = buf_page_is_accessed(&block->page); + mutex_exit(&block->mutex); + mutex_exit(&buf_pool_zip_mutex); + buf_page_free_descriptor(bpage); - /* Decompress the page and apply buffered operations - while not holding buf_pool_mutex or block->mutex. */ + /* Decompress the page while not holding + buf_pool_mutex or block->mutex. */ success = buf_zip_decompress(block, srv_use_checksums); ut_a(success); if (UNIV_LIKELY(!recv_no_ibuf_operations)) { - ibuf_merge_or_delete_for_page(block, space, offset, - zip_size, TRUE); + if (access_time) { +#ifdef UNIV_IBUF_COUNT_DEBUG + ut_a(ibuf_count_get(space, offset) == 0); +#endif /* UNIV_IBUF_COUNT_DEBUG */ + } else { + ibuf_merge_or_delete_for_page( + block, space, offset, zip_size, TRUE); + } } /* Unfix and unlatch the block. */ |