diff --git a/Documentation/Changelog.md b/Documentation/Changelog.md index e55a8fa86..b3585a394 100644 --- a/Documentation/Changelog.md +++ b/Documentation/Changelog.md @@ -77,6 +77,7 @@ For more details, please refer to: the master. There is also limited capability for rejoining nodes. For more details, please refer to: +* [MariaDB MaxScale 2.2.20 Release Notes](Release-Notes/MaxScale-2.2.20-Release-Notes.md) * [MariaDB MaxScale 2.2.19 Release Notes](Release-Notes/MaxScale-2.2.19-Release-Notes.md) * [MariaDB MaxScale 2.2.18 Release Notes](Release-Notes/MaxScale-2.2.18-Release-Notes.md) * [MariaDB MaxScale 2.2.17 Release Notes](Release-Notes/MaxScale-2.2.17-Release-Notes.md) diff --git a/Documentation/Release-Notes/MaxScale-2.2.20-Release-Notes.md b/Documentation/Release-Notes/MaxScale-2.2.20-Release-Notes.md new file mode 100644 index 000000000..9c0340924 --- /dev/null +++ b/Documentation/Release-Notes/MaxScale-2.2.20-Release-Notes.md @@ -0,0 +1,40 @@ +# MariaDB MaxScale 2.2.20 Release Notes -- 2019-03-15 + +Release 2.2.20 is a GA release. + +This document describes the changes in release 2.2.20, when compared to the +previous release in the same series. + +For any problems you encounter, please consider submitting a bug +report on [our Jira](https://jira.mariadb.org/projects/MXS). + +## Bug fixes + +* [MXS-2375](https://jira.mariadb.org/browse/MXS-2375) maxctrl stop maxscale is confusing +* [MXS-2368](https://jira.mariadb.org/browse/MXS-2368) maxctrl requires password on command line and cannot change user password +* [MXS-2335](https://jira.mariadb.org/browse/MXS-2335) lower_case_table_names doesn't work +* [MXS-2322](https://jira.mariadb.org/browse/MXS-2322) Null characters in passwords break maxctrl +* [MXS-2311](https://jira.mariadb.org/browse/MXS-2311) connection_keepalive and error : (4852) Unexpected internal state: received response 0x00 from server +* [MXS-2296](https://jira.mariadb.org/browse/MXS-2296) maxscale-system-test does not generate core dumps +* [MXS-2268](https://jira.mariadb.org/browse/MXS-2268) readwritesplitter is not routing queries properly in Maxscale 2.3.2 +* [MXS-2206](https://jira.mariadb.org/browse/MXS-2206) Cmake version check fails with version = 3.10.2 + +## Known Issues and Limitations + +There are some limitations and known issues within this version of MaxScale. +For more information, please refer to the [Limitations](../About/Limitations.md) document. + +## Packaging + +RPM and Debian packages are provided for supported the Linux distributions. + +Packages can be downloaded [here](https://mariadb.com/downloads/mariadb-tx/maxscale). + +## Source Code + +The source code of MaxScale is tagged at GitHub with a tag, which is identical +with the version of MaxScale. For instance, the tag of version X.Y.Z of MaxScale +is `maxscale-X.Y.Z`. Further, the default branch is always the latest GA version +of MaxScale. + +The source code is available [here](https://github.com/mariadb-corporation/MaxScale). diff --git a/VERSION22.cmake b/VERSION22.cmake index b218f991e..13684f7f5 100644 --- a/VERSION22.cmake +++ b/VERSION22.cmake @@ -5,7 +5,7 @@ set(MAXSCALE_VERSION_MAJOR "2" CACHE STRING "Major version") set(MAXSCALE_VERSION_MINOR "2" CACHE STRING "Minor version") -set(MAXSCALE_VERSION_PATCH "20" CACHE STRING "Patch version") +set(MAXSCALE_VERSION_PATCH "21" CACHE STRING "Patch version") # This should only be incremented if a package is rebuilt set(MAXSCALE_BUILD_NUMBER 1 CACHE STRING "Release number") diff --git a/maxctrl/lib/start.js b/maxctrl/lib/start.js index 8f4fbbd90..228f07e96 100644 --- a/maxctrl/lib/start.js +++ b/maxctrl/lib/start.js @@ -33,10 +33,10 @@ exports.builder = function(yargs) { return doRequest(host, 'monitors/' + argv.name + '/start', null, {method: 'PUT'}) }) }) - .command('maxscale', 'Start MaxScale by starting all services', function(yargs) { + .command(['services', 'maxscale'], 'Start all services', function(yargs) { return yargs.epilog('This command will execute the `start service` command for ' + 'all services in MaxScale.') - .usage('Usage: start maxscale') + .usage('Usage: start [services|maxscale]') }, function(argv) { maxctrl(argv, function(host) { return doRequest(host, 'services/', function(res) { diff --git a/maxctrl/lib/stop.js b/maxctrl/lib/stop.js index 561d816b4..b908ecd6f 100644 --- a/maxctrl/lib/stop.js +++ b/maxctrl/lib/stop.js @@ -37,10 +37,10 @@ exports.builder = function(yargs) { return doRequest(host, 'monitors/' + argv.name + '/stop', null, {method: 'PUT'}) }) }) - .command('maxscale', 'Stop MaxScale by stopping all services', function(yargs) { + .command(['services', 'maxscale'], 'Stop all services', function(yargs) { return yargs.epilog('This command will execute the `stop service` command for ' + 'all services in MaxScale.') - .usage('Usage: stop maxscale') + .usage('Usage: stop [services|maxscale]') }, function(argv) { maxctrl(argv, function(host) { return doRequest(host, 'services/', function(res) { diff --git a/maxscale-system-test/Documentation/RELEASE.md b/maxscale-system-test/Documentation/RELEASE.md index d25b7d333..a6ca25e3c 100644 --- a/maxscale-system-test/Documentation/RELEASE.md +++ b/maxscale-system-test/Documentation/RELEASE.md @@ -248,3 +248,16 @@ On behalf of the entire MaxScale team, YOUR NAME HERE ``` + +## 10. Update the version number for the next release + +Increment the `MAXSCALE_VERSION_PATCH` value in the `VERSIONxx.cmake` file +in the source root where `xx` is the major and minor release number. For +example, with 2.2 releases, update the `VERSION22.cmake` file. + +If the `MAXSCALE_BUILD_NUMBER` is not 1, set it to 1. This is only +incremented if the packages have to be rebuilt after a release has been +made. + +Make sure the `VERSION.cmake` points to the latest `VERSIONxx.cmake` file +so that updates in older releases won't affect newer releases. diff --git a/maxscale-system-test/cnf/maxscale.cnf.template.maxrows b/maxscale-system-test/cnf/maxscale.cnf.template.maxrows index 6e3a7b540..1a97ce2c3 100755 --- a/maxscale-system-test/cnf/maxscale.cnf.template.maxrows +++ b/maxscale-system-test/cnf/maxscale.cnf.template.maxrows @@ -1,11 +1,16 @@ [maxscale] threads=###threads### -log_warning=1 + +[server1] +type=server +address=###node_server_IP_1### +port=###node_server_port_1### +protocol=MySQLBackend [MySQL-Monitor] type=monitor module=mysqlmon -servers= server1, server2,server3 ,server4 +servers=server1 user=maxskysql password= skysql monitor_interval=1000 @@ -13,8 +18,8 @@ detect_stale_master=false [RW-Split-Router] type=service -router= readwritesplit -servers=server1, server2, server3,server4 +router=readwritesplit +servers=server1 user=maxskysql password=skysql slave_selection_criteria=LEAST_GLOBAL_CONNECTIONS @@ -25,7 +30,7 @@ filters=MaxRows type=service router=readconnroute router_options= slave -servers=server1,server2,server3,server4 +servers=server1 user=maxskysql password=skysql @@ -33,7 +38,7 @@ password=skysql type=service router=readconnroute router_options=master -servers=server1,server2,server3,server4 +servers=server1 user=maxskysql password=skysql @@ -42,7 +47,6 @@ type=listener service=RW-Split-Router protocol=MySQLClient port=4006 -#socket=/tmp/rwsplit.sock [Read-Connection-Listener-Slave] type=listener @@ -64,7 +68,6 @@ router=cli type=listener service=CLI protocol=maxscaled -#address=localhost socket=default [MaxRows] @@ -73,28 +76,3 @@ module=maxrows max_resultset_rows=20 max_resultset_size=900000000 debug=3 - -[server1] -type=server -address=###node_server_IP_1### -port=###node_server_port_1### -protocol=MySQLBackend - -[server2] -type=server -address=###node_server_IP_2### -port=###node_server_port_2### -protocol=MySQLBackend - -[server3] -type=server -address=###node_server_IP_3### -port=###node_server_port_3### -protocol=MySQLBackend - -[server4] -type=server -address=###node_server_IP_4### -port=###node_server_port_4### -protocol=MySQLBackend - diff --git a/maxscale-system-test/fwf_syntax.cpp b/maxscale-system-test/fwf_syntax.cpp index 61657efb1..f7b7c1ec6 100644 --- a/maxscale-system-test/fwf_syntax.cpp +++ b/maxscale-system-test/fwf_syntax.cpp @@ -64,7 +64,7 @@ int main(int argc, char** argv) for (int i = 0; rules_failure[i]; i++) { /** Create rule file with syntax error */ - test.add_result(truncate(temp_rules, 0), "Failed to truncate"); + int __attribute__((unused)) rc = truncate(temp_rules, 0); create_rule(rules_failure[i], users_ok[0]); char buf[PATH_MAX + 1]; copy_rules(&test, (char*)temp_rules, (char*)getcwd(buf, sizeof(buf))); diff --git a/server/core/dcb.cc b/server/core/dcb.cc index 98a8f47cb..75759d985 100644 --- a/server/core/dcb.cc +++ b/server/core/dcb.cc @@ -1774,14 +1774,7 @@ static int gw_write(DCB* dcb, GWBUF* writeq, bool* stop_writing) if (written < 0) { *stop_writing = true; -#if defined (SS_DEBUG) - if (saved_errno != EAGAIN - && saved_errno != EWOULDBLOCK) -#else - if (saved_errno != EAGAIN - && saved_errno != EWOULDBLOCK - && saved_errno != EPIPE) -#endif + if (saved_errno != EAGAIN && saved_errno != EWOULDBLOCK && saved_errno != EPIPE) { MXS_ERROR("Write to %s %s in state %s failed: %d, %s", dcb->type(), diff --git a/server/modules/routing/readwritesplit/rwsplit_select_backends.cc b/server/modules/routing/readwritesplit/rwsplit_select_backends.cc index 72734db7b..23774cae5 100644 --- a/server/modules/routing/readwritesplit/rwsplit_select_backends.cc +++ b/server/modules/routing/readwritesplit/rwsplit_select_backends.cc @@ -221,7 +221,7 @@ PRWBackends::iterator find_best_backend(PRWBackends& backends, bool masters_accepts_reads) { // Group backends by priority. The set of highest priority backends will then compete. - int best_priority {INT_MAX}; // low numbers are high priority + int best_priority {2}; // low numbers are high priority for (auto& psBackend : backends) { @@ -251,7 +251,12 @@ PRWBackends::iterator find_best_backend(PRWBackends& backends, } auto best = select(priority_map[best_priority]); - auto rval = std::find(backends.begin(), backends.end(), *best); + auto rval = backends.end(); + + if (best != priority_map[best_priority].end()) + { + rval = std::find(backends.begin(), backends.end(), *best); + } for (auto& a : priority_map) { diff --git a/server/modules/routing/readwritesplit/rwsplitsession.cc b/server/modules/routing/readwritesplit/rwsplitsession.cc index 818d6d742..9905c669e 100644 --- a/server/modules/routing/readwritesplit/rwsplitsession.cc +++ b/server/modules/routing/readwritesplit/rwsplitsession.cc @@ -244,14 +244,17 @@ bool RWSplitSession::route_stored_query() GWBUF* temp_storage = m_query_queue; m_query_queue = NULL; - // The query needs to be explicitly parsed as it was processed multiple times - qc_parse(query_queue, QC_COLLECT_ALL); - // TODO: Move the handling of queued queries to the client protocol // TODO: module where the command tracking is done automatically. uint8_t cmd = mxs_mysql_get_command(query_queue); mysql_protocol_set_current_command(m_client, (mxs_mysql_cmd_t)cmd); + if (cmd == MXS_COM_QUERY || cmd == MXS_COM_STMT_PREPARE) + { + // The query needs to be explicitly parsed as it was processed multiple times + qc_parse(query_queue, QC_COLLECT_ALL); + } + if (!routeQuery(query_queue)) { rval = false; @@ -737,15 +740,6 @@ void RWSplitSession::clientReply(GWBUF* writebuf, DCB* backend_dcb) m_can_replay_trx = true; } - if (m_expected_responses == 0) - { - /** - * Close stale connections to servers in maintenance. Done here to avoid closing the connections - * before all responses have been received. - */ - close_stale_connections(); - } - if (backend->in_use() && backend->has_session_commands()) { // Backend is still in use and has more session commands to execute @@ -772,6 +766,15 @@ void RWSplitSession::clientReply(GWBUF* writebuf, DCB* backend_dcb) /** Write reply to client DCB */ MXS_SESSION_ROUTE_REPLY(backend_dcb->session, writebuf); } + + if (m_expected_responses == 0) + { + /** + * Close stale connections to servers in maintenance. Done here to avoid closing the connections + * before all responses have been received. + */ + close_stale_connections(); + } } void check_and_log_backend_state(const RWBackend* backend, DCB* problem_dcb)