buf_LRU_free_block(): Do not allocate the control block when
a compressed-only page is being freed.
buf_validate(): Note that buf_pool->zip_clean may contain blocks
with io_fix == BUF_IO_READ.
buf_page_get_gen(). This saves one mutex operation per block request.
buf_page_get_gen(), various macros and functions: Add parameter zip_size.
btr_node_ptr_get_child(): Add parameter index.
fil_space_get_latch(): Add optional output parameter zip_size.
fil_space_get_zip_size(): Return 0 for space id==0, because the
system tablespace is never compressed.
fsp_header_init(): Remove the parameter zip_size.
ibuf_free_excess_pages(): Remove the parameter zip_size.
trx_rseg_t, trx_undo_t: Add field zip_size.
xdes_lst_get_next(): Remove, unused.
that also exists in uncompressed form in the buffer pool, pass the
compressed frame to fil_io() instead of the uncompressed one when
not using the doublewrite buffer.
page checksum of compressed-only blocks. Pass the compressed page frame
to fil_io() when needed.
page_zip_calc_checksum(): Skip also FIL_PAGE_LSN and FIL_PAGE_FILE_FLUSH_LSN.
buf_flush_init_for_writing(): Expect page to be non-NULL.
and to be flushed to disk.
buf_LRU_free_block(): Enable the freeing of uncompressed pages of
compressed tablespaces.
trx_doublewrite->buf_block_arr[]: Change the type from buf_block_t*
to buf_page_t*.
buf_flush_ready_for_flush(): Add debug assertion.
buf_flush_buffered_writes(), buf_flush_try_page(): Support blocks of type
BUF_BLOCK_ZIP_DIRTY.
buf_flush_post_to_doublewrite_buf(), buf_flush_write_block_low():
Change the type of the parameter from buf_block_t* to buf_page_t*.
buf_flush_init_for_writing(): Allow page to be NULL if page_zip_ is non-NULL.
compressed page) is not protected by block_mutex. Before releasing
buf_pool->mutex, we can simply assign b->io_fix. After reacquiring
buf_pool->mutex, we also have to acquire buf_pool->zip_mutex.
of a block, do not release buf_pool->mutex between the time the old control
block is removed from buf_pool->page_hash and the new control block is
added to it. Prevent operations on the compressed-only block while calling
btr_search_drop_page_hash_index() or page_zip_calc_checksum().
buf_LRU_invalidate_tablespace(): Revert the change done in r1223.
buf_pool->zip_mutex will have been released by
buf_LRU_block_remove_hashed_page() when it returns BUF_BLOCK_ZIP_FREE.
invoking buf_buddy_alloc(). An IO-fixed block must also be x-latched
when block->mutex and buf_pool->mutex are released.
buf_page_create(): Protect the block during buf_buddy_alloc() by
IO-fixing and X-latching it.
buf_zip_decompress(). This will prevent btr_cur_search_to_nth_level()
from accessing a half-decompressed leaf page. Internal B-tree nodes
(non-leaf pages) in B-tree searches are only protected by the tree
latch (index->lock) and by buffer-fixing.
buf_pool->page_hash and buf_pool->LRU before releasing buf_pool->mutex.
buf_page_init_for_read(), buf_page_create(): Allocate the compressed
page after the block has been added to the buffer pool. Document the
reason for this.
buf_page_init(): Declare block->frame valid only in the system tablespace.
trx_sysf_create(): Declare the rest of the page valid, although it is
uninitialized.
buf_buddy_relocate(): Document that src may have been split and some of
it may be in buf_pool->zip_free[j] for some j<i, thus mach_read_from_4()
may be reading from free memory. Check buffer pages only for addressability,
not for being completely initialized. Ensure that block descriptors are
completely initialized.
buf_buddy_remove_from_free(): Check prev->state and next->state in
UNIV_DEBUG && UNIV_DEBUG_VALGRIND builds.
buf_buddy_free_low(): Flag the entire block valid prior to invoking
buf_buddy_remove_from_free() in order to avoid a Valgrind warning about
the debug assertion on bpage->state. Remove the Valgrind check for
buddy being completely allocated. If it has been split to smaller blocks,
some of those blocks may be free.
UNIV_MEM_FREE(): Declare a memory area free.
UNIV_MEM_ALLOC(): Declare a memory area allocated (but uninitialized).
UNIV_MEM_DESC(): Associate a memory area with a control block.
UNIV_MEM_UNDESC(): Unassociate a control block.
trx_sys_create_doublewrite_buf(): Clear the buffer with memset().
buf_page_init(): Add a bogus UNIV_MEM_VALID(block->frame) to silence
valid warnings about InnoDB data pages containing uninitialized data.
buf_LRU_get_free_only(): Add UNIV_MEM_ALLOC(block->frame).
buf_LRU_get_free_block(): Add UNIV_MEM_DESC(block->page.zip.data, block).
buf_LRU_free_block(): Add UNIV_MEM_DESC(b->zip.data, b) when allocating
a compressed-only control block for a compressed page.
buf_LRU_block_free_non_file_page(): Replace UNIV_MEM_INVALID() with
UNIV_MEM_FREE().
buf_LRU_block_remove_hashed_page(): Add UNIV_MEM_UNDESC(bpage) when
deallocating a compressed-only control block. Add
UNIV_MEM_INVALID(block->frame). (The frame should be flagged free
by buf_LRU_block_free_non_file_page() moments later.)
buf0buddy.c: Disable some extra checks in Valgrind-instrumented builds.
Add UNIV_MEM_VALID(), UNIV_MEM_INVALID(), UNIV_MEM_FREE(), UNIV_MEM_ALLOC()
as necessary.
buf_buddy_block_free(), buf_buddy_free_low(): Flag the freed bytes
uninitialized.
buf_page_init_for_read(), buf_buddy_relocate(): Do not refer to bpage
after invoking buf_relocate().
buf_buddy_relocate(): Flag src uninitialized.
during the buf_zip_decompress() call. Otherwise, the block may end
up being freed by another thread. This bug was caught by the
page_zip_validate() check in buf_LRU_block_remove_hashed_page().
buf_page_init_for_read(): Protect the buf_zip_decompress() call with
an X-lock on the block.
page_zip_validate(): Move the page_is_comp() assertion after the
page header comparison.
compressed-only page, restart the scan of the LRU list, because
prev_bpage may have been relocated.
buf_LRU_block_remove_hashed_page(): Note that other compressed pages
or compressed-only blocks may be relocated when freeing a compressed
page or a compressed-only block descriptor.
dirty uncompressed blocks. Move the page_zip_validate() call to
a more appropriate place, buf_LRU_block_remove_hashed_page().
buf_LRU_block_remove_hashed_page(): Allow bpage->oldest_modification != 0
for uncompressed pages if there is a compressed page that will be preserved.
Release the mutexes before calling buf_print() and buf_LRU_print().
page_zip_validate(): Remove the assertion containing the
buf_frame_get_page_zip() call. We might already be holding buf_pool->mutex.
the buffer pool.
buf_LRU_free_block(): When preserving the compressed page, compute the
checksum. Also assert page_zip_validate().
buf_zip_decompress(): Add parameter "check" for enabling checksum tests.
Before decompressing a compressed-only page from the buffer pool, verify
the compressed page checksum.
buf_page_get_gen(): Note that buf_read_page() may uncompress
a compressed-only page.
buf_page_create(): Test buf_page_in_file() instead of BUF_BLOCK_FILE_PAGE.
and add compressed-only pages to buf_pool->page_hash.
BUF_POOL_ZIP_FOLD(), BUF_POOL_ZIP_FOLD_PTR(), BUF_POOL_ZIP_FOLD_BPAGE():
Macros for computing buf_pool->zip_hash fold values. Make use of these
in buf0buddy.c.
buf0buddy.c: Replace some ptr == ut_align_down(ptr, ...) in assertions with
!ut_align_offset(ptr, ...).
to BUF_BLOCK_ZIP_DIRTY (discarding the uncompressed page corresponding
to a modified compressed page that has not been flushed to disk).
buf_page_can_relocate(): New function, modelled after
buf_flush_ready_for_replace().
buf_LRU_free_block(): Allow the transition to BUF_BLOCK_ZIP_DIRTY.
buf_flush_insert_into_flush_list(): Make the prototype public.
buf_buddy_relocate(): Remove an unnecessary switch statement.
Use buf_page_can_relocate() instead of buf_flush_ready_for_replace().
buf_page_peek(): Made UNIV_INLINE.
Document UNIV_ZIP_DEBUG.
Improve diagnostics.
buf_buddy_relocate(): Do not assume all small blocks to contain only one
buf_page_t object. Require an exact size match, as in the case of
compressed pages.
buf_relocate(): Relocate buf_pool->LRU_old if needed.
Validate the LRU list in debug builds.
buf_LRU_block_remove_hashed_page(): Do not overwrite FIL_PAGE_OFFSET
or FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID. The memory will be invalidated
in debug builds of buf_buddy_free().
buf0buddy.c: Add assertions for not holding buf_pool->zip_mutex.
The calling thread should not be holding any block->mutex, but it might
be too time-consuming to assert against that, even #ifdef UNIV_SYNC_DEBUG.
There is something wrong with the management of compressed-only blocks
(BUF_BLOCK_ZIP_PAGE). To disable the creation of such blocks, set zip=TRUE
in buf_LRU_block_remove_hashed_page().
buf_LRU_block_remove_hashed_page(): Release buf_pool->zip_mutex when
freeing a compressed-only page and its control block, with buf_buddy_free().
Adapt callers.
buf_LRU_block_free_hashed_page(): Change the parameter type from buf_page_t*
to buf_block_t*.
buf_LRU_free_block(): Move below the definition of buf_LRU_add_block_low().
Allocate block descriptor for compressed-only blocks.
buf_LRU_block_free_non_file_page(): Replace ut_free() with buf_buddy_free().
buf_zip_decompress(): New function, split from buf_page_io_complete().
buf_page_init_for_read(): Do not allocate the compressed page until it is
really needed, to avoid the overhead of the buddy allocator. Decompress
compressed-only blocks that are needed again.
buf_page_create(): Do not allocate the compressed page until it is
really needed, to avoid the overhead of the buddy allocator.
buf_validate(): Replace some equality tests on the lengths of the LRU
list and the flush lists with greater-or-equal tests, since the counted
numbers do not include control blocks for compressed-only pages.
buf_buddy_get(): New function in buf0buddy.c, to replace the macro
in buf0buddy.h.
buf_buddy_get_offset(): Remove.
buf_buddy_get_slot(): Remove the prototype from buf0buddy.h. This function
is for internal use in buf0buddy.ic.
buf_page_get_gen(): Cache the result of fil_space_get_zip_size().
trx_commit_off_kernel(): Eliminate the flag must_flush_log. Initialize lsn = 0
to signify must_flush_log == FALSE.
log_flush_margin(): Eliminate the flag do_flush. Initialize lsn = 0
to signify do_flush == FALSE.
buf_buddy_block_free(): Remove the block from buf_pool->zip_hash.
buf_buddy_alloc_clean(): Test for buf_page_in_file() before
invoking buf_LRU_free_block(). The LRU list also contains "half-freed"
blocks (state == BUF_BLOCK_REMOVE_HASH).