1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

Merge 10.1 into 10.2

This commit is contained in:
Marko Mäkelä
2016-12-30 08:56:13 +02:00
23 changed files with 415 additions and 176 deletions

View File

@ -8041,6 +8041,16 @@ end |
ERROR 0A000: Not allowed to return a result set from a function ERROR 0A000: Not allowed to return a result set from a function
drop table t1,t2; drop table t1,t2;
# #
# MDEV-11584: GRANT inside an SP does not work well on 2nd execution
#
CREATE PROCEDURE sp1()
GRANT ALL PRIVILEGES ON *.* TO 'foo'@'%' IDENTIFIED BY 'pass';
CALL sp1();
CALL sp1();
drop user 'foo'@'%';
drop procedure sp1;
#End of 10.1 tests
#
# MDEV-11081: CURSOR for query with GROUP BY # MDEV-11081: CURSOR for query with GROUP BY
# #
CREATE TABLE t1 (name VARCHAR(10), value INT); CREATE TABLE t1 (name VARCHAR(10), value INT);
@ -8079,12 +8089,3 @@ v_name v_total
c 1 c 1
DROP PROCEDURE p1; DROP PROCEDURE p1;
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-11584: GRANT inside an SP does not work well on 2nd execution
#
CREATE PROCEDURE sp1()
GRANT ALL PRIVILEGES ON *.* TO 'foo'@'%' IDENTIFIED BY 'pass';
CALL sp1();
CALL sp1();
drop user 'foo'@'%';
drop procedure sp1;

View File

@ -0,0 +1,105 @@
call mtr.add_suppression("InnoDB: Table .* tablespace is set as discarded");
SET GLOBAL innodb_file_format = `Barracuda`;
SET GLOBAL innodb_file_per_table = ON;
SET GLOBAL innodb_compression_algorithm = 1;
create table t1(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb encrypted=yes encryption_key_id=4;
create table t2(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb encrypted=yes encryption_key_id=1;
create table t3(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb page_compressed=yes;
create table t4(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb page_compressed=yes encrypted=yes encryption_key_id=4;
create table t5(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb;
insert into t1 values (NULL, 'verysecretmessage');
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t2 select * from t1;
insert into t3 select * from t1;
insert into t4 select * from t1;
insert into t5 select * from t1;
FLUSH TABLE t1,t2,t3,t4,t5 FOR EXPORT;
backup: t1
backup: t2
backup: t3
backup: t4
backup: t5
t1.cfg
t1.frm
t1.ibd
t2.cfg
t2.frm
t2.ibd
t3.cfg
t3.frm
t3.ibd
t4.cfg
t4.frm
t4.ibd
t5.cfg
t5.frm
t5.ibd
UNLOCK TABLES;
ALTER TABLE t1 DISCARD TABLESPACE;
ALTER TABLE t2 DISCARD TABLESPACE;
ALTER TABLE t3 DISCARD TABLESPACE;
ALTER TABLE t4 DISCARD TABLESPACE;
ALTER TABLE t5 DISCARD TABLESPACE;
DROP TABLE t1;
DROP TABLE t3;
DROP TABLE t4;
DROP TABLE t5;
create table t6(a int) engine=innodb;
create table t5(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb;
create table t3(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb page_compressed=yes;
create table t1(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb encrypted=yes encryption_key_id=4;
create table t4(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb page_compressed=yes encrypted=yes encryption_key_id=4;
ALTER TABLE t1 DISCARD TABLESPACE;
ALTER TABLE t3 DISCARD TABLESPACE;
ALTER TABLE t4 DISCARD TABLESPACE;
ALTER TABLE t5 DISCARD TABLESPACE;
restore: t1 .ibd and .cfg files
restore: t2 .ibd and .cfg files
restore: t3 .ibd and .cfg files
restore: t4 .ibd and .cfg files
restore: t5 .ibd and .cfg files
ALTER TABLE t1 IMPORT TABLESPACE;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` bigint(20) NOT NULL AUTO_INCREMENT,
`b` char(200) DEFAULT NULL,
PRIMARY KEY (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=377 DEFAULT CHARSET=latin1 `encrypted`=yes `encryption_key_id`=4
SELECT COUNT(*) FROM t1;
COUNT(*)
256
ALTER TABLE t2 IMPORT TABLESPACE;
SELECT COUNT(*) FROM t2;
COUNT(*)
256
ALTER TABLE t3 IMPORT TABLESPACE;
SELECT COUNT(*) FROM t3;
COUNT(*)
256
ALTER TABLE t4 IMPORT TABLESPACE;
SELECT COUNT(*) FROM t4;
COUNT(*)
256
ALTER TABLE t5 IMPORT TABLESPACE;
SELECT COUNT(*) FROM t5;
COUNT(*)
256
# t1 encrypted expecting NOT FOUND
NOT FOUND /verysecretmessage/ in t1.ibd
# t2 encrypted expecting NOT FOUND
NOT FOUND /verysecretmessage/ in t2.ibd
# t3 page compressed expecting NOT FOUND
NOT FOUND /verysecretmessage/ in t3.ibd
# t4 page compressed and encrypted expecting NOT FOUND
NOT FOUND /verysecretmessage/ in t4.ibd
# t5 normal expecting FOUND
FOUND /verysecretmessage/ in t5.ibd
DROP TABLE t1,t2,t3,t4,t5,t6;

View File

@ -0,0 +1,131 @@
-- source include/have_innodb.inc
-- source include/have_file_key_management_plugin.inc
#
# MDEV-11656: 'Data structure corruption' IMPORT TABLESPACE doesn't work for encrypted InnoDB tables if space_id changed
#
call mtr.add_suppression("InnoDB: Table .* tablespace is set as discarded");
--disable_query_log
let $innodb_file_format_orig = `SELECT @@innodb_file_format`;
let $innodb_file_per_table_orig = `SELECT @@innodb_file_per_table`;
let $innodb_compression_algo = `SELECT @@innodb_compression_algorithm`;
--enable_query_log
--disable_warnings
SET GLOBAL innodb_file_format = `Barracuda`;
SET GLOBAL innodb_file_per_table = ON;
SET GLOBAL innodb_compression_algorithm = 1;
--enable_warnings
create table t1(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb encrypted=yes encryption_key_id=4;
create table t2(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb encrypted=yes encryption_key_id=1;
create table t3(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb page_compressed=yes;
create table t4(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb page_compressed=yes encrypted=yes encryption_key_id=4;
create table t5(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb;
insert into t1 values (NULL, 'verysecretmessage');
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t1(b) select b from t1;
insert into t2 select * from t1;
insert into t3 select * from t1;
insert into t4 select * from t1;
insert into t5 select * from t1;
let MYSQLD_DATADIR =`SELECT @@datadir`;
FLUSH TABLE t1,t2,t3,t4,t5 FOR EXPORT;
perl;
do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl";
ib_backup_tablespaces("test", "t1","t2","t3","t4","t5");
EOF
--list_files $MYSQLD_DATADIR/test
UNLOCK TABLES;
ALTER TABLE t1 DISCARD TABLESPACE;
ALTER TABLE t2 DISCARD TABLESPACE;
ALTER TABLE t3 DISCARD TABLESPACE;
ALTER TABLE t4 DISCARD TABLESPACE;
ALTER TABLE t5 DISCARD TABLESPACE;
#
# Now intentionally change space_id for t1,t3,t4,t5
#
DROP TABLE t1;
DROP TABLE t3;
DROP TABLE t4;
DROP TABLE t5;
create table t6(a int) engine=innodb;
create table t5(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb;
create table t3(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb page_compressed=yes;
create table t1(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb encrypted=yes encryption_key_id=4;
create table t4(c1 bigint not null primary key auto_increment, b char(200)) engine=innodb page_compressed=yes encrypted=yes encryption_key_id=4;
ALTER TABLE t1 DISCARD TABLESPACE;
ALTER TABLE t3 DISCARD TABLESPACE;
ALTER TABLE t4 DISCARD TABLESPACE;
ALTER TABLE t5 DISCARD TABLESPACE;
perl;
do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl";
ib_discard_tablespaces("test", "t1","t2","t3","t4","t5");
ib_restore_tablespaces("test", "t1","t2","t3","t4","t5");
EOF
ALTER TABLE t1 IMPORT TABLESPACE;
SHOW CREATE TABLE t1;
SELECT COUNT(*) FROM t1;
ALTER TABLE t2 IMPORT TABLESPACE;
SELECT COUNT(*) FROM t2;
ALTER TABLE t3 IMPORT TABLESPACE;
SELECT COUNT(*) FROM t3;
ALTER TABLE t4 IMPORT TABLESPACE;
SELECT COUNT(*) FROM t4;
ALTER TABLE t5 IMPORT TABLESPACE;
SELECT COUNT(*) FROM t5;
#
# Verify
#
--let $MYSQLD_TMPDIR = `SELECT @@tmpdir`
--let $MYSQLD_DATADIR = `SELECT @@datadir`
--let SEARCH_RANGE = 10000000
--let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd
--let t2_IBD = $MYSQLD_DATADIR/test/t2.ibd
--let t3_IBD = $MYSQLD_DATADIR/test/t3.ibd
--let t4_IBD = $MYSQLD_DATADIR/test/t4.ibd
--let t5_IBD = $MYSQLD_DATADIR/test/t5.ibd
--let SEARCH_PATTERN=verysecretmessage
--echo # t1 encrypted expecting NOT FOUND
-- let SEARCH_FILE=$t1_IBD
-- source include/search_pattern_in_file.inc
--echo # t2 encrypted expecting NOT FOUND
-- let SEARCH_FILE=$t2_IBD
-- source include/search_pattern_in_file.inc
--echo # t3 page compressed expecting NOT FOUND
-- let SEARCH_FILE=$t3_IBD
-- source include/search_pattern_in_file.inc
--echo # t4 page compressed and encrypted expecting NOT FOUND
-- let SEARCH_FILE=$t4_IBD
-- source include/search_pattern_in_file.inc
--echo # t5 normal expecting FOUND
-- let SEARCH_FILE=$t5_IBD
-- source include/search_pattern_in_file.inc
DROP TABLE t1,t2,t3,t4,t5,t6;
# reset system
--disable_warnings
--disable_query_log
EVAL SET GLOBAL innodb_file_per_table = $innodb_file_per_table_orig;
EVAL SET GLOBAL innodb_file_format = $innodb_file_format_orig;
EVAL SET GLOBAL innodb_compression_algorithm = $innodb_compression_algo;
--enable_query_log
--enable_warnings

View File

@ -9498,6 +9498,20 @@ end |
drop table t1,t2; drop table t1,t2;
--echo #
--echo # MDEV-11584: GRANT inside an SP does not work well on 2nd execution
--echo #
CREATE PROCEDURE sp1()
GRANT ALL PRIVILEGES ON *.* TO 'foo'@'%' IDENTIFIED BY 'pass';
CALL sp1();
CALL sp1();
drop user 'foo'@'%';
drop procedure sp1;
--echo #End of 10.1 tests
--echo # --echo #
--echo # MDEV-11081: CURSOR for query with GROUP BY --echo # MDEV-11081: CURSOR for query with GROUP BY
--echo # --echo #
@ -9534,15 +9548,3 @@ DELIMITER ;|
CALL p1(); CALL p1();
DROP PROCEDURE p1; DROP PROCEDURE p1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-11584: GRANT inside an SP does not work well on 2nd execution
--echo #
CREATE PROCEDURE sp1()
GRANT ALL PRIVILEGES ON *.* TO 'foo'@'%' IDENTIFIED BY 'pass';
CALL sp1();
CALL sp1();
drop user 'foo'@'%';
drop procedure sp1;

View File

@ -113,10 +113,6 @@ handle_new_error:
trx_rollback_for_mysql(trx); trx_rollback_for_mysql(trx);
break; break;
case DB_MUST_GET_MORE_FILE_SPACE:
ut_error;
case DB_CORRUPTION: case DB_CORRUPTION:
case DB_FOREIGN_EXCEED_MAX_CASCADE: case DB_FOREIGN_EXCEED_MAX_CASCADE:
break; break;

View File

@ -6330,11 +6330,13 @@ fil_iterate(
for (offset = iter.start; offset < iter.end; offset += n_bytes) { for (offset = iter.start; offset < iter.end; offset += n_bytes) {
byte* io_buffer = iter.io_buffer; byte* io_buffer = iter.io_buffer;
const bool row_compressed
= callback.get_page_size().is_compressed();
block->frame = io_buffer; block->frame = io_buffer;
if (callback.get_page_size().is_compressed()) { if (row_compressed) {
page_zip_des_init(&block->page.zip); page_zip_des_init(&block->page.zip);
page_zip_set_size(&block->page.zip, iter.page_size); page_zip_set_size(&block->page.zip, iter.page_size);
@ -6406,9 +6408,11 @@ fil_iterate(
bool decrypted = false; bool decrypted = false;
for (ulint i = 0; i < n_pages_read; ++i) { for (ulint i = 0; i < n_pages_read; ++i) {
ulint size = iter.page_size; ulint size = iter.page_size;
byte* src = (readptr + (i * size)); dberr_t err = DB_SUCCESS;
byte* dst = (io_buffer + (i * size)); byte* src = readptr + (i * size);
byte* dst = io_buffer + (i * size);
bool frame_changed = false;
ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE); ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE);
@ -6432,9 +6436,12 @@ fil_iterate(
if (decrypted) { if (decrypted) {
updated = true; updated = true;
} else if (!page_compressed
&& !row_compressed) {
block->frame = src;
frame_changed = true;
} else { } else {
/* TODO: remove unnecessary memcpy's */ memcpy(dst, src, size);
memcpy(dst, src, iter.page_size);
} }
} }
@ -6460,7 +6467,45 @@ fil_iterate(
buf_block_set_state(block, BUF_BLOCK_NOT_USED); buf_block_set_state(block, BUF_BLOCK_NOT_USED);
buf_block_set_state(block, BUF_BLOCK_READY_FOR_USE); buf_block_set_state(block, BUF_BLOCK_READY_FOR_USE);
src = (io_buffer + (i * size)); /* If tablespace is encrypted we use additional
temporary scratch area where pages are read
for decrypting readptr == crypt_io_buffer != io_buffer.
Destination for decryption is a buffer pool block
block->frame == dst == io_buffer that is updated.
Pages that did not require decryption even when
tablespace is marked as encrypted are not copied
instead block->frame is set to src == readptr.
For encryption we again use temporary scratch area
writeptr != io_buffer == dst
that is then written to the tablespace
(1) For normal tables io_buffer == dst == writeptr
(2) For only page compressed tables
io_buffer == dst == writeptr
(3) For encrypted (and page compressed)
readptr != io_buffer == dst != writeptr
*/
ut_ad(!encrypted && !page_compressed ?
src == dst && dst == writeptr + (i * size):1);
ut_ad(page_compressed && !encrypted ?
src == dst && dst == writeptr + (i * size):1);
ut_ad(encrypted ?
src != dst && dst != writeptr + (i * size):1);
if (encrypted) {
memcpy(writeptr + (i * size),
row_compressed ? block->page.zip.data :
block->frame, size);
}
if (frame_changed) {
block->frame = dst;
}
src = io_buffer + (i * size);
if (page_compressed) { if (page_compressed) {
ulint len = 0; ulint len = 0;
@ -6481,7 +6526,7 @@ fil_iterate(
write it back. Note that we should not encrypt the write it back. Note that we should not encrypt the
buffer that is in buffer pool. */ buffer that is in buffer pool. */
if (decrypted && encrypted) { if (decrypted && encrypted) {
unsigned char *dest = (writeptr + (i * size)); byte *dest = writeptr + (i * size);
ulint space = mach_read_from_4( ulint space = mach_read_from_4(
src + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); src + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
ulint offset = mach_read_from_4(src + FIL_PAGE_OFFSET); ulint offset = mach_read_from_4(src + FIL_PAGE_OFFSET);
@ -6706,16 +6751,22 @@ fil_tablespace_iterate(
iter.io_buffer = static_cast<byte*>( iter.io_buffer = static_cast<byte*>(
ut_align(io_buffer, UNIV_PAGE_SIZE)); ut_align(io_buffer, UNIV_PAGE_SIZE));
iter.crypt_io_buffer = iter.crypt_data void* crypt_io_buffer;
? static_cast<byte*>( if (iter.crypt_data) {
ut_malloc_nokey(iter.n_io_buffers crypt_io_buffer = static_cast<byte*>(
* UNIV_PAGE_SIZE)) ut_malloc_nokey((2 + iter.n_io_buffers)
: NULL; * UNIV_PAGE_SIZE));
iter.crypt_io_buffer = static_cast<byte*>(
ut_align(crypt_io_buffer,
UNIV_PAGE_SIZE));
} else {
crypt_io_buffer = NULL;
}
err = fil_iterate(iter, block, callback); err = fil_iterate(iter, block, callback);
ut_free(io_buffer); ut_free(io_buffer);
ut_free(iter.crypt_io_buffer); ut_free(crypt_io_buffer);
fil_space_destroy_crypt_data(&iter.crypt_data); fil_space_destroy_crypt_data(&iter.crypt_data);
} }

View File

@ -955,10 +955,6 @@ void
srv_purge_wakeup(void); srv_purge_wakeup(void);
/*==================*/ /*==================*/
/** Call exit(3) */
void
srv_fatal_error();
/** Check if tablespace is being truncated. /** Check if tablespace is being truncated.
(Ignore system-tablespace as we don't re-create the tablespace (Ignore system-tablespace as we don't re-create the tablespace
and so some of the action that are suppressed by this function and so some of the action that are suppressed by this function

View File

@ -41,7 +41,7 @@ struct dict_table_t;
fprintf(stderr, "innodb_force_recovery_crash=%lu\n", \ fprintf(stderr, "innodb_force_recovery_crash=%lu\n", \
srv_force_recovery_crash); \ srv_force_recovery_crash); \
fflush(stderr); \ fflush(stderr); \
_exit(3); \ abort(); \
} \ } \
} while (0) } while (0)
#endif /* DBUG_OFF */ #endif /* DBUG_OFF */

View File

@ -5910,22 +5910,18 @@ os_file_get_last_error(
return(os_file_get_last_error_low(report_all_errors, false)); return(os_file_get_last_error_low(report_all_errors, false));
} }
/** Does error handling when a file operation fails. /** Handle errors for file operations.
Conditionally exits (calling srv_fatal_error()) based on should_exit value
and the error type, if should_exit is true then on_error_silent is ignored.
@param[in] name name of a file or NULL @param[in] name name of a file or NULL
@param[in] operation operation @param[in] operation operation
@param[in] should_exit call srv_fatal_error() on an unknown error, @param[in] should_abort whether to abort on an unknown error
if this parameter is true @param[in] on_error_silent whether to suppress reports of non-fatal errors
@param[in] on_error_silent if true then don't print any message to the log
iff it is an unknown non-fatal error
@return true if we should retry the operation */ @return true if we should retry the operation */
static MY_ATTRIBUTE((warn_unused_result)) static MY_ATTRIBUTE((warn_unused_result))
bool bool
os_file_handle_error_cond_exit( os_file_handle_error_cond_exit(
const char* name, const char* name,
const char* operation, const char* operation,
bool should_exit, bool should_abort,
bool on_error_silent) bool on_error_silent)
{ {
ulint err; ulint err;
@ -5986,17 +5982,17 @@ os_file_handle_error_cond_exit(
is better to ignore on_error_silent and print an error message is better to ignore on_error_silent and print an error message
to the log. */ to the log. */
if (should_exit || !on_error_silent) { if (should_abort || !on_error_silent) {
ib::error() << "File " ib::error() << "File "
<< (name != NULL ? name : "(unknown)") << (name != NULL ? name : "(unknown)")
<< ": '" << operation << "'" << ": '" << operation << "'"
" returned OS error " << err << "." " returned OS error " << err << "."
<< (should_exit << (should_abort
? " Cannot continue operation" : ""); ? " Cannot continue operation" : "");
} }
if (should_exit) { if (should_abort) {
srv_fatal_error(); abort();
} }
} }

View File

@ -153,9 +153,7 @@ os_thread_create_func(
int ret = pthread_create(&new_thread_id, &attr, func, arg); int ret = pthread_create(&new_thread_id, &attr, func, arg);
if (ret != 0) { ut_a(ret == 0);
ib::fatal() << "pthread_create returned " << ret;
}
pthread_attr_destroy(&attr); pthread_attr_destroy(&attr);

View File

@ -3230,19 +3230,3 @@ srv_was_tablespace_truncated(const fil_space_t* space)
return(truncate_t::was_tablespace_truncated(space->id)); return(truncate_t::was_tablespace_truncated(space->id));
} }
/** Call exit(3) */
void
srv_fatal_error()
{
ib::error() << "Cannot continue operation.";
fflush(stderr);
ut_d(innodb_calling_exit = true);
srv_shutdown_all_bg_threads();
exit(3);
}

View File

@ -2221,21 +2221,8 @@ files_checked:
if (err == DB_SUCCESS) { if (err == DB_SUCCESS) {
/* Initialize the change buffer. */ /* Initialize the change buffer. */
err = dict_boot(); err = dict_boot();
} } else {
return(srv_init_abort(err));
if (err != DB_SUCCESS) {
/* A tablespace was not found during recovery. The
user must force recovery. */
if (err == DB_TABLESPACE_NOT_FOUND) {
srv_fatal_error();
ut_error;
}
return(srv_init_abort(DB_ERROR));
} }
purge_queue = trx_sys_init_at_db_start(); purge_queue = trx_sys_init_at_db_start();

View File

@ -184,10 +184,6 @@ handle_new_error:
trx_rollback_for_mysql(trx); trx_rollback_for_mysql(trx);
break; break;
case DB_MUST_GET_MORE_FILE_SPACE:
exit(1);
case DB_CORRUPTION: case DB_CORRUPTION:
case DB_FOREIGN_EXCEED_MAX_CASCADE: case DB_FOREIGN_EXCEED_MAX_CASCADE:
break; break;

View File

@ -224,12 +224,10 @@ start_again:
+ FSP_EXTENT_SIZE / 2 + 100) + FSP_EXTENT_SIZE / 2 + 100)
* UNIV_PAGE_SIZE)) { * UNIV_PAGE_SIZE)) {
ib_logf(IB_LOG_LEVEL_ERROR, ib_logf(IB_LOG_LEVEL_FATAL,
"Cannot create doublewrite buffer: you must " "Cannot create doublewrite buffer: you must "
"increase your buffer pool size. Cannot continue " "increase your buffer pool size. Cannot continue "
"operation."); "operation.");
exit(EXIT_FAILURE);
} }
block2 = fseg_create(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, block2 = fseg_create(TRX_SYS_SPACE, TRX_SYS_PAGE_NO,
@ -242,15 +240,10 @@ start_again:
buf_block_dbg_add_level(block2, SYNC_NO_ORDER_CHECK); buf_block_dbg_add_level(block2, SYNC_NO_ORDER_CHECK);
if (block2 == NULL) { if (block2 == NULL) {
ib_logf(IB_LOG_LEVEL_ERROR, ib_logf(IB_LOG_LEVEL_FATAL,
"Cannot create doublewrite buffer: you must " "Cannot create doublewrite buffer: you must "
"increase your tablespace size. " "increase your tablespace size. "
"Cannot continue operation."); "Cannot continue operation.");
/* We exit without committing the mtr to prevent
its modifications to the database getting to disk */
exit(EXIT_FAILURE);
} }
fseg_header = doublewrite + TRX_SYS_DOUBLEWRITE_FSEG; fseg_header = doublewrite + TRX_SYS_DOUBLEWRITE_FSEG;
@ -261,12 +254,10 @@ start_again:
new_block = fseg_alloc_free_page( new_block = fseg_alloc_free_page(
fseg_header, prev_page_no + 1, FSP_UP, &mtr); fseg_header, prev_page_no + 1, FSP_UP, &mtr);
if (new_block == NULL) { if (new_block == NULL) {
ib_logf(IB_LOG_LEVEL_ERROR, ib_logf(IB_LOG_LEVEL_FATAL,
"Cannot create doublewrite buffer: you must " "Cannot create doublewrite buffer: you must "
"increase your tablespace size. " "increase your tablespace size. "
"Cannot continue operation."); "Cannot continue operation.");
exit(EXIT_FAILURE);
} }
/* We read the allocated pages to the buffer pool; /* We read the allocated pages to the buffer pool;

View File

@ -4618,7 +4618,7 @@ will_not_choose:
return; return;
} }
exit(1); abort();
} }
if (def.success && remote.success) { if (def.success && remote.success) {
@ -6594,6 +6594,7 @@ fil_iterate(
for (offset = iter.start; offset < iter.end; offset += n_bytes) { for (offset = iter.start; offset < iter.end; offset += n_bytes) {
byte* io_buffer = iter.io_buffer; byte* io_buffer = iter.io_buffer;
bool row_compressed = false;
block->frame = io_buffer; block->frame = io_buffer;
@ -6606,6 +6607,7 @@ fil_iterate(
/* Zip IO is done in the compressed page buffer. */ /* Zip IO is done in the compressed page buffer. */
io_buffer = block->page.zip.data; io_buffer = block->page.zip.data;
row_compressed = true;
} else { } else {
io_buffer = iter.io_buffer; io_buffer = iter.io_buffer;
} }
@ -6646,8 +6648,9 @@ fil_iterate(
for (ulint i = 0; i < n_pages_read; ++i) { for (ulint i = 0; i < n_pages_read; ++i) {
ulint size = iter.page_size; ulint size = iter.page_size;
dberr_t err = DB_SUCCESS; dberr_t err = DB_SUCCESS;
byte* src = (readptr + (i * size)); byte* src = readptr + (i * size);
byte* dst = (io_buffer + (i * size)); byte* dst = io_buffer + (i * size);
bool frame_changed = false;
ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE); ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE);
@ -6671,8 +6674,12 @@ fil_iterate(
if (decrypted) { if (decrypted) {
updated = true; updated = true;
} else { } else {
/* TODO: remove unnecessary memcpy's */ if (!page_compressed && !row_compressed) {
memcpy(dst, src, size); block->frame = src;
frame_changed = true;
} else {
memcpy(dst, src, size);
}
} }
} }
@ -6697,7 +6704,45 @@ fil_iterate(
buf_block_set_state(block, BUF_BLOCK_NOT_USED); buf_block_set_state(block, BUF_BLOCK_NOT_USED);
buf_block_set_state(block, BUF_BLOCK_READY_FOR_USE); buf_block_set_state(block, BUF_BLOCK_READY_FOR_USE);
src = (io_buffer + (i * size)); /* If tablespace is encrypted we use additional
temporary scratch area where pages are read
for decrypting readptr == crypt_io_buffer != io_buffer.
Destination for decryption is a buffer pool block
block->frame == dst == io_buffer that is updated.
Pages that did not require decryption even when
tablespace is marked as encrypted are not copied
instead block->frame is set to src == readptr.
For encryption we again use temporary scratch area
writeptr != io_buffer == dst
that is then written to the tablespace
(1) For normal tables io_buffer == dst == writeptr
(2) For only page compressed tables
io_buffer == dst == writeptr
(3) For encrypted (and page compressed)
readptr != io_buffer == dst != writeptr
*/
ut_ad(!encrypted && !page_compressed ?
src == dst && dst == writeptr + (i * size):1);
ut_ad(page_compressed && !encrypted ?
src == dst && dst == writeptr + (i * size):1);
ut_ad(encrypted ?
src != dst && dst != writeptr + (i * size):1);
if (encrypted) {
memcpy(writeptr + (i * size),
row_compressed ? block->page.zip.data :
block->frame, size);
}
if (frame_changed) {
block->frame = dst;
}
src = io_buffer + (i * size);
if (page_compressed) { if (page_compressed) {
ulint len = 0; ulint len = 0;
@ -6718,7 +6763,7 @@ fil_iterate(
write it back. Note that we should not encrypt the write it back. Note that we should not encrypt the
buffer that is in buffer pool. */ buffer that is in buffer pool. */
if (decrypted && encrypted) { if (decrypted && encrypted) {
unsigned char *dest = (writeptr + (i * size)); byte *dest = writeptr + (i * size);
ulint space = mach_read_from_4( ulint space = mach_read_from_4(
src + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); src + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
ulint offset = mach_read_from_4(src + FIL_PAGE_OFFSET); ulint offset = mach_read_from_4(src + FIL_PAGE_OFFSET);
@ -6900,9 +6945,9 @@ fil_tablespace_iterate(
void* crypt_io_buffer = NULL; void* crypt_io_buffer = NULL;
if (iter.crypt_data != NULL) { if (iter.crypt_data != NULL) {
crypt_io_buffer = mem_alloc( crypt_io_buffer = mem_alloc(
iter.n_io_buffers * UNIV_PAGE_SIZE); (2 + iter.n_io_buffers) * UNIV_PAGE_SIZE);
iter.crypt_io_buffer = static_cast<byte*>( iter.crypt_io_buffer = static_cast<byte*>(
crypt_io_buffer); ut_align(crypt_io_buffer, UNIV_PAGE_SIZE));
} }
err = fil_iterate(iter, &block, callback); err = fil_iterate(iter, &block, callback);

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2016, 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
@ -29,6 +30,8 @@ Created 2007/03/16/03 Sunny Bains
#include "mem0mem.h" #include "mem0mem.h"
#include "ha_prototypes.h" #include "ha_prototypes.h"
#define exit(x) abort()
/* The type of AST Node */ /* The type of AST Node */
enum fts_ast_type_t { enum fts_ast_type_t {
FTS_AST_OPER, /*!< Operator */ FTS_AST_OPER, /*!< Operator */

View File

@ -920,24 +920,10 @@ failure:
mutex_exit(&(log_sys->mutex)); mutex_exit(&(log_sys->mutex));
if (!success) { if (!success) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_FATAL,
"InnoDB: Error: ib_logfiles are too small" "The combined size of ib_logfiles"
" for innodb_thread_concurrency %lu.\n"
"InnoDB: The combined size of ib_logfiles"
" should be bigger than\n" " should be bigger than\n"
"InnoDB: 200 kB * innodb_thread_concurrency.\n" "InnoDB: 200 kB * innodb_thread_concurrency.");
"InnoDB: To get mysqld to start up, set"
" innodb_thread_concurrency in my.cnf\n"
"InnoDB: to a lower value, for example, to 8."
" After an ERROR-FREE shutdown\n"
"InnoDB: of mysqld you can adjust the size of"
" ib_logfiles, as explained in\n"
"InnoDB: " REFMAN "adding-and-removing.html\n"
"InnoDB: Cannot continue operation."
" Calling exit(1).\n",
(ulong) srv_thread_concurrency);
exit(1);
} }
return(success); return(success);
@ -2861,15 +2847,9 @@ loop:
} }
if (!ret) { if (!ret) {
fprintf(stderr, ib_logf(IB_LOG_LEVEL_FATAL,
"InnoDB: Cannot create or open" "InnoDB: Cannot create or open"
" archive log file %s.\n" " archive log file %s.\n", name);
"InnoDB: Cannot continue operation.\n"
"InnoDB: Check that the log archive"
" directory exists,\n"
"InnoDB: you have access rights to it, and\n"
"InnoDB: there is space available.\n", name);
exit(1);
} }
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG

View File

@ -1,6 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2011-2012 Percona Inc. All Rights Reserved. Copyright (c) 2011-2012 Percona Inc. All Rights Reserved.
Copyright (C) 2016, 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
@ -405,12 +406,11 @@ log_online_can_track_missing(
last_tracked_lsn = ut_max(last_tracked_lsn, MIN_TRACKED_LSN); last_tracked_lsn = ut_max(last_tracked_lsn, MIN_TRACKED_LSN);
if (last_tracked_lsn > tracking_start_lsn) { if (last_tracked_lsn > tracking_start_lsn) {
ib_logf(IB_LOG_LEVEL_ERROR, ib_logf(IB_LOG_LEVEL_FATAL,
"last tracked LSN " LSN_PF " is ahead of tracking " "last tracked LSN " LSN_PF " is ahead of tracking "
"start LSN " LSN_PF ". This can be caused by " "start LSN " LSN_PF ". This can be caused by "
"mismatched bitmap files.", "mismatched bitmap files.",
last_tracked_lsn, tracking_start_lsn); last_tracked_lsn, tracking_start_lsn);
exit(1);
} }
return (last_tracked_lsn == tracking_start_lsn) return (last_tracked_lsn == tracking_start_lsn)
@ -450,9 +450,7 @@ log_online_track_missing_on_startup(
log_bmp_sys->start_lsn = ut_max(last_tracked_lsn, log_bmp_sys->start_lsn = ut_max(last_tracked_lsn,
MIN_TRACKED_LSN); MIN_TRACKED_LSN);
log_set_tracked_lsn(log_bmp_sys->start_lsn); log_set_tracked_lsn(log_bmp_sys->start_lsn);
if (!log_online_follow_redo_log()) { ut_a(log_online_follow_redo_log());
exit(1);
}
ut_ad(log_bmp_sys->end_lsn >= tracking_start_lsn); ut_ad(log_bmp_sys->end_lsn >= tracking_start_lsn);
ib_logf(IB_LOG_LEVEL_INFO, ib_logf(IB_LOG_LEVEL_INFO,
@ -677,9 +675,8 @@ log_online_read_init(void)
if (os_file_closedir(bitmap_dir)) { if (os_file_closedir(bitmap_dir)) {
os_file_get_last_error(TRUE); os_file_get_last_error(TRUE);
ib_logf(IB_LOG_LEVEL_ERROR, "cannot close \'%s\'", ib_logf(IB_LOG_LEVEL_FATAL, "cannot close \'%s\'",
log_bmp_sys->bmp_file_home); log_bmp_sys->bmp_file_home);
exit(1);
} }
if (!log_bmp_sys->out_seq_num) { if (!log_bmp_sys->out_seq_num) {
@ -699,9 +696,7 @@ log_online_read_init(void)
if (!success) { if (!success) {
/* New file, tracking from scratch */ /* New file, tracking from scratch */
if (!log_online_start_bitmap_file()) { ut_a(log_online_start_bitmap_file());
exit(1);
}
} }
else { else {
@ -738,9 +733,7 @@ log_online_read_init(void)
} else { } else {
file_start_lsn = tracking_start_lsn; file_start_lsn = tracking_start_lsn;
} }
if (!log_online_rotate_bitmap_file(file_start_lsn)) { ut_a(log_online_rotate_bitmap_file(file_start_lsn));
exit(1);
}
if (last_tracked_lsn < tracking_start_lsn) { if (last_tracked_lsn < tracking_start_lsn) {

View File

@ -920,7 +920,7 @@ os_file_handle_error_cond_exit(
} }
if (should_exit) { if (should_exit) {
exit(1); abort();
} }
} }

View File

@ -192,11 +192,7 @@ os_thread_create_func(
#else #else
ret = pthread_create(&pthread, &attr, func, arg); ret = pthread_create(&pthread, &attr, func, arg);
#endif #endif
if (ret) { ut_a(ret == 0);
fprintf(stderr,
"InnoDB: Error: pthread_create returned %d\n", ret);
exit(1);
}
#ifndef UNIV_HPUX10 #ifndef UNIV_HPUX10
pthread_attr_destroy(&attr); pthread_attr_destroy(&attr);

View File

@ -1196,9 +1196,7 @@ handle_new_error:
"InnoDB: lack of space. You must add" "InnoDB: lack of space. You must add"
" a new data file to\n" " a new data file to\n"
"InnoDB: my.cnf and restart the database.\n", stderr); "InnoDB: my.cnf and restart the database.\n", stderr);
abort();
ut_ad(0);
exit(1);
case DB_CORRUPTION: case DB_CORRUPTION:
fputs("InnoDB: We detected index corruption" fputs("InnoDB: We detected index corruption"

View File

@ -363,8 +363,7 @@ row_undo_step(
"InnoDB: Out of tablespace.\n" "InnoDB: Out of tablespace.\n"
"InnoDB: Consider increasing" "InnoDB: Consider increasing"
" your tablespace.\n"); " your tablespace.\n");
abort();
exit(1);
} }
ut_error; ut_error;

View File

@ -630,7 +630,7 @@ create_log_file(
fprintf(stderr, "innodb_force_recovery_crash=%lu\n", \ fprintf(stderr, "innodb_force_recovery_crash=%lu\n", \
srv_force_recovery_crash); \ srv_force_recovery_crash); \
fflush(stderr); \ fflush(stderr); \
exit(3); \ abort(); \
} \ } \
} while (0) } while (0)
#endif #endif
@ -2948,16 +2948,7 @@ files_checked:
/* Check that os_fast_mutexes work as expected */ /* Check that os_fast_mutexes work as expected */
os_fast_mutex_init(PFS_NOT_INSTRUMENTED, &srv_os_test_mutex); os_fast_mutex_init(PFS_NOT_INSTRUMENTED, &srv_os_test_mutex);
if (0 != os_fast_mutex_trylock(&srv_os_test_mutex)) { ut_a(0 == os_fast_mutex_trylock(&srv_os_test_mutex));
ut_print_timestamp(stderr);
fprintf(stderr,
" InnoDB: Error: pthread_mutex_trylock returns"
" an unexpected value on\n");
ut_print_timestamp(stderr);
fprintf(stderr,
" InnoDB: success! Cannot continue.\n");
exit(1);
}
os_fast_mutex_unlock(&srv_os_test_mutex); os_fast_mutex_unlock(&srv_os_test_mutex);