Console View
|
Categories: connectors experimental galera main |
|
| connectors | experimental | galera | main | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Alexey (Holyfoot) Botchkov
holyfoot@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch '11.8' into 12.3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
rusher
diego.dupin@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [misc] Make the internal length decoders static inline | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Georgi (Joro) Kodinov
joro@mariadb.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| MDEV-38486: post-merge fix: set to empty. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
forkfun
alice.sherepa@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch 'bb-10.11-release' into bb-11.4-release | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Oleksandr Byelkin
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch '11.4' into 11.8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
alice.sherepa@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch 'br-11.8-merge' into br-12.3-merge | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Sergei Petrunia
sergey@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
serg@mariadb.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
skip columnstore better followup for 550444c3bd4 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
rusher
diego.dupin@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [misc] Clear the error state in mysql_stmt_fetch() only when one is set | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
rusher
diego.dupin@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch '3.4-codec-simplify' into 3.4-perf | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Sergei Golubchik
serg@mariadb.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| don't install plugin test files if the plugin isn't built | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
rusher
diego.dupin@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
diego.dupin@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
[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
bodyhadia44@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
knielsen@knielsen-hq.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Fix help Signed-off-by: Kristian Nielsen <[email protected]> |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Oleksandr Byelkin
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch 'bb-11.4-release' into br-11.8-merge | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Dave Gosselin
dave.gosselin@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
diego.dupin@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch '3.4-single-pass-metadata' into 3.4-perf | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Sergei Golubchik
serg@mariadb.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
skip columnstore better followup for 550444c3bd4 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Oleksandr Byelkin
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch 'bb-11.4-merge' into br-11.8-merge | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
sergey@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| New help | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Hemant Dangi
hemant.dangi@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch '10.11' into 11.4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Oleksandr Byelkin
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch 'br-11.8-merge' into br-12.3-merge | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
pekka.lampio@galeracluster.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
diego.dupin@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch '3.4-stmt-fetch-clear-error' into 3.4-perf | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
rusher
diego.dupin@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge branch '3.4-stmt-fetch-loop' into 3.4-perf | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||