Merge branch '2.3' into develop
This commit is contained in:
@ -77,6 +77,7 @@ For more details, please refer to:
|
|||||||
the master. There is also limited capability for rejoining nodes.
|
the master. There is also limited capability for rejoining nodes.
|
||||||
|
|
||||||
For more details, please refer to:
|
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.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.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)
|
* [MariaDB MaxScale 2.2.17 Release Notes](Release-Notes/MaxScale-2.2.17-Release-Notes.md)
|
||||||
|
40
Documentation/Release-Notes/MaxScale-2.2.20-Release-Notes.md
Normal file
40
Documentation/Release-Notes/MaxScale-2.2.20-Release-Notes.md
Normal file
@ -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).
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
set(MAXSCALE_VERSION_MAJOR "2" CACHE STRING "Major version")
|
set(MAXSCALE_VERSION_MAJOR "2" CACHE STRING "Major version")
|
||||||
set(MAXSCALE_VERSION_MINOR "2" CACHE STRING "Minor 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
|
# This should only be incremented if a package is rebuilt
|
||||||
set(MAXSCALE_BUILD_NUMBER 1 CACHE STRING "Release number")
|
set(MAXSCALE_BUILD_NUMBER 1 CACHE STRING "Release number")
|
||||||
|
@ -33,10 +33,10 @@ exports.builder = function(yargs) {
|
|||||||
return doRequest(host, 'monitors/' + argv.name + '/start', null, {method: 'PUT'})
|
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 ' +
|
return yargs.epilog('This command will execute the `start service` command for ' +
|
||||||
'all services in MaxScale.')
|
'all services in MaxScale.')
|
||||||
.usage('Usage: start maxscale')
|
.usage('Usage: start [services|maxscale]')
|
||||||
}, function(argv) {
|
}, function(argv) {
|
||||||
maxctrl(argv, function(host) {
|
maxctrl(argv, function(host) {
|
||||||
return doRequest(host, 'services/', function(res) {
|
return doRequest(host, 'services/', function(res) {
|
||||||
|
@ -37,10 +37,10 @@ exports.builder = function(yargs) {
|
|||||||
return doRequest(host, 'monitors/' + argv.name + '/stop', null, {method: 'PUT'})
|
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 ' +
|
return yargs.epilog('This command will execute the `stop service` command for ' +
|
||||||
'all services in MaxScale.')
|
'all services in MaxScale.')
|
||||||
.usage('Usage: stop maxscale')
|
.usage('Usage: stop [services|maxscale]')
|
||||||
}, function(argv) {
|
}, function(argv) {
|
||||||
maxctrl(argv, function(host) {
|
maxctrl(argv, function(host) {
|
||||||
return doRequest(host, 'services/', function(res) {
|
return doRequest(host, 'services/', function(res) {
|
||||||
|
@ -248,3 +248,16 @@ On behalf of the entire MaxScale team,
|
|||||||
|
|
||||||
YOUR NAME HERE
|
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.
|
||||||
|
@ -1,11 +1,16 @@
|
|||||||
[maxscale]
|
[maxscale]
|
||||||
threads=###threads###
|
threads=###threads###
|
||||||
log_warning=1
|
|
||||||
|
[server1]
|
||||||
|
type=server
|
||||||
|
address=###node_server_IP_1###
|
||||||
|
port=###node_server_port_1###
|
||||||
|
protocol=MySQLBackend
|
||||||
|
|
||||||
[MySQL-Monitor]
|
[MySQL-Monitor]
|
||||||
type=monitor
|
type=monitor
|
||||||
module=mysqlmon
|
module=mysqlmon
|
||||||
servers= server1, server2,server3 ,server4
|
servers=server1
|
||||||
user=maxskysql
|
user=maxskysql
|
||||||
password= skysql
|
password= skysql
|
||||||
monitor_interval=1000
|
monitor_interval=1000
|
||||||
@ -13,8 +18,8 @@ detect_stale_master=false
|
|||||||
|
|
||||||
[RW-Split-Router]
|
[RW-Split-Router]
|
||||||
type=service
|
type=service
|
||||||
router= readwritesplit
|
router=readwritesplit
|
||||||
servers=server1, server2, server3,server4
|
servers=server1
|
||||||
user=maxskysql
|
user=maxskysql
|
||||||
password=skysql
|
password=skysql
|
||||||
slave_selection_criteria=LEAST_GLOBAL_CONNECTIONS
|
slave_selection_criteria=LEAST_GLOBAL_CONNECTIONS
|
||||||
@ -25,7 +30,7 @@ filters=MaxRows
|
|||||||
type=service
|
type=service
|
||||||
router=readconnroute
|
router=readconnroute
|
||||||
router_options= slave
|
router_options= slave
|
||||||
servers=server1,server2,server3,server4
|
servers=server1
|
||||||
user=maxskysql
|
user=maxskysql
|
||||||
password=skysql
|
password=skysql
|
||||||
|
|
||||||
@ -33,7 +38,7 @@ password=skysql
|
|||||||
type=service
|
type=service
|
||||||
router=readconnroute
|
router=readconnroute
|
||||||
router_options=master
|
router_options=master
|
||||||
servers=server1,server2,server3,server4
|
servers=server1
|
||||||
user=maxskysql
|
user=maxskysql
|
||||||
password=skysql
|
password=skysql
|
||||||
|
|
||||||
@ -42,7 +47,6 @@ type=listener
|
|||||||
service=RW-Split-Router
|
service=RW-Split-Router
|
||||||
protocol=MySQLClient
|
protocol=MySQLClient
|
||||||
port=4006
|
port=4006
|
||||||
#socket=/tmp/rwsplit.sock
|
|
||||||
|
|
||||||
[Read-Connection-Listener-Slave]
|
[Read-Connection-Listener-Slave]
|
||||||
type=listener
|
type=listener
|
||||||
@ -64,7 +68,6 @@ router=cli
|
|||||||
type=listener
|
type=listener
|
||||||
service=CLI
|
service=CLI
|
||||||
protocol=maxscaled
|
protocol=maxscaled
|
||||||
#address=localhost
|
|
||||||
socket=default
|
socket=default
|
||||||
|
|
||||||
[MaxRows]
|
[MaxRows]
|
||||||
@ -73,28 +76,3 @@ module=maxrows
|
|||||||
max_resultset_rows=20
|
max_resultset_rows=20
|
||||||
max_resultset_size=900000000
|
max_resultset_size=900000000
|
||||||
debug=3
|
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
|
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ int main(int argc, char** argv)
|
|||||||
for (int i = 0; rules_failure[i]; i++)
|
for (int i = 0; rules_failure[i]; i++)
|
||||||
{
|
{
|
||||||
/** Create rule file with syntax error */
|
/** 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]);
|
create_rule(rules_failure[i], users_ok[0]);
|
||||||
char buf[PATH_MAX + 1];
|
char buf[PATH_MAX + 1];
|
||||||
copy_rules(&test, (char*)temp_rules, (char*)getcwd(buf, sizeof(buf)));
|
copy_rules(&test, (char*)temp_rules, (char*)getcwd(buf, sizeof(buf)));
|
||||||
|
@ -1774,14 +1774,7 @@ static int gw_write(DCB* dcb, GWBUF* writeq, bool* stop_writing)
|
|||||||
if (written < 0)
|
if (written < 0)
|
||||||
{
|
{
|
||||||
*stop_writing = true;
|
*stop_writing = true;
|
||||||
#if defined (SS_DEBUG)
|
if (saved_errno != EAGAIN && saved_errno != EWOULDBLOCK && saved_errno != EPIPE)
|
||||||
if (saved_errno != EAGAIN
|
|
||||||
&& saved_errno != EWOULDBLOCK)
|
|
||||||
#else
|
|
||||||
if (saved_errno != EAGAIN
|
|
||||||
&& saved_errno != EWOULDBLOCK
|
|
||||||
&& saved_errno != EPIPE)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
MXS_ERROR("Write to %s %s in state %s failed: %d, %s",
|
MXS_ERROR("Write to %s %s in state %s failed: %d, %s",
|
||||||
dcb->type(),
|
dcb->type(),
|
||||||
|
@ -221,7 +221,7 @@ PRWBackends::iterator find_best_backend(PRWBackends& backends,
|
|||||||
bool masters_accepts_reads)
|
bool masters_accepts_reads)
|
||||||
{
|
{
|
||||||
// Group backends by priority. The set of highest priority backends will then compete.
|
// 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)
|
for (auto& psBackend : backends)
|
||||||
{
|
{
|
||||||
@ -251,7 +251,12 @@ PRWBackends::iterator find_best_backend(PRWBackends& backends,
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto best = select(priority_map[best_priority]);
|
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)
|
for (auto& a : priority_map)
|
||||||
{
|
{
|
||||||
|
@ -244,14 +244,17 @@ bool RWSplitSession::route_stored_query()
|
|||||||
GWBUF* temp_storage = m_query_queue;
|
GWBUF* temp_storage = m_query_queue;
|
||||||
m_query_queue = NULL;
|
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: Move the handling of queued queries to the client protocol
|
||||||
// TODO: module where the command tracking is done automatically.
|
// TODO: module where the command tracking is done automatically.
|
||||||
uint8_t cmd = mxs_mysql_get_command(query_queue);
|
uint8_t cmd = mxs_mysql_get_command(query_queue);
|
||||||
mysql_protocol_set_current_command(m_client, (mxs_mysql_cmd_t)cmd);
|
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))
|
if (!routeQuery(query_queue))
|
||||||
{
|
{
|
||||||
rval = false;
|
rval = false;
|
||||||
@ -737,15 +740,6 @@ void RWSplitSession::clientReply(GWBUF* writebuf, DCB* backend_dcb)
|
|||||||
m_can_replay_trx = true;
|
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())
|
if (backend->in_use() && backend->has_session_commands())
|
||||||
{
|
{
|
||||||
// Backend is still in use and has more session commands to execute
|
// 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 */
|
/** Write reply to client DCB */
|
||||||
MXS_SESSION_ROUTE_REPLY(backend_dcb->session, writebuf);
|
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)
|
void check_and_log_backend_state(const RWBackend* backend, DCB* problem_dcb)
|
||||||
|
Reference in New Issue
Block a user