mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-25507 CHECK on encrypted Aria table complains about "Wrong LSN"
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.
This commit is contained in:
@ -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;
|
||||
@ -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;
|
||||
|
@ -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;
|
||||
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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 */
|
||||
}
|
||||
@ -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;
|
||||
@ -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 */
|
||||
@ -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) &&
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
@ -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() */
|
||||
@ -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)
|
||||
@ -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)
|
||||
|
Reference in New Issue
Block a user