diff options
Diffstat (limited to 'storage/innobase')
-rw-r--r-- | storage/innobase/fil/fil0fil.cc | 10 | ||||
-rw-r--r-- | storage/innobase/fil/fil0pagecompress.cc | 119 | ||||
-rw-r--r-- | storage/innobase/include/fil0pagecompress.h | 1 | ||||
-rw-r--r-- | storage/innobase/include/fsp0pagecompress.ic | 112 | ||||
-rw-r--r-- | storage/innobase/include/os0file.h | 18 | ||||
-rw-r--r-- | storage/innobase/include/os0file.ic | 7 | ||||
-rw-r--r-- | storage/innobase/os/os0file.cc | 31 |
7 files changed, 171 insertions, 127 deletions
diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 2f56936ae04..1718e68d667 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -4920,7 +4920,7 @@ extend_file: success = os_aio(OS_FILE_WRITE, OS_AIO_SYNC, node->name, node->handle, buf, offset, page_size * n_pages, - NULL, NULL, 0); + NULL, NULL, 0, FALSE, 0); #endif /* UNIV_HOTBACKUP */ if (success) { os_has_said_disk_full = FALSE; @@ -5302,6 +5302,8 @@ fil_io( ulint wake_later; os_offset_t offset; ibool ignore_nonexistent_pages; + ibool page_compressed = FALSE; + ibool page_compression_level = 0; is_log = type & OS_FILE_LOG; type = type & ~OS_FILE_LOG; @@ -5462,6 +5464,9 @@ fil_io( ut_a(byte_offset % OS_FILE_LOG_BLOCK_SIZE == 0); ut_a((len % OS_FILE_LOG_BLOCK_SIZE) == 0); + page_compressed = fsp_flags_is_page_compressed(space->flags); + page_compression_level = fsp_flags_get_page_compression_level(space->flags); + #ifdef UNIV_HOTBACKUP /* In ibbackup do normal i/o, not aio */ if (type == OS_FILE_READ) { @@ -5474,7 +5479,8 @@ fil_io( #else /* Queue the aio request */ ret = os_aio(type, mode | wake_later, node->name, node->handle, buf, - offset, len, node, message, write_size); + offset, len, node, message, write_size, + page_compressed, page_compression_level); #endif /* UNIV_HOTBACKUP */ ut_a(ret); diff --git a/storage/innobase/fil/fil0pagecompress.cc b/storage/innobase/fil/fil0pagecompress.cc index b67f583b53b..2da9d70e197 100644 --- a/storage/innobase/fil/fil0pagecompress.cc +++ b/storage/innobase/fil/fil0pagecompress.cc @@ -77,6 +77,7 @@ fil_compress_page( this must be appropriately aligned */ byte* out_buf, /*!< out: compressed buffer */ ulint len, /*!< in: length of input buffer.*/ + ulint compression_level, /* in: compression level */ ulint* out_len) /*!< out: actual length of compressed page */ { int err = Z_OK; @@ -84,13 +85,13 @@ fil_compress_page( ulint header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE; ulint write_size=0; - ut_a(buf); - ut_a(out_buf); - ut_a(len); - ut_a(out_len); + ut_ad(buf); + ut_ad(out_buf); + ut_ad(len); + ut_ad(out_len); - level = fil_space_get_page_compression_level(space_id); - ut_a(fil_space_is_page_compressed(space_id)); + level = compression_level; + ut_ad(fil_space_is_page_compressed(space_id)); fil_system_enter(); fil_space_t* space = fil_space_get_by_id(space_id); @@ -181,8 +182,8 @@ fil_decompress_page( ulint compression_alg = 0; byte *in_buf; - ut_a(buf); - ut_a(len); + ut_ad(buf); + ut_ad(len); /* Before actual decompress, make sure that page type is correct */ @@ -264,106 +265,4 @@ fil_decompress_page( } } -/*******************************************************************//** -Find out wheather the page is index page or not -@return true if page type index page, false if not */ -ibool -fil_page_is_index_page( -/*===================*/ - byte *buf) /*!< in: page */ -{ - return(mach_read_from_2(buf+FIL_PAGE_TYPE) == FIL_PAGE_INDEX); -} - -/*******************************************************************//** -Find out wheather the page is page compressed -@return true if page is page compressed, false if not */ -ibool -fil_page_is_compressed( -/*===================*/ - byte *buf) /*!< in: page */ -{ - return(mach_read_from_2(buf+FIL_PAGE_TYPE) == FIL_PAGE_PAGE_COMPRESSED); -} - -/*******************************************************************//** -Returns the page compression level of the space, or 0 if the space -is not compressed. The tablespace must be cached in the memory cache. -@return page compression level, ULINT_UNDEFINED if space not found */ -ulint -fil_space_get_page_compression_level( -/*=================================*/ - ulint id) /*!< in: space id */ -{ - ulint flags; - - flags = fil_space_get_flags(id); - - if (flags && flags != ULINT_UNDEFINED) { - - return(fsp_flags_get_page_compression_level(flags)); - } - - return(flags); -} - -/*******************************************************************//** -Extract the page compression from space. -@return true if space is page compressed, false if space is not found -or space is not page compressed. */ -ibool -fil_space_is_page_compressed( -/*=========================*/ - ulint id) /*!< in: space id */ -{ - ulint flags; - - flags = fil_space_get_flags(id); - - if (flags && flags != ULINT_UNDEFINED) { - return(fsp_flags_is_page_compressed(flags)); - } - - return(flags); -} - -/****************************************************************//** -Get the name of the compression algorithm used for page -compression. -@return compression algorithm name or "UNKNOWN" if not known*/ -const char* -fil_get_compression_alg_name( -/*=========================*/ - ulint comp_alg) /*!<in: compression algorithm number */ -{ - switch(comp_alg) { - case FIL_PAGE_COMPRESSION_ZLIB: - return ("ZLIB"); - break; - default: - return("UNKNOWN"); - break; - } -} - -/*******************************************************************//** -Returns the atomic writes flag of the space, or false if the space -is not using atomic writes. The tablespace must be cached in the memory cache. -@return atomic writes table option value */ -atomic_writes_t -fil_space_get_atomic_writes( -/*========================*/ - ulint id) /*!< in: space id */ -{ - ulint flags; - - flags = fil_space_get_flags(id); - - if (flags && flags != ULINT_UNDEFINED) { - - return((atomic_writes_t)fsp_flags_get_atomic_writes(flags)); - } - - return((atomic_writes_t)0); -} diff --git a/storage/innobase/include/fil0pagecompress.h b/storage/innobase/include/fil0pagecompress.h index bf5caf98a75..342b105401c 100644 --- a/storage/innobase/include/fil0pagecompress.h +++ b/storage/innobase/include/fil0pagecompress.h @@ -84,6 +84,7 @@ fil_compress_page( this must be appropriately aligned */ byte* out_buf, /*!< out: compressed buffer */ ulint len, /*!< in: length of input buffer.*/ + ulint compression_level, /*!< in: compression level */ ulint* out_len); /*!< out: actual length of compressed page */ /****************************************************************//** diff --git a/storage/innobase/include/fsp0pagecompress.ic b/storage/innobase/include/fsp0pagecompress.ic index 4859012428a..755d91b3cd9 100644 --- a/storage/innobase/include/fsp0pagecompress.ic +++ b/storage/innobase/include/fsp0pagecompress.ic @@ -24,6 +24,8 @@ compression and atomic writes information to file space. Created 11/12/2013 Jan Lindström jan.lindstrom@skysql.com ***********************************************************************/ +#include "fsp0fsp.h" + /********************************************************************//** Determine if the tablespace is page compressed from dict_table_t::flags. @return TRUE if page compressed, FALSE if not page compressed */ @@ -59,3 +61,113 @@ fsp_flags_get_atomic_writes( { return((atomic_writes_t)FSP_FLAGS_GET_ATOMIC_WRITES(flags)); } + +/*******************************************************************//** +Find out wheather the page is index page or not +@return true if page type index page, false if not */ +UNIV_INLINE +ibool +fil_page_is_index_page( +/*===================*/ + byte *buf) /*!< in: page */ +{ + return(mach_read_from_2(buf+FIL_PAGE_TYPE) == FIL_PAGE_INDEX); +} + +/*******************************************************************//** +Find out wheather the page is page compressed +@return true if page is page compressed, false if not */ +UNIV_INLINE +ibool +fil_page_is_compressed( +/*===================*/ + byte *buf) /*!< in: page */ +{ + return(mach_read_from_2(buf+FIL_PAGE_TYPE) == FIL_PAGE_PAGE_COMPRESSED); +} + +/*******************************************************************//** +Returns the page compression level of the space, or 0 if the space +is not compressed. The tablespace must be cached in the memory cache. +@return page compression level, ULINT_UNDEFINED if space not found */ +UNIV_INLINE +ulint +fil_space_get_page_compression_level( +/*=================================*/ + ulint id) /*!< in: space id */ +{ + ulint flags; + + flags = fil_space_get_flags(id); + + if (flags && flags != ULINT_UNDEFINED) { + + return(fsp_flags_get_page_compression_level(flags)); + } + + return(flags); +} + +/*******************************************************************//** +Extract the page compression from space. +@return true if space is page compressed, false if space is not found +or space is not page compressed. */ +UNIV_INLINE +ibool +fil_space_is_page_compressed( +/*=========================*/ + ulint id) /*!< in: space id */ +{ + ulint flags; + + flags = fil_space_get_flags(id); + + if (flags && flags != ULINT_UNDEFINED) { + + return(fsp_flags_is_page_compressed(flags)); + } + + return(flags); +} + +/****************************************************************//** +Get the name of the compression algorithm used for page +compression. +@return compression algorithm name or "UNKNOWN" if not known*/ +UNIV_INLINE +const char* +fil_get_compression_alg_name( +/*=========================*/ + ulint comp_alg) /*!<in: compression algorithm number */ +{ + switch(comp_alg) { + case FIL_PAGE_COMPRESSION_ZLIB: + return ("ZLIB"); + break; + default: + return("UNKNOWN"); + break; + } +} + +/*******************************************************************//** +Returns the atomic writes flag of the space, or false if the space +is not using atomic writes. The tablespace must be cached in the memory cache. +@return atomic writes table option value */ +UNIV_INLINE +atomic_writes_t +fil_space_get_atomic_writes( +/*========================*/ + ulint id) /*!< in: space id */ +{ + ulint flags; + + flags = fil_space_get_flags(id); + + if (flags && flags != ULINT_UNDEFINED) { + + return((atomic_writes_t)fsp_flags_get_atomic_writes(flags)); + } + + return((atomic_writes_t)0); +} diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index 8b798b6d34f..d2bafc30cbe 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -288,9 +288,11 @@ The wrapper functions have the prefix of "innodb_". */ pfs_os_file_close_func(file, __FILE__, __LINE__) # define os_aio(type, mode, name, file, buf, offset, \ - n, message1, message2, write_size) \ + n, message1, message2, write_size, \ + page_compression, page_compression_level) \ pfs_os_aio_func(type, mode, name, file, buf, offset, \ - n, message1, message2, write_size, __FILE__, __LINE__) + n, message1, message2, write_size, \ + page_compression, page_compression_level, __FILE__, __LINE__) # define os_file_read(file, buf, offset, n) \ pfs_os_file_read_func(file, buf, offset, n, __FILE__, __LINE__) @@ -327,7 +329,7 @@ to original un-instrumented file I/O APIs */ # define os_aio(type, mode, name, file, buf, offset, n, message1, message2, write_size) \ os_aio_func(type, mode, name, file, buf, offset, n, \ - message1, message2, write_size) + message1, message2, write_size, page_compression, page_compression_level) # define os_file_read(file, buf, offset, n) \ os_file_read_func(file, buf, offset, n) @@ -733,6 +735,10 @@ pfs_os_aio_func( operation for this page and if initialized we do not trim again if actual page size does not decrease. */ + ibool page_compression, /*!< in: is page compression used + on this file space */ + ulint page_compression_level, /*!< page compression + level to be used */ const char* src_file,/*!< in: file name where func invoked */ ulint src_line);/*!< in: line where the func invoked */ /*******************************************************************//** @@ -1065,11 +1071,15 @@ os_aio_func( (can be used to identify a completed aio operation); ignored if mode is OS_AIO_SYNC */ - ulint* write_size);/*!< in/out: Actual write size initialized + ulint* write_size,/*!< in/out: Actual write size initialized after fist successfull trim operation for this page and if initialized we do not trim again if actual page size does not decrease. */ + ibool page_compression, /*!< in: is page compression used + on this file space */ + ulint page_compression_level); /*!< page compression + level to be used */ /************************************************************************//** Wakes up all async i/o threads so that they know to exit themselves in diff --git a/storage/innobase/include/os0file.ic b/storage/innobase/include/os0file.ic index 3274fb12310..4d116785fb9 100644 --- a/storage/innobase/include/os0file.ic +++ b/storage/innobase/include/os0file.ic @@ -220,6 +220,10 @@ pfs_os_aio_func( operation for this page and if initialized we do not trim again if actual page size does not decrease. */ + ibool page_compression, /*!< in: is page compression used + on this file space */ + ulint page_compression_level, /*!< page compression + level to be used */ const char* src_file,/*!< in: file name where func invoked */ ulint src_line)/*!< in: line where the func invoked */ { @@ -235,7 +239,8 @@ pfs_os_aio_func( src_file, src_line); result = os_aio_func(type, mode, name, file, buf, offset, - n, message1, message2, write_size); + n, message1, message2, write_size, + page_compression, page_compression_level); register_pfs_file_io_end(locker, n); diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index 57d5f5b3203..06c1a8c6ed4 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -196,6 +196,9 @@ struct os_aio_slot_t{ freed after the write has been completed */ + ibool page_compression; + ulint page_compression_level; + ulint* write_size; /*!< Actual write size initialized after fist successfull trim operation for this page and if @@ -4353,11 +4356,15 @@ os_aio_array_reserve_slot( to write */ os_offset_t offset, /*!< in: file offset */ ulint len, /*!< in: length of the block to read or write */ - ulint* write_size) /*!< in: Actual write size initialized + ulint* write_size,/*!< in/out: Actual write size initialized after fist successfull trim operation for this page and if initialized we do not trim again if actual page size does not decrease. */ + ibool page_compression, /*!< in: is page compression used + on this file space */ + ulint page_compression_level) /*!< page compression + level to be used */ { os_aio_slot_t* slot = NULL; #ifdef WIN_ASYNC_IO @@ -4449,6 +4456,8 @@ found: slot->io_already_done = FALSE; slot->page_compress_success = FALSE; slot->write_size = write_size; + slot->page_compression_level = page_compression_level; + slot->page_compression = page_compression; /* If the space is page compressed and this is write operation and if either only index pages compression is disabled or @@ -4456,7 +4465,7 @@ found: we compress the page */ if (message1 && type == OS_FILE_WRITE && - fil_space_is_page_compressed(fil_node_get_space_id(slot->message1)) && + page_compression && (srv_page_compress_index_pages == false || (srv_page_compress_index_pages == true && fil_page_is_index_page(slot->buf)))) { ulint real_len = len; @@ -4477,7 +4486,7 @@ found: can't really avoid this now. */ memset(slot->page_buf, 0, len); - tmp = fil_compress_page(fil_node_get_space_id(slot->message1), (byte *)buf, slot->page_buf, len, &real_len); + tmp = fil_compress_page(fil_node_get_space_id(slot->message1), (byte *)buf, slot->page_buf, len, page_compression_level, &real_len); /* If compression succeeded, set up the length and buffer */ if (tmp != buf) { @@ -4773,11 +4782,15 @@ os_aio_func( (can be used to identify a completed aio operation); ignored if mode is OS_AIO_SYNC */ - ulint* write_size)/*!< in/out: Actual write size initialized + ulint* write_size,/*!< in/out: Actual write size initialized after fist successfull trim operation for this page and if initialized we do not trim again if actual page size does not decrease. */ + ibool page_compression, /*!< in: is page compression used + on this file space */ + ulint page_compression_level) /*!< page compression + level to be used */ { os_aio_array_t* array; os_aio_slot_t* slot; @@ -4875,7 +4888,7 @@ try_again: } slot = os_aio_array_reserve_slot(type, array, message1, message2, file, - name, buf, offset, n, write_size); + name, buf, offset, n, write_size, page_compression, page_compression_level); if (type == OS_FILE_READ) { if (srv_use_native_aio) { @@ -5100,7 +5113,7 @@ os_aio_windows_handle( switch (slot->type) { case OS_FILE_WRITE: if (slot->message1 && - fil_space_is_page_compressed(fil_node_get_space_id(slot->message1)) && + page_compression && slot->page_buf) { ret = WriteFile(slot->file, slot->page_buf, (DWORD) slot->len, &len, @@ -5141,8 +5154,7 @@ os_aio_windows_handle( ret_val = ret && len == slot->len; } - if (slot->message1 && - fil_space_is_page_compressed(fil_node_get_space_id(slot->message1))) { + if (slot->message1 && page_compression) { // We allocate memory for page compressed buffer if and only // if it is not yet allocated. if (slot->page_buf == NULL) { @@ -5256,8 +5268,7 @@ retry: /* If the table is page compressed and this is read, we decompress before we annouce the read is complete. For writes, we free the compressed page. */ - if (slot->message1 && - fil_space_is_page_compressed(fil_node_get_space_id(slot->message1))) { + if (slot->message1 && slot->page_compression) { // We allocate memory for page compressed buffer if and only // if it is not yet allocated. if (slot->page_buf == NULL) { |