Commit graph

23462 commits

Author SHA1 Message Date
Thirunarayanan Balathandayuthapani
c92f7e287f MDEV-8139 Fix Scrubbing
fil_space_t::freed_ranges: Store ranges of freed page numbers.

fil_space_t::last_freed_lsn: Store the most recent LSN of
freeing a page.

fil_space_t::freed_mutex: Protects freed_ranges, last_freed_lsn.

fil_space_create(): Initialize the freed_range mutex.

fil_space_free_low(): Frees the freed_range mutex.

range_set: Ranges of page numbers.

buf_page_create(): Removes the page from freed_ranges when page
is being reused.

btr_free_root(): Remove the PAGE_INDEX_ID invalidation. Because
btr_free_root() and dict_drop_index_tree() are executed in
the same atomic mini-transaction, there is no need to
invalidate the root page.

buf_release_freed_page(): Split from buf_flush_freed_page().
Skip any I/O

buf_flush_freed_pages(): Get the freed ranges from tablespace and
Write punch-hole or zeroes of the freed ranges.

buf_flush_try_neighbors(): Handles the flushing of freed ranges.

mtr_t::freed_pages: Variable to store the list of freed pages.

mtr_t::add_freed_pages(): To add freed pages.

mtr_t::clear_freed_pages(): To clear the freed pages.

mtr_t::m_freed_in_system_tablespace: Variable to indicate whether page has
been freed in system tablespace.

mtr_t::m_trim_pages: Variable to indicate whether the space has been trimmed.

mtr_t::commit(): Add the freed page and update the last freed lsn
in the tablespace and clear the tablespace freed range if space is
trimmed.

file_name_t::freed_pages: Store the freed pages during recovery.

file_name_t::add_freed_page(), file_name_t::remove_freed_page(): To
add and remove freed page during recovery.

store_freed_or_init_rec(): Store or remove the freed pages while
encountering FREE_PAGE or INIT_PAGE redo log record.

recv_init_crash_recovery_spaces(): Add the freed page encountered
during recovery to respective tablespace.
2020-06-12 09:17:51 +05:30
Sergei Golubchik
07d1c8567c post-fix for #1504 2020-06-12 01:17:57 +02:00
Varun Gupta
35acf39b5c MDEV-21831: Assertion `length == pack_length()' failed in Field_inet6::sort_string upon INSERT into RocksDB table
For INET6 columns the values are stored as BINARY columns and returned to the client in TEXT format.
For rocksdb the indexes store mem-comparable images for columns, so use the pack_length() to store
the mem-comparable form for INET6 columns. This would also remain consistent with CHAR columns.
2020-06-11 23:27:21 +05:30
Marko Mäkelä
757e756d6e MDEV-22850 Reduce buf_pool.page_hash latch contention
For reads, the buf_pool.page_hash is protected by buf_pool.mutex or
by the hash_lock. There is no need to compute or acquire hash_lock
if we are not modifying the buf_pool.page_hash.

However, the buf_pool.page_hash latch must be held exclusively
when changing buf_page_t::in_file(), or if we desire to prevent
buf_page_t::can_relocate() or buf_page_t::buf_fix_count()
from changing.

rw_lock_lock_word_decr(): Add a comment that explains the polling logic.

buf_page_t::set_state(): When in_file() is to be changed, assert that
an exclusive buf_pool.page_hash latch is being held. Unfortunately
we cannot assert this for set_state(BUF_BLOCK_REMOVE_HASH) because
set_corrupt_id() may already have been called.

buf_LRU_free_page(): Check buf_page_t::can_relocate() before
aqcuiring the hash_lock.

buf_block_t::initialise(): Initialize also page.buf_fix_count().

buf_page_create(): Initialize buf_fix_count while not holding
any mutex or hash_lock. Acquire the hash_lock only for the
duration of inserting the block to the buf_pool.page_hash.

buf_LRU_old_init(), buf_LRU_add_block(),
buf_page_t::belongs_to_unzip_LRU(): Do not assert buf_page_t::in_file(),
because buf_page_create() will invoke buf_LRU_add_block()
before acquiring hash_lock and buf_page_t::set_state().

buf_pool_t::validate(): Rely on the buf_pool.mutex and do not
unnecessarily acquire any buf_pool.page_hash latches.

buf_page_init_for_read(): Clarify that we must acquire the hash_lock
upfront in order to prevent a race with buf_pool_t::watch_remove().
2020-06-11 17:30:33 +03:00
Kentoku SHIBA
0af1b0bd21 Add information_schema.spider_wrapper_protocols for knowing available wrappers of Spider 2020-06-11 16:41:14 +09:00
Marko Mäkelä
c9f262ee0d MDEV-22863: Fix GCC 4.8.5 -Wconversion
This regression was introduced in
commit dd77f072f9 (MDEV-22841).
2020-06-11 15:00:00 +03:00
Marko Mäkelä
7de4458d33 MDEV-22865 compilation failure on win32-debug
ut_filename_hash(): Add better casts to please the compiler:

warning C4307: '*': integral constant overflow

This regression was introduced in
commit dd77f072f9 (MDEV-22841).
2020-06-11 14:53:07 +03:00
Marko Mäkelä
7e798534f0 MDEV-22858 Remove unused innodb_mem_validate_usec, innodb_master_purge_usec
MONITOR_SRV_MEM_VALIDATE_MICROSECOND, MEM_PERIODIC_CHECK,
SRV_MASTER_MEM_VALIDATE_INTERVAL: Remove. These were unused
ever since UNIV_MEM_DEBUG was removed.

MONITOR_SRV_PURGE_MICROSECOND: Remove. This was always unused.
2020-06-10 18:07:13 +03:00
Eugene Kosov
264a98eaa0 MDEV-8069 DROP or rebuild of a large table may lock up InnoDB
Problematic mutex is dict_sys.mutex.
Idea of the patch: unlink() fd under that mutex while
it's still open. This way unlink() will be fast and
actual file removal will happen on close().
And close() will be called outside of dict_sys.mutex.
This should be safe against crash which may happen between
unlink() and close(): file will be removed by OS anyway.
The same applies to both *nix and Windows.

I created and removed a 4G file on some NVMe SSD on ext4:

write(3, "\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"..., 1048576) = 1048576 <0.000519>
fdatasync(3)                            = 0 <3.533763>
close(3)                                = 0 <0.000011>
unlink("file")                          = 0 <0.411563>

write(3, "\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"..., 1048576) = 1048576 <0.000520>
fdatasync(3)                            = 0 <3.544938>
unlink("file")                          = 0 <0.000029>
close(3)                                = 0 <0.407057>

Such systems can benefit of this patch.

fil_node_t::detach(): closes fil_node_t but not file handle,
  returns that file handle

fil_node_t::prepare_to_close_or_deatch(): 'closes' fil_node_t

fil_node_t:close_to_free(): new argument detach_handle

fil_system_t::detach(): now can detach file handles

fil_delete_tablespace(): now can detach file handles

row_drop_table_for_mysql(): performs actual file removal
2020-06-10 16:59:07 +03:00
Otto Kekäläinen
cc0205cf86 MDEV-19917: Install Spider with a simple spider.cnf
To install Spider one can simply drop a /etc/mysql/conf.d/spider.cnf like

  [mariadb]
  plugin-load-add=ha_spider.so

This is automatically generated and installed when plugin is correctly
registered to plugin.cmake with its own component name. Many other plugins
such as Connect and RocksDB install in the same way.

This solved MDEV-19917 as the mere adding and removing of spider.cnf
automatically installs and uninstalls it.

Remove the overly complex and uncecessary install.sql from Spider,
if should not be needed in modern times anymore.

With this change there is no need for a uninstall.sql either.
2020-06-10 13:45:22 +02:00
Vladislav Vaintroub
dd77f072f9 MDEV-22841 ut_new_get_key_by_file is unnecessarily expensive
Change how lookup for the "auto" PSI_memory_keys is done.
Lookup for filename hashes (integers), instead of C strings

Generate these hashes at the compile time with constexpr,
rather than at runtime.
2020-06-10 08:19:06 +02:00
Marko Mäkelä
17a7bafec0 MDEV-22110 preparation: Remove mtr_memo_contains macros
Let us invoke the debug member functions of mtr_t directly.

mtr_t::memo_contains(): Change the parameter type to
const rw_lock_t&. This function cannot be invoked on
buf_block_t::lock.

The function mtr_t::memo_contains_flagged() is intended to be invoked
on buf_block_t* or rw_lock_t*, and it along with
mtr_t::memo_contains_page_flagged() are the way to check whether
a buffer pool page has been latched within a mini-transaction.
2020-06-10 07:50:09 +03:00
Marko Mäkelä
d6f8c48424 MDEV-22110 preparation: Remove some unused function parameters
xdes_get_state(), fseg_get_nth_frag_page_no(),
fseg_find_free_frag_page_slot(), fseg_find_last_used_frag_page_slot(),
fseg_get_n_frag_pages(), fseg_n_reserved_pages_low(),
fseg_print_low(): Remove the unused parameter mtr, and add
a const qualifier to the pointer to the buffer pool page frame.
2020-06-10 07:49:42 +03:00
Marko Mäkelä
70d4e55db9 MDEV-15053 fixup: Reduce contention in buf_page_get_low()
svr_n_page_hash_locks: Increase from 16 to 64. Before MDEV-15058,
we used to have the buf_pool.page_hash partitioned to each instance.

rw_lock_lock_word_decr(): Sleep a little in the spinloop.

rw_lock_s_lock_low(): Correct a comment. The function does perform
spinning.

This improves scalability in read-only workloads on a 32-CPU system
when the number of concurrent connections exceeds the CPU core count.

Thanks to Axel Schwenke for running benchmarks.
2020-06-09 18:04:46 +03:00
Marko Mäkelä
e8a21ed301 WIP 2020-06-09 17:57:42 +03:00
Sergei Golubchik
89a33303c4 remove dead code
reduce the amount of engine-specific code in the server,
particularly as it does not serve any purpose now.

may be needed for VP engine,
to be reconsidered in MDEV-7795
2020-06-09 14:32:43 +02:00
Eugene Kosov
01e8459d93 MDEV-22325 ib_logfile0 is too small for innodb_thread_concurrency=0. The size of ib_logfile0 should be bigger than 200 kB * innodb_thread_concurrency.
Correct log message. IMO, we shouldn't be very precise in that
message as the formula behind it is not trivial.

Also performed a little cleanup.
2020-06-09 03:15:31 +03:00
Marko Mäkelä
1b01833a4b MDEV-15053 follow-up to reduce buf_pool.mutex contention
buf_LRU_make_block_young(): Merge with buf_page_make_young().

buf_pool_check_no_pending_io(): Remove. Replaced with
buf_pool.any_io_pending() and buf_pool.io_pending(),
which do not unnecessarily acquire buf_pool.mutex.

buf_pool_t::init_flush[]: Use atomic access, so that
buf_flush_wait_LRU_batch_end() can avoid acquiring buf_pool.mutex.

buf_pool_t::try_LRU_scan: Declare as bool.
2020-06-08 20:58:44 +03:00
Marko Mäkelä
3be169093b MDEV-22824 Buffer overflow in dict_table_t::parse_name()
dict_table_t::parse_name(): Strip any partition or subpartition
name before copying the name to the decoding buffer.
2020-06-07 18:54:34 +03:00
Marko Mäkelä
0e69f601aa Merge 10.4 into 10.5 2020-06-07 12:22:06 +03:00
Marko Mäkelä
7ae12371dd MDEV-22817 Assertion idlen <= MAX_TABLE_NAME_LEN in create_table_info_t::create_foreign_keys()
create_table_info_t::create_foreign_keys(): Make the create_name buffer
long enough for both the database and table name. It is still not long
enough to hold partition or subpartition names. Because we do never
supported FOREIGN KEY constraints on partitions, we can simply skip
the call to innobase_convert_name() on CREATE TABLE.
2020-06-07 12:21:32 +03:00
Marko Mäkelä
c7a2fb1e08 Merge 10.3 into 10.4 2020-06-06 22:05:32 +03:00
Marko Mäkelä
b3e395a13e Merge 10.2 into 10.3 2020-06-06 18:50:25 +03:00
Marko Mäkelä
e14ffd85d0 MDEV-22721 fixup for 32-bit GCC
lock_check_trx_id_sanity(): Because the argument of UNIV_LIKELY
or __builtin_expect() can be less than sizeof(trx_id_t) on 32-bit
systems, it cannot reliably perform an implicit comparison to 0.
2020-06-06 18:18:40 +03:00
Marko Mäkelä
a08a8bc191 MDEV-22721: Fix GCC 5.3.1 -Wconversion 2020-06-06 17:29:41 +03:00
Marko Mäkelä
1bd5b75c73 MDEV-22818 Server crash on corrupted ROW_FORMAT=COMPRESSED page
page_zip_fields_decode(): Do not dereference index=NULL.
Instead, return NULL early. The only caller does not care
about the values of output parameters in that case.

This bug was introduced in MySQL 5.7.6 by
mysql/mysql-server@9eae0edb7a
and in MariaDB 10.2.2 by
commit 2e814d4702.

Thanks to my son for pointing this out after investigating
the output of a static analysis tool.
2020-06-06 09:33:48 +03:00
Marko Mäkelä
62516c53c1 MDEV-22816 Assertion `node->space == fil_system.sys_space' failed in fil_aio_callback
fil_aio_callback(): Remove a bogus assertion that was added in
commit b1ab211dee (MDEV-15053).
We will have !bpage for any write by buf_flush_freed_page().
2020-06-06 08:51:38 +03:00
Marko Mäkelä
095d656dea MDEV-15053 fixup: MSAN use-of-uninitialized-value
buf_page_init_for_read(): Initialize the output parameter of
buf_buddy_alloc().
2020-06-06 08:30:09 +03:00
Marko Mäkelä
6877ef9a7c Merge 10.4 into 10.5 2020-06-05 20:36:43 +03:00
Marko Mäkelä
374f94c5a7 MDEV-21751 followup: Bypass the change buffer on slow shutdown 2020-06-05 19:04:04 +03:00
Marko Mäkelä
68d9d512e9 Merge 10.3 into 10.4 2020-06-05 18:05:22 +03:00
Marko Mäkelä
286e52e948 After-merge fix: GCC -Wmaybe-uninitialized 2020-06-05 17:45:27 +03:00
Vladislav Vaintroub
d642c5b83d Reduce CPU usage in srv_purge_shutdown.
Polling for srv_purge_should_exit() once every millisecond is enough.
2020-06-05 16:21:39 +02:00
Marko Mäkelä
680463a8d9 Merge 10.2 into 10.3 2020-06-05 16:51:26 +03:00
Marko Mäkelä
efc70da5fd MDEV-22769 Shutdown hang or crash due to XA breaking locks
The background drop table queue in InnoDB is a work-around for
cases where the SQL layer is requesting DDL on tables on which
transactional locks exist.

One such case are XA transactions. Our test case exploits the
fact that the recovery of XA PREPARE transactions will
only resurrect InnoDB table locks, but not MDL that should
block any concurrent DDL.

srv_shutdown_t: Introduce the srv_shutdown_state=SRV_SHUTDOWN_INITIATED
for the initial part of shutdown, to wait for the background drop
table queue to be emptied.

srv_shutdown_bg_undo_sources(): Assign
srv_shutdown_state=SRV_SHUTDOWN_INITIATED
before waiting for the background drop table queue to be emptied.

row_drop_tables_for_mysql_in_background(): On slow shutdown, if
no active transactions exist (excluding ones that are in
XA PREPARE state), skip any tables on which locks exist.

row_drop_table_for_mysql(): Do not unnecessarily attempt to
drop InnoDB persistent statistics for tables that have
already been added to the background drop table queue.

row_mysql_close(): Relax an assertion, and free all memory
even if innodb_force_recovery=2 would prevent the background
drop table queue from being emptied.
2020-06-05 15:22:46 +03:00
Marko Mäkelä
138c11cce5 MDEV-22790 Race between btr_page_mtr_lock() dropping AHI on the same block
This race condition was introduced by
commit ad6171b91c (MDEV-22456).

In the observed case, two threads were executing
btr_search_drop_page_hash_index() on the same block,
to free a stale entry that was attached to a dropped index.
Both threads were holding an S latch on the block.

We must prevent the double-free of block->index by holding
block->lock in exclusive mode.

btr_search_guess_on_hash(): Do not invoke
btr_search_drop_page_hash_index(block) to get rid of
stale entries, because we are not necessarily holding
an exclusive block->lock here.

buf_defer_drop_ahi(): New function, to safely drop stale
entries in buf_page_mtr_lock(). We will skip the call to
btr_search_drop_page_hash_index(block) when only requesting
bufferfixing (no page latch), because in that case, we should
not be accessing the adaptive hash index, and we might get
a deadlock if we acquired the page latch.
2020-06-05 15:22:46 +03:00
Marko Mäkelä
3677dd5cb4 MDEV-22646: Fix a memory leak
btr_search_sys_free(): Free btr_search_sys->hash_tables.

The leak was introduced in commit ad2bf1129c.
2020-06-05 15:22:46 +03:00
Kentoku SHIBA
d88870e6cc MENT-805 ODBC login fails with with Spider from bb-10.5-MENT-30 if password contains a semicolon 2020-06-05 17:30:04 +09:00
Kentoku SHIBA
b3250ab3b2 MENT-787 Server from bb-10.5-MENT-30 crashes upon Spider installation
It looks buffer over flow of spider_unique_id_buf. It requires to analyze on reproducing environment, but I extend this first.
2020-06-05 17:30:03 +09:00
Kentoku SHIBA
0b7fe26e9d Change Spider's plugin maturity to BETA 2020-06-05 17:30:03 +09:00
Kentoku SHIBA
a756d54704 Fix issue caused by using spider_bgs_mode = 2 when Spider use limit_mode = 1 internally for data nodes. 2020-06-05 17:30:03 +09:00
Kentoku SHIBA
9ba56c072c Add a parameter spider_strict_group_by for supporting ONLY_FULL_GROUP_BY 2020-06-05 17:30:02 +09:00
Kentoku SHIBA
bbb1140d47 add pointer of ha_spider to Spider's use_result function 2020-06-05 17:30:02 +09:00
Kentoku SHIBA
f16633c175 fix evaluating bitmap issue in spider 2020-06-05 17:30:02 +09:00
Kentoku SHIBA
18f32f2cd2 fix issue for escape charcters in table parameters of Spider 2020-06-05 17:30:01 +09:00
Kentoku SHIBA
793b84b817 add a table parameter "dsn" to Spider 2020-06-05 17:30:01 +09:00
Kentoku SHIBA
932baa9410 fix build errors on windows environments 2020-06-05 17:30:00 +09:00
Kentoku SHIBA
6c3180bed9 add test result of spider.bugfix insert_select 2020-06-05 17:30:00 +09:00
Kentoku SHIBA
94861b83f4 prepare for adding new connectors for Spider
Conflicts:
	storage/spider/spd_conn.cc
2020-06-05 17:30:00 +09:00
Kentoku SHIBA
23c8adda74 MDEV-6268 SPIDER table with no COMMENT clause causes queries to wait forever
Add looping check

Conflicts:
	sql/table.h
2020-06-05 17:29:59 +09:00