summaryrefslogtreecommitdiff
path: root/storage/innobase/fil/fil0crypt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/fil/fil0crypt.cc')
-rw-r--r--storage/innobase/fil/fil0crypt.cc378
1 files changed, 216 insertions, 162 deletions
diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc
index 2db3063d6b5..fb872628e4f 100644
--- a/storage/innobase/fil/fil0crypt.cc
+++ b/storage/innobase/fil/fil0crypt.cc
@@ -122,13 +122,11 @@ void
fil_space_crypt_init()
/*==================*/
{
- mutex_create(fil_crypt_key_mutex_key,
- &fil_crypt_key_mutex, SYNC_NO_ORDER_CHECK);
+ mutex_create(LATCH_ID_FIL_CRYPT_MUTEX, &fil_crypt_key_mutex);
- fil_crypt_throttle_sleep_event = os_event_create();
+ fil_crypt_throttle_sleep_event = os_event_create(0);
- mutex_create(fil_crypt_stat_mutex_key,
- &crypt_stat_mutex, SYNC_NO_ORDER_CHECK);
+ mutex_create(LATCH_ID_FIL_CRYPT_STAT_MUTEX, &crypt_stat_mutex);
memset(&crypt_stat, 0, sizeof(crypt_stat));
}
@@ -139,7 +137,7 @@ void
fil_space_crypt_cleanup()
/*=====================*/
{
- os_event_free(fil_crypt_throttle_sleep_event);
+ os_event_destroy(fil_crypt_throttle_sleep_event);
}
/******************************************************************
@@ -204,8 +202,7 @@ fil_space_create_crypt_data(
crypt_data->min_key_version = encryption_key_get_latest_version(key_id);
}
- mutex_create(fil_crypt_data_mutex_key,
- &crypt_data->mutex, SYNC_NO_ORDER_CHECK);
+ mutex_create(LATCH_ID_FIL_CRYPT_DATA_MUTEX, &crypt_data->mutex);
crypt_data->locker = crypt_data_scheme_locker;
my_random_bytes(crypt_data->iv, sizeof(crypt_data->iv));
crypt_data->encryption = encrypt_mode;
@@ -258,20 +255,6 @@ fil_space_read_crypt_data(
}
if (memcmp(page + offset, CRYPT_MAGIC, MAGIC_SZ) != 0) {
-#ifdef UNIV_DEBUG
- ib_logf(IB_LOG_LEVEL_WARN,
- "Found potentially bogus bytes on "
- "page 0 offset %lu for space %lu : "
- "[ %.2x %.2x %.2x %.2x %.2x %.2x ]. "
- "Assuming space is not encrypted!.",
- offset, space,
- page[offset + 0],
- page[offset + 1],
- page[offset + 2],
- page[offset + 3],
- page[offset + 4],
- page[offset + 5]);
-#endif
/* Crypt data is not stored. */
return NULL;
}
@@ -280,18 +263,17 @@ fil_space_read_crypt_data(
if (! (type == CRYPT_SCHEME_UNENCRYPTED ||
type == CRYPT_SCHEME_1)) {
-
- ib_logf(IB_LOG_LEVEL_ERROR,
- "Found non sensible crypt scheme: %lu for space %lu "
- " offset: %lu bytes: "
- "[ %.2x %.2x %.2x %.2x %.2x %.2x ].",
- type, space, offset,
- page[offset + 0 + MAGIC_SZ],
- page[offset + 1 + MAGIC_SZ],
- page[offset + 2 + MAGIC_SZ],
- page[offset + 3 + MAGIC_SZ],
- page[offset + 4 + MAGIC_SZ],
- page[offset + 5 + MAGIC_SZ]);
+ ib::error() << "Found non sensible crypt scheme: "
+ << type << " for space: "
+ << space << " offset: "
+ << offset << " bytes: ["
+ << page[offset + 0 + MAGIC_SZ]
+ << page[offset + 1 + MAGIC_SZ]
+ << page[offset + 2 + MAGIC_SZ]
+ << page[offset + 3 + MAGIC_SZ]
+ << page[offset + 4 + MAGIC_SZ]
+ << page[offset + 5 + MAGIC_SZ]
+ << "].";
ut_error;
}
@@ -299,17 +281,18 @@ fil_space_read_crypt_data(
ulint iv_length = mach_read_from_1(page + offset + MAGIC_SZ + 1);
if (! (iv_length == sizeof(crypt_data->iv))) {
- ib_logf(IB_LOG_LEVEL_ERROR,
- "Found non sensible iv length: %lu for space %lu "
- " offset: %lu type: %lu bytes: "
- "[ %.2x %.2x %.2x %.2x %.2x %.2x ].",
- iv_length, space, offset, type,
- page[offset + 0 + MAGIC_SZ],
- page[offset + 1 + MAGIC_SZ],
- page[offset + 2 + MAGIC_SZ],
- page[offset + 3 + MAGIC_SZ],
- page[offset + 4 + MAGIC_SZ],
- page[offset + 5 + MAGIC_SZ]);
+ ib::error() << "Found non sensible iv length: "
+ << iv_length << " for space: "
+ << space << " offset: "
+ << offset << " type: "
+ << type << " bytes: ["
+ << page[offset + 0 + MAGIC_SZ]
+ << page[offset + 1 + MAGIC_SZ]
+ << page[offset + 2 + MAGIC_SZ]
+ << page[offset + 3 + MAGIC_SZ]
+ << page[offset + 4 + MAGIC_SZ]
+ << page[offset + 5 + MAGIC_SZ]
+ << "].";
ut_error;
}
@@ -331,8 +314,7 @@ fil_space_read_crypt_data(
crypt_data->key_id = key_id;
crypt_data->page0_offset = offset;
crypt_data->encryption = encryption;
- mutex_create(fil_crypt_data_mutex_key,
- &crypt_data->mutex, SYNC_NO_ORDER_CHECK);
+ mutex_create(LATCH_ID_FIL_CRYPT_DATA_MUTEX, &crypt_data->mutex);
crypt_data->locker = crypt_data_scheme_locker;
crypt_data->inited = true;
memcpy(crypt_data->iv, page + offset + MAGIC_SZ + 2, iv_length);
@@ -352,13 +334,17 @@ fil_space_destroy_crypt_data(
/* Make sure that this thread owns the crypt_data
and make it unawailable, this does not fully
avoid the race between drop table and crypt thread */
+ mutex_enter(&fil_crypt_threads_mutex);
mutex_enter(&(*crypt_data)->mutex);
(*crypt_data)->inited = false;
mutex_exit(&(*crypt_data)->mutex);
+ /* JAN: TODO:
mutex_free(& (*crypt_data)->mutex);
memset(*crypt_data, 0, sizeof(fil_space_crypt_t));
free(*crypt_data);
(*crypt_data) = NULL;
+ */
+ mutex_exit(&fil_crypt_threads_mutex);
}
}
@@ -550,17 +536,16 @@ fil_encrypt_buf(
ulint offset, /*!< in: Page offset */
lsn_t lsn, /*!< in: lsn */
byte* src_frame, /*!< in: Source page to be encrypted */
- ulint zip_size, /*!< in: compressed size if
- row format compressed */
+ const page_size_t& page_size, /*!< in: page size */
byte* dst_frame) /*!< in: outbut buffer */
{
- ulint page_size = (zip_size) ? zip_size : UNIV_PAGE_SIZE;
+ ulint size = page_size.physical();
uint key_version = fil_crypt_get_latest_key_version(crypt_data);
if (key_version == ENCRYPTION_KEY_VERSION_INVALID) {
- ib_logf(IB_LOG_LEVEL_FATAL,
- "Unknown key id %u. Can't continue!\n",
- crypt_data->key_id);
+ ib::error() << "Unknown key id: "
+ << crypt_data->key_id
+ << " Can't continue!";
ut_error;
}
@@ -580,7 +565,7 @@ fil_encrypt_buf(
/* Calculate the start offset in a page */
ulint unencrypted_bytes = header_len + FIL_PAGE_DATA_END;
- ulint srclen = page_size - unencrypted_bytes;
+ ulint srclen = size - unencrypted_bytes;
const byte* src = src_frame + header_len;
byte* dst = dst_frame + header_len;
uint32 dstlen = 0;
@@ -594,12 +579,10 @@ fil_encrypt_buf(
space, offset, lsn);
if (! ((rc == MY_AES_OK) && ((ulint) dstlen == srclen))) {
- ib_logf(IB_LOG_LEVEL_FATAL,
- "Unable to encrypt data-block "
- " src: %p srclen: %ld buf: %p buflen: %d."
- " return-code: %d. Can't continue!\n",
- src, (long)srclen,
- dst, dstlen, rc);
+ ib::error() << "Unable to encrypt data-block "
+ << " src: " << src << " srclen: " << srclen
+ << " buf: " << dst << " buflen: " << dstlen
+ << " return-code: "<< rc << " Can't continue!";
ut_error;
}
@@ -609,18 +592,18 @@ fil_encrypt_buf(
to sector boundary is written. */
if (!page_compressed) {
/* FIL page trailer is also not encrypted */
- memcpy(dst_frame + page_size - FIL_PAGE_DATA_END,
- src_frame + page_size - FIL_PAGE_DATA_END,
+ memcpy(dst_frame + page_size.physical() - FIL_PAGE_DATA_END,
+ src_frame + page_size.physical() - FIL_PAGE_DATA_END,
FIL_PAGE_DATA_END);
} else {
/* Clean up rest of buffer */
- memset(dst_frame+header_len+srclen, 0, page_size - (header_len+srclen));
+ memset(dst_frame+header_len+srclen, 0, page_size.physical() - (header_len+srclen));
}
/* handle post encryption checksum */
ib_uint32_t checksum = 0;
- checksum = fil_crypt_calculate_checksum(zip_size, dst_frame);
+ checksum = fil_crypt_calculate_checksum(page_size, dst_frame);
// store the post-encryption checksum after the key-version
mach_write_to_4(dst_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + 4, checksum);
@@ -640,8 +623,7 @@ fil_space_encrypt(
ulint offset, /*!< in: Page offset */
lsn_t lsn, /*!< in: lsn */
byte* src_frame, /*!< in: Source page to be encrypted */
- ulint zip_size, /*!< in: compressed size if
- row_format compressed */
+ const page_size_t& page_size, /*!< in: page size */
byte* dst_frame) /*!< in: outbut buffer */
{
fil_space_crypt_t* crypt_data = NULL;
@@ -664,7 +646,60 @@ fil_space_encrypt(
ut_a(crypt_data != NULL && crypt_data->encryption != FIL_SPACE_ENCRYPTION_OFF);
- byte* tmp = fil_encrypt_buf(crypt_data, space, offset, lsn, src_frame, zip_size, dst_frame);
+ byte* tmp = fil_encrypt_buf(crypt_data, space, offset, lsn, src_frame, page_size, dst_frame);
+
+#ifdef UNIV_DEBUG
+ if (tmp) {
+ /* Verify that encrypted buffer is not corrupted */
+ byte* tmp_mem = (byte *)malloc(UNIV_PAGE_SIZE);
+ dberr_t err = DB_SUCCESS;
+ byte* src = src_frame;
+ bool page_compressed_encrypted = (mach_read_from_2(tmp+FIL_PAGE_TYPE) == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED);
+ byte* comp_mem = NULL;
+ byte* uncomp_mem = NULL;
+
+ if (page_compressed_encrypted) {
+ comp_mem = (byte *)malloc(UNIV_PAGE_SIZE);
+ uncomp_mem = (byte *)malloc(UNIV_PAGE_SIZE);
+ memcpy(comp_mem, src_frame, UNIV_PAGE_SIZE);
+ fil_decompress_page(uncomp_mem, comp_mem, page_size.physical(), NULL);
+ src = uncomp_mem;
+ }
+
+ bool corrupted1 = buf_page_is_corrupted(true, src, page_size, fsp_is_checksum_disabled(space));
+ bool ok = fil_space_decrypt(crypt_data, tmp_mem, page_size, tmp, &err);
+
+ /* Need to decompress the page if it was also compressed */
+ if (page_compressed_encrypted) {
+ memcpy(comp_mem, tmp_mem, UNIV_PAGE_SIZE);
+ fil_decompress_page(tmp_mem, comp_mem, page_size.physical(), NULL);
+ }
+
+ bool corrupted = buf_page_is_corrupted(true, tmp_mem, page_size, fsp_is_checksum_disabled(space));
+ bool different = memcmp(src, tmp_mem, page_size.physical());
+
+ if (!ok || corrupted || corrupted1 || err != DB_SUCCESS || different) {
+ fprintf(stderr, "JAN: ok %d corrupted %d corrupted1 %d err %d different %d\n", ok , corrupted, corrupted1, err, different);
+ fprintf(stderr, "JAN1: src_frame\n");
+ buf_page_print(src_frame, page_size, BUF_PAGE_PRINT_NO_CRASH);
+ fprintf(stderr, "JAN2: encrypted_frame\n");
+ buf_page_print(tmp, page_size, BUF_PAGE_PRINT_NO_CRASH);
+ fprintf(stderr, "JAN1: decrypted_frame\n");
+ buf_page_print(tmp_mem, page_size, BUF_PAGE_PRINT_NO_CRASH);
+ ut_error;
+ }
+
+ free(tmp_mem);
+
+ if (comp_mem) {
+ free(comp_mem);
+ }
+
+ if (uncomp_mem) {
+ free(uncomp_mem);
+ }
+ }
+#endif /* UNIV_DEBUG */
return tmp;
}
@@ -704,7 +739,7 @@ fil_space_decrypt(
/*==============*/
fil_space_crypt_t* crypt_data, /*!< in: crypt data */
byte* tmp_frame, /*!< in: temporary buffer */
- ulint page_size, /*!< in: page size */
+ const page_size_t& page_size, /*!< in: page size */
byte* src_frame, /*!< in: out: page buffer */
dberr_t* err) /*!< in: out: DB_SUCCESS or
error code */
@@ -730,13 +765,14 @@ fil_space_decrypt(
data file (ibdata*, not *.ibd), if not
clear it. */
#ifdef UNIV_DEBUG
- ib_logf(IB_LOG_LEVEL_WARN,
- "Page on space %lu offset %lu has key_version %u"
- " when it shoud be undefined.",
- space, offset, key_version);
+ ib::warn()
+ << "Page on space "<< space << " offset " << offset
+ << " has key_version " << key_version
+ << " when it shoud be undefined.";
#endif
mach_write_to_4(src_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 0);
}
+
return false;
}
@@ -756,7 +792,7 @@ fil_space_decrypt(
const byte* src = src_frame + header_len;
byte* dst = tmp_frame + header_len;
uint32 dstlen = 0;
- ulint srclen = page_size - (header_len + FIL_PAGE_DATA_END);
+ ulint srclen = page_size.physical() - (header_len + FIL_PAGE_DATA_END);
if (page_compressed) {
srclen = mach_read_from_2(src_frame + FIL_PAGE_DATA);
@@ -773,12 +809,11 @@ fil_space_decrypt(
return false;
}
- ib_logf(IB_LOG_LEVEL_FATAL,
- "Unable to decrypt data-block "
- " src: %p srclen: %ld buf: %p buflen: %d."
- " return-code: %d. Can't continue!\n",
- src, (long)srclen,
- dst, dstlen, rc);
+ ib::error() << "Unable to decrypt data-block "
+ << " src: " << src << "srclen: "
+ << srclen << " buf: " << dst << "buflen: "
+ << dstlen << " return-code: " << rc
+ << " Can't continue!";
ut_error;
}
@@ -788,8 +823,8 @@ fil_space_decrypt(
to sector boundary is written. */
if (!page_compressed) {
/* Copy FIL trailer */
- memcpy(tmp_frame + page_size - FIL_PAGE_DATA_END,
- src_frame + page_size - FIL_PAGE_DATA_END,
+ memcpy(tmp_frame + page_size.physical() - FIL_PAGE_DATA_END,
+ src_frame + page_size.physical() - FIL_PAGE_DATA_END,
FIL_PAGE_DATA_END);
// clear key-version & crypt-checksum from dst
@@ -811,7 +846,7 @@ fil_space_decrypt(
/*==============*/
ulint space, /*!< in: Fil space id */
byte* tmp_frame, /*!< in: temporary buffer */
- ulint page_size, /*!< in: page size */
+ const page_size_t& page_size, /*!< in: page size */
byte* src_frame) /*!< in/out: page buffer */
{
dberr_t err = DB_SUCCESS;
@@ -828,7 +863,7 @@ fil_space_decrypt(
if (encrypted) {
/* Copy the decrypted page back to page buffer, not
really any other options. */
- memcpy(src_frame, tmp_frame, page_size);
+ memcpy(src_frame, tmp_frame, page_size.physical());
}
res = src_frame;
@@ -845,14 +880,14 @@ UNIV_INTERN
ulint
fil_crypt_calculate_checksum(
/*=========================*/
- ulint zip_size, /*!< in: zip_size or 0 */
- byte* dst_frame) /*!< in: page where to calculate */
+ const page_size_t& page_size, /*!< in: page size */
+ byte* dst_frame) /*!< in: page where to calculate */
{
ib_uint32_t checksum = 0;
srv_checksum_algorithm_t algorithm =
static_cast<srv_checksum_algorithm_t>(srv_checksum_algorithm);
- if (zip_size == 0) {
+ if (!page_size.is_compressed()) {
switch (algorithm) {
case SRV_CHECKSUM_ALGORITHM_CRC32:
case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32:
@@ -871,7 +906,7 @@ fil_crypt_calculate_checksum(
* if new enum is added and not handled here */
}
} else {
- checksum = page_zip_calc_checksum(dst_frame, zip_size,
+ checksum = page_zip_calc_checksum(dst_frame, page_size.physical(),
algorithm);
}
@@ -887,9 +922,8 @@ UNIV_INTERN
bool
fil_space_verify_crypt_checksum(
/*============================*/
- const byte* src_frame, /*!< in: page the verify */
- ulint zip_size) /*!< in: compressed size if
- row_format compressed */
+ const byte* src_frame, /*!< in: page the verify */
+ const page_size_t& page_size) /*!< in: page size */
{
// key version
uint key_version = mach_read_from_4(
@@ -924,7 +958,7 @@ fil_space_verify_crypt_checksum(
srv_checksum_algorithm_t save_checksum_algorithm =
(srv_checksum_algorithm_t)srv_checksum_algorithm;
- if (zip_size == 0 &&
+ if (!page_size.is_compressed() &&
(save_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_STRICT_INNODB ||
save_checksum_algorithm == SRV_CHECKSUM_ALGORITHM_INNODB)) {
/* handle ALGORITHM_INNODB specially,
@@ -938,7 +972,7 @@ fil_space_verify_crypt_checksum(
}
/* verify checksums */
- ibool corrupted = buf_page_is_corrupted(false, src_frame, zip_size);
+ ibool corrupted = buf_page_is_corrupted(false, src_frame, page_size, false);
/** restore frame & algorithm */
srv_checksum_algorithm = save_checksum_algorithm;
@@ -951,11 +985,7 @@ fil_space_verify_crypt_checksum(
UNIV_PAGE_SIZE - FIL_PAGE_END_LSN_OLD_CHKSUM,
checksum_field2);
- if (!corrupted) {
- return true; // page was encrypted and checksum matched
- } else {
- return false; // page was encrypted but checksum didn't match
- }
+ return (!corrupted);
}
/***********************************************************************/
@@ -986,9 +1016,9 @@ fil_crypt_get_key_state(
new_state->rotate_key_age = srv_fil_crypt_rotate_key_age;
if (new_state->key_version == ENCRYPTION_KEY_VERSION_INVALID) {
- ib_logf(IB_LOG_LEVEL_ERROR,
- "Used key_id %u can't be found from key file.",
- new_state->key_id);
+ ib::error() << "Used key_id "
+ << new_state->key_id
+ << " can't be found from key file.";
}
ut_a(new_state->key_version != ENCRYPTION_KEY_VERSION_INVALID);
@@ -1133,26 +1163,30 @@ fil_crypt_start_encrypting_space(
/* 2 - get page 0 */
ulint offset = 0;
- ulint zip_size = fil_space_get_zip_size(space);
- buf_block_t* block = buf_page_get_gen(space, zip_size, offset,
+ const page_id_t page_id(space, offset);
+ bool tsfound;
+ const page_size_t page_size = fil_space_get_page_size(space, &tsfound);
+ dberr_t err = DB_SUCCESS;
+ buf_block_t* block = buf_page_get_gen(page_id, page_size,
RW_X_LATCH,
NULL,
BUF_GET,
__FILE__, __LINE__,
- &mtr);
+ &mtr, &err);
if (fil_crypt_is_closing(space) ||
- fil_space_found_by_id(space) == NULL) {
+ fil_space_found_by_id(space) == NULL ||
+ err != DB_SUCCESS) {
mtr_commit(&mtr);
break;
}
/* 3 - compute location to store crypt data */
byte* frame = buf_block_get_frame(block);
- ulint maxsize;
+ ulint maxsize = 0;
ut_ad(crypt_data);
crypt_data->page0_offset =
- fsp_header_get_crypt_offset(zip_size, &maxsize);
+ fsp_header_get_crypt_offset(page_size, &maxsize);
/* 4 - write crypt data to page 0 */
fil_space_write_crypt_data_low(crypt_data,
@@ -1169,7 +1203,7 @@ fil_crypt_start_encrypting_space(
}
/* record lsn of update */
- lsn_t end_lsn = mtr.end_lsn;
+ lsn_t end_lsn = mtr.commit_lsn();
/* 4 - sync tablespace before publishing crypt data */
@@ -1181,7 +1215,7 @@ fil_crypt_start_encrypting_space(
ulint n_pages = 0;
ulint sum_pages = 0;
do {
- success = buf_flush_list(ULINT_MAX, end_lsn, &n_pages);
+ success = buf_flush_lists(ULINT_MAX, end_lsn, &n_pages);
buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST);
sum_pages += n_pages;
} while (!success &&
@@ -1279,7 +1313,7 @@ fil_crypt_space_needs_rotation(
/* Make sure that tablespace is found and it is normal tablespace */
if (fil_space_found_by_id(space) == NULL ||
- fil_space_get_type(space) != FIL_TABLESPACE) {
+ fil_space_get_type(space) != FIL_TYPE_TABLESPACE) {
return false;
}
@@ -1702,11 +1736,15 @@ static
bool
fil_crypt_is_page_uninitialized(
/*============================*/
- const byte *frame, /*!< in: Page */
- uint zip_size) /*!< in: compressed size if
- row_format compressed */
+ const byte* frame, /*!< in: Page */
+ const page_size_t& page_size) /*!< in: page size */
{
- if (zip_size) {
+ if (fil_page_get_type(frame) == FIL_PAGE_TYPE_ALLOCATED) {
+ /* empty pages aren't encrypted */
+ return true;
+ }
+
+ if (page_size.is_compressed()) {
ulint stored_checksum = mach_read_from_4(
frame + FIL_PAGE_SPACE_OR_CHKSUM);
/* empty pages aren't encrypted */
@@ -1714,7 +1752,7 @@ fil_crypt_is_page_uninitialized(
return true;
}
} else {
- ulint size = UNIV_PAGE_SIZE;
+ ulint size = page_size.logical();
ulint checksum_field1 = mach_read_from_4(
frame + FIL_PAGE_SPACE_OR_CHKSUM);
ulint checksum_field2 = mach_read_from_4(
@@ -1728,8 +1766,8 @@ fil_crypt_is_page_uninitialized(
return false;
}
-#define fil_crypt_get_page_throttle(state,space,zip_size,offset,mtr,sleeptime_ms) \
- fil_crypt_get_page_throttle_func(state, space, zip_size, offset, mtr, \
+#define fil_crypt_get_page_throttle(state,space,page_size,offset,mtr,sleeptime_ms) \
+ fil_crypt_get_page_throttle_func(state, space, page_size, offset, mtr, \
sleeptime_ms, __FILE__, __LINE__)
/***********************************************************************
@@ -1741,17 +1779,20 @@ fil_crypt_get_page_throttle_func(
/*=============================*/
rotate_thread_t* state, /*!< in/out: Key rotation state */
ulint space, /*!< in: FIL space id */
- uint zip_size, /*!< in: compressed size if
- row_format compressed */
+ const page_size_t& page_size, /*!< in: page size */
ulint offset, /*!< in: page offsett */
mtr_t* mtr, /*!< in/out: minitransaction */
ulint* sleeptime_ms, /*!< out: sleep time */
const char* file, /*!< in: file name */
ulint line) /*!< in: file line */
{
- buf_block_t* block = buf_page_try_get_func(space, offset, RW_X_LATCH,
- true,
- file, line, mtr);
+ const page_id_t& page_id = page_id_t(space, offset);
+ dberr_t err = DB_SUCCESS;
+ buf_block_t* block = NULL;
+
+ // JAN: TODO:
+ // buf_block_t* block = buf_page_try_get_func(page_id, file, line, mtr);
+
if (block != NULL) {
/* page was in buffer pool */
state->crypt_stat.pages_read_from_cache++;
@@ -1768,12 +1809,12 @@ fil_crypt_get_page_throttle_func(
state->crypt_stat.pages_read_from_disk++;
- ullint start = ut_time_us(NULL);
- block = buf_page_get_gen(space, zip_size, offset,
+ uintmax_t start = ut_time_us(NULL);
+ block = buf_page_get_gen(page_id, page_size,
RW_X_LATCH,
NULL, BUF_GET_POSSIBLY_FREED,
- file, line, mtr);
- ullint end = ut_time_us(NULL);
+ file, line, mtr, &err);
+ uintmax_t end = ut_time_us(NULL);
if (end < start) {
end = start; // safety...
@@ -1812,8 +1853,7 @@ btr_scrub_get_block_and_allocation_status(
/*======================================*/
rotate_thread_t* state, /*!< in/out: Key rotation state */
ulint space, /*!< in: FIL space id */
- uint zip_size, /*!< in: compressed size if
- row_format compressed */
+ const page_size_t& page_size, /*!< in: page size */
ulint offset, /*!< in: page offsett */
mtr_t* mtr, /*!< in/out: minitransaction
*/
@@ -1832,7 +1872,7 @@ btr_scrub_get_block_and_allocation_status(
/* this is easy case, we lock fil_space_latch first and
then block */
block = fil_crypt_get_page_throttle(state,
- space, zip_size,
+ space, page_size,
offset, mtr,
sleeptime_ms);
mtr_commit(&local_mtr);
@@ -1849,7 +1889,7 @@ btr_scrub_get_block_and_allocation_status(
*/
block = fil_crypt_get_page_throttle(state,
- space, zip_size,
+ space, page_size,
offset, mtr,
sleeptime_ms);
}
@@ -1869,7 +1909,8 @@ fil_crypt_rotate_page(
{
ulint space = state->space;
ulint offset = state->offset;
- const uint zip_size = fil_space_get_zip_size(space);
+ bool tsfound;
+ const page_size_t page_size = fil_space_get_page_size(space, &tsfound);
ulint sleeptime_ms = 0;
/* check if tablespace is closing before reading page */
@@ -1885,7 +1926,7 @@ fil_crypt_rotate_page(
mtr_t mtr;
mtr_start(&mtr);
buf_block_t* block = fil_crypt_get_page_throttle(state,
- space, zip_size,
+ space, page_size,
offset, &mtr,
&sleeptime_ms);
@@ -1902,7 +1943,7 @@ fil_crypt_rotate_page(
fil_space_crypt_t *crypt_data = fil_space_get_crypt_data(space);
if (kv == 0 &&
- fil_crypt_is_page_uninitialized(frame, zip_size)) {
+ fil_crypt_is_page_uninitialized(frame, page_size)) {
;
} else if (fil_crypt_needs_rotation(
crypt_data->encryption,
@@ -1943,7 +1984,7 @@ fil_crypt_rotate_page(
}
mtr_commit(&mtr);
- lsn_t end_lsn = mtr.end_lsn;
+ lsn_t end_lsn = mtr.commit_lsn();
if (needs_scrubbing == BTR_SCRUB_PAGE) {
mtr_start(&mtr);
@@ -1951,8 +1992,9 @@ fil_crypt_rotate_page(
* refetch page and allocation status
*/
btr_scrub_page_allocation_status_t allocated;
+
block = btr_scrub_get_block_and_allocation_status(
- state, space, zip_size, offset, &mtr,
+ state, space, page_size, offset, &mtr,
&allocated,
&sleeptime_ms);
@@ -1966,7 +2008,7 @@ fil_crypt_rotate_page(
/* we need to refetch it once more now that we have
* index locked */
block = btr_scrub_get_block_and_allocation_status(
- state, space, zip_size, offset, &mtr,
+ state, space, page_size, offset, &mtr,
&allocated,
&sleeptime_ms);
@@ -2073,15 +2115,15 @@ fil_crypt_flush_space(
bool success = false;
ulint n_pages = 0;
ulint sum_pages = 0;
- ullint start = ut_time_us(NULL);
+ uintmax_t start = ut_time_us(NULL);
do {
- success = buf_flush_list(ULINT_MAX, end_lsn, &n_pages);
+ success = buf_flush_lists(ULINT_MAX, end_lsn, &n_pages);
buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST);
sum_pages += n_pages;
} while (!success && !fil_crypt_is_closing(space));
- ullint end = ut_time_us(NULL);
+ uintmax_t end = ut_time_us(NULL);
if (sum_pages && end > start) {
state->cnt_waited += sum_pages;
@@ -2101,18 +2143,27 @@ fil_crypt_flush_space(
mtr_t mtr;
mtr_start(&mtr);
ulint offset = 0; // page 0
- const uint zip_size = fil_space_get_zip_size(space);
- buf_block_t* block = buf_page_get_gen(space, zip_size, offset,
+ const page_id_t page_id(space, offset);
+ bool tsfound;
+ const page_size_t page_size = fil_space_get_page_size(space, &tsfound);
+ dberr_t err = DB_SUCCESS;
+
+ buf_block_t* block = buf_page_get_gen(page_id, page_size,
RW_X_LATCH, NULL, BUF_GET,
- __FILE__, __LINE__, &mtr);
- byte* frame = buf_block_get_frame(block);
- ulint maxsize;
- crypt_data->page0_offset =
- fsp_header_get_crypt_offset(zip_size, &maxsize);
+ __FILE__, __LINE__, &mtr, &err);
+
+ if (block && err == DB_SUCCESS) {
+ byte* frame = buf_block_get_frame(block);
+ ulint maxsize=0;
+
+ crypt_data->page0_offset =
+ fsp_header_get_crypt_offset(page_size, &maxsize);
+
+ fil_space_write_crypt_data(space, frame,
+ crypt_data->page0_offset,
+ ULINT_MAX, &mtr);
+ }
- fil_space_write_crypt_data(space, frame,
- crypt_data->page0_offset,
- ULINT_MAX, &mtr);
mtr_commit(&mtr);
}
}
@@ -2325,9 +2376,10 @@ fil_crypt_set_thread_cnt(
for (uint i = 0; i < add; i++) {
os_thread_id_t rotation_thread_id;
os_thread_create(fil_crypt_thread, NULL, &rotation_thread_id);
- ib_logf(IB_LOG_LEVEL_INFO,
- "Creating #%d thread id %lu total threads %u.",
- i+1, os_thread_pf(rotation_thread_id), new_cnt);
+ ib::info() << "Creating "
+ << i+1 << " encryption thread id "
+ << os_thread_pf(rotation_thread_id)
+ << " total threads " << new_cnt << ".";
}
} else if (new_cnt < srv_n_fil_crypt_threads) {
srv_n_fil_crypt_threads = new_cnt;
@@ -2383,12 +2435,11 @@ void
fil_crypt_threads_init()
/*====================*/
{
- ut_ad(mutex_own(&fil_system->mutex));
if (!fil_crypt_threads_inited) {
- fil_crypt_event = os_event_create();
- fil_crypt_threads_event = os_event_create();
- mutex_create(fil_crypt_threads_mutex_key,
- &fil_crypt_threads_mutex, SYNC_NO_ORDER_CHECK);
+ fil_crypt_event = os_event_create(0);
+ fil_crypt_threads_event = os_event_create(0);
+ mutex_create(LATCH_ID_FIL_CRYPT_THREADS_MUTEX,
+ &fil_crypt_threads_mutex);
uint cnt = srv_n_fil_crypt_threads;
srv_n_fil_crypt_threads = 0;
@@ -2415,8 +2466,8 @@ void
fil_crypt_threads_cleanup()
/*=======================*/
{
- os_event_free(fil_crypt_event);
- os_event_free(fil_crypt_threads_event);
+ os_event_destroy(fil_crypt_event);
+ os_event_destroy(fil_crypt_threads_event);
fil_crypt_threads_inited = false;
}
@@ -2494,9 +2545,10 @@ fil_space_crypt_close_tablespace(
uint now = time(0);
if (now >= last + 30) {
- ib_logf(IB_LOG_LEVEL_WARN,
- "Waited %u seconds to drop space: %lu.",
- now - start, space);
+ ib::warn() << "Waited "
+ << now - start
+ << " seconds to drop space: "
+ << space << ".";
last = now;
}
}
@@ -2581,8 +2633,10 @@ fil_space_get_scrub_status(
memset(status, 0, sizeof(*status));
if (crypt_data != NULL) {
+ bool tsfound;
+ const page_size_t page_size = fil_space_get_page_size(id, &tsfound);
status->space = id;
- status->compressed = fil_space_get_zip_size(id) > 0;
+ status->compressed = page_size.is_compressed();
mutex_enter(&crypt_data->mutex);
status->last_scrub_completed =
crypt_data->rotate_state.scrubbing.last_scrub_completed;