diff options
author | Monty <monty@mariadb.org> | 2021-04-30 15:37:00 +0300 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2021-04-30 15:45:07 +0300 |
commit | 25fa2a68313046b638aaf1779d45d3e8c8757b07 (patch) | |
tree | f1946d9a6cb2fd732c530acb5c1c042b9e23455a | |
parent | 42cdc37ff92b7c84abee4d9ec49c47ccbd34ba24 (diff) | |
download | mariadb-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.result | 18 | ||||
-rw-r--r-- | mysql-test/suite/encryption/t/aria_tiny.test | 17 | ||||
-rw-r--r-- | storage/maria/ma_close.c | 3 | ||||
-rw-r--r-- | storage/maria/ma_open.c | 21 |
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) |