Commit 09b03ff3 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.3 into 10.4

parents bf2680ea 1deb6304
/***************************************************************************** /*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
Copyright (C) 2014, 2018, MariaDB Corporation. Copyright (C) 2014, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -104,6 +104,7 @@ static bool init_crypt_key(crypt_info_t* info, bool upgrade = false) ...@@ -104,6 +104,7 @@ static bool init_crypt_key(crypt_info_t* info, bool upgrade = false)
<< info->key_version << " failed (" << rc << info->key_version << " failed (" << rc
<< "). Maybe the key or the required encryption " << "). Maybe the key or the required encryption "
"key management plugin was not found."; "key management plugin was not found.";
info->key_version = ENCRYPTION_KEY_VERSION_INVALID;
return false; return false;
} }
...@@ -123,6 +124,7 @@ static bool init_crypt_key(crypt_info_t* info, bool upgrade = false) ...@@ -123,6 +124,7 @@ static bool init_crypt_key(crypt_info_t* info, bool upgrade = false)
if (err != MY_AES_OK || dst_len != MY_AES_BLOCK_SIZE) { if (err != MY_AES_OK || dst_len != MY_AES_BLOCK_SIZE) {
ib::error() << "Getting redo log crypto key failed: err = " ib::error() << "Getting redo log crypto key failed: err = "
<< err << ", len = " << dst_len; << err << ", len = " << dst_len;
info->key_version = ENCRYPTION_KEY_VERSION_INVALID;
return false; return false;
} }
...@@ -317,6 +319,7 @@ log_crypt_101_read_block(byte* buf) ...@@ -317,6 +319,7 @@ log_crypt_101_read_block(byte* buf)
for (const crypt_info_t* const end = info + infos_used; info < end; for (const crypt_info_t* const end = info + infos_used; info < end;
info++) { info++) {
if (info->key_version if (info->key_version
&& info->key_version != ENCRYPTION_KEY_VERSION_INVALID
&& info->checkpoint_no == checkpoint_no) { && info->checkpoint_no == checkpoint_no) {
goto found; goto found;
} }
...@@ -328,6 +331,9 @@ log_crypt_101_read_block(byte* buf) ...@@ -328,6 +331,9 @@ log_crypt_101_read_block(byte* buf)
/* MariaDB Server 10.1 would use the first key if it fails to /* MariaDB Server 10.1 would use the first key if it fails to
find a key for the current checkpoint. */ find a key for the current checkpoint. */
info = infos; info = infos;
if (info->key_version == ENCRYPTION_KEY_VERSION_INVALID) {
return false;
}
found: found:
byte dst[OS_FILE_LOG_BLOCK_SIZE]; byte dst[OS_FILE_LOG_BLOCK_SIZE];
uint dst_len; uint dst_len;
......
...@@ -569,6 +569,7 @@ dberr_t trx_rseg_array_init() ...@@ -569,6 +569,7 @@ dberr_t trx_rseg_array_init()
bool wsrep_xid_in_rseg_found = false; bool wsrep_xid_in_rseg_found = false;
#endif #endif
mtr_t mtr; mtr_t mtr;
dberr_t err = DB_SUCCESS;
for (ulint rseg_id = 0; rseg_id < TRX_SYS_N_RSEGS; rseg_id++) { for (ulint rseg_id = 0; rseg_id < TRX_SYS_N_RSEGS; rseg_id++) {
mtr.start(); mtr.start();
...@@ -598,10 +599,11 @@ dberr_t trx_rseg_array_init() ...@@ -598,10 +599,11 @@ dberr_t trx_rseg_array_init()
ut_ad(rseg->id == rseg_id); ut_ad(rseg->id == rseg_id);
ut_ad(!trx_sys.rseg_array[rseg_id]); ut_ad(!trx_sys.rseg_array[rseg_id]);
trx_sys.rseg_array[rseg_id] = rseg; trx_sys.rseg_array[rseg_id] = rseg;
if (dberr_t err = trx_rseg_mem_restore( if ((err = trx_rseg_mem_restore(
rseg, max_trx_id, &mtr)) { rseg, max_trx_id, &mtr))
!= DB_SUCCESS) {
mtr.commit(); mtr.commit();
return err; break;
} }
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (!wsrep_sys_xid.is_null() && if (!wsrep_sys_xid.is_null() &&
...@@ -622,6 +624,21 @@ dberr_t trx_rseg_array_init() ...@@ -622,6 +624,21 @@ dberr_t trx_rseg_array_init()
mtr.commit(); mtr.commit();
} }
if (err != DB_SUCCESS) {
for (ulint rseg_id = 0; rseg_id < TRX_SYS_N_RSEGS; rseg_id++) {
if (trx_rseg_t*& rseg = trx_sys.rseg_array[rseg_id]) {
while (trx_undo_t* u= UT_LIST_GET_FIRST(
rseg->undo_list)) {
UT_LIST_REMOVE(rseg->undo_list, u);
ut_free(u);
}
trx_rseg_mem_free(rseg);
rseg = NULL;
}
}
return err;
}
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (!wsrep_sys_xid.is_null()) { if (!wsrep_sys_xid.is_null()) {
/* Upgrade from a version prior to 10.3.5, /* Upgrade from a version prior to 10.3.5,
......
...@@ -1087,18 +1087,11 @@ trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no, ...@@ -1087,18 +1087,11 @@ trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no,
const uint16_t type = mach_read_from_2(TRX_UNDO_PAGE_HDR const uint16_t type = mach_read_from_2(TRX_UNDO_PAGE_HDR
+ TRX_UNDO_PAGE_TYPE + TRX_UNDO_PAGE_TYPE
+ undo_page); + undo_page);
switch (type) { if (UNIV_UNLIKELY(type > 2)) {
case 0: corrupted_type:
case 2: /* TRX_UNDO_UPDATE */
break;
case 1: /* TRX_UNDO_INSERT */
sql_print_error("InnoDB: upgrade from older version than"
" MariaDB 10.3 requires clean shutdown");
goto corrupted;
default:
sql_print_error("InnoDB: unsupported undo header type %u", sql_print_error("InnoDB: unsupported undo header type %u",
type); type);
corrupted: corrupted:
mtr.commit(); mtr.commit();
return nullptr; return nullptr;
} }
...@@ -1118,12 +1111,21 @@ trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no, ...@@ -1118,12 +1111,21 @@ trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no,
switch (state) { switch (state) {
case TRX_UNDO_ACTIVE: case TRX_UNDO_ACTIVE:
case TRX_UNDO_PREPARED: case TRX_UNDO_PREPARED:
if (UNIV_LIKELY(type != 1)) {
break; break;
}
sql_print_error("InnoDB: upgrade from older version than"
" MariaDB 10.3 requires clean shutdown");
goto corrupted;
default: default:
sql_print_error("InnoDB: unsupported undo header state %u", sql_print_error("InnoDB: unsupported undo header state %u",
state); state);
goto corrupted; goto corrupted;
case TRX_UNDO_TO_PURGE: case TRX_UNDO_TO_PURGE:
if (UNIV_UNLIKELY(type == 1)) {
goto corrupted_type;
}
/* fall through */
case TRX_UNDO_CACHED: case TRX_UNDO_CACHED:
trx_id_t id = mach_read_from_8(TRX_UNDO_TRX_NO + undo_header); trx_id_t id = mach_read_from_8(TRX_UNDO_TRX_NO + undo_header);
if (id >> 48) { if (id >> 48) {
......
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