Use standard InnoDB error mechanism on compression and encryption

error messages.
This commit is contained in:
Jan Lindström 2015-03-02 10:55:48 +02:00
parent 1f1f977167
commit 7047bef1ef
10 changed files with 337 additions and 264 deletions

View File

@ -1,4 +1,4 @@
call mtr.add_suppression("InnoDB: Warning: Compression failed for space*"); call mtr.add_suppression("Compression failed for space*");
set global innodb_file_format = `barracuda`; set global innodb_file_format = `barracuda`;
set global innodb_file_per_table = on; set global innodb_file_per_table = on;
set global innodb_compression_algorithm = 6; set global innodb_compression_algorithm = 6;

View File

@ -1,5 +1,6 @@
call mtr.add_suppression("KeyID 0 not found or with error. Check the key and the log file*"); call mtr.add_suppression("KeyID 0 not found or with error. Check the key and the log*");
call mtr.add_suppression("Disabling redo log encryption"); call mtr.add_suppression("Disabling redo log encryp*");
call mtr.add_suppression("InnoDB: Redo log crypto: Can't initialize to key version*");
SET GLOBAL innodb_file_format = `Barracuda`; SET GLOBAL innodb_file_format = `Barracuda`;
SET GLOBAL innodb_file_per_table = ON; SET GLOBAL innodb_file_per_table = ON;
create table innodb_normal(c1 bigint not null, b char(200)) engine=innodb; create table innodb_normal(c1 bigint not null, b char(200)) engine=innodb;

View File

@ -1,7 +1,7 @@
-- source include/have_innodb.inc -- source include/have_innodb.inc
-- source include/have_innodb_snappy.inc -- source include/have_innodb_snappy.inc
call mtr.add_suppression("InnoDB: Warning: Compression failed for space*"); call mtr.add_suppression("Compression failed for space*");
--disable_query_log --disable_query_log
let $innodb_compression_algorithm_orig=`select @@innodb_compression_algorithm`; let $innodb_compression_algorithm_orig=`select @@innodb_compression_algorithm`;

View File

@ -6,8 +6,9 @@ let $innodb_file_format_orig = `SELECT @@innodb_file_format`;
let $innodb_file_per_table_orig = `SELECT @@innodb_file_per_table`; let $innodb_file_per_table_orig = `SELECT @@innodb_file_per_table`;
--enable_query_log --enable_query_log
call mtr.add_suppression("KeyID 0 not found or with error. Check the key and the log file*"); call mtr.add_suppression("KeyID 0 not found or with error. Check the key and the log*");
call mtr.add_suppression("Disabling redo log encryption"); call mtr.add_suppression("Disabling redo log encryp*");
call mtr.add_suppression("InnoDB: Redo log crypto: Can't initialize to key version*");
SET GLOBAL innodb_file_format = `Barracuda`; SET GLOBAL innodb_file_format = `Barracuda`;
SET GLOBAL innodb_file_per_table = ON; SET GLOBAL innodb_file_per_table = ON;

View File

@ -1,3 +1,29 @@
/*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
Copyright (C) 2014, 2015, MariaDB Corporation. All Rights Reserved.
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
Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
/**************************************************//**
@file fil0crypt.cc
Innodb file space encrypt/decrypt
Created Jonas Oreland Google
Modified Jan Lindström jan.lindstrom@mariadb.com
*******************************************************/
#include "fil0fil.h" #include "fil0fil.h"
#include "srv0srv.h" #include "srv0srv.h"
#include "srv0start.h" #include "srv0start.h"
@ -11,6 +37,7 @@
#include "fsp0fsp.h" #include "fsp0fsp.h"
#include "fil0pagecompress.h" #include "fil0pagecompress.h"
#include "fil0pageencryption.h" #include "fil0pageencryption.h"
#include "ha_prototypes.h" // IB_LOG_
#include <my_crypt.h> #include <my_crypt.h>
@ -368,11 +395,11 @@ fil_space_read_crypt_data(ulint space, const byte* page, ulint offset)
} }
if (memcmp(page + offset, CRYPT_MAGIC, MAGIC_SZ) != 0) { if (memcmp(page + offset, CRYPT_MAGIC, MAGIC_SZ) != 0) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"Warning: found potentially bogus bytes on " "Found potentially bogus bytes on "
"page 0 offset %lu for space %lu : " "page 0 offset %lu for space %lu : "
"[ %.2x %.2x %.2x %.2x %.2x %.2x ]. " "[ %.2x %.2x %.2x %.2x %.2x %.2x ]. "
"Assuming space is not encrypted!\n", "Assuming space is not encrypted!.",
offset, space, offset, space,
page[offset + 0], page[offset + 0],
page[offset + 1], page[offset + 1],
@ -387,10 +414,10 @@ fil_space_read_crypt_data(ulint space, const byte* page, ulint offset)
if (! (type == CRYPT_SCHEME_UNENCRYPTED || if (! (type == CRYPT_SCHEME_UNENCRYPTED ||
type == CRYPT_SCHEME_1)) { type == CRYPT_SCHEME_1)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"Found non sensible crypt scheme: %lu for space %lu " "Found non sensible crypt scheme: %lu for space %lu "
" offset: %lu bytes: " " offset: %lu bytes: "
"[ %.2x %.2x %.2x %.2x %.2x %.2x ]\n", "[ %.2x %.2x %.2x %.2x %.2x %.2x ].",
type, space, offset, type, space, offset,
page[offset + 0 + MAGIC_SZ], page[offset + 0 + MAGIC_SZ],
page[offset + 1 + MAGIC_SZ], page[offset + 1 + MAGIC_SZ],
@ -403,10 +430,10 @@ fil_space_read_crypt_data(ulint space, const byte* page, ulint offset)
ulint iv_length = mach_read_from_1(page + offset + MAGIC_SZ + 1); ulint iv_length = mach_read_from_1(page + offset + MAGIC_SZ + 1);
if (! (iv_length == CRYPT_SCHEME_1_IV_LEN)) { if (! (iv_length == CRYPT_SCHEME_1_IV_LEN)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"Found non sensible iv length: %lu for space %lu " "Found non sensible iv length: %lu for space %lu "
" offset: %lu type: %lu bytes: " " offset: %lu type: %lu bytes: "
"[ %.2x %.2x %.2x %.2x %.2x %.2x ]\n", "[ %.2x %.2x %.2x %.2x %.2x %.2x ].",
iv_length, space, offset, type, iv_length, space, offset, type,
page[offset + 0 + MAGIC_SZ], page[offset + 0 + MAGIC_SZ],
page[offset + 1 + MAGIC_SZ], page[offset + 1 + MAGIC_SZ],
@ -1414,8 +1441,8 @@ fil_crypt_realloc_iops(rotate_thread_t *state)
state->sum_waited_us / state->cnt_waited; state->sum_waited_us / state->cnt_waited;
#if DEBUG_KEYROTATION_THROTTLING #if DEBUG_KEYROTATION_THROTTLING
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"thr_no: %u - update estimated_max_iops from %u to %u\n", "thr_no: %u - update estimated_max_iops from %u to %u.",
state->thread_no, state->thread_no,
state->estimated_max_iops, state->estimated_max_iops,
1000000 / avg_wait_time_us); 1000000 / avg_wait_time_us);
@ -1428,8 +1455,8 @@ fil_crypt_realloc_iops(rotate_thread_t *state)
state->sum_waited_us = 0; state->sum_waited_us = 0;
} else { } else {
#if DEBUG_KEYROTATION_THROTTLING #if DEBUG_KEYROTATION_THROTTLING
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"thr_no: %u only waited %lu%% skip re-estimate\n", "thr_no: %u only waited %lu%% skip re-estimate.",
state->thread_no, state->thread_no,
(100 * state->cnt_waited) / state->batch); (100 * state->cnt_waited) / state->batch);
#endif #endif
@ -1477,8 +1504,8 @@ fil_crypt_realloc_iops(rotate_thread_t *state)
n_fil_crypt_iops_allocated += extra; n_fil_crypt_iops_allocated += extra;
state->allocated_iops += extra; state->allocated_iops += extra;
#if DEBUG_KEYROTATION_THROTTLING #if DEBUG_KEYROTATION_THROTTLING
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"thr_no: %u increased iops from %u to %u\n", "thr_no: %u increased iops from %u to %u.",
state->thread_no, state->thread_no,
state->allocated_iops - extra, state->allocated_iops - extra,
state->allocated_iops); state->allocated_iops);
@ -2325,9 +2352,8 @@ fil_space_crypt_close_tablespace(
uint now = time(0); uint now = time(0);
if (now >= last + 30) { if (now >= last + 30) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"WARNING: " "Waited %u seconds to drop space: %lu.",
"waited %u seconds to drop space: %lu\n",
now - start, space); now - start, space);
last = now; last = now;
} }

View File

@ -47,6 +47,7 @@ Updated 14/02/2015
#include "page0zip.h" #include "page0zip.h"
#include "trx0sys.h" #include "trx0sys.h"
#include "row0mysql.h" #include "row0mysql.h"
#include "ha_prototypes.h" // IB_LOG_
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
# include "buf0lru.h" # include "buf0lru.h"
# include "ibuf0ibuf.h" # include "ibuf0ibuf.h"
@ -117,9 +118,9 @@ fil_decompress_page_2(
if (original_len < UNIV_PAGE_SIZE_MIN - (FIL_PAGE_DATA + 8) if (original_len < UNIV_PAGE_SIZE_MIN - (FIL_PAGE_DATA + 8)
|| original_len > UNIV_PAGE_SIZE_MAX - FIL_PAGE_DATA || original_len > UNIV_PAGE_SIZE_MAX - FIL_PAGE_DATA
|| len < original_len + FIL_PAGE_DATA) { || len < original_len + FIL_PAGE_DATA) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: We try to uncompress corrupted page\n" "Corruption: We try to uncompress corrupted page. "
"InnoDB: Original len %lu len %lu.\n", "Original len %lu len %lu.",
original_len, len); original_len, len);
fflush(stderr); fflush(stderr);
@ -132,16 +133,15 @@ fil_decompress_page_2(
switch(algorithm) { switch(algorithm) {
case PAGE_ZLIB_ALGORITHM: { case PAGE_ZLIB_ALGORITHM: {
fprintf(stderr, "InnoDB: [Note]: zlib\n");
err = uncompress(page_buf, &len, ptr, original_len); err = uncompress(page_buf, &len, ptr, original_len);
/* If uncompress fails it means that page is corrupted */ /* If uncompress fails it means that page is corrupted */
if (err != Z_OK) { if (err != Z_OK) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed "
"InnoDB: but uncompress failed with error %d.\n" "but uncompress failed with error %d "
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
err, original_len, len); err, original_len, len);
fflush(stderr); fflush(stderr);
@ -153,15 +153,15 @@ fil_decompress_page_2(
} }
#ifdef HAVE_LZ4 #ifdef HAVE_LZ4
case PAGE_LZ4_ALGORITHM: { case PAGE_LZ4_ALGORITHM: {
fprintf(stderr, "InnoDB: [Note]: lz4\n");
err = LZ4_decompress_fast( err = LZ4_decompress_fast(
(const char*) ptr, (char*) (page_buf), original_len); (const char*) ptr, (char*) (page_buf), original_len);
if (err < 0) { if (err < 0) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %d bytes.\n" " but decompression read only %d bytes"
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
err, original_len, len); err, original_len, len);
fflush(stderr); fflush(stderr);
@ -179,7 +179,6 @@ fil_decompress_page_2(
size_t dst_pos = 0; size_t dst_pos = 0;
uint64_t memlimit = UINT64_MAX; uint64_t memlimit = UINT64_MAX;
fprintf(stderr, "InnoDB: [Note]: lzma\n");
ret = lzma_stream_buffer_decode( ret = lzma_stream_buffer_decode(
&memlimit, &memlimit,
0, 0,
@ -193,10 +192,10 @@ fil_decompress_page_2(
if (ret != LZMA_OK || (dst_pos <= 0 || dst_pos > len)) { if (ret != LZMA_OK || (dst_pos <= 0 || dst_pos > len)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %ld bytes.\n" " but decompression read only %ld bytes"
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
dst_pos, original_len, len); dst_pos, original_len, len);
fflush(stderr); fflush(stderr);
@ -210,15 +209,15 @@ fil_decompress_page_2(
#ifdef HAVE_LZO #ifdef HAVE_LZO
case PAGE_LZO_ALGORITHM: { case PAGE_LZO_ALGORITHM: {
ulint olen = 0; ulint olen = 0;
fprintf(stderr, "InnoDB: [Note]: lzo \n");
err = lzo1x_decompress((const unsigned char *)ptr, err = lzo1x_decompress((const unsigned char *)ptr,
original_len,(unsigned char *)(page_buf), &olen, NULL); original_len,(unsigned char *)(page_buf), &olen, NULL);
if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) { if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %ld bytes.\n" " but decompression read only %ld bytes"
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
olen, original_len, len); olen, original_len, len);
fflush(stderr); fflush(stderr);
@ -229,10 +228,10 @@ fil_decompress_page_2(
#endif /* HAVE_LZO */ #endif /* HAVE_LZO */
default: default:
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" " Corruption: Page is marked as compressed "
"InnoDB: but compression algorithm %s\n" " but compression algorithm %s"
"InnoDB: is not known.\n" " is not known."
,fil_get_compression_alg_name(algorithm)); ,fil_get_compression_alg_name(algorithm));
fflush(stderr); fflush(stderr);
@ -296,8 +295,6 @@ fil_compress_page(
return (buf); return (buf);
} }
fprintf(stderr, "JAN: orig_page_type %lu\n", orig_page_type);
level = compression_level; level = compression_level;
ut_ad(fil_space_is_page_compressed(space_id)); ut_ad(fil_space_is_page_compressed(space_id));
@ -312,8 +309,8 @@ fil_compress_page(
} }
#ifdef UNIV_PAGECOMPRESS_DEBUG #ifdef UNIV_PAGECOMPRESS_DEBUG
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"InnoDB: Note: Preparing for compress for space %lu name %s len %lu\n", "Preparing for compress for space %lu name %s len %lu.",
space_id, fil_space_name(space), len); space_id, fil_space_name(space), len);
#endif /* UNIV_PAGECOMPRESS_DEBUG */ #endif /* UNIV_PAGECOMPRESS_DEBUG */
@ -330,8 +327,8 @@ fil_compress_page(
/* If error we leave the actual page as it was */ /* If error we leave the actual page as it was */
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu rt %d write %lu\n", "Compression failed for space %lu name %s len %lu rt %d write %lu.",
space_id, fil_space_name(space), len, err, write_size); space_id, fil_space_name(space), len, err, write_size);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -349,8 +346,8 @@ fil_compress_page(
if (err != LZO_E_OK || write_size > UNIV_PAGE_SIZE-header_len) { if (err != LZO_E_OK || write_size > UNIV_PAGE_SIZE-header_len) {
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu err %d write_size %lu\n", "Compression failed for space %lu name %s len %lu err %d write_size %lu.",
space_id, fil_space_name(space), len, err, write_size); space_id, fil_space_name(space), len, err, write_size);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -377,8 +374,8 @@ fil_compress_page(
if (err != LZMA_OK || out_pos > UNIV_PAGE_SIZE-header_len) { if (err != LZMA_OK || out_pos > UNIV_PAGE_SIZE-header_len) {
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu err %d write_size %lu\n", "Compression failed for space %lu name %s len %lu err %d write_size %lu",
space_id, fil_space_name(space), len, err, out_pos); space_id, fil_space_name(space), len, err, out_pos);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -408,8 +405,8 @@ fil_compress_page(
if (err != BZ_OK || write_size > UNIV_PAGE_SIZE-header_len) { if (err != BZ_OK || write_size > UNIV_PAGE_SIZE-header_len) {
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu err %d write_size %lu\n", "Compression failed for space %lu name %s len %lu err %d write_size %lu.",
space_id, fil_space_name(space), len, err, write_size); space_id, fil_space_name(space), len, err, write_size);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -430,8 +427,8 @@ fil_compress_page(
if (cstatus != SNAPPY_OK || write_size > UNIV_PAGE_SIZE-header_len) { if (cstatus != SNAPPY_OK || write_size > UNIV_PAGE_SIZE-header_len) {
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu err %d write_size %lu\n", "Compression failed for space %lu name %s len %lu err %d write_size %lu.",
space_id, fil_space_name(space), len, (int)cstatus, write_size); space_id, fil_space_name(space), len, (int)cstatus, write_size);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -450,8 +447,8 @@ fil_compress_page(
/* If error we leave the actual page as it was */ /* If error we leave the actual page as it was */
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu rt %d write %lu\n", "Compression failed for space %lu name %s len %lu rt %d write %lu.",
space_id, fil_space_name(space), len, err, write_size); space_id, fil_space_name(space), len, err, write_size);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -525,8 +522,8 @@ fil_compress_page(
} }
#ifdef UNIV_PAGECOMPRESS_DEBUG #ifdef UNIV_PAGECOMPRESS_DEBUG
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"InnoDB: Note: Compression succeeded for space %lu name %s len %lu out_len %lu\n", "Compression succeeded for space %lu name %s len %lu out_len %lu.",
space_id, fil_space_name(space), len, write_size); space_id, fil_space_name(space), len, write_size);
#endif /* UNIV_PAGECOMPRESS_DEBUG */ #endif /* UNIV_PAGECOMPRESS_DEBUG */
@ -577,10 +574,6 @@ fil_decompress_page(
// If no buffer was given, we need to allocate temporal buffer // If no buffer was given, we need to allocate temporal buffer
if (page_buf == NULL) { if (page_buf == NULL) {
#ifdef UNIV_PAGECOMPRESS_DEBUG
fprintf(stderr,
"InnoDB: Note: FIL: Compression buffer not given, allocating...\n");
#endif /* UNIV_PAGECOMPRESS_DEBUG */
in_buf = static_cast<byte *>(ut_malloc(UNIV_PAGE_SIZE*3)); in_buf = static_cast<byte *>(ut_malloc(UNIV_PAGE_SIZE*3));
} else { } else {
in_buf = page_buf; in_buf = page_buf;
@ -600,10 +593,9 @@ fil_decompress_page(
if (mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM) != BUF_NO_CHECKSUM_MAGIC || if (mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM) != BUF_NO_CHECKSUM_MAGIC ||
mach_read_from_2(buf+FIL_PAGE_TYPE) != FIL_PAGE_PAGE_COMPRESSED) { mach_read_from_2(buf+FIL_PAGE_TYPE) != FIL_PAGE_PAGE_COMPRESSED) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: We try to uncompress corrupted page\n" "Corruption: We try to uncompress corrupted page"
"InnoDB: CRC %lu type %lu.\n" " CRC %lu type %lu len %lu.",
"InnoDB: len %lu\n",
mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM), mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM),
mach_read_from_2(buf+FIL_PAGE_TYPE), len); mach_read_from_2(buf+FIL_PAGE_TYPE), len);
@ -618,9 +610,9 @@ fil_decompress_page(
actual_size = mach_read_from_2(buf+FIL_PAGE_DATA); actual_size = mach_read_from_2(buf+FIL_PAGE_DATA);
/* Check if payload size is corrupted */ /* Check if payload size is corrupted */
if (actual_size == 0 || actual_size > UNIV_PAGE_SIZE) { if (actual_size == 0 || actual_size > UNIV_PAGE_SIZE) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: We try to uncompress corrupted page\n" "Corruption: We try to uncompress corrupted page"
"InnoDB: actual size %lu compression %s\n", " actual size %lu compression %s.",
actual_size, fil_get_compression_alg_name(compression_alg)); actual_size, fil_get_compression_alg_name(compression_alg));
fflush(stderr); fflush(stderr);
ut_error; ut_error;
@ -633,8 +625,8 @@ fil_decompress_page(
} }
#ifdef UNIV_PAGECOMPRESS_DEBUG #ifdef UNIV_PAGECOMPRESS_DEBUG
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"InnoDB: Note: Preparing for decompress for len %lu\n", "Preparing for decompress for len %lu\n",
actual_size); actual_size);
#endif /* UNIV_PAGECOMPRESS_DEBUG */ #endif /* UNIV_PAGECOMPRESS_DEBUG */
@ -646,10 +638,10 @@ fil_decompress_page(
/* If uncompress fails it means that page is corrupted */ /* If uncompress fails it means that page is corrupted */
if (err != Z_OK) { if (err != Z_OK) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but uncompress failed with error %d.\n" " but uncompress failed with error %d "
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
err, actual_size, len); err, actual_size, len);
fflush(stderr); fflush(stderr);
@ -663,10 +655,10 @@ fil_decompress_page(
err = LZ4_decompress_fast((const char *)buf+FIL_PAGE_DATA+FIL_PAGE_COMPRESSED_SIZE, (char *)in_buf, len); err = LZ4_decompress_fast((const char *)buf+FIL_PAGE_DATA+FIL_PAGE_COMPRESSED_SIZE, (char *)in_buf, len);
if (err != (int)actual_size) { if (err != (int)actual_size) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %d bytes.\n" " but decompression read only %d bytes "
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
err, actual_size, len); err, actual_size, len);
fflush(stderr); fflush(stderr);
@ -682,10 +674,10 @@ fil_decompress_page(
actual_size,(unsigned char *)in_buf, &olen, NULL); actual_size,(unsigned char *)in_buf, &olen, NULL);
if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) { if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %ld bytes.\n" " but decompression read only %ld bytes"
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
olen, actual_size, len); olen, actual_size, len);
fflush(stderr); fflush(stderr);
@ -715,10 +707,10 @@ fil_decompress_page(
if (ret != LZMA_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) { if (ret != LZMA_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %ld bytes.\n" " but decompression read only %ld bytes"
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
dst_pos, actual_size, len); dst_pos, actual_size, len);
fflush(stderr); fflush(stderr);
@ -741,10 +733,10 @@ fil_decompress_page(
0); 0);
if (err != BZ_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) { if (err != BZ_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %du bytes.\n" " but decompression read only %du bytes"
"InnoDB: size %lu len %lu err %d\n", " size %lu len %lu err %d.",
dst_pos, actual_size, len, err); dst_pos, actual_size, len, err);
fflush(stderr); fflush(stderr);
@ -766,10 +758,10 @@ fil_decompress_page(
&olen); &olen);
if (cstatus != SNAPPY_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) { if (cstatus != SNAPPY_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %lu bytes.\n" " but decompression read only %lu bytes"
"InnoDB: size %lu len %lu err %d\n", " size %lu len %lu err %d.",
olen, actual_size, len, (int)cstatus); olen, actual_size, len, (int)cstatus);
fflush(stderr); fflush(stderr);
@ -779,10 +771,10 @@ fil_decompress_page(
} }
#endif /* HAVE_SNAPPY */ #endif /* HAVE_SNAPPY */
default: default:
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but compression algorithm %s\n" " but compression algorithm %s"
"InnoDB: is not known.\n" " is not known."
,fil_get_compression_alg_name(compression_alg)); ,fil_get_compression_alg_name(compression_alg));
fflush(stderr); fflush(stderr);
@ -790,12 +782,6 @@ fil_decompress_page(
break; break;
} }
#ifdef UNIV_PAGECOMPRESS_DEBUG
fprintf(stderr,
"InnoDB: Note: Decompression succeeded for len %lu \n",
len);
#endif /* UNIV_PAGECOMPRESS_DEBUG */
srv_stats.pages_page_decompressed.inc(); srv_stats.pages_page_decompressed.inc();
/* Copy the uncompressed page to the buffer pool, not /* Copy the uncompressed page to the buffer pool, not

View File

@ -1,8 +1,27 @@
/*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
Copyright (C) 2014, 2015, MariaDB Corporation. All Rights Reserved.
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
Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
/**************************************************//** /**************************************************//**
@file log0crypt.cc @file log0crypt.cc
Innodb log encrypt/decrypt Innodb log encrypt/decrypt
Created 11/25/2013 Minli Zhu Created 11/25/2013 Minli Zhu Google
Modified Jan Lindström jan.lindstrom@mariadb.com
*******************************************************/ *******************************************************/
#include "m_string.h" #include "m_string.h"
#include "log0crypt.h" #include "log0crypt.h"
@ -13,6 +32,7 @@ Created 11/25/2013 Minli Zhu
#include "log0recv.h" // for recv_sys #include "log0recv.h" // for recv_sys
#include "mysql/plugin_encryption_key_management.h" // for BAD_ENCRYPTION_KEY_VERSION #include "mysql/plugin_encryption_key_management.h" // for BAD_ENCRYPTION_KEY_VERSION
#include "ha_prototypes.h" // IB_LOG_
/* If true, enable redo log encryption. */ /* If true, enable redo log encryption. */
UNIV_INTERN my_bool srv_encrypt_log = FALSE; UNIV_INTERN my_bool srv_encrypt_log = FALSE;
@ -51,18 +71,18 @@ log_init_crypt_msg_and_nonce(void)
mach_write_to_1(redo_log_crypt_msg, redo_log_purpose_byte); mach_write_to_1(redo_log_crypt_msg, redo_log_purpose_byte);
if (my_random_bytes(redo_log_crypt_msg + 1, PURPOSE_BYTE_LEN) != AES_OK) if (my_random_bytes(redo_log_crypt_msg + 1, PURPOSE_BYTE_LEN) != AES_OK)
{ {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"\nInnoDB redo log crypto: generate " "Redo log crypto: generate "
"%u-byte random number as crypto msg failed.\n", "%u-byte random number as crypto msg failed.",
PURPOSE_BYTE_LEN); PURPOSE_BYTE_LEN);
abort(); abort();
} }
if (my_random_bytes(aes_ctr_nonce, MY_AES_BLOCK_SIZE) != AES_OK) if (my_random_bytes(aes_ctr_nonce, MY_AES_BLOCK_SIZE) != AES_OK)
{ {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"\nInnoDB redo log crypto: generate " "Redo log crypto: generate "
"%u-byte random number as AES_CTR nonce failed.\n", "%u-byte random number as AES_CTR nonce failed.",
MY_AES_BLOCK_SIZE); MY_AES_BLOCK_SIZE);
abort(); abort();
} }
@ -80,16 +100,17 @@ log_init_crypt_key(
{ {
if (crypt_ver == UNENCRYPTED_KEY_VER) if (crypt_ver == UNENCRYPTED_KEY_VER)
{ {
fprintf(stderr, "\nInnoDB redo log crypto: unencrypted key ver.\n\n"); ib_logf(IB_LOG_LEVEL_INFO,
"Redo log crypto: unencrypted key ver.");
memset(key, 0, MY_AES_BLOCK_SIZE); memset(key, 0, MY_AES_BLOCK_SIZE);
return; return;
} }
if (crypt_msg[PURPOSE_BYTE_OFFSET] != redo_log_purpose_byte) if (crypt_msg[PURPOSE_BYTE_OFFSET] != redo_log_purpose_byte)
{ {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"\nInnoDB redo log crypto: msg type mismatched. " "Redo log crypto: msg type mismatched. "
"Expected: %x; Actual: %x\n", "Expected: %x; Actual: %x.",
redo_log_purpose_byte, crypt_msg[PURPOSE_BYTE_OFFSET]); redo_log_purpose_byte, crypt_msg[PURPOSE_BYTE_OFFSET]);
abort(); abort();
} }
@ -97,9 +118,9 @@ log_init_crypt_key(
byte mysqld_key[MY_AES_BLOCK_SIZE] = {0}; byte mysqld_key[MY_AES_BLOCK_SIZE] = {0};
if (get_encryption_key(crypt_ver, mysqld_key, MY_AES_BLOCK_SIZE)) if (get_encryption_key(crypt_ver, mysqld_key, MY_AES_BLOCK_SIZE))
{ {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"\nInnoDB redo log crypto: getting mysqld crypto key " "Redo log crypto: getting mysqld crypto key "
"from key version failed.\n"); "from key version failed.");
abort(); abort();
} }
@ -113,9 +134,9 @@ log_init_crypt_key(
if (rc != AES_OK || dst_len != MY_AES_BLOCK_SIZE) if (rc != AES_OK || dst_len != MY_AES_BLOCK_SIZE)
{ {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"\nInnoDB redo log crypto: getting redo log crypto key " "Redo log crypto: getting redo log crypto key "
"failed.\n"); "failed.");
abort(); abort();
} }
} }
@ -247,9 +268,11 @@ log_crypt_set_ver_and_key(
vkey == (unsigned int)CRYPT_KEY_UNKNOWN) { vkey == (unsigned int)CRYPT_KEY_UNKNOWN) {
encrypted = false; encrypted = false;
fprintf(stderr, "\nInnoDB redo log crypto: Can't initialize to key version %du\n", ib_logf(IB_LOG_LEVEL_WARN,
key_ver); "Redo log crypto: Can't initialize to key version %du.", vkey);
fprintf(stderr, "InnoDB: Warning: Disabling redo log encryption\n"); ib_logf(IB_LOG_LEVEL_WARN,
"Disabling redo log encryption.");
srv_encrypt_log = FALSE; srv_encrypt_log = FALSE;
} else { } else {
key_ver = vkey; key_ver = vkey;

View File

@ -1,3 +1,29 @@
/*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
Copyright (C) 2014, 2015, MariaDB Corporation. All Rights Reserved.
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
Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
/**************************************************//**
@file fil0crypt.cc
Innodb file space encrypt/decrypt
Created Jonas Oreland Google
Modified Jan Lindström jan.lindstrom@mariadb.com
*******************************************************/
#include "fil0fil.h" #include "fil0fil.h"
#include "srv0srv.h" #include "srv0srv.h"
#include "srv0start.h" #include "srv0start.h"
@ -11,6 +37,7 @@
#include "fsp0fsp.h" #include "fsp0fsp.h"
#include "fil0pagecompress.h" #include "fil0pagecompress.h"
#include "fil0pageencryption.h" #include "fil0pageencryption.h"
#include "ha_prototypes.h" // IB_LOG_
#include <my_crypt.h> #include <my_crypt.h>
@ -368,11 +395,11 @@ fil_space_read_crypt_data(ulint space, const byte* page, ulint offset)
} }
if (memcmp(page + offset, CRYPT_MAGIC, MAGIC_SZ) != 0) { if (memcmp(page + offset, CRYPT_MAGIC, MAGIC_SZ) != 0) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"Warning: found potentially bogus bytes on " "Found potentially bogus bytes on "
"page 0 offset %lu for space %lu : " "page 0 offset %lu for space %lu : "
"[ %.2x %.2x %.2x %.2x %.2x %.2x ]. " "[ %.2x %.2x %.2x %.2x %.2x %.2x ]. "
"Assuming space is not encrypted!\n", "Assuming space is not encrypted!.",
offset, space, offset, space,
page[offset + 0], page[offset + 0],
page[offset + 1], page[offset + 1],
@ -387,10 +414,10 @@ fil_space_read_crypt_data(ulint space, const byte* page, ulint offset)
if (! (type == CRYPT_SCHEME_UNENCRYPTED || if (! (type == CRYPT_SCHEME_UNENCRYPTED ||
type == CRYPT_SCHEME_1)) { type == CRYPT_SCHEME_1)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"Found non sensible crypt scheme: %lu for space %lu " "Found non sensible crypt scheme: %lu for space %lu "
" offset: %lu bytes: " " offset: %lu bytes: "
"[ %.2x %.2x %.2x %.2x %.2x %.2x ]\n", "[ %.2x %.2x %.2x %.2x %.2x %.2x ].",
type, space, offset, type, space, offset,
page[offset + 0 + MAGIC_SZ], page[offset + 0 + MAGIC_SZ],
page[offset + 1 + MAGIC_SZ], page[offset + 1 + MAGIC_SZ],
@ -403,10 +430,10 @@ fil_space_read_crypt_data(ulint space, const byte* page, ulint offset)
ulint iv_length = mach_read_from_1(page + offset + MAGIC_SZ + 1); ulint iv_length = mach_read_from_1(page + offset + MAGIC_SZ + 1);
if (! (iv_length == CRYPT_SCHEME_1_IV_LEN)) { if (! (iv_length == CRYPT_SCHEME_1_IV_LEN)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"Found non sensible iv length: %lu for space %lu " "Found non sensible iv length: %lu for space %lu "
" offset: %lu type: %lu bytes: " " offset: %lu type: %lu bytes: "
"[ %.2x %.2x %.2x %.2x %.2x %.2x ]\n", "[ %.2x %.2x %.2x %.2x %.2x %.2x ].",
iv_length, space, offset, type, iv_length, space, offset, type,
page[offset + 0 + MAGIC_SZ], page[offset + 0 + MAGIC_SZ],
page[offset + 1 + MAGIC_SZ], page[offset + 1 + MAGIC_SZ],
@ -1414,8 +1441,8 @@ fil_crypt_realloc_iops(rotate_thread_t *state)
state->sum_waited_us / state->cnt_waited; state->sum_waited_us / state->cnt_waited;
#if DEBUG_KEYROTATION_THROTTLING #if DEBUG_KEYROTATION_THROTTLING
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"thr_no: %u - update estimated_max_iops from %u to %u\n", "thr_no: %u - update estimated_max_iops from %u to %u.",
state->thread_no, state->thread_no,
state->estimated_max_iops, state->estimated_max_iops,
1000000 / avg_wait_time_us); 1000000 / avg_wait_time_us);
@ -1428,8 +1455,8 @@ fil_crypt_realloc_iops(rotate_thread_t *state)
state->sum_waited_us = 0; state->sum_waited_us = 0;
} else { } else {
#if DEBUG_KEYROTATION_THROTTLING #if DEBUG_KEYROTATION_THROTTLING
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"thr_no: %u only waited %lu%% skip re-estimate\n", "thr_no: %u only waited %lu%% skip re-estimate.",
state->thread_no, state->thread_no,
(100 * state->cnt_waited) / state->batch); (100 * state->cnt_waited) / state->batch);
#endif #endif
@ -1477,8 +1504,8 @@ fil_crypt_realloc_iops(rotate_thread_t *state)
n_fil_crypt_iops_allocated += extra; n_fil_crypt_iops_allocated += extra;
state->allocated_iops += extra; state->allocated_iops += extra;
#if DEBUG_KEYROTATION_THROTTLING #if DEBUG_KEYROTATION_THROTTLING
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"thr_no: %u increased iops from %u to %u\n", "thr_no: %u increased iops from %u to %u.",
state->thread_no, state->thread_no,
state->allocated_iops - extra, state->allocated_iops - extra,
state->allocated_iops); state->allocated_iops);
@ -2325,9 +2352,8 @@ fil_space_crypt_close_tablespace(
uint now = time(0); uint now = time(0);
if (now >= last + 30) { if (now >= last + 30) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"WARNING: " "Waited %u seconds to drop space: %lu.",
"waited %u seconds to drop space: %lu\n",
now - start, space); now - start, space);
last = now; last = now;
} }

View File

@ -47,6 +47,7 @@ Updated 14/02/2015
#include "page0zip.h" #include "page0zip.h"
#include "trx0sys.h" #include "trx0sys.h"
#include "row0mysql.h" #include "row0mysql.h"
#include "ha_prototypes.h" // IB_LOG_
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
# include "buf0lru.h" # include "buf0lru.h"
# include "ibuf0ibuf.h" # include "ibuf0ibuf.h"
@ -117,9 +118,9 @@ fil_decompress_page_2(
if (original_len < UNIV_PAGE_SIZE_MIN - (FIL_PAGE_DATA + 8) if (original_len < UNIV_PAGE_SIZE_MIN - (FIL_PAGE_DATA + 8)
|| original_len > UNIV_PAGE_SIZE_MAX - FIL_PAGE_DATA || original_len > UNIV_PAGE_SIZE_MAX - FIL_PAGE_DATA
|| len < original_len + FIL_PAGE_DATA) { || len < original_len + FIL_PAGE_DATA) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: We try to uncompress corrupted page\n" "Corruption: We try to uncompress corrupted page. "
"InnoDB: Original len %lu len %lu.\n", "Original len %lu len %lu.",
original_len, len); original_len, len);
fflush(stderr); fflush(stderr);
@ -132,16 +133,15 @@ fil_decompress_page_2(
switch(algorithm) { switch(algorithm) {
case PAGE_ZLIB_ALGORITHM: { case PAGE_ZLIB_ALGORITHM: {
fprintf(stderr, "InnoDB: [Note]: zlib\n");
err = uncompress(page_buf, &len, ptr, original_len); err = uncompress(page_buf, &len, ptr, original_len);
/* If uncompress fails it means that page is corrupted */ /* If uncompress fails it means that page is corrupted */
if (err != Z_OK) { if (err != Z_OK) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed "
"InnoDB: but uncompress failed with error %d.\n" "but uncompress failed with error %d "
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
err, original_len, len); err, original_len, len);
fflush(stderr); fflush(stderr);
@ -153,15 +153,15 @@ fil_decompress_page_2(
} }
#ifdef HAVE_LZ4 #ifdef HAVE_LZ4
case PAGE_LZ4_ALGORITHM: { case PAGE_LZ4_ALGORITHM: {
fprintf(stderr, "InnoDB: [Note]: lz4\n");
err = LZ4_decompress_fast( err = LZ4_decompress_fast(
(const char*) ptr, (char*) (page_buf), original_len); (const char*) ptr, (char*) (page_buf), original_len);
if (err < 0) { if (err < 0) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %d bytes.\n" " but decompression read only %d bytes"
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
err, original_len, len); err, original_len, len);
fflush(stderr); fflush(stderr);
@ -179,7 +179,6 @@ fil_decompress_page_2(
size_t dst_pos = 0; size_t dst_pos = 0;
uint64_t memlimit = UINT64_MAX; uint64_t memlimit = UINT64_MAX;
fprintf(stderr, "InnoDB: [Note]: lzma\n");
ret = lzma_stream_buffer_decode( ret = lzma_stream_buffer_decode(
&memlimit, &memlimit,
0, 0,
@ -193,10 +192,10 @@ fil_decompress_page_2(
if (ret != LZMA_OK || (dst_pos <= 0 || dst_pos > len)) { if (ret != LZMA_OK || (dst_pos <= 0 || dst_pos > len)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %ld bytes.\n" " but decompression read only %ld bytes"
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
dst_pos, original_len, len); dst_pos, original_len, len);
fflush(stderr); fflush(stderr);
@ -210,16 +209,17 @@ fil_decompress_page_2(
#ifdef HAVE_LZO #ifdef HAVE_LZO
case PAGE_LZO_ALGORITHM: { case PAGE_LZO_ALGORITHM: {
ulint olen = 0; ulint olen = 0;
fprintf(stderr, "InnoDB: [Note]: lzo \n");
err = lzo1x_decompress((const unsigned char *)ptr, err = lzo1x_decompress((const unsigned char *)ptr,
original_len,(unsigned char *)(page_buf), &olen, NULL); original_len,(unsigned char *)(page_buf), &olen, NULL);
if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) { if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %ld bytes.\n" " but decompression read only %ld bytes"
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
olen, original_len, len); olen, original_len, len);
fflush(stderr); fflush(stderr);
ut_error; ut_error;
@ -229,10 +229,10 @@ fil_decompress_page_2(
#endif /* HAVE_LZO */ #endif /* HAVE_LZO */
default: default:
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" " Corruption: Page is marked as compressed "
"InnoDB: but compression algorithm %s\n" " but compression algorithm %s"
"InnoDB: is not known.\n" " is not known."
,fil_get_compression_alg_name(algorithm)); ,fil_get_compression_alg_name(algorithm));
fflush(stderr); fflush(stderr);
@ -296,8 +296,6 @@ fil_compress_page(
return (buf); return (buf);
} }
fprintf(stderr, "JAN: orig_page_type %lu\n", orig_page_type);
level = compression_level; level = compression_level;
ut_ad(fil_space_is_page_compressed(space_id)); ut_ad(fil_space_is_page_compressed(space_id));
@ -312,8 +310,8 @@ fil_compress_page(
} }
#ifdef UNIV_PAGECOMPRESS_DEBUG #ifdef UNIV_PAGECOMPRESS_DEBUG
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"InnoDB: Note: Preparing for compress for space %lu name %s len %lu\n", "Preparing for compress for space %lu name %s len %lu.",
space_id, fil_space_name(space), len); space_id, fil_space_name(space), len);
#endif /* UNIV_PAGECOMPRESS_DEBUG */ #endif /* UNIV_PAGECOMPRESS_DEBUG */
@ -330,8 +328,8 @@ fil_compress_page(
/* If error we leave the actual page as it was */ /* If error we leave the actual page as it was */
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu rt %d write %lu\n", "Compression failed for space %lu name %s len %lu rt %d write %lu.",
space_id, fil_space_name(space), len, err, write_size); space_id, fil_space_name(space), len, err, write_size);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -349,8 +347,8 @@ fil_compress_page(
if (err != LZO_E_OK || write_size > UNIV_PAGE_SIZE-header_len) { if (err != LZO_E_OK || write_size > UNIV_PAGE_SIZE-header_len) {
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu err %d write_size %lu\n", "Compression failed for space %lu name %s len %lu err %d write_size %lu.",
space_id, fil_space_name(space), len, err, write_size); space_id, fil_space_name(space), len, err, write_size);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -377,8 +375,8 @@ fil_compress_page(
if (err != LZMA_OK || out_pos > UNIV_PAGE_SIZE-header_len) { if (err != LZMA_OK || out_pos > UNIV_PAGE_SIZE-header_len) {
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu err %d write_size %lu\n", "Compression failed for space %lu name %s len %lu err %d write_size %lu",
space_id, fil_space_name(space), len, err, out_pos); space_id, fil_space_name(space), len, err, out_pos);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -407,8 +405,8 @@ fil_compress_page(
if (err != BZ_OK || write_size > UNIV_PAGE_SIZE-header_len) { if (err != BZ_OK || write_size > UNIV_PAGE_SIZE-header_len) {
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu err %d write_size %lu\n", "Compression failed for space %lu name %s len %lu err %d write_size %lu.",
space_id, fil_space_name(space), len, err, write_size); space_id, fil_space_name(space), len, err, write_size);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -429,8 +427,8 @@ fil_compress_page(
if (cstatus != SNAPPY_OK || write_size > UNIV_PAGE_SIZE-header_len) { if (cstatus != SNAPPY_OK || write_size > UNIV_PAGE_SIZE-header_len) {
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu err %d write_size %lu\n", "Compression failed for space %lu name %s len %lu err %d write_size %lu.",
space_id, fil_space_name(space), len, (int)cstatus, write_size); space_id, fil_space_name(space), len, (int)cstatus, write_size);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -449,8 +447,8 @@ fil_compress_page(
/* If error we leave the actual page as it was */ /* If error we leave the actual page as it was */
if (space->printed_compression_failure == false) { if (space->printed_compression_failure == false) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_WARN,
"InnoDB: Warning: Compression failed for space %lu name %s len %lu rt %d write %lu\n", "Compression failed for space %lu name %s len %lu rt %d write %lu.",
space_id, fil_space_name(space), len, err, write_size); space_id, fil_space_name(space), len, err, write_size);
space->printed_compression_failure = true; space->printed_compression_failure = true;
} }
@ -523,8 +521,8 @@ fil_compress_page(
} }
#ifdef UNIV_PAGECOMPRESS_DEBUG #ifdef UNIV_PAGECOMPRESS_DEBUG
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"InnoDB: Note: Compression succeeded for space %lu name %s len %lu out_len %lu\n", "Compression succeeded for space %lu name %s len %lu out_len %lu.",
space_id, fil_space_name(space), len, write_size); space_id, fil_space_name(space), len, write_size);
#endif /* UNIV_PAGECOMPRESS_DEBUG */ #endif /* UNIV_PAGECOMPRESS_DEBUG */
@ -574,10 +572,6 @@ fil_decompress_page(
// If no buffer was given, we need to allocate temporal buffer // If no buffer was given, we need to allocate temporal buffer
if (page_buf == NULL) { if (page_buf == NULL) {
#ifdef UNIV_PAGECOMPRESS_DEBUG
fprintf(stderr,
"InnoDB: Note: FIL: Compression buffer not given, allocating...\n");
#endif /* UNIV_PAGECOMPRESS_DEBUG */
in_buf = static_cast<byte *>(ut_malloc(UNIV_PAGE_SIZE*3)); in_buf = static_cast<byte *>(ut_malloc(UNIV_PAGE_SIZE*3));
} else { } else {
in_buf = page_buf; in_buf = page_buf;
@ -597,10 +591,9 @@ fil_decompress_page(
if (mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM) != BUF_NO_CHECKSUM_MAGIC || if (mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM) != BUF_NO_CHECKSUM_MAGIC ||
mach_read_from_2(buf+FIL_PAGE_TYPE) != FIL_PAGE_PAGE_COMPRESSED) { mach_read_from_2(buf+FIL_PAGE_TYPE) != FIL_PAGE_PAGE_COMPRESSED) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: We try to uncompress corrupted page\n" "Corruption: We try to uncompress corrupted page"
"InnoDB: CRC %lu type %lu.\n" " CRC %lu type %lu len %lu.",
"InnoDB: len %lu\n",
mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM), mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM),
mach_read_from_2(buf+FIL_PAGE_TYPE), len); mach_read_from_2(buf+FIL_PAGE_TYPE), len);
@ -615,9 +608,9 @@ fil_decompress_page(
actual_size = mach_read_from_2(buf+FIL_PAGE_DATA); actual_size = mach_read_from_2(buf+FIL_PAGE_DATA);
/* Check if payload size is corrupted */ /* Check if payload size is corrupted */
if (actual_size == 0 || actual_size > UNIV_PAGE_SIZE) { if (actual_size == 0 || actual_size > UNIV_PAGE_SIZE) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: We try to uncompress corrupted page\n" "Corruption: We try to uncompress corrupted page"
"InnoDB: actual size %lu compression %s\n", " actual size %lu compression %s.",
actual_size, fil_get_compression_alg_name(compression_alg)); actual_size, fil_get_compression_alg_name(compression_alg));
fflush(stderr); fflush(stderr);
ut_error; ut_error;
@ -630,8 +623,8 @@ fil_decompress_page(
} }
#ifdef UNIV_PAGECOMPRESS_DEBUG #ifdef UNIV_PAGECOMPRESS_DEBUG
fprintf(stderr, ib_logf(IB_LOG_LEVEL_INFO,
"InnoDB: Note: Preparing for decompress for len %lu\n", "Preparing for decompress for len %lu\n",
actual_size); actual_size);
#endif /* UNIV_PAGECOMPRESS_DEBUG */ #endif /* UNIV_PAGECOMPRESS_DEBUG */
@ -643,10 +636,10 @@ fil_decompress_page(
/* If uncompress fails it means that page is corrupted */ /* If uncompress fails it means that page is corrupted */
if (err != Z_OK) { if (err != Z_OK) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but uncompress failed with error %d.\n" " but uncompress failed with error %d "
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
err, actual_size, len); err, actual_size, len);
fflush(stderr); fflush(stderr);
@ -660,10 +653,10 @@ fil_decompress_page(
err = LZ4_decompress_fast((const char *)buf+FIL_PAGE_DATA+FIL_PAGE_COMPRESSED_SIZE, (char *)in_buf, len); err = LZ4_decompress_fast((const char *)buf+FIL_PAGE_DATA+FIL_PAGE_COMPRESSED_SIZE, (char *)in_buf, len);
if (err != (int)actual_size) { if (err != (int)actual_size) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %d bytes.\n" " but decompression read only %d bytes "
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
err, actual_size, len); err, actual_size, len);
fflush(stderr); fflush(stderr);
@ -678,10 +671,10 @@ fil_decompress_page(
actual_size,(unsigned char *)in_buf, &olen, NULL); actual_size,(unsigned char *)in_buf, &olen, NULL);
if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) { if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %ld bytes.\n" " but decompression read only %ld bytes"
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
olen, actual_size, len); olen, actual_size, len);
fflush(stderr); fflush(stderr);
@ -711,10 +704,10 @@ fil_decompress_page(
if (ret != LZMA_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) { if (ret != LZMA_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %ld bytes.\n" " but decompression read only %ld bytes"
"InnoDB: size %lu len %lu\n", " size %lu len %lu.",
dst_pos, actual_size, len); dst_pos, actual_size, len);
fflush(stderr); fflush(stderr);
@ -737,10 +730,10 @@ fil_decompress_page(
0); 0);
if (err != BZ_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) { if (err != BZ_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %du bytes.\n" " but decompression read only %du bytes"
"InnoDB: size %lu len %lu err %d\n", " size %lu len %lu err %d.",
dst_pos, actual_size, len, err); dst_pos, actual_size, len, err);
fflush(stderr); fflush(stderr);
@ -762,10 +755,10 @@ fil_decompress_page(
&olen); &olen);
if (cstatus != SNAPPY_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) { if (cstatus != SNAPPY_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but decompression read only %lu bytes.\n" " but decompression read only %lu bytes"
"InnoDB: size %lu len %lu err %d\n", " size %lu len %lu err %d.",
olen, actual_size, len, (int)cstatus); olen, actual_size, len, (int)cstatus);
fflush(stderr); fflush(stderr);
@ -775,10 +768,10 @@ fil_decompress_page(
} }
#endif /* HAVE_SNAPPY */ #endif /* HAVE_SNAPPY */
default: default:
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"InnoDB: Corruption: Page is marked as compressed\n" "Corruption: Page is marked as compressed"
"InnoDB: but compression algorithm %s\n" " but compression algorithm %s"
"InnoDB: is not known.\n" " is not known."
,fil_get_compression_alg_name(compression_alg)); ,fil_get_compression_alg_name(compression_alg));
fflush(stderr); fflush(stderr);
@ -786,12 +779,6 @@ fil_decompress_page(
break; break;
} }
#ifdef UNIV_PAGECOMPRESS_DEBUG
fprintf(stderr,
"InnoDB: Note: Decompression succeeded for len %lu \n",
len);
#endif /* UNIV_PAGECOMPRESS_DEBUG */
srv_stats.pages_page_decompressed.inc(); srv_stats.pages_page_decompressed.inc();
/* Copy the uncompressed page to the buffer pool, not /* Copy the uncompressed page to the buffer pool, not

View File

@ -1,8 +1,27 @@
/*****************************************************************************
Copyright (C) 2013, 2015, Google Inc. All Rights Reserved.
Copyright (C) 2014, 2015, MariaDB Corporation. All Rights Reserved.
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
Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
/**************************************************//** /**************************************************//**
@file log0crypt.cc @file log0crypt.cc
Innodb log encrypt/decrypt Innodb log encrypt/decrypt
Created 11/25/2013 Minli Zhu Created 11/25/2013 Minli Zhu Google
Modified Jan Lindström jan.lindstrom@mariadb.com
*******************************************************/ *******************************************************/
#include "m_string.h" #include "m_string.h"
#include "log0crypt.h" #include "log0crypt.h"
@ -14,6 +33,7 @@ Created 11/25/2013 Minli Zhu
#include "log0recv.h" // for recv_sys #include "log0recv.h" // for recv_sys
#include "mysql/plugin_encryption_key_management.h" // for BAD_ENCRYPTION_KEY_VERSION #include "mysql/plugin_encryption_key_management.h" // for BAD_ENCRYPTION_KEY_VERSION
#include "ha_prototypes.h" // IB_LOG_
/* If true, enable redo log encryption. */ /* If true, enable redo log encryption. */
UNIV_INTERN my_bool srv_encrypt_log = FALSE; UNIV_INTERN my_bool srv_encrypt_log = FALSE;
@ -52,18 +72,18 @@ log_init_crypt_msg_and_nonce(void)
mach_write_to_1(redo_log_crypt_msg, redo_log_purpose_byte); mach_write_to_1(redo_log_crypt_msg, redo_log_purpose_byte);
if (my_random_bytes(redo_log_crypt_msg + 1, PURPOSE_BYTE_LEN) != AES_OK) if (my_random_bytes(redo_log_crypt_msg + 1, PURPOSE_BYTE_LEN) != AES_OK)
{ {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"\nInnoDB redo log crypto: generate " "Redo log crypto: generate "
"%u-byte random number as crypto msg failed.\n", "%u-byte random number as crypto msg failed.",
PURPOSE_BYTE_LEN); PURPOSE_BYTE_LEN);
abort(); abort();
} }
if (my_random_bytes(aes_ctr_nonce, MY_AES_BLOCK_SIZE) != AES_OK) if (my_random_bytes(aes_ctr_nonce, MY_AES_BLOCK_SIZE) != AES_OK)
{ {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"\nInnoDB redo log crypto: generate " "Redo log crypto: generate "
"%u-byte random number as AES_CTR nonce failed.\n", "%u-byte random number as AES_CTR nonce failed.",
MY_AES_BLOCK_SIZE); MY_AES_BLOCK_SIZE);
abort(); abort();
} }
@ -81,16 +101,17 @@ log_init_crypt_key(
{ {
if (crypt_ver == UNENCRYPTED_KEY_VER) if (crypt_ver == UNENCRYPTED_KEY_VER)
{ {
fprintf(stderr, "\nInnoDB redo log crypto: unencrypted key ver.\n\n"); ib_logf(IB_LOG_LEVEL_INFO,
"Redo log crypto: unencrypted key ver.");
memset(key, 0, MY_AES_BLOCK_SIZE); memset(key, 0, MY_AES_BLOCK_SIZE);
return; return;
} }
if (crypt_msg[PURPOSE_BYTE_OFFSET] != redo_log_purpose_byte) if (crypt_msg[PURPOSE_BYTE_OFFSET] != redo_log_purpose_byte)
{ {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"\nInnoDB redo log crypto: msg type mismatched. " "Redo log crypto: msg type mismatched. "
"Expected: %x; Actual: %x\n", "Expected: %x; Actual: %x.",
redo_log_purpose_byte, crypt_msg[PURPOSE_BYTE_OFFSET]); redo_log_purpose_byte, crypt_msg[PURPOSE_BYTE_OFFSET]);
abort(); abort();
} }
@ -98,9 +119,9 @@ log_init_crypt_key(
byte mysqld_key[MY_AES_BLOCK_SIZE] = {0}; byte mysqld_key[MY_AES_BLOCK_SIZE] = {0};
if (get_encryption_key(crypt_ver, mysqld_key, MY_AES_BLOCK_SIZE)) if (get_encryption_key(crypt_ver, mysqld_key, MY_AES_BLOCK_SIZE))
{ {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"\nInnoDB redo log crypto: getting mysqld crypto key " "Redo log crypto: getting mysqld crypto key "
"from key version failed.\n"); "from key version failed.");
abort(); abort();
} }
@ -114,9 +135,9 @@ log_init_crypt_key(
if (rc != AES_OK || dst_len != MY_AES_BLOCK_SIZE) if (rc != AES_OK || dst_len != MY_AES_BLOCK_SIZE)
{ {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_ERROR,
"\nInnoDB redo log crypto: getting redo log crypto key " "Redo log crypto: getting redo log crypto key "
"failed.\n"); "failed.");
abort(); abort();
} }
} }
@ -248,9 +269,11 @@ log_crypt_set_ver_and_key(
vkey == (unsigned int)CRYPT_KEY_UNKNOWN) { vkey == (unsigned int)CRYPT_KEY_UNKNOWN) {
encrypted = false; encrypted = false;
fprintf(stderr, "\nInnoDB redo log crypto: Can't initialize to key version %du\n", ib_logf(IB_LOG_LEVEL_WARN,
key_ver); "Redo log crypto: Can't initialize to key version %du.", vkey);
fprintf(stderr, "InnoDB: Warning: Disabling redo log encryption\n"); ib_logf(IB_LOG_LEVEL_WARN,
"Disabling redo log encryption.");
srv_encrypt_log = FALSE; srv_encrypt_log = FALSE;
} else { } else {
key_ver = vkey; key_ver = vkey;