Home - Waterfall Grid T-Grid Console Builders Recent Builds Buildslaves Changesources - JSON API - About

Console View


Categories: connectors experimental galera main
Legend:   Passed Failed Warnings Failed Again Running Exception Offline No data

connectors experimental galera main
Alexey (Holyfoot) Botchkov
MDEV-36261 XMLTYPE: methods - step 1

Method functions added to the XMLTYPE.
  functions added here are:

  FUNCTION XMLTYPE.createNonSchemaBasedXML() RETURN XMLType
  FUNCTION XMLTYPE.createSchemaBasedXML(schema TEXT DEFAULT NULL) RETURN XMLType
  FUNCTION XMLTYPE.getClobVal() RETURN LONGTEXT
  FUNCTION XMLTYPE.getNamespace() RETURN LONGTEXT
  FUNCTION XMLTYPE.isFragment() RETURN INTEGER
  FUNCTION XMLTYPE.getSchemaURL() RETURN LONGTEXT
  FUNCTION XMLTYPE.getNumberVal() RETURN DOUBLE
  FUNCTION XMLTYPE.getStringVal() RETURN LONGTEXT
  FUNCTION XMLTYPE.getRootElement() RETURN LONGTEXT
Oleksandr Byelkin
Fix assertion in Create_tmp_table::finalize lost in 10.11->11.4 merge

Merge 3d174503712 dropped the create_tmp_table_for_derived check in
Item_field::create_tmp_field_from_item_field().

Restore the check.
Oleksandr Byelkin
Fix assertion in Create_tmp_table::finalize lost in 10.11->11.4 merge

Merge 3d174503712 dropped the create_tmp_table_for_derived check in
Item_field::create_tmp_field_from_item_field().

Restore the check.
Vladislav Vaintroub
MDEV-38741 mtr: do not suppress the reason of a client disconnect

The global suppressions of "Aborted connection", in mariadb-test-run.pl
and mtr_warnings.sql, hid the line that the client disconnect watcher
writes when it aborts a command: "Aborted connection N to db: 'x' user:
'u' host: 'h' (Client disconnected)". Nothing showed when the watcher
aborted a connection that it should have left alone. main.locale found
one, because its server log is in German and the English entry did not
match.

Make the two entries skip a line that ends in "(Client disconnected)".
Other aborted connections are suppressed as before.

The tests that drop a client on purpose accept the reason:
have_disconnect_watcher.inc, which the tests of the watcher include,
and dirty_close, loaddata, sp_notembedded, ssl_timeout, mysqltest,
innodb_bug38231, innodb.xa_recovery, mysql_client_test,
mysql_client_test_nonblock, mysql_client_test_comp,
rpl_semi_sync_shutdown_await_ack, spider/bugfix.mdev_35959 (a Spider
link that times out) and mariabackup.nolock_ddl_during_backup_end
(mariabackup ends in the middle of a backup). The Connector/C tests of
the unit suite close connections on purpose, but cannot call
mtr.add_suppression(), so suite.pm adds it before each of them.

A replica closes its connection on purpose when it is stopped, in any
phase of its setup, also while the master runs one of its first
queries. rpl_init.inc accepts the reason for every server of the
replication tests, without writing it to the binlog. A binlog dump
thread logs its disconnect with another message, and only with
log_warnings=4.

Assisted-by: Claude:claude-sonnet-5-5
Oleksandr Byelkin
Merge branch '11.8' into 12.3
rusher
[misc] Make the internal length decoders static inline
Georgi (Joro) Kodinov
MDEV-38486: post-merge fix: set to empty.
forkfun
MDEV-24557 mariadb-dump: import MySQL 5.7+ users, grants, roles

--system=users/all now translates a MySQL 5.7+ source to MariaDB SQL.

- Privileges are mapped; those with no MariaDB equivalent are dropped
  with a "# WARNING". A partial revoke becomes DENY (13.1.1+).
- Translated GRANTs are gated 11.4. All grants are dumped last.
- CREATE USER clauses MariaDB lacks are dropped; an unsupported auth
  plugin locks the account. The hash is read as a string, not as 0x...
  (print_identified_with_as_hex), which MariaDB cannot parse.
- MySQL roles become MariaDB roles, renamed <user>_NNNN if the host is
  not '%' or the name is unavailable (taken, PUBLIC, NONE). Several
  default roles go into <user>_default_roles.
- A mandatory role is granted to PUBLIC, with a "# WARNING": MariaDB
  activates it for every account, MySQL only where it is enabled.
- An unlocked role account (a hybrid) has its privileges on its role,
  which its members get, and on the account itself. The role is
  not its default role, so roles granted to the account stay inactive
  until enabled, as on MySQL. A locked role account has them on its
  role only.
- A comment end in a name is escaped in literals; in a GRANT or DENY the
  statement is emitted ungated, with a "# WARNING".

For every source:
- The /*!80001 CREATE ROLE, DROP ROLE, ALTER USER ... DEFAULT ROLE and
  /*!50701 DROP USER statements are gone: a dump no longer restores
  roles into MySQL.
- The dialect is detected in SQL, not from the version string.
- Roles are created WITH ADMIN mariadb_dump_import_role, so their order
  does not matter.
- DROP USER IF EXISTS is gated /*M!100103, and NO_AUTO_CREATE_USER is
  set while grants run. PUBLIC is not created as a role.

--insert-ignore now overrides --replace, with a warning; together they
gave an invalid REPLACE IGNORE.

Tests replay a dump captured from MySQL 26.7.0; recapture it after
changing the MySQL-source code (see mysql_users_setup.sql).

Assisted-By: Claude:claude-sonnet-5-5
Oleksandr Byelkin
Merge branch 'bb-10.11-release' into bb-11.4-release
Oleksandr Byelkin
Merge branch '11.4' into 11.8
Vladislav Vaintroub
MDEV-38741 mtr: do not suppress the reason of a client disconnect

The global suppressions of "Aborted connection", in mariadb-test-run.pl
and mtr_warnings.sql, hid the line that the client disconnect watcher
writes when it aborts a command: "Aborted connection N to db: 'x' user:
'u' host: 'h' (Client disconnected)". Nothing showed when the watcher
aborted a connection that it should have left alone. main.locale found
one, because its server log is in German and the English entry did not
match.

Make the two entries skip a line that ends in "(Client disconnected)".
Other aborted connections are suppressed as before.

The tests that drop a client on purpose accept the reason:
have_disconnect_watcher.inc, which the tests of the watcher include,
and dirty_close, loaddata, sp_notembedded, ssl_timeout, mysqltest,
innodb_bug38231, innodb.xa_recovery, mysql_client_test,
mysql_client_test_nonblock, mysql_client_test_comp,
rpl_semi_sync_shutdown_await_ack, spider/bugfix.mdev_35959 (a Spider
link that times out) and mariabackup.nolock_ddl_during_backup_end
(mariabackup ends in the middle of a backup). The Connector/C tests of
the unit suite close connections on purpose, but cannot call
mtr.add_suppression(), so suite.pm adds it before each of them.

A replica closes its connection on purpose when it is stopped, in any
phase of its setup, also while the master runs one of its first
queries. rpl_init.inc accepts the reason for every server of the
replication tests, without writing it to the binlog. A binlog dump
thread logs its disconnect with another message, and only with
log_warnings=4.

Assisted-by: Claude:claude-sonnet-5-5
forkfun
MDEV-24557 mariadb-dump: import MySQL 5.7+ users, grants, roles

--system=users/all now translates a MySQL 5.7+ source to MariaDB SQL.

- Privileges are mapped; those with no MariaDB equivalent are dropped
  with a "# WARNING". A partial revoke becomes DENY (13.1.1+).
- Translated GRANTs are gated 11.4. All grants are dumped last.
- CREATE USER clauses MariaDB lacks are dropped; an unsupported auth
  plugin locks the account. The hash is read as a string, not as 0x...
  (print_identified_with_as_hex), which MariaDB cannot parse.
- MySQL roles become MariaDB roles, renamed <user>_NNNN if the host is
  not '%' or the name is unavailable (taken, PUBLIC, NONE). Several
  default roles go into <user>_default_roles.
- A mandatory role is granted to PUBLIC, with a "# WARNING": MariaDB
  activates it for every account, MySQL only where it is enabled.
- An unlocked role account (a hybrid) has its privileges on its role,
  which its members get, and on the account itself. The role is
  not its default role, so roles granted to the account stay inactive
  until enabled, as on MySQL. A locked role account has them on its
  role only.
- A comment end in a name is escaped in literals; in a GRANT or DENY the
  statement is emitted ungated, with a "# WARNING".

For every source:
- The /*!80001 CREATE ROLE, DROP ROLE, ALTER USER ... DEFAULT ROLE and
  /*!50701 DROP USER statements are gone: a dump no longer restores
  roles into MySQL.
- The dialect is detected in SQL, not from the version string.
- Roles are created WITH ADMIN mariadb_dump_import_role, so their order
  does not matter.
- DROP USER IF EXISTS is gated /*M!100103, and NO_AUTO_CREATE_USER is
  set while grants run. PUBLIC is not created as a role.

--insert-ignore now overrides --replace, with a warning; together they
gave an invalid REPLACE IGNORE.

Tests replay a dump captured from MySQL 26.7.0; recapture it after
changing the MySQL-source code (see mysql_users_setup.sql).

Assisted-By: Claude:claude-sonnet-5-5
Oleksandr Byelkin
Merge branch 'br-11.8-merge' into br-12.3-merge
Sergei Petrunia
MDEV-38274: Unexpectedly large pages_read_count in main.analyze_stmt_prefetch_count

The testcase checked the values of pages_prefetch_read_count and
pages_read_count that InnoDB reported for the query.

The numbers depend on how fast the prefetch thread is in comparison with
the query thread. It can also happen that we request to prefetch a page
but then still have to wait for it to be read, which is counted in
pages_read_count.

Replace the checks in the file with ones that will hold in all
circumstances.
Vladislav Vaintroub
MDEV-38741 Abort the running statement when its client disconnects

The server notices that a client is gone only when it reads from or
writes to the socket. A statement that waits, for example for an InnoDB
row lock, keeps running, and its transaction keeps its locks.

Watch the client socket from the end of login until the connection ends
or the client sends COM_QUIT, with epoll (Linux), kqueue (BSD, macOS),
or on Windows with WSAEventSelect and an I/O completion port, and the
exit of the client process for a named pipe. When the client has gone,
the watcher sets DISCONNECT_SIGNALED in THD::disconnect_flags. If a
command that expects an answer is running, it is aborted with
KILL_CONNECTION. If the connection is idle, the next such command is
aborted when it starts. COM_QUIT and COM_STMT_CLOSE are not aborted, a
client can send them and then quit.

The events of a round are served by one scan of the connections, under
one read lock of the thread list. A scan for each event took the lock
for a long time: with 256 clients that connect and disconnect, 1300
scans per second cost 17% of the connection rate.

A command whose last reply is being sent is not aborted, there is
nothing left to interrupt. Protocol::end_statement() sets
DISCONNECT_UNINTERRUPTIBLE when it sends the last reply of a command:
an error, or a reply with no more results to follow. A read-only SELECT
sends its result early, from select_send::send_eof(), and the client
can quit while the server still cleans up. COM_STATISTICS and
COM_STMT_PREPARE write their replies themselves and set the flag before
they do. The lost connection is then logged as usual. The watcher and
the connection thread order their accesses with atomic read-modify-write
operations on the flags, no lock is taken for a command.

A connection that is already being killed is left alone. KILL
CONNECTION shuts the socket of its victim, which the watcher reports,
and a second awake of the dying thread would wait for it in
abort_current_cond_wait() for up to 2 seconds.

The socket is not shut down, the connection ends after the error is
sent, and the reason, "Client disconnected", is logged once. A
binlog dump thread logs "BINLOG DUMP client disconnected", and only
with log_warnings=4: a replica closes the connection on purpose when it
stops. A connection with the disconnect noted, idle or only finishing
its reply, shows that State in the processlist. Galera connections are
not aborted.

The global variable disconnect_watcher, ON by default, can be set OFF,
which also ends the watches that exist. It exists only where there is a
watcher: Linux, Windows, the BSDs and macOS, not the embedded server.

New tests: main.disconnect_*, sys_vars.disconnect_watcher_basic,
rpl.rpl_dump_thread_disconnect and mysql_client_test
test_disconnect_*. Some rpl and innodb tests are adjusted to pass with
the watcher ON and OFF.

Assisted-by: Claude:claude-sonnet-5-5
Vladislav Vaintroub
MDEV-38741 Abort the running statement when its client disconnects

The server notices that a client is gone only when it reads from or
writes to the socket. A statement that waits, for example for an InnoDB
row lock, keeps running, and its transaction keeps its locks.

Watch the client socket from the end of login until the connection ends
or the client sends COM_QUIT, with epoll (Linux), kqueue (BSD, macOS),
or on Windows with WSAEventSelect and an I/O completion port, and the
exit of the client process for a named pipe. When the client has gone,
the watcher sets DISCONNECT_SIGNALED in THD::disconnect_flags. If a
command that expects an answer is running, it is aborted with
KILL_CONNECTION. If the connection is idle, the next such command is
aborted when it starts. COM_QUIT and COM_STMT_CLOSE are not aborted, a
client can send them and then quit.

The events of a round are served by one scan of the connections, under
one read lock of the thread list. A scan for each event took the lock
for a long time: with 256 clients that connect and disconnect, 1300
scans per second cost 17% of the connection rate.

A command whose last reply is being sent is not aborted, there is
nothing left to interrupt. Protocol::end_statement() sets
DISCONNECT_UNINTERRUPTIBLE when it sends the last reply of a command:
an error, or a reply with no more results to follow. A read-only SELECT
sends its result early, from select_send::send_eof(), and the client
can quit while the server still cleans up. COM_STATISTICS and
COM_STMT_PREPARE write their replies themselves and set the flag before
they do. The lost connection is then logged as usual. The watcher and
the connection thread order their accesses with atomic read-modify-write
operations on the flags, no lock is taken for a command.

A connection that is already being killed is left alone. KILL
CONNECTION shuts the socket of its victim, which the watcher reports,
and a second awake of the dying thread would wait for it in
abort_current_cond_wait() for up to 2 seconds.

The socket is not shut down, the connection ends after the error is
sent, and the reason, "Client disconnected", is logged once. A
binlog dump thread logs "BINLOG DUMP client disconnected", and only
with log_warnings=4: a replica closes the connection on purpose when it
stops. A connection with the disconnect noted, idle or only finishing
its reply, shows that State in the processlist. Galera connections are
not aborted.

The global variable disconnect_watcher, ON by default, can be set OFF,
which also ends the watches that exist. It exists only where there is a
watcher: Linux, Windows, the BSDs and macOS, not the embedded server.

New tests: main.disconnect_*, sys_vars.disconnect_watcher_basic,
rpl.rpl_dump_thread_disconnect and mysql_client_test
test_disconnect_*. Some rpl and innodb tests are adjusted to pass with
the watcher ON and OFF.

Assisted-by: Claude:claude-sonnet-5-5
Sergei Golubchik
skip columnstore better

followup for 550444c3bd4
rusher
[misc] Clear the error state in mysql_stmt_fetch() only when one is set
rusher
Merge branch '3.4-codec-simplify' into 3.4-perf
Sergei Golubchik
don't install plugin test files if the plugin isn't built
rusher
Simplify the binary result conversion functions

Make ps_fetch_from_1_to_8_bytes() static inline: it is only called with
a constant byte count, but had external linkage so the compiler kept it
out of line and switched on the byte count at runtime for every integer
column. Each caller now contains only the store and range check for its
width.

In ps_fetch_datetime(), choose the destination MYSQL_TIME first and
decode once instead of calling convert_to_datetime() from every case of
the buffer type switch, where the DATE case duplicated
DATETIME/TIMESTAMP. Being called once, convert_to_datetime() is inlined
as well.

No functional change.

Assisted-by: Claude Fable 5.1
rusher
[CONC-876] Resolve the conversion of bound result columns at bind time

mthd_stmt_fetch_to_bind() selected the conversion for every column of every row at fetch time: a call through mysql_ps_fetch_functions[] on
the column type, then a switch on the buffer type inside that function.

The pair (column type, buffer type) is fixed for the life of a result binding, so decide once. mysql_stmt_bind_result() and the type update after execute now classify each bound column with a 256 entry class table (ma_fetch_class[]) and store the outcome in the pack_length member of the library's private MYSQL_BIND copy (unused until now, the user's MYSQL_BIND is not touched):

  - integers of the same width (TINY/SHORT/YEAR/INT24/LONG/LONGLONG),
    FLOAT and DOUBLE into the matching buffer type,
  - character strings and decimals into a string, decimal or blob
    buffer,
  - binary strings (charset 63) into any buffer,
  - TIME/DATE/DATETIME/TIMESTAMP into a MYSQL_TIME buffer

are copied inline by the fetch loop with the same statements as the
conversion functions; every other pair keeps calling the conversion
function. Values, lengths, error and NULL flags are unchanged for all
column type x buffer type combinations, including truncation,
mysql_stmt_fetch_column() offsets and metadata changes between
executes.

Fetching 1000 rows of 10 int and string columns spends about 15% less
time in the fetch loop, 7% less end to end.

Assited-by: Claude Fable 5.1
Abdelrahman Hedia
MDEV-38486: No semi-sync ACK for @@skip_replication transactions

A transaction committed with @@skip_replication=1 is marked on the master as
not taking part in replication. Semi-sync did not know about that, so it
registered the transaction for an ACK and the commit waited for one. A slave
running with --replicate-events-marked-for-skip=FILTER_ON_MASTER never receives
such a transaction and so never ACKs it: the commit blocked until
rpl_semi_sync_master_timeout expired, and semi-sync was switched off.

Such a transaction now does not take part in semi-sync either: the master
neither requests nor awaits an ACK for it, whatever each slave then does with
it. Semi-sync is a master-side guarantee, and the transaction has already
opted out of replication on the master. Making it depend on the slaves'
--replicate-events-marked-for-skip would not be consistent anyway, as a
FILTER_ON_SLAVE slave ACKs an event which it then throws away, just like a
FILTER_ON_MASTER slave that never received it.

The whole change is in the semi-sync master code, behind its existing
get_master_enabled() checks, so nothing changes when semi-sync is off.
Repl_semi_sync_master::skips_ack() tests the session's OPTION_SKIP_REPLICATION;
report_binlog_update() then does not register the transaction, and
wait_after_sync() and wait_after_commit() do not wait for it. The option
cannot change inside a transaction or a statement, so registering and waiting
always agree. wait_after_sync() now takes the transaction's THD for that,
because in group commit the waiting thread is the leader, not the thread of
the transaction.

Test: rpl.rpl_semi_sync_skip_replication runs, for every
rpl_semi_sync_master_wait_point and every replicate_events_marked_for_skip
value, @@skip_replication changes through both the direct binlog write and the
group commit paths, and checks that no ACK is requested, granted or missed for
them. It also forces a skip_replication and an ordinary transaction into one
binlog group commit, with either one as the leader, and checks that exactly one
ACK is requested and granted, and that a following ordinary transaction is
still ACKed.
Kristian Nielsen
Fix help

Signed-off-by: Kristian Nielsen <[email protected]>
Oleksandr Byelkin
Merge branch 'bb-11.4-release' into br-11.8-merge
Dave Gosselin
MDEV-38643: ST_GeomFromText marks its SELECT with UNCACHEABLE_RAND

This patch removes the flag from ST_GeomFromText, ST_GeomFromWKB,
ST_GeomFromGeoJSON, ST_AsGeoJSON.

When called with one argument, these functions set UNCACHEABLE_RAND on
the enclosing SELECT.  In contrast, the forms with more arguments
never set that flag.

The flag was added in 2006 by commit 384407aaeb3, which moved the
function parsing out of sql_yacc.yy.  The prior grammar rules did not
set the flag for these, either.  The new code has the same form as the
code for ENCRYPT, which requires the UNCACHEABLE_RAND flag as its one
argument variant takes its salt from the clock.
rusher
Merge branch '3.4-single-pass-metadata' into 3.4-perf
Sergei Golubchik
skip columnstore better

followup for 550444c3bd4
Oleksandr Byelkin
Merge branch 'bb-11.4-merge' into br-11.8-merge
Vladislav Vaintroub
MDEV-38741 Abort the running statement when its client disconnects

The server notices that a client is gone only when it reads from or
writes to the socket. A statement that waits, for example for an InnoDB
row lock, keeps running, and its transaction keeps its locks.

Watch the client socket from the end of login until the connection ends
or the client sends COM_QUIT, with epoll (Linux), kqueue (BSD, macOS),
or on Windows with WSAEventSelect and an I/O completion port, and the
exit of the client process for a named pipe. When the client has gone,
the watcher sets DISCONNECT_SIGNALED in THD::disconnect_flags. If a
command that expects an answer is running, it is aborted with
KILL_CONNECTION. If the connection is idle, the next such command is
aborted when it starts. COM_QUIT and COM_STMT_CLOSE are not aborted, a
client can send them and then quit.

The events of a round are served by one scan of the connections, under
one read lock of the thread list. A scan for each event took the lock
for a long time: with 256 clients that connect and disconnect, 1300
scans per second cost 17% of the connection rate.

A command whose last reply is being sent is not aborted, there is
nothing left to interrupt. Protocol::end_statement() sets
DISCONNECT_UNINTERRUPTIBLE when it sends the last reply of a command:
an error, or a reply with no more results to follow. A read-only SELECT
sends its result early, from select_send::send_eof(), and the client
can quit while the server still cleans up. COM_STATISTICS and
COM_STMT_PREPARE write their replies themselves and set the flag before
they do. The lost connection is then logged as usual. The watcher and
the connection thread order their accesses with atomic read-modify-write
operations on the flags, no lock is taken for a command.

A connection that is already being killed is left alone. KILL
CONNECTION shuts the socket of its victim, which the watcher reports,
and a second awake of the dying thread would wait for it in
abort_current_cond_wait() for up to 2 seconds.

The socket is not shut down, the connection ends after the error is
sent, and the reason, "Client disconnected", is logged once. A
binlog dump thread logs "BINLOG DUMP client disconnected", and only
with log_warnings=4: a replica closes the connection on purpose when it
stops. A connection with the disconnect noted, idle or only finishing
its reply, shows that State in the processlist. Galera connections are
not aborted.

The global variable disconnect_watcher, ON by default, can be set OFF,
which also ends the watches that exist. It exists only where there is a
watcher: Linux, Windows, the BSDs and macOS, not the embedded server.

New tests: main.disconnect_*, sys_vars.disconnect_watcher_basic,
rpl.rpl_dump_thread_disconnect and mysql_client_test
test_disconnect_*. Some rpl and innodb tests are adjusted to pass with
the watcher ON and OFF.

Assisted-by: Claude:claude-sonnet-5-5
Sergei Petrunia
MDEV-38274: Unexpectedly large pages_read_count in main.analyze_stmt_prefetch_count

The testcase checked the values of pages_prefetch_read_count and
pages_read_count that InnoDB reported for the query.

The numbers depend on how fast the prefetch thread is in comparison with
the query thread. It can also happen that we request to prefetch a page
but then still have to wait for it to be read, which is counted in
pages_read_count.

Replace the checks in the file with ones that will hold in all
circumstances.
Oleksandr Byelkin
New help
Hemant Dangi
MDEV-42122: check_port() must verify the listener is our own

Issue:
wait_for_listen() asks check_port() whether a process named
socat/nc/netcat is listening on the expected port, but passes no PID
to match against, so check_port() accepts any process with that name
anywhere on the system. On a busy host running many concurrent SSTs,
an unrelated process can transiently hold the same port number, and
wait_for_listen() then reports "ready" even though this invocation's
own listener never came up.

Solution:
When check_port() isn't given a specific PID to match, verify that a
candidate process found by name and port is this script's own
process or a descendant of it, rather than accepting any same-named
process. Existing callers that already pass a known PID are
unaffected.
Oleksandr Byelkin
Merge branch '10.11' into 11.4
Oleksandr Byelkin
Merge branch 'br-11.8-merge' into br-12.3-merge
Vladislav Vaintroub
MDEV-38741 mtr: do not suppress the reason of a client disconnect

The global suppressions of "Aborted connection", in mariadb-test-run.pl
and mtr_warnings.sql, hid the line that the client disconnect watcher
writes when it aborts a command: "Aborted connection N to db: 'x' user:
'u' host: 'h' (Client disconnected)". Nothing showed when the watcher
aborted a connection that it should have left alone. main.locale found
one, because its server log is in German and the English entry did not
match.

Make the two entries skip a line that ends in "(Client disconnected)".
Other aborted connections are suppressed as before.

The tests that drop a client on purpose accept the reason:
have_disconnect_watcher.inc, which the tests of the watcher include,
and dirty_close, loaddata, sp_notembedded, ssl_timeout, mysqltest,
innodb_bug38231, innodb.xa_recovery, mysql_client_test,
mysql_client_test_nonblock, mysql_client_test_comp,
rpl_semi_sync_shutdown_await_ack, spider/bugfix.mdev_35959 (a Spider
link that times out) and mariabackup.nolock_ddl_during_backup_end
(mariabackup ends in the middle of a backup). The Connector/C tests of
the unit suite close connections on purpose, but cannot call
mtr.add_suppression(), so suite.pm adds it before each of them.

A replica closes its connection on purpose when it is stopped, in any
phase of its setup, also while the master runs one of its first
queries. rpl_init.inc accepts the reason for every server of the
replication tests, without writing it to the binlog. A binlog dump
thread logs its disconnect with another message, and only with
log_warnings=4.

Assisted-by: Claude:claude-sonnet-5-5
Pekka Lampio
MDEV-38999: Galera - stale reads in explicit transactions

wsrep_must_sync_wait() skipped a statement's causal wait unconditionally
once a multi-statement transaction was open, regardless of which
wsrep_sync_wait bit was configured - so later statements could run
against a view no fresher than whatever BEGIN itself happened to check.
A timed-out wait's error also stayed sticky until commit/rollback,
breaking ROLLBACK itself.

Fix: only skip the wait once the transaction has made its first write or
locking read (SELECT ... FOR UPDATE/LOCK IN SHARE MODE, including via a
stored procedure CALL, autocommit statements, and UNION) - after that,
re-waiting risks a self-deadlock against the local applier. Clear a
timed-out wait's error immediately instead of leaving it sticky.

Tests: galera_MDEV-38999*.test cover the bitmask gap, the self-deadlock
risk, stored-procedure/UNION/autocommit locking reads, and the query
cache's independent wait path.

Assisted-by Claude AI
rusher
Merge branch '3.4-stmt-fetch-clear-error' into 3.4-perf
rusher
Merge branch '3.4-stmt-fetch-loop' into 3.4-perf