Skip to content

Commit

Permalink
MDEV-11835: InnoDB: Failing assertion: free_slot != NULL on
Browse files Browse the repository at this point in the history
restarting server with encryption and read-only

buf0buf.cc: Temporary slots used in encryption was calculated
by read_threads * write_threads. However, in read-only mode
write_threads is zero. Correct way is to calculate
(read_threads + write_threads) * max pending IO requests.
  • Loading branch information
Jan Lindström committed Jan 19, 2017
1 parent a146385 commit dc557ca
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 2 deletions.
3 changes: 3 additions & 0 deletions mysql-test/suite/encryption/r/innodb-read-only.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Wait max 10 min for key encryption threads to encrypt all spaces
# Success!
# All done
3 changes: 3 additions & 0 deletions mysql-test/suite/encryption/t/innodb-read-only.opt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
--innodb-encrypt-tables=1
--innodb-encryption-threads=4
--innodb-tablespaces-encryption
34 changes: 34 additions & 0 deletions mysql-test/suite/encryption/t/innodb-read-only.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
--source suite/encryption/include/have_file_key_management_plugin.inc
--source include/have_innodb.inc
--source include/not_embedded.inc

--echo # Wait max 10 min for key encryption threads to encrypt all spaces
let $cnt=600;
while ($cnt)
{
let $success=`SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0`;
if ($success)
{
let $cnt=0;
}
if (!$success)
{
real_sleep 1;
dec $cnt;
}
}
if (!$success)
{
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION;
SHOW STATUS LIKE 'innodb_encryption%';
-- die Timeout waiting for encryption threads
}
--echo # Success!

#
# MDEV-11835: InnoDB: Failing assertion: free_slot != NULL on
# restarting server with encryption and read-only
#
--let $restart_parameters= --innodb-read-only=1 --innodb-encrypt-tables=1
--source include/restart_mysqld.inc
--echo # All done
2 changes: 1 addition & 1 deletion storage/innobase/buf/buf0buf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1508,7 +1508,7 @@ buf_pool_init_instance(

/* Initialize the temporal memory array and slots */
buf_pool->tmp_arr = (buf_tmp_array_t *)mem_zalloc(sizeof(buf_tmp_array_t));
ulint n_slots = srv_n_read_io_threads * srv_n_write_io_threads * (8 * OS_AIO_N_PENDING_IOS_PER_THREAD);
ulint n_slots = (srv_n_read_io_threads + srv_n_write_io_threads) * (8 * OS_AIO_N_PENDING_IOS_PER_THREAD);
buf_pool->tmp_arr->n_slots = n_slots;
buf_pool->tmp_arr->slots = (buf_tmp_buffer_t*)mem_zalloc(sizeof(buf_tmp_buffer_t) * n_slots);

Expand Down
2 changes: 1 addition & 1 deletion storage/xtradb/buf/buf0buf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1571,7 +1571,7 @@ buf_pool_init_instance(

/* Initialize the temporal memory array and slots */
buf_pool->tmp_arr = (buf_tmp_array_t *)mem_zalloc(sizeof(buf_tmp_array_t));
ulint n_slots = srv_n_read_io_threads * srv_n_write_io_threads * (8 * OS_AIO_N_PENDING_IOS_PER_THREAD);
ulint n_slots = (srv_n_read_io_threads + srv_n_write_io_threads) * (8 * OS_AIO_N_PENDING_IOS_PER_THREAD);
buf_pool->tmp_arr->n_slots = n_slots;
buf_pool->tmp_arr->slots = (buf_tmp_buffer_t*)mem_zalloc(sizeof(buf_tmp_buffer_t) * n_slots);

Expand Down

0 comments on commit dc557ca

Please sign in to comment.