summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2021-04-30 15:37:00 +0300
committerMonty <monty@mariadb.org>2021-04-30 15:45:07 +0300
commit25fa2a68313046b638aaf1779d45d3e8c8757b07 (patch)
treef1946d9a6cb2fd732c530acb5c1c042b9e23455a
parent42cdc37ff92b7c84abee4d9ec49c47ccbd34ba24 (diff)
downloadmariadb-git-25fa2a68313046b638aaf1779d45d3e8c8757b07.tar.gz
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.
-rw-r--r--mysql-test/suite/encryption/r/aria_tiny.result18
-rw-r--r--mysql-test/suite/encryption/t/aria_tiny.test17
-rw-r--r--storage/maria/ma_close.c3
-rw-r--r--storage/maria/ma_open.c21
4 files changed, 44 insertions, 15 deletions
diff --git a/mysql-test/suite/encryption/r/aria_tiny.result b/mysql-test/suite/encryption/r/aria_tiny.result
index 7ad69878215..28f762255c4 100644
--- a/mysql-test/suite/encryption/r/aria_tiny.result
+++ b/mysql-test/suite/encryption/r/aria_tiny.result
@@ -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;
diff --git a/mysql-test/suite/encryption/t/aria_tiny.test b/mysql-test/suite/encryption/t/aria_tiny.test
index a7faba9633a..337720eec52 100644
--- a/mysql-test/suite/encryption/t/aria_tiny.test
+++ b/mysql-test/suite/encryption/t/aria_tiny.test
@@ -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;
diff --git a/storage/maria/ma_close.c b/storage/maria/ma_close.c
index d2bbdd6f60a..7441e29a97b 100644
--- a/storage/maria/ma_close.c
+++ b/storage/maria/ma_close.c
@@ -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)
diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c
index d346c606c4e..db15778bc23 100644
--- a/storage/maria/ma_open.c
+++ b/storage/maria/ma_open.c
@@ -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)