From: Sergey Vojtovich Date: April 1 2010 11:53am Subject: bzr commit into mysql-5.1-bugteam branch (svoj:3497) Bug#49535 List-Archive: http://lists.mysql.com/commits/104851 X-Bug: 49535 Message-Id: <0L0700MCH51BX730@fe-emea-10.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_92jzojKRsw/WFKeuPNNM8w)" --Boundary_(ID_92jzojKRsw/WFKeuPNNM8w) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/svoj/devel/innodb-snapshots/mysql-5.1-bugteam/ based on revid:svoj@stripped 3497 Sergey Vojtovich 2010-04-01 Applying InnoDB snapshot, fixes BUG#49535. Detailed revision comments: r6674 | inaam | 2010-02-11 17:54:44 +0200 (Thu, 11 Feb 2010) | 16 lines branches/zip bug# 49535 This is a backport of r4924. mem_heap_get_size() scans all allocated blocks to calculate the total size of the heap. This patch introduces a new, total_size, field in mem_block_info_struct. This field is valid only for base block (i.e.: the first block allocated for the heap) and is set to ULINT_UNDEFINED in other blocks. This considerably improves the performance of redo scan during recovery. rb://108 issue#216 Approved by: Heikki modified: storage/innodb_plugin/include/mem0mem.h storage/innodb_plugin/include/mem0mem.ic storage/innodb_plugin/mem/mem0mem.c === modified file 'storage/innodb_plugin/include/mem0mem.h' --- a/storage/innodb_plugin/include/mem0mem.h 2009-11-30 11:32:05 +0000 +++ b/storage/innodb_plugin/include/mem0mem.h 2010-04-01 11:52:35 +0000 @@ -359,6 +359,9 @@ struct mem_block_info_struct { to the heap is also the first block in this list, though it also contains the base node of the list. */ ulint len; /*!< physical length of this block in bytes */ + ulint total_size; /* physical length in bytes of all blocks + in the heap. This is defined only in the base + node and is set to ULINT_UNDEFINED in others. */ ulint type; /*!< type of heap: MEM_HEAP_DYNAMIC, or MEM_HEAP_BUF possibly ORed to MEM_HEAP_BTR_SEARCH */ ulint free; /*!< offset in bytes of the first free position for === modified file 'storage/innodb_plugin/include/mem0mem.ic' --- a/storage/innodb_plugin/include/mem0mem.ic 2009-05-27 09:45:59 +0000 +++ b/storage/innodb_plugin/include/mem0mem.ic 2010-04-01 11:52:35 +0000 @@ -579,18 +579,12 @@ mem_heap_get_size( /*==============*/ mem_heap_t* heap) /*!< in: heap */ { - mem_block_t* block; ulint size = 0; ut_ad(mem_heap_check(heap)); - block = heap; + size = heap->total_size; - while (block != NULL) { - - size += mem_block_get_len(block); - block = UT_LIST_GET_NEXT(list, block); - } #ifndef UNIV_HOTBACKUP if (heap->free_block) { size += UNIV_PAGE_SIZE; === modified file 'storage/innodb_plugin/mem/mem0mem.c' --- a/storage/innodb_plugin/mem/mem0mem.c 2009-10-08 10:00:49 +0000 +++ b/storage/innodb_plugin/mem/mem0mem.c 2010-04-01 11:52:35 +0000 @@ -383,6 +383,20 @@ mem_heap_create_block( mem_block_set_free(block, MEM_BLOCK_HEADER_SIZE); mem_block_set_start(block, MEM_BLOCK_HEADER_SIZE); + if (UNIV_UNLIKELY(heap == NULL)) { + /* This is the first block of the heap. The field + total_size should be initialized here */ + block->total_size = len; + } else { + /* Not the first allocation for the heap. This block's + total_length field should be set to undefined. */ + ut_d(block->total_size = ULINT_UNDEFINED); + UNIV_MEM_INVALID(&block->total_size, + sizeof block->total_size); + + heap->total_size += len; + } + ut_ad((ulint)MEM_BLOCK_HEADER_SIZE < len); return(block); @@ -471,6 +485,10 @@ mem_heap_block_free( mem_pool_mutex_exit(); #endif + + ut_ad(heap->total_size >= block->len); + heap->total_size -= block->len; + type = heap->type; len = block->len; block->magic_n = MEM_FREED_BLOCK_MAGIC_N; --Boundary_(ID_92jzojKRsw/WFKeuPNNM8w) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/svoj@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/svoj@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: svoj@stripped # target_branch: file:///home/svoj/devel/innodb-snapshots/mysql-5.1-\ # bugteam/ # testament_sha1: a4bc0c01b5dab6243ad0da8b2e089cd51db91dd7 # timestamp: 2010-04-01 15:53:25 +0400 # base_revision_id: svoj@stripped # # Begin bundle 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 --Boundary_(ID_92jzojKRsw/WFKeuPNNM8w)--