Commit 58ce5513 authored by Jan Lindström's avatar Jan Lindström

Removed some unnecessary assertions to debug build and enhanced the...

Removed some unnecessary assertions to debug build and enhanced the page_compression and page_compression_level fetch.
parent ec825721
...@@ -4920,7 +4920,7 @@ extend_file: ...@@ -4920,7 +4920,7 @@ extend_file:
success = os_aio(OS_FILE_WRITE, OS_AIO_SYNC, success = os_aio(OS_FILE_WRITE, OS_AIO_SYNC,
node->name, node->handle, buf, node->name, node->handle, buf,
offset, page_size * n_pages, offset, page_size * n_pages,
NULL, NULL, 0); NULL, NULL, 0, FALSE, 0);
#endif /* UNIV_HOTBACKUP */ #endif /* UNIV_HOTBACKUP */
if (success) { if (success) {
os_has_said_disk_full = FALSE; os_has_said_disk_full = FALSE;
...@@ -5302,6 +5302,8 @@ fil_io( ...@@ -5302,6 +5302,8 @@ fil_io(
ulint wake_later; ulint wake_later;
os_offset_t offset; os_offset_t offset;
ibool ignore_nonexistent_pages; ibool ignore_nonexistent_pages;
ibool page_compressed = FALSE;
ibool page_compression_level = 0;
is_log = type & OS_FILE_LOG; is_log = type & OS_FILE_LOG;
type = type & ~OS_FILE_LOG; type = type & ~OS_FILE_LOG;
...@@ -5462,6 +5464,9 @@ fil_io( ...@@ -5462,6 +5464,9 @@ fil_io(
ut_a(byte_offset % OS_FILE_LOG_BLOCK_SIZE == 0); ut_a(byte_offset % OS_FILE_LOG_BLOCK_SIZE == 0);
ut_a((len % 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 #ifdef UNIV_HOTBACKUP
/* In ibbackup do normal i/o, not aio */ /* In ibbackup do normal i/o, not aio */
if (type == OS_FILE_READ) { if (type == OS_FILE_READ) {
...@@ -5474,7 +5479,8 @@ fil_io( ...@@ -5474,7 +5479,8 @@ fil_io(
#else #else
/* Queue the aio request */ /* Queue the aio request */
ret = os_aio(type, mode | wake_later, node->name, node->handle, buf, 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 */ #endif /* UNIV_HOTBACKUP */
ut_a(ret); ut_a(ret);
......
...@@ -77,6 +77,7 @@ fil_compress_page( ...@@ -77,6 +77,7 @@ fil_compress_page(
this must be appropriately aligned */ this must be appropriately aligned */
byte* out_buf, /*!< out: compressed buffer */ byte* out_buf, /*!< out: compressed buffer */
ulint len, /*!< in: length of input buffer.*/ ulint len, /*!< in: length of input buffer.*/
ulint compression_level, /* in: compression level */
ulint* out_len) /*!< out: actual length of compressed page */ ulint* out_len) /*!< out: actual length of compressed page */
{ {
int err = Z_OK; int err = Z_OK;
...@@ -84,13 +85,13 @@ fil_compress_page( ...@@ -84,13 +85,13 @@ fil_compress_page(
ulint header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE; ulint header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE;
ulint write_size=0; ulint write_size=0;
ut_a(buf); ut_ad(buf);
ut_a(out_buf); ut_ad(out_buf);
ut_a(len); ut_ad(len);
ut_a(out_len); ut_ad(out_len);
level = fil_space_get_page_compression_level(space_id); level = compression_level;
ut_a(fil_space_is_page_compressed(space_id)); ut_ad(fil_space_is_page_compressed(space_id));
fil_system_enter(); fil_system_enter();
fil_space_t* space = fil_space_get_by_id(space_id); fil_space_t* space = fil_space_get_by_id(space_id);
...@@ -181,8 +182,8 @@ fil_decompress_page( ...@@ -181,8 +182,8 @@ fil_decompress_page(
ulint compression_alg = 0; ulint compression_alg = 0;
byte *in_buf; byte *in_buf;
ut_a(buf); ut_ad(buf);
ut_a(len); ut_ad(len);
/* Before actual decompress, make sure that page type is correct */ /* Before actual decompress, make sure that page type is correct */
...@@ -264,106 +265,4 @@ fil_decompress_page( ...@@ -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);
}
...@@ -84,6 +84,7 @@ fil_compress_page( ...@@ -84,6 +84,7 @@ fil_compress_page(
this must be appropriately aligned */ this must be appropriately aligned */
byte* out_buf, /*!< out: compressed buffer */ byte* out_buf, /*!< out: compressed buffer */
ulint len, /*!< in: length of input buffer.*/ ulint len, /*!< in: length of input buffer.*/
ulint compression_level, /*!< in: compression level */
ulint* out_len); /*!< out: actual length of compressed page */ ulint* out_len); /*!< out: actual length of compressed page */
/****************************************************************//** /****************************************************************//**
......
...@@ -24,6 +24,8 @@ compression and atomic writes information to file space. ...@@ -24,6 +24,8 @@ compression and atomic writes information to file space.
Created 11/12/2013 Jan Lindström jan.lindstrom@skysql.com 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. Determine if the tablespace is page compressed from dict_table_t::flags.
@return TRUE if page compressed, FALSE if not page compressed */ @return TRUE if page compressed, FALSE if not page compressed */
...@@ -59,3 +61,113 @@ fsp_flags_get_atomic_writes( ...@@ -59,3 +61,113 @@ fsp_flags_get_atomic_writes(
{ {
return((atomic_writes_t)FSP_FLAGS_GET_ATOMIC_WRITES(flags)); 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);
}
...@@ -288,9 +288,11 @@ The wrapper functions have the prefix of "innodb_". */ ...@@ -288,9 +288,11 @@ The wrapper functions have the prefix of "innodb_". */
pfs_os_file_close_func(file, __FILE__, __LINE__) pfs_os_file_close_func(file, __FILE__, __LINE__)
# define os_aio(type, mode, name, file, buf, offset, \ # 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, \ 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) \ # define os_file_read(file, buf, offset, n) \
pfs_os_file_read_func(file, buf, offset, n, __FILE__, __LINE__) pfs_os_file_read_func(file, buf, offset, n, __FILE__, __LINE__)
...@@ -327,7 +329,7 @@ to original un-instrumented file I/O APIs */ ...@@ -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) \ # define os_aio(type, mode, name, file, buf, offset, n, message1, message2, write_size) \
os_aio_func(type, mode, name, file, buf, offset, n, \ 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) \ # define os_file_read(file, buf, offset, n) \
os_file_read_func(file, buf, offset, n) os_file_read_func(file, buf, offset, n)
...@@ -733,6 +735,10 @@ pfs_os_aio_func( ...@@ -733,6 +735,10 @@ pfs_os_aio_func(
operation for this page and if operation for this page and if
initialized we do not trim again if initialized we do not trim again if
actual page size does not decrease. */ 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 */ const char* src_file,/*!< in: file name where func invoked */
ulint src_line);/*!< in: line where the func invoked */ ulint src_line);/*!< in: line where the func invoked */
/*******************************************************************//** /*******************************************************************//**
...@@ -1065,11 +1071,15 @@ os_aio_func( ...@@ -1065,11 +1071,15 @@ os_aio_func(
(can be used to identify a completed (can be used to identify a completed
aio operation); ignored if mode is aio operation); ignored if mode is
OS_AIO_SYNC */ 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 after fist successfull trim
operation for this page and if operation for this page and if
initialized we do not trim again if initialized we do not trim again if
actual page size does not decrease. */ 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 Wakes up all async i/o threads so that they know to exit themselves in
......
...@@ -220,6 +220,10 @@ pfs_os_aio_func( ...@@ -220,6 +220,10 @@ pfs_os_aio_func(
operation for this page and if operation for this page and if
initialized we do not trim again if initialized we do not trim again if
actual page size does not decrease. */ 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 */ const char* src_file,/*!< in: file name where func invoked */
ulint src_line)/*!< in: line where the func invoked */ ulint src_line)/*!< in: line where the func invoked */
{ {
...@@ -235,7 +239,8 @@ pfs_os_aio_func( ...@@ -235,7 +239,8 @@ pfs_os_aio_func(
src_file, src_line); src_file, src_line);
result = os_aio_func(type, mode, name, file, buf, offset, 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); register_pfs_file_io_end(locker, n);
......
...@@ -196,6 +196,9 @@ struct os_aio_slot_t{ ...@@ -196,6 +196,9 @@ struct os_aio_slot_t{
freed after the write freed after the write
has been completed */ has been completed */
ibool page_compression;
ulint page_compression_level;
ulint* write_size; /*!< Actual write size initialized ulint* write_size; /*!< Actual write size initialized
after fist successfull trim after fist successfull trim
operation for this page and if operation for this page and if
...@@ -4353,11 +4356,15 @@ os_aio_array_reserve_slot( ...@@ -4353,11 +4356,15 @@ os_aio_array_reserve_slot(
to write */ to write */
os_offset_t offset, /*!< in: file offset */ os_offset_t offset, /*!< in: file offset */
ulint len, /*!< in: length of the block to read or write */ 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 after fist successfull trim
operation for this page and if operation for this page and if
initialized we do not trim again if initialized we do not trim again if
actual page size does not decrease. */ 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; os_aio_slot_t* slot = NULL;
#ifdef WIN_ASYNC_IO #ifdef WIN_ASYNC_IO
...@@ -4449,6 +4456,8 @@ found: ...@@ -4449,6 +4456,8 @@ found:
slot->io_already_done = FALSE; slot->io_already_done = FALSE;
slot->page_compress_success = FALSE; slot->page_compress_success = FALSE;
slot->write_size = write_size; 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 /* If the space is page compressed and this is write operation
and if either only index pages compression is disabled or and if either only index pages compression is disabled or
...@@ -4456,7 +4465,7 @@ found: ...@@ -4456,7 +4465,7 @@ found:
we compress the page */ we compress the page */
if (message1 && if (message1 &&
type == OS_FILE_WRITE && 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 == false ||
(srv_page_compress_index_pages == true && fil_page_is_index_page(slot->buf)))) { (srv_page_compress_index_pages == true && fil_page_is_index_page(slot->buf)))) {
ulint real_len = len; ulint real_len = len;
...@@ -4477,7 +4486,7 @@ found: ...@@ -4477,7 +4486,7 @@ found:
can't really avoid this now. */ can't really avoid this now. */
memset(slot->page_buf, 0, len); 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 compression succeeded, set up the length and buffer */
if (tmp != buf) { if (tmp != buf) {
...@@ -4773,11 +4782,15 @@ os_aio_func( ...@@ -4773,11 +4782,15 @@ os_aio_func(
(can be used to identify a completed (can be used to identify a completed
aio operation); ignored if mode is aio operation); ignored if mode is
OS_AIO_SYNC */ 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 after fist successfull trim
operation for this page and if operation for this page and if
initialized we do not trim again if initialized we do not trim again if
actual page size does not decrease. */ 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_array_t* array;
os_aio_slot_t* slot; os_aio_slot_t* slot;
...@@ -4875,7 +4888,7 @@ try_again: ...@@ -4875,7 +4888,7 @@ try_again:
} }
slot = os_aio_array_reserve_slot(type, array, message1, message2, file, 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 (type == OS_FILE_READ) {
if (srv_use_native_aio) { if (srv_use_native_aio) {
...@@ -5100,7 +5113,7 @@ os_aio_windows_handle( ...@@ -5100,7 +5113,7 @@ os_aio_windows_handle(
switch (slot->type) { switch (slot->type) {
case OS_FILE_WRITE: case OS_FILE_WRITE:
if (slot->message1 && if (slot->message1 &&
fil_space_is_page_compressed(fil_node_get_space_id(slot->message1)) && page_compression &&
slot->page_buf) { slot->page_buf) {
ret = WriteFile(slot->file, slot->page_buf, ret = WriteFile(slot->file, slot->page_buf,
(DWORD) slot->len, &len, (DWORD) slot->len, &len,
...@@ -5141,8 +5154,7 @@ os_aio_windows_handle( ...@@ -5141,8 +5154,7 @@ os_aio_windows_handle(
ret_val = ret && len == slot->len; ret_val = ret && len == slot->len;
} }
if (slot->message1 && if (slot->message1 && page_compression) {
fil_space_is_page_compressed(fil_node_get_space_id(slot->message1))) {
// We allocate memory for page compressed buffer if and only // We allocate memory for page compressed buffer if and only
// if it is not yet allocated. // if it is not yet allocated.
if (slot->page_buf == NULL) { if (slot->page_buf == NULL) {
...@@ -5256,8 +5268,7 @@ retry: ...@@ -5256,8 +5268,7 @@ retry:
/* If the table is page compressed and this is read, /* If the table is page compressed and this is read,
we decompress before we annouce the read is we decompress before we annouce the read is
complete. For writes, we free the compressed page. */ complete. For writes, we free the compressed page. */
if (slot->message1 && if (slot->message1 && slot->page_compression) {
fil_space_is_page_compressed(fil_node_get_space_id(slot->message1))) {
// We allocate memory for page compressed buffer if and only // We allocate memory for page compressed buffer if and only
// if it is not yet allocated. // if it is not yet allocated.
if (slot->page_buf == NULL) { if (slot->page_buf == NULL) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment