Commit graph

179483 commits

Author SHA1 Message Date
Marko Mäkelä
ccf22b8025 Post-merge fix: Adjust message codes in results 2017-12-12 13:27:16 +02:00
Marko Mäkelä
a285e68018 Merge 10.2 into bb-10.2-ext 2017-12-12 09:15:17 +02:00
Sergei Petrunia
e12f77a7e3 MDEV-14389: MyRocks and NOPAD collations
Disallow use of NOPAD collations in indexed columns.
2017-12-12 01:33:03 +03:00
Marko Mäkelä
8695c816e7 Wrap __atomic_compare_exchange_n() as valid C 2017-12-11 15:57:51 +02:00
Marko Mäkelä
e312a407b8 Merge 10.2 into bb-10.2-ext 2017-12-11 15:06:11 +02:00
Marko Mäkelä
13b9ec651a MDEV-14589 InnoDB should not lock a delete-marked record
When the transaction isolation level is SERIALIZABLE, or when
a locking read is performed in the REPEATABLE READ isolation level,
InnoDB must lock delete-marked records in order to prevent another
transaction from inserting something.

However, at READ UNCOMMITTED or READ COMMITTED isolation level or
when the parameter innodb_locks_unsafe_for_binlog is set, the
repeatability of the reads does not matter, and there is no need
to lock any records.

row_search_mvcc(): Skip locks on delete-marked committed records upfront,
instead of invoking row_unlock_for_mysql() afterwards. The unlocking
never worked for secondary index records.
2017-12-11 14:39:53 +02:00
Marko Mäkelä
434c9e6f0e MDEV-14614 InnoDB: Failing assertion in dict_stats_rename_table()
dict_stats_rename_table(): After DB_LOCK_WAIT_TIMEOUT
or DB_DUPLICATE_KEY, reset the trx->error_state before retrying.
Also, properly treat DB_DEADLOCK as a hard error.
2017-12-11 13:56:50 +02:00
Marko Mäkelä
1e6ac94451 Correct the comment of row_vers_impl_x_locked() 2017-12-11 13:56:36 +02:00
Sergei Petrunia
bdeb27a000 MDEV-14123: .rocksdb folder may break workflow which re-create data directory
Part #2: Adjust other parts of testsuite to take into account
that RocksDB files are in "#rocksdb" now.
2017-12-11 12:31:59 +03:00
Sergei Petrunia
ddc1d6904a MDEV-14123: .rocksdb folder may break workflow which re-create data directory
Part2: make MyRocks add its directory into @@ignore_db_dirs when starting.

This is necessary because apparently not everybody are using plugin's my.cnf
So load ha_rocksdb.{so,dll} manually and then hit MDEV-12451, MDEV-14461
etc.
2017-12-11 12:31:58 +03:00
Sergei Petrunia
b8a0373ed2 MDEV-14123: ".rocksdb folder may break workflow", and other MDEVs
Rename  Use '#rocksdb' instead of '.rocksdb' as subdirectory for RocksDB
datadir.
2017-12-11 12:31:58 +03:00
Marko Mäkelä
40eee1da17 MDEV-14614 InnoDB: Failing assertion: trx->error_state == DB_SUCCESS or lock wait timeout upon saving statistics
The assertion failure was caused by
MDEV-14511 Use fewer transactions for updating InnoDB persistent statistics

We are reusing a transaction object after commit, and sometimes,
even after a successful operation, the trx_t::error_state may be
something else than DB_SUCCESS. Reset the field when needed.
2017-12-11 10:12:14 +02:00
Marko Mäkelä
86beb08774 Remove an unnecessary dependency on persistent statistics 2017-12-11 09:31:28 +02:00
Sergey Vojtovich
927dd9f355 Fixed LF_BACKOFF calls 2017-12-08 21:35:29 +04:00
Marko Mäkelä
0af52734a7 Remove the unused function row_is_magic_monitor_table()
Before MySQL 5.7 or MariaDB 10.2.2, there used to be some
magic InnoDB table names that would assign some InnoDB flags
on CREATE TABLE or DROP TABLE.
2017-12-08 16:36:19 +02:00
Marko Mäkelä
51bc407403 Remove dead code for "InnoDB table(space) monitor"
Starting with MySQL 5.7 (or MariaDB 10.2.2) InnoDB no longer contains
the "table monitor" or "tablespace monitor". The conditions on
srv_print_innodb_tablespace_monitor, srv_print_innodb_table_monitor
never hold. So, the code was dead.

Also, remove a bogus reference to dict_print(), which used to implement
the InnoDB table monitor.
2017-12-08 16:31:54 +02:00
Marko Mäkelä
3945049809 Remove space_name_list_t
fil_get_space_names(): Remove.

fts_drop_orphaned_tables(): Iterate fil_system->space_list directly.
2017-12-08 16:00:25 +02:00
Marko Mäkelä
094b0f869b Merge 10.2 into bb-10.2-ext 2017-12-08 16:00:10 +02:00
Vladislav Vaintroub
bf96310657 Fix warnings 2017-12-08 13:10:41 +00:00
Monty
38908aaf81 Fix failing mtr tests
- Changed rocksdb.2pcgroup_commit.test to print information on error
- Updated myisam_views-big.result
2017-12-08 13:46:23 +02:00
Monty
c2118a08b1 Move all kill mutex protection to LOCK_thd_kill
LOCK_thd_data was used to protect both THD data and
ensure that the THD is not deleted while it was in use

This patch moves the THD delete protection to LOCK_thd_kill,
which already protects the THD for kill.

The benefits are:
- More well defined what LOCK_thd_data protects
- LOCK_thd_data usage is now much simpler and easier to verify
- Less chance of deadlocks in SHOW PROCESS LIST as there is less
  chance of interactions between mutexes
- Remove not needed LOCK_thread_count from
  thd_get_error_context_description()
- Fewer mutex taken for thd->awake()

Other things:
- Don't take mysys->var mutex in show processlist to check if thread
  is kill marked
- thd->awake() now automatically takes the LOCK_thd_kill mutex
  (Simplifies code)
- Apc uses LOCK_thd_kill instead of LOCK_thd_data
2017-12-08 13:46:23 +02:00
Monty
3574f9c7bc Updated MW-388.result file 2017-12-08 13:46:23 +02:00
Monty
7891a713da Don't wait too long in SHOW PROCESSLIST
This will allow show processlist to continue, without blocking
all new connections, if some threads gets stuck while holding
LOCK_thd_data or mysys_var->mutex

Connections that has mutex 'stuck' are marked as 'Busy' in 'Command'

Todo:
Make F_BACKOFF to do 'pause' instead of just (1)
2017-12-08 13:44:46 +02:00
Sergey Vojtovich
b3346c2f41 Restore LF_BACKOFF
Moved InnoDB UT_RELAX_CPU() to server. Restored cross-platform LF_BACKOFF
implementation basing on UT_RELAX_CPU().
2017-12-08 13:44:45 +02:00
Jan Lindström
2662228d18 Fix test failures. 2017-12-08 13:34:20 +02:00
Alexander Barkov
0e5eef886a MDEV-14350 Index use with collation utf8mb4_unicode_nopad_ci on LIKE pattern with wrong results 2017-12-08 13:19:19 +04:00
Marko Mäkelä
07e9ff1fe1 MDEV-14378 In ALGORITHM=INPLACE, use a common name for the intermediate tables or partitions
Allow DROP TABLE `#mysql50##sql-...._.` to drop tables that were
being rebuilt by ALGORITHM=INPLACE

NOTE: If the server is killed after the table-rebuilding ALGORITHM=INPLACE
commits inside InnoDB but before the .frm file has been replaced, then
the recovery will involve something else than DROP TABLE.

NOTE: If the server is killed in a true inplace ALTER TABLE commits
inside InnoDB but before the .frm file has been replaced, then we
are really out of luck. To properly handle that situation, we would
need a transactional mysql.ddl_fixup table that directs recovery to
rename or remove files.

prepare_inplace_alter_table_dict(): Use the altered_table->s->table_name
for generating the new_table_name.

table_name_t::part_suffix: The start of the partition name suffix.

table_name_t::dbend(): Return the end of the schema name.

table_name_t::dblen(): Return the length of the schema name, in bytes.

table_name_t::basename(): Return the name without the schema name.

table_name_t::part(): Return the partition name, or NULL if none.

row_drop_table_for_mysql(): Assert for #sql, not #sql-ib.
2017-12-08 10:07:51 +02:00
Marko Mäkelä
0a02c1a667 Merge 10.2 into bb-10.2-ext 2017-12-08 10:02:28 +02:00
Marko Mäkelä
dfafe15abb MDEV-14606 Assertion failure on IMPORT TABLESPACE
fseg_alloc_free_page_low(): Remove a bogus and redundant assertion about
fil_space_t::purpose. The debug function fsp_space_modify_check()
is asserting something similar, but more accurately.
2017-12-08 09:53:11 +02:00
Alexander Barkov
a61fbf87ed Adding the -Wnon-virtual-dtor GCC/CLang flag in maintainer mode 2017-12-08 09:44:53 +04:00
Sergei Petrunia
578b26598a MDEV-14607: storage_engine-rocksdb.type_bit_indexes fails after latest pushes
Update the .result file. Old EXPLAIN output was incorrect due to
hitting MDEV-14563.
2017-12-08 01:17:01 +03:00
Alexander Barkov
08dae44711 MDEV-14228 MariaDB crashes with function 2017-12-07 15:54:27 +04:00
Jan Lindström
4d016e6ed2 Add Galera test cases that fail to disabled. 2017-12-07 13:08:41 +02:00
Jan Lindström
ba576c5b78 MDEV-14401: Stored procedure that declares a handler that catches ER_LOCK_DEADLOCK error causes thd->is_error() assertion
This was missing bug fix from MySQL wsrep i.e. Galera.
Problem was that if stored procedure declares a handler that
catches deadlock error, then the error may have been
cleared in method sp_rcontext::handle_sql_condition().
Use wsrep_conflict_state correctly to determine is the
error already sent to client.

Add test case for both this bug and MDEV-12837: WSREP: BF
lock wait long. Test requires both fixes to pass.
2017-12-07 13:08:41 +02:00
Jan Lindström
da3a3a68df MDEV-12837: WSREP: BF lock wait long
Problem was a merge error from MySQL wsrep i.e. Galera.

wsrep_on_check
	New check function. Galera can't be enabled
	if innodb-lock-schedule-algorithm=VATS.

innobase_kill_query
	In Galera async kill we could own lock mutex.

innobase_init
	If Variance-Aware-Transaction-Sheduling Algorithm (VATS) is
	used on Galera we fall back to First-Come-First-Served (FCFS)
	with notice to user.

Changed innodb-lock-schedule-algorithm as read-only parameter
as it was designed to be.

lock_reset_lock_and_trx_wait
	Use ib::hex() to print out transaction ID.

lock_rec_other_has_expl_req,
lock_rec_other_has_conflicting,
RecLock::add_to_waitq
lock_rec_lock_slow
lock_table_other_has_incompatible
lock_rec_insert_check_and_lock
lock_prdt_other_has_conflicting

	Change pointer to conflicting lock to normal pointer as this
	pointer contents could be changed later.

RecLock::create
	Conclicting lock pointer is moved to last parameter with
	default value NULL. This conflicting transaction could
	be selected as victim in Galera if requesting transaction
	is BF (brute force) transaction. In this case contents
	of conflicting lock pointer will be changed. Use ib::hex() to print
	transaction ids.
2017-12-07 13:08:41 +02:00
Monty
6d4b0958dc Fix failing test mysql_client_test
Backported patch from 10.3 that allows one to remove short .frm files
2017-12-07 11:41:52 +02:00
Monty
3eaca005ff Ensure that mysqladmin also works with MariaDB 10.3 + more
Increase the number of status variabels that can be handled
2017-12-07 10:32:23 +02:00
Marko Mäkelä
bce4065129 Merge 10.2 into bb-10.2-ext 2017-12-07 08:18:43 +02:00
Marko Mäkelä
51c73a431f Merge 10.1 into 10.2 2017-12-07 08:17:50 +02:00
Marko Mäkelä
447931c6ab Post-fix for MDEV-14587
dict_stats_process_entry_from_defrag_pool(): Release the mutex
2017-12-07 08:14:49 +02:00
Marko Mäkelä
ce07676502 Merge 10.2 into bb-10.2-ext 2017-12-06 19:34:03 +02:00
Marko Mäkelä
77fb7ccba4 Follow-up fix to MDEV-13201 Assertion srv_undo_sources || ... failed on shutdown during DDL operation
Introduce the debug flag trx_t::persistent_stats to suppress the
assertion for the updates of persistent statistics during fast
shutdown.

dict_stats_exec_sql(): Do execute the statement even though shutdown
has been initiated.
2017-12-06 18:52:28 +02:00
Marko Mäkelä
7dc6066dea MDEV-14511 Use fewer transactions for updating InnoDB persistent statistics
dict_stats_exec_sql(): Expect the caller to always provide a transaction.
Remove some redundant assertions. The caller must hold dict_sys->mutex,
but holding dict_operation_lock is only necessary for accessing
data dictionary tables, which we are not accessing.

dict_stats_save_index_stat(): Acquire dict_sys->mutex
for invoking dict_stats_exec_sql().

dict_stats_save(), dict_stats_update_for_index(), dict_stats_update(),
dict_stats_drop_index(), dict_stats_delete_from_table_stats(),
dict_stats_delete_from_index_stats(), dict_stats_drop_table(),
dict_stats_rename_in_table_stats(), dict_stats_rename_in_index_stats(),
dict_stats_rename_table(): Use a single caller-provided
transaction that is started and committed or rolled back by the caller.

dict_stats_process_entry_from_recalc_pool(): Let the caller provide
a transaction object.

ha_innobase::open(): Pass a transaction to dict_stats_init().

ha_innobase::create(), ha_innobase::discard_or_import_tablespace():
Pass a transaction to dict_stats_update().

ha_innobase::rename_table(): Pass a transaction to
dict_stats_rename_table(). We do not use the same transaction
as the one that updated the data dictionary tables, because
we already released the dict_operation_lock. (FIXME: there is
a race condition; a lock wait on SYS_* tables could occur
in another DDL transaction until the data dictionary transaction
is committed.)

ha_innobase::info_low(): Pass a transaction to dict_stats_update()
when calculating persistent statistics.

alter_stats_norebuild(), alter_stats_rebuild(): Update the
persistent statistics as well. In this way, a single transaction
will be used for updating the statistics of a whole table, even
for partitioned tables.

ha_innobase::commit_inplace_alter_table(): Drop statistics for
all partitions when adding or dropping virtual columns, so that
the statistics will be recalculated on the next handler::open().
This is a refactored version of Oracle Bug#22469660 fix.

RecLock::add_to_waitq(), lock_table_enqueue_waiting():
Do not allow a lock wait to occur for updating statistics
in a data dictionary transaction, such as DROP TABLE. Instead,
return the previously unused error code DB_QUE_THR_SUSPENDED.

row_merge_lock_table(), row_mysql_lock_table(): Remove dead code
for handling DB_QUE_THR_SUSPENDED.

row_drop_table_for_mysql(), row_truncate_table_for_mysql():
Drop the statistics as part of the data dictionary transaction.
After TRUNCATE TABLE, the statistics will be recalculated on
subsequent ha_innobase::open(), similar to how the logic after
the above-mentioned Oracle Bug#22469660 fix in
ha_innobase::commit_inplace_alter_table() works.

btr_defragment_thread(): Use a single transaction object for
updating defragmentation statistics.

dict_stats_save_defrag_stats(), dict_stats_save_defrag_stats(),
dict_stats_process_entry_from_defrag_pool(),
dict_defrag_process_entries_from_defrag_pool(),
dict_stats_save_defrag_summary(), dict_stats_save_defrag_stats():
Add a parameter for the transaction.

dict_stats_empty_table(): Make public. This will be called by
row_truncate_table_for_mysql() after dropping persistent statistics,
to clear the memory-based statistics as well.
2017-12-06 18:52:28 +02:00
Sergei Petrunia
2c1e4d4d7a MDEV-14563: Wrong query plan for query with no PK
Part #2: Don't use the new code for the clustered PK, it is handled
in the special way right above.
2017-12-06 12:35:17 +03:00
Sergei Petrunia
a6254e5e7d MDEV-14563: Wrong query plan for query with no PK
TABLE_SHARE::init_from_binary_frm_image() calls handler_file->index_flags()
before it has set TABLE_SHARE::primary_key (it is 0 while it should be
MAX_KEY in my example).
This causes MyRocks to report wrong index flags (it thinks it's a PK while
it is not), which causes invalid query plans later on.

Do the only thing that seems feasible: adjust field->part_of key to have
correct value in ha_rocksdb::open.
2017-12-06 12:35:17 +03:00
Sergei Petrunia
c3803914c5 MDEV-14433: RocksDB may show empty or incorrect output with rocksdb_strict_collation_check=off
Part#1: Set field->part_of_key correctly for PK fields.
2017-12-06 12:35:17 +03:00
Marko Mäkelä
f1f2b7742f MDEV-13626 Merge InnoDB test cases from MySQL 5.7 (part 4) 2017-12-06 10:40:58 +02:00
Marko Mäkelä
afe6aef5ff Adjust the test innodb.virtual_stats and rename to gcol.innodb_virtual_stats 2017-12-06 10:37:08 +02:00
Marko Mäkelä
b1cd5ca2af Import innodb.virtual_stats from MySQL 5.7 2017-12-06 10:35:09 +02:00
Marko Mäkelä
e9bc0f75ef MDEV-5834 cleanup: Inline two tiny functions 2017-12-06 10:32:24 +02:00