Commit graph

18950 commits

Author SHA1 Message Date
Alexander Barkov
6db1b0188c Merge remote-tracking branch 'origin/bb-10.2-ext' into 10.3 2017-08-15 07:52:48 +04:00
Alexander Barkov
9d85323007 MDEV-13500 sql_mode=ORACLE: can't create a virtual column with function MOD
Fixing Item_func_mod::print() to print "arg1 MOD arg2" instea of "arg1 % arg2"
2017-08-14 11:12:17 +04:00
Igor Babaev
0f554dd0fd Adjusted result files for tokudb tests. 2017-08-13 09:44:44 -07:00
Marko Mäkelä
347d9456e4 MDEV-13495 Crash in rollback of a recovered INSERT transaction after upgrade
If the server is upgraded from a database that was created
before MDEV-12288, and if the undo logs in the database contain
an incomplete transaction that performed an INSERT operation,
the server would crash when rolling back that transaction.

trx_commit_low(): Relax a too strict transaction. This function
will also be called after completing the rollback of a recovered
transaction.

trx_purge_add_undo_to_history(): Merged from the functions
trx_purge_add_update_undo_to_history() and trx_undo_update_cleanup(),
which are removed. Remove the parameter undo_page, and instead call
trx_undo_set_state_at_finish() to obtain it.

trx_write_serialisation_history(): Treat undo and old_insert equally.
That is, after the rollback (or XA COMMIT) of a recovered transaction
before upgrade, move all logs (both insert_undo and update_undo) to
the purge queue.
2017-08-11 12:47:54 +03:00
Alexey Botchkov
1a9e13d622 Merge remote-tracking branch 'origin/10.2' into bb-10.2-ext
Conflicts:
	sql/item_cmpfunc.cc
	storage/innobase/buf/buf0flu.cc
	storage/innobase/include/ut0stage.h
	storage/innobase/row/row0upd.cc
2017-08-11 10:58:23 +04:00
Marko Mäkelä
bfffe571ac Fix some GCC 7 warnings for InnoDB
buf_page_io_complete(): Do not test bpage for NULL, because
it is declared (and always passed) as nonnull.

buf_flush_batch(): Remove the constant local variable count=0.

fil_ibd_load(): Use magic comment to suppress -Wimplicit-fallthrough.

ut_stage_alter_t::inc(ulint): Disable references to an unused parameter.

lock_queue_validate(), sync_array_find_thread(), rbt_check_ordering():
Define only in debug builds.
2017-08-10 14:00:51 +03:00
Marko Mäkelä
73297f532f MDEV-13476 TRX_UNDO_PAGE_TYPE mismatch when writing undo log after upgrade
When undo log pages pre-exist from an upgrade, the
TRX_UNDO_PAGE_TYPE could be TRX_UNDO_INSERT==1 (for insert_undo)
TRX_UNDO_UPDATE==2 (for update_undo), instead of the new unified
page type 0 that was introduced in MDEV-12288.

The undo log page type does not really matter much, because the
undo log record type identifies the records independently
of the page type. So, the debug assertions can simply allow any
potential value of the TRX_UNDO_PAGE_TYPE (0, 1, or 2).
2017-08-10 12:31:26 +03:00
Marko Mäkelä
237f23d702 MDEV-13475 InnoDB: Failing assertion: lsn == log_sys->lsn || srv_force_recovery == SRV_FORCE_NO_LOG_REDO
At shutdown, we would have lsn == srv_start_lsn == 0 if the server
was started up in --innodb-read-only mode with an old-format redo log.

This regression was caused by MDEV-13430, which skips some redo log
processing at startup when the redo log file format differs (and the
redo log has been determined to be logically empty).

Even though the MDEV-13430 change was introduced in MariaDB 10.2.8,
the MariaDB Server 10.2 series is unaffected by this, because
it will refuse to start up from a version-tagged redo log that is
not tagged to be in the MySQL 5.7.9 or MariaDB 10.2.2 format.
Starting with MariaDB 10.3.1, there are multiple version-tagged
redo log formats.

recv_recovery_from_checkpoint_start(): When skipping an empty
different-format redo log, initialize srv_start_lsn and
recv_sys->recovered_lsn from the redo log file.
2017-08-10 11:51:03 +03:00
Marko Mäkelä
bdab49d389 MDEV-13481 Merge new release of InnoDB MySQL 5.7.19 to 10.2
Only a relevant subset of the InnoDB changes was merged.
In particular, two follow-up bug fixes for the bugs that
were introduced in 5.7.18 but not MariaDB 10.2.7 were omitted.
Because MariaDB 10.2.7 omitted the risky change

Bug#23481444 OPTIMISER CALL ROW_SEARCH_MVCC() AND READ THE INDEX
APPLIED BY UNCOMMITTED ROWS

we do not need the follow-up fixes that were introduced in
MySQL 5.6.37 and MySQL 5.7.19:

Bug#25175249 ASSERTION: (TEMPL->IS_VIRTUAL && !FIELD) || ...
Bug#25793677 INNODB: FAILING ASSERTION: CLUST_TEMPL_FOR_SEC || LEN
2017-08-10 08:55:14 +03:00
Thirunarayanan Balathandayuthapani
38be0beb5d Bug CONCURRENT INSERT FAILS IF TABLE DOES REBUILD
Analysis:
=========
   During alter table rebuild, InnoDB fails to apply concurrent insert log.
If the insert log record is present across the blocks then apply phase
trying to access the next block without fetching it.

Fix:
====
During virtual column parsing, check whether the record is present
across the blocks before accessing the virtual column information.

Reviewed-by: Jimmy Yang <jimmy.yang@oracle.com>
RB: 16243
2017-08-09 22:28:30 +03:00
Thirunarayanan Balathandayuthapani
5721d5ba12 Bug CONCURRENT DELETE DOESN'T APPLY DURING TABLE REBUILD
Analysis:
========
During alter table rebuild, InnoDB fails to apply concurrent delete log.
Parsing and validation of merge record happens while applying the
log operation on a table. Validation goes wrong for the virtual column.
Validation assumes that virtual column information can't be the end
of the merge record end.

Fix:
====
Virtual column information in the merge record can be end of the merge
record. Virtual column information is written at the end for
row_log_table_delete().

Reviewed-by: Satya Bodapati<satya.bodapati@oracle.com>
RB: 16155
2017-08-09 22:28:30 +03:00
Marko Mäkelä
f2eaac5d92 Remove dead references to clust_templ_for_sec
MariaDB 10.2 never contained the Oracle change

Bug#23481444 OPTIMISER CALL ROW_SEARCH_MVCC() AND READ THE
INDEX APPLIED BY UNCOMMITTED ROWS

because it was considered risky for a GA release and incomplete.
Remove the references that were added when merging MySQL 5.6.36
to MariaDB 10.0.31, 10.1.24, and 10.2.7.
2017-08-09 22:28:30 +03:00
Thirunarayanan Balathandayuthapani
9d57468dde Bug INNODB: LATCH ORDER VIOLATION DURING TRUNCATE TABLE IF INNODB_SYNC_DEBUG ENABLED
Analysis:
========

(1) During TRUNCATE of file_per_table tablespace, dict_operation_lock is
released before eviction of dirty pages of a tablespace from the buffer
pool. After eviction, we try to re-acquire
dict_operation_lock (higher level latch) but we already hold lower
level latch (index->lock). This causes latch order violation

(2) Deadlock issue is present if child table is being truncated and it
holds index lock. At the same time, cascade dml happens and it took
dict_operation_lock and waiting for index lock.

Fix:
====
1) Release the indexes lock before releasing the dict operation lock.

2) Ignore the cascading dml operation on the parent table, for the
cascading foreign key, if the child table is truncated or if it is
in the process of being truncated.

Reviewed-by: Jimmy Yang <jimmy.yang@oracle.com>
Reviewed-by: Kevin Lewis <kevin.lewis@oracle.com>
RB: 16122
2017-08-09 22:28:30 +03:00
Darshan M N
bf8054b0e8 BUG#25365223 ERRORLOG UPDATED WITH NOTES INFORMATION WHEN A REF FKEY ISN'T FOUND IN GRSETUP
Issue
====
The issue is that the info message that InnoDB prints when a table
is created with a reference which doesn't exist fills up the log as
it's printed for every insert when foreign_key_checks is disabled.

Fix
===
The fix is to display the message only if foreign_key_checks is
enabled.

Reviewed-by: Jimmy Yang <jimmy.yang@oracle.com>
2017-08-09 22:28:29 +03:00
Thirunarayanan Balathandayuthapani
88c391ad6d Bug TABLE REBUILD USES EXCESSIVE MEMORY
Problem:
=======
   Offsets allocates memory from row_heap even for deleted row
traversal during table rebuild.

Solution:
=========
  Empty the row_heap even for deleted record. So that
offsets don't allocate memory everytime.

Reviewed-by: Jimmy Yang <jimmy.yang@oracle.com>
RB: 15694
2017-08-09 22:28:29 +03:00
Marko Mäkelä
a72f34c0a2 MDEV-12868 MySQL bug also affects MariaDB 10.2
Cherry-pick the commit from MySQL 5.7.19, and adapt the test case:

commit 45c933ac19c73a3e9c756a87ee1ba18ba1ac564c
Author: Aakanksha Verma <aakanksha.verma@oracle.com>
Date:   Tue Mar 21 10:31:43 2017 +0530

    Bug    ERRORS WHEN RESTARTING MYSQL AFTER RENAME TABLE.

    PROBLEM

    While renaming table innodb doesn't update the InnoDB Dictionary table
    INNODB_SYS_DATAFILES incase there is change in database while doing
    rename table. Hence on a restart the server log shows error that it
    couldnt find table with old path before rename which has actually been
    renamed. So the errors would only vanish if we update the system
    tablespace

    FIX

    Update the innodb dictionary table with new path in the case there is
    not a change in the table but the database holding the table as well.

    Reviewed-by: Jimmy Yang<Jimmy.Yang@oracle.com>
    RB: 15751
2017-08-09 22:28:04 +03:00
Marko Mäkelä
63ad4fe5bb MDEV-13430 InnoDB upgrade from previous versions to 10.3 is not possible
Most of this fix was merged from a backport to 10.2.

recv_find_max_checkpoint(): Do not return DB_SUCCESS on an error.
2017-08-09 13:50:29 +03:00
Marko Mäkelä
efa4996bb7 Remove stray XtraDB files
The XtraDB storage engine is not used in MariaDB 10.2, and
it no longer exists starting with MariaDB 10.3.1.
2017-08-09 13:00:01 +03:00
Marko Mäkelä
f5b0c47b58 Fix a -Wimplicit-fallthrough warning 2017-08-09 13:00:01 +03:00
Marko Mäkelä
c039cacf53 MDEV-12288 follow-up: Adjust PAGE_MAX_TRX_ID in online ADD INDEX
row_log_table_apply_convert_mrec(), row_log_table_apply_insert_low(),
row_log_table_apply_insert(), row_log_table_apply_update(): Remove
the trx_id parameter. The clustered index may contain DB_TRX_ID=0,
but PAGE_MAX_TRX_ID=0 is invalid for secondary indexes. Use the
current transaction ID when inserting secondary index records.

row_log_table_apply_op(): Remove the trx_id_col parameter.
2017-08-09 13:00:01 +03:00
Marko Mäkelä
620ba97cfc Merge remote-tracking branch 'origin/bb-10.2-ext' into 10.3 2017-08-09 12:59:39 +03:00
Marko Mäkelä
0930d6698f Merge 10.2 into bb-10.2-ext 2017-08-09 12:35:21 +03:00
Marko Mäkelä
c720e68f53 MDEV-13472 rpl.rpl_semi_sync_wait_point crashes because of thd_destructor_proxy
The thd_destructor_proxy detects that no transactions are active and
starts srv_shutdown_bg_undo_sources(), but fails to take into account
that new transactions can still start, especially be slave but also
by other threads. In addition there is no mutex when checking for
active transaction so this is not safe.

We relax the failing InnoDB debug assertion by allowing the execution
of user transactions after the purge thread has been shut down.

FIXME: If innodb_fast_shutdown=0, we should somehow guarantee that no
new transactions can start after thd_destructor_proxy observed that
trx_sys_any_active_transactions() did not hold.
2017-08-09 08:14:39 +03:00
Marko Mäkelä
ffa3789495 Follow-up to MDEV-11487: Remove InnoDB internal temporary tables
row_update_for_mysql(): Remove the wrapper function and
rename the function from row_update_for_mysql_using_upd_graph().
Remove the unused parameter mysql_rec.
2017-08-08 15:34:41 +03:00
Marko Mäkelä
c3f9fdeaf5 Add DBUG "trx" instrumentation that was used for catching MDEV-13470 2017-08-08 15:32:23 +03:00
Marko Mäkelä
1f0a22acbd Merge 10.2 into bb-10.2-ext 2017-08-08 09:47:00 +03:00
Marko Mäkelä
6f623907cd Backport MDEV-13430 recovery improvement to MariaDB 10.2
If the latest InnoDB redo log checkpoint was stored in the
first checkpoint slot and not the second one, InnoDB would
incorrectly set log_sys->log.lsn to the previous checkpoint.

It is possible that this logic error did not exist before
commit 86927cc712, which
removed traces of multiple InnoDB redo logs, to prepare for
MDEV-12548 (Mariabackup for MariaDB 10.2). In the worst case,
this error could mean that InnoDB unnecessarily fails to
recover from redo log when the last-but-one checkpoint was
overwritten, but the last checkpoint is intact.

recv_find_max_checkpoint(), recv_find_max_checkpoint_0():
Do not overwrite the fields of log_sys->log with the information
of an older checkpoint.

recv_find_max_checkpoint(): Do not return DB_SUCCESS on an error.

recv_recovery_from_checkpoint_start(): Return early if the log is
in a version-tagged format but not in the latest format. (In this case,
the log must be logically empty, and there is nothing to apply.)
2017-08-08 09:44:38 +03:00
Jan Lindström
34eef269eb MDEV-11939: innochecksum mistakes a file for an encrypted one (page 0 invalid)
Always read full page 0 to determine does tablespace contain
encryption metadata. Tablespaces that are page compressed or
page compressed and encrypted do not compare checksum as
it does not exists. For encrypted tables use checksum
verification written for encrypted tables and normal tables
use normal method.

buf_page_is_checksum_valid_crc32
buf_page_is_checksum_valid_innodb
buf_page_is_checksum_valid_none
        Modify Innochecksum logging to file to avoid compilation
	warnings.

fil0crypt.cc fil0crypt.h
        Modify to be able to use in innochecksum compilation and
        move fil_space_verify_crypt_checksum to end of the file.
        Add innochecksum logging to file.

univ.i
        Add innochecksum strict_verify, log_file and cur_page_num
        variables as extern.

page_zip_verify_checksum
        Add innochecksum logging to file and remove unnecessary code.

innochecksum.cc
        Lot of changes most notable able to read encryption
        metadata from page 0 of the tablespace.

Added test case where we corrupt intentionally
FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION (encryption key version)
FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION+4 (post encryption checksum)
FIL_DATA+10 (data)
2017-08-08 09:41:09 +03:00
Alexander Barkov
988a9daa94 Merge remote-tracking branch 'origin/10.2' into bb-10.2-ext
Conflicts:
	mysql-test/r/func_json.result
	mysql-test/r/win.result
	mysql-test/t/func_json.test
	mysql-test/t/win.test
	sql/share/errmsg-utf8.txt
	storage/rocksdb/ha_rocksdb.cc
	storage/rocksdb/mysql-test/rocksdb/r/tbl_opt_data_index_dir.result
2017-08-07 21:35:34 +04:00
Kristian Nielsen
36e81a23c5 MDEV-11937: InnoDB flushes redo log too often
Problem was introduced with the InnoDB 5.7 merge, the code related to
avoiding extra fsync at the end of commit when binlog is enabled. The
MariaDB method for this was removed, but the replacement MySQL method
based on thd_get_durability_property() is not functional in MariaDB.

This commit reverts the offending parts of the merge and adds a test
case, to fix the problem for InnoDB. But other storage engines are
likely to have a similar problem.
2017-08-07 18:23:55 +02:00
Sergei Petrunia
5ae598390a Attempt to make rocksdb.rocksdb_parts stable 2017-08-07 18:12:24 +03:00
Sergei Petrunia
30c36b2c15 Make rocksdb.rocksdb_icp test stable 2017-08-07 17:25:11 +03:00
Marko Mäkelä
dcdc1c6d09 MDEV-13452 Assertion `!recv_no_log_write' failed in log_reserve_and_open()
The debug flag recv_no_log_write prohibits writes of redo log records for
modifying page data. The debug assertion was failing when fil_names_clear()
was writing the informative MLOG_FILE_NAME and MLOG_CHECKPOINT records
which do not modify any data.

log_reserve_and_open(), log_write_low(): Remove the debug assertion.

log_pad_current_log_block(), mtr_write_log(),
mtr_t::Command::prepare_write(): Add the debug assertion.
2017-08-07 13:54:37 +03:00
Marko Mäkelä
a33220fbef MDEV-13451 Assertion `!recv_no_ibuf_operations' failed in ibuf_page_low()
During InnoDB startup, change buffer merge operations are prohibited
before recv_apply_hashed_log_recs(true), which performs the last phase
of redo log apply. Before this call, ibuf_init_at_db_start() would be
invoked, and it could trigger the debug assertion.

ibuf_init_at_db_start(): Do not declare the mini-transaction as
"inside change buffer", because nothing is being written in the
mini-transaction. The purpose of this function is only to initialize
the memory data structures from the persistent data structures.
2017-08-07 13:50:31 +03:00
Sergei Petrunia
93a6eed607 Backport to 10.2: Make rocksdb.type_varchar test stable
It may produce test failures like this because of non-deterministic
cost calculations:

-1	SIMPLE	t1	#	col1	col1	259	NULL	#	Using where
+1	SIMPLE	t1	#	col1	NULL	NULL	NULL	#	Using where
2017-08-06 15:36:50 +03:00
Sergei Petrunia
f717fb8242 Make rocksdb.type_varchar test stable
It may produce test failures like this because of non-deterministic
cost calculations:

-1	SIMPLE	t1	#	col1	col1	259	NULL	#	Using where
+1	SIMPLE	t1	#	col1	NULL	NULL	NULL	#	Using where
2017-08-06 14:42:30 +03:00
Sergei Petrunia
7925a4bce8 More comments 2017-08-05 13:57:17 +00:00
Sergei Petrunia
eda033255a Make "SET @@rocksdb_bulk_load=0" return an error instead of crashing the server
- This is more in line with MariaDB environment
- And help with rocksdb.bulk_load_errors test, too
2017-08-03 15:16:40 +00:00
Sergei Petrunia
fcb8d8e598 Make rocksdb.prefix_extractor_override work on Windows 2017-08-01 19:19:54 +00:00
Alexander Barkov
1b0cf1b729 Merge remote-tracking branch 'origin/bb-10.2-ext' into 10.3 2017-08-01 15:58:26 +04:00
Alexander Barkov
68bc777830 Merge remote-tracking branch 'origin/10.2' into bb-10.2-ext 2017-08-01 15:37:01 +04:00
Sergei Petrunia
0899724257 Use proper #include's 2017-08-01 08:50:48 +00:00
Sergei Petrunia
2963a49f72 Post-merge fix: Rdb_io_watchdog doesn't support windows
Part .
2017-08-01 08:50:25 +00:00
Sergei Petrunia
61ca3cf524 Post-merge fix: Rdb_io_watchdog doesn't support windows
So disable it there for now.
2017-07-31 17:34:47 +00:00
Sergei Petrunia
1388afcd84 MDEV-13413: After the merge rocksdb.drop_table fails with warnings
- Fix the bad merge in drop_table.test
- Remove the obsolete rocksdb_info_log_level=info_level option
  which caused warnings to be found in the error log.
2017-07-31 13:44:15 +00:00
Sergei Petrunia
6bf757a2a9 Disable rocksdb.issue243_transactionStatus
It uses SHOW ENGINE TRANSACTION STATUS, which is not supported in MariaDB
2017-07-30 13:37:04 +00:00
Sergei Petrunia
4eec6d4cca Update test result for rocksdb.tbl_opt_data_index_dir
See MDEV-12279, MariaDB is still not able to produce nice error messages
in this case.
2017-07-30 13:36:11 +00:00
Sergei Petrunia
da9c669210 Fixes for a few more post-merge test failures 2017-07-30 12:09:51 +00:00
Sergei Petrunia
d74e43e7bc Fix rocksdb.duplicate_table test 2017-07-30 11:12:54 +00:00
Sergei Petrunia
894c797eaf Mark all tests that are derived from rocksdb.bulk_load as "big".
(Could we just put the mark into bulk_load.inc ?)
2017-07-30 10:51:27 +00:00