Skip to content

Commit

Permalink
MDEV-25507 CHECK on encrypted Aria table complains about "Wrong LSN"
Browse files Browse the repository at this point in the history
This happens during repair when a temporary table is opened
with HA_OPEN_COPY, which resets 'share->born_transactional', which
the encryption code did not like.

Fixed by resetting just share->now_transactional.
  • Loading branch information
montywi committed Apr 30, 2021
1 parent 42cdc37 commit 25fa2a6
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 15 deletions.
18 changes: 16 additions & 2 deletions mysql-test/suite/encryption/r/aria_tiny.result
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
set global aria_encrypt_tables = 1;
SET @aria_encrypt= @@aria_encrypt_tables;
SET global aria_encrypt_tables=1;
create table t1 (i int, key(i)) engine=aria;
insert into t1 values (1);
drop table t1;
Expand All @@ -10,4 +11,17 @@ check table t1;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;
set global aria_encrypt_tables = 0;
#
# MDEV CHECK on encrypted Aria table complains about "Wrong LSN"
#
CREATE TABLE t1 (f DATE PRIMARY KEY) ENGINE=Aria;
INSERT INTO t1 (f) VALUES ('1995-01-01'),('2000-01-01');
DELETE FROM t1 WHERE f = '2000-01-01';
OPTIMIZE TABLE t1;
Table Op Msg_type Msg_text
test.t1 optimize status OK
CHECK TABLE t1 EXTENDED;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
set global aria_encrypt_tables=@aria_encrypt;
17 changes: 15 additions & 2 deletions mysql-test/suite/encryption/t/aria_tiny.test
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
--source include/have_file_key_management_plugin.inc
--source include/have_sequence.inc

SET @aria_encrypt= @@aria_encrypt_tables;
SET global aria_encrypt_tables=1;
#
# MDEV-8022 Assertion `rc == 0' failed in ma_encrypt on dropping an encrypted Aria table
#
set global aria_encrypt_tables = 1;

create table t1 (i int, key(i)) engine=aria;
insert into t1 values (1);
drop table t1;
Expand All @@ -24,7 +26,18 @@ alter table t1 enable keys;
check table t1;
drop table t1;

--echo #
--echo # MDEV CHECK on encrypted Aria table complains about "Wrong LSN"
--echo #

CREATE TABLE t1 (f DATE PRIMARY KEY) ENGINE=Aria;
INSERT INTO t1 (f) VALUES ('1995-01-01'),('2000-01-01');
DELETE FROM t1 WHERE f = '2000-01-01';
OPTIMIZE TABLE t1;
CHECK TABLE t1 EXTENDED;
DROP TABLE t1;

#
# Cleanup
#
set global aria_encrypt_tables = 0;
set global aria_encrypt_tables=@aria_encrypt;
3 changes: 2 additions & 1 deletion storage/maria/ma_close.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,8 @@ int maria_close(register MARIA_HA *info)
mysql_rwlock_destroy(&share->keyinfo[i].root_lock);
}
}
DBUG_ASSERT(share->now_transactional == share->base.born_transactional);
DBUG_ASSERT(share->now_transactional == share->base.born_transactional ||
share->internal_table);
/*
We assign -1 because checkpoint does not need to flush (in case we
have concurrent checkpoint if no then we do not need it here also)
Expand Down
21 changes: 11 additions & 10 deletions storage/maria/ma_open.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,9 +187,9 @@ static MARIA_HA *maria_clone_internal(MARIA_SHARE *share,
maria_delay_key_write)
share->delay_key_write=1;

if (!share->base.born_transactional) /* For transactional ones ... */
if (!share->now_transactional) /* If not transctional table */
{
/* ... force crash if no trn given */
/* Pagecache requires access to info->trn->rec_lsn */
_ma_set_tmp_trn_for_table(&info, &dummy_transaction_object);
info.state= &share->state.state; /* Change global values by default */
}
Expand Down Expand Up @@ -282,7 +282,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
ulong *nulls_per_key_part;
my_off_t key_root[HA_MAX_POSSIBLE_KEY];
ulonglong max_key_file_length, max_data_file_length;
my_bool versioning= 1;
my_bool versioning= 1, born_transactional;
File data_file= -1, kfile= -1;
struct ms3_st *s3_client= 0;
S3_INFO *share_s3= 0;
Expand Down Expand Up @@ -526,6 +526,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
file_version= (share->state.header.not_used == 0);
if (file_version == 0)
share->base.language= share->state.header.not_used;
born_transactional= share->base.born_transactional;

share->state.state_length=base_pos;
/* For newly opened tables we reset the error-has-been-printed flag */
Expand Down Expand Up @@ -560,7 +561,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
We can ignore testing uuid if STATE_NOT_MOVABLE is not set, as in this
case the uuid will be set in _ma_mark_file_changed().
*/
if (share->base.born_transactional &&
if (born_transactional &&
((share->state.create_trid > trnman_get_max_trid() &&
!maria_in_recovery) ||
((share->state.changed & STATE_NOT_MOVABLE) &&
Expand Down Expand Up @@ -601,7 +602,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
}

/* Ensure we have space in the key buffer for transaction id's */
if (share->base.born_transactional)
if (born_transactional)
share->base.max_key_length= ALIGN_SIZE(share->base.max_key_length +
MARIA_MAX_PACK_TRANSID_SIZE);

Expand Down Expand Up @@ -700,7 +701,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,

share->block_size= share->base.block_size; /* Convenience */
share->max_index_block_size= share->block_size - KEYPAGE_CHECKSUM_SIZE;
share->keypage_header= ((share->base.born_transactional ?
share->keypage_header= ((born_transactional ?
LSN_STORE_SIZE + TRANSID_SIZE :
0) + KEYPAGE_KEYID_SIZE + KEYPAGE_FLAG_SIZE +
KEYPAGE_USED_SIZE);
Expand All @@ -723,7 +724,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
/* Calculate length to store a key + nod flag and transaction info */
keyinfo->max_store_length= (keyinfo->maxlength +
share->base.key_reflength);
if (share->base.born_transactional)
if (born_transactional)
keyinfo->max_store_length+= MARIA_INDEX_OVERHEAD_SIZE;

/* See ma_delete.cc::underflow() */
Expand Down Expand Up @@ -862,9 +863,9 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
file for REPAIR. Don't do logging. This base information will not go
to disk.
*/
share->base.born_transactional= FALSE;
born_transactional= FALSE;
}
if (share->base.born_transactional)
if (born_transactional)
{
share->page_type= PAGECACHE_LSN_PAGE;
if (share->state.create_rename_lsn == LSN_NEEDS_NEW_STATE_LSNS)
Expand Down Expand Up @@ -915,7 +916,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags,
}
else
share->page_type= PAGECACHE_PLAIN_PAGE;
share->now_transactional= share->base.born_transactional;
share->now_transactional= born_transactional;

/* Use pack_reclength as we don't want to modify base.pack_recklength */
if (share->state.header.org_data_file_type == DYNAMIC_RECORD)
Expand Down

0 comments on commit 25fa2a6

Please sign in to comment.