Merge branch '2.2' into 2.3
This commit is contained in:
@ -60,6 +60,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.16 Release Notes](Release-Notes/MaxScale-2.2.16-Release-Notes.md)
|
||||||
* [MariaDB MaxScale 2.2.15 Release Notes](Release-Notes/MaxScale-2.2.15-Release-Notes.md)
|
* [MariaDB MaxScale 2.2.15 Release Notes](Release-Notes/MaxScale-2.2.15-Release-Notes.md)
|
||||||
* [MariaDB MaxScale 2.2.14 Release Notes](Release-Notes/MaxScale-2.2.14-Release-Notes.md)
|
* [MariaDB MaxScale 2.2.14 Release Notes](Release-Notes/MaxScale-2.2.14-Release-Notes.md)
|
||||||
* [MariaDB MaxScale 2.2.13 Release Notes](Release-Notes/MaxScale-2.2.13-Release-Notes.md)
|
* [MariaDB MaxScale 2.2.13 Release Notes](Release-Notes/MaxScale-2.2.13-Release-Notes.md)
|
||||||
|
|||||||
40
Documentation/Release-Notes/MaxScale-2.2.16-Release-Notes.md
Normal file
40
Documentation/Release-Notes/MaxScale-2.2.16-Release-Notes.md
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# MariaDB MaxScale 2.2.16 Release Notes
|
||||||
|
|
||||||
|
Release 2.2.16 is a GA release.
|
||||||
|
|
||||||
|
This document describes the changes in release 2.2.16, 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-2119](https://jira.mariadb.org/browse/MXS-2119) Files and directories are created with wrong permissions
|
||||||
|
* [MXS-2117](https://jira.mariadb.org/browse/MXS-2117) Old style queries aren't used when MDEV-13453 is encountered
|
||||||
|
* [MXS-2115](https://jira.mariadb.org/browse/MXS-2115) Automatic version detection doesn't work
|
||||||
|
* [MXS-2111](https://jira.mariadb.org/browse/MXS-2111) After SET PASSWORD done on the database, MaxScale not able to connect
|
||||||
|
* [MXS-2108](https://jira.mariadb.org/browse/MXS-2108) Session not immediately closed when all connections are lost
|
||||||
|
* [MXS-2103](https://jira.mariadb.org/browse/MXS-2103) ReadWriteSplit, SELECT on fully qualified temporary table is wrongly routed to Slave
|
||||||
|
* [MXS-2073](https://jira.mariadb.org/browse/MXS-2073) TCP_NODELAY not enabled for client socket
|
||||||
|
* [MXS-2049](https://jira.mariadb.org/browse/MXS-2049) Kerberos authentication not working or not clearly documented
|
||||||
|
|
||||||
|
## 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).
|
||||||
@ -43,6 +43,9 @@
|
|||||||
|
|
||||||
MXS_BEGIN_DECLS
|
MXS_BEGIN_DECLS
|
||||||
|
|
||||||
|
// Default version string sent to clients
|
||||||
|
#define DEFAULT_VERSION_STRING "5.5.5-10.2.12 " MAXSCALE_VERSION "-maxscale"
|
||||||
|
|
||||||
#define MYSQL_HEADER_LEN 4
|
#define MYSQL_HEADER_LEN 4
|
||||||
#define MYSQL_CHECKSUM_LEN 4
|
#define MYSQL_CHECKSUM_LEN 4
|
||||||
#define MYSQL_EOF_PACKET_LEN 9
|
#define MYSQL_EOF_PACKET_LEN 9
|
||||||
|
|||||||
@ -825,9 +825,6 @@ add_test_executable(compound_statement.cpp compound_statement replication LABELS
|
|||||||
# Check if 'weightby' parameter works
|
# Check if 'weightby' parameter works
|
||||||
add_test_executable(server_weight.cpp server_weight galera.weight LABELS readwritesplit readconnroute LIGHT GALERA_BACKEND)
|
add_test_executable(server_weight.cpp server_weight galera.weight LABELS readwritesplit readconnroute LIGHT GALERA_BACKEND)
|
||||||
|
|
||||||
# Executes a lot of session commands with "disable_sescmd_history=true" and check that memory consumption is not increasing
|
|
||||||
add_test_executable(ses_bigmem.cpp ses_bigmem no_ses_cmd_store LABELS readwritesplit REPL_BACKEND)
|
|
||||||
|
|
||||||
# test for 'max_sescmd_history' and 'connection_timeout' parameters
|
# test for 'max_sescmd_history' and 'connection_timeout' parameters
|
||||||
add_test_executable(session_limits.cpp session_limits session_limits LABELS readwritesplit REPL_BACKEND)
|
add_test_executable(session_limits.cpp session_limits session_limits LABELS readwritesplit REPL_BACKEND)
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
[maxscale]
|
[maxscale]
|
||||||
threads=###threads###
|
threads=###threads###
|
||||||
|
query_retries=2
|
||||||
|
query_retry_timeout=10
|
||||||
|
|
||||||
[MySQL-Monitor]
|
[MySQL-Monitor]
|
||||||
type=monitor
|
type=monitor
|
||||||
|
|||||||
@ -1,92 +0,0 @@
|
|||||||
[maxscale]
|
|
||||||
threads=###threads###
|
|
||||||
log_warning=1
|
|
||||||
|
|
||||||
[MySQL Monitor]
|
|
||||||
type=monitor
|
|
||||||
module=mysqlmon
|
|
||||||
servers= server1, server2,server3 ,server4
|
|
||||||
user=maxskysql
|
|
||||||
password= skysql
|
|
||||||
monitor_interval=1000
|
|
||||||
|
|
||||||
[RW Split Router]
|
|
||||||
type=service
|
|
||||||
router= readwritesplit
|
|
||||||
servers=server1, server2, server3,server4
|
|
||||||
user=maxskysql
|
|
||||||
password=skysql
|
|
||||||
slave_selection_criteria=LEAST_GLOBAL_CONNECTIONS
|
|
||||||
disable_sescmd_history=true
|
|
||||||
max_slave_connections=1
|
|
||||||
|
|
||||||
[Read Connection Router Slave]
|
|
||||||
type=service
|
|
||||||
router=readconnroute
|
|
||||||
router_options= slave
|
|
||||||
servers=server1,server2,server3,server4
|
|
||||||
user=maxskysql
|
|
||||||
password=skysql
|
|
||||||
|
|
||||||
[Read Connection Router Master]
|
|
||||||
type=service
|
|
||||||
router=readconnroute
|
|
||||||
router_options=master
|
|
||||||
servers=server1,server2,server3,server4
|
|
||||||
user=maxskysql
|
|
||||||
password=skysql
|
|
||||||
|
|
||||||
[RW Split Listener]
|
|
||||||
type=listener
|
|
||||||
service=RW Split Router
|
|
||||||
protocol=MySQLClient
|
|
||||||
port=4006
|
|
||||||
#socket=/tmp/rwsplit.sock
|
|
||||||
|
|
||||||
[Read Connection Listener Slave]
|
|
||||||
type=listener
|
|
||||||
service=Read Connection Router Slave
|
|
||||||
protocol=MySQLClient
|
|
||||||
port=4009
|
|
||||||
|
|
||||||
[Read Connection Listener Master]
|
|
||||||
type=listener
|
|
||||||
service=Read Connection Router Master
|
|
||||||
protocol=MySQLClient
|
|
||||||
port=4008
|
|
||||||
|
|
||||||
[CLI]
|
|
||||||
type=service
|
|
||||||
router=cli
|
|
||||||
|
|
||||||
[CLI Listener]
|
|
||||||
type=listener
|
|
||||||
service=CLI
|
|
||||||
protocol=maxscaled
|
|
||||||
#address=localhost
|
|
||||||
socket=default
|
|
||||||
|
|
||||||
[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
|
|
||||||
|
|
||||||
@ -46,6 +46,7 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
test.tprintf("Syncing slaves");
|
test.tprintf("Syncing slaves");
|
||||||
test.stop_timeout();
|
test.stop_timeout();
|
||||||
|
test.repl->fix_replication();
|
||||||
test.repl->sync_slaves();
|
test.repl->sync_slaves();
|
||||||
test.set_timeout(60);
|
test.set_timeout(60);
|
||||||
|
|
||||||
|
|||||||
@ -16,7 +16,7 @@ int main(int argc, char* argv[])
|
|||||||
/** Create a database on each node */
|
/** Create a database on each node */
|
||||||
for (int i = 0; i < test.repl->N; i++)
|
for (int i = 0; i < test.repl->N; i++)
|
||||||
{
|
{
|
||||||
test.set_timeout(20);
|
test.set_timeout(60);
|
||||||
execute_query(test.repl->nodes[i], "set global max_connections = 600");
|
execute_query(test.repl->nodes[i], "set global max_connections = 600");
|
||||||
execute_query(test.repl->nodes[i], "DROP DATABASE IF EXISTS shard_db%d", i);
|
execute_query(test.repl->nodes[i], "DROP DATABASE IF EXISTS shard_db%d", i);
|
||||||
execute_query(test.repl->nodes[i], "CREATE DATABASE shard_db%d", i);
|
execute_query(test.repl->nodes[i], "CREATE DATABASE shard_db%d", i);
|
||||||
@ -31,23 +31,23 @@ int main(int argc, char* argv[])
|
|||||||
{
|
{
|
||||||
char str[256];
|
char str[256];
|
||||||
sprintf(str, "shard_db%d", i);
|
sprintf(str, "shard_db%d", i);
|
||||||
test.set_timeout(30);
|
test.set_timeout(60);
|
||||||
MYSQL* conn = open_conn_db(test.maxscales->rwsplit_port[0],
|
MYSQL* conn = open_conn_db(test.maxscales->rwsplit_port[0],
|
||||||
test.maxscales->IP[0],
|
test.maxscales->IP[0],
|
||||||
str,
|
str,
|
||||||
test.maxscales->user_name,
|
test.maxscales->user_name,
|
||||||
test.maxscales->password,
|
test.maxscales->password,
|
||||||
test.ssl);
|
test.ssl);
|
||||||
test.set_timeout(30);
|
test.set_timeout(60);
|
||||||
test.add_result(execute_query(conn, "SELECT 1"), "Trying DB %d failed at %d", i, j);
|
test.add_result(execute_query(conn, "SELECT 1"), "Trying DB %d failed at %d", i, j);
|
||||||
mysql_close(conn);
|
mysql_close(conn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create a database on each node */
|
/** Drop the databases */
|
||||||
for (int i = 0; i < test.repl->N; i++)
|
for (int i = 0; i < test.repl->N; i++)
|
||||||
{
|
{
|
||||||
test.set_timeout(20);
|
test.set_timeout(60);
|
||||||
execute_query(test.repl->nodes[i], "DROP DATABASE shard_db%d", i);
|
execute_query(test.repl->nodes[i], "DROP DATABASE shard_db%d", i);
|
||||||
test.stop_timeout();
|
test.stop_timeout();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,53 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file ses_bigmem Executes a lot of session commands with "disable_sescmd_history=true" and check that
|
|
||||||
* memory consumption is not increasing
|
|
||||||
* (relates to MXS-672 "maxscale possible memory leak"
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "testconnections.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
TestConnections* Test = new TestConnections(argc, argv);
|
|
||||||
unsigned long maxscale_mem;
|
|
||||||
|
|
||||||
Test->set_timeout(10);
|
|
||||||
|
|
||||||
Test->maxscales->connect_maxscale(0);
|
|
||||||
int iterations = Test->smoke ? 100000 : 1000000;
|
|
||||||
int r = Test->smoke ? 1 : 3;
|
|
||||||
|
|
||||||
for (int j = 0; j < r; j++)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < iterations && Test->global_result == 0; i++)
|
|
||||||
{
|
|
||||||
Test->set_timeout(10);
|
|
||||||
Test->try_query(Test->maxscales->routers[0][j], (char*) "set autocommit=0;");
|
|
||||||
Test->try_query(Test->maxscales->routers[0][j], (char*) "select 1;");
|
|
||||||
Test->try_query(Test->maxscales->routers[0][j], (char*) "set autocommit=1;");
|
|
||||||
Test->try_query(Test->maxscales->routers[0][j], (char*) "select 2;");
|
|
||||||
if ((i / 1000) * 1000 == i)
|
|
||||||
{
|
|
||||||
Test->tprintf("i=%d\n", i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
maxscale_mem = Test->maxscales->get_maxscale_memsize(0);
|
|
||||||
Test->tprintf("Maxscale process uses %lu KBytes\n", maxscale_mem);
|
|
||||||
|
|
||||||
if (maxscale_mem > 2000000)
|
|
||||||
{
|
|
||||||
Test->add_result(1, "Maxscale consumes too much memory\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Test->check_maxscale_alive(0);
|
|
||||||
int rval = Test->global_result;
|
|
||||||
delete Test;
|
|
||||||
return rval;
|
|
||||||
}
|
|
||||||
@ -303,8 +303,7 @@ const MXS_MODULE_PARAM config_service_params[] =
|
|||||||
{CN_AUTH_ALL_SERVERS, MXS_MODULE_PARAM_BOOL, "false"},
|
{CN_AUTH_ALL_SERVERS, MXS_MODULE_PARAM_BOOL, "false"},
|
||||||
{CN_STRIP_DB_ESC, MXS_MODULE_PARAM_BOOL, "true"},
|
{CN_STRIP_DB_ESC, MXS_MODULE_PARAM_BOOL, "true"},
|
||||||
{CN_LOCALHOST_MATCH_WILDCARD_HOST, MXS_MODULE_PARAM_BOOL, "true"},
|
{CN_LOCALHOST_MATCH_WILDCARD_HOST, MXS_MODULE_PARAM_BOOL, "true"},
|
||||||
{CN_VERSION_STRING, MXS_MODULE_PARAM_STRING,
|
{CN_VERSION_STRING, MXS_MODULE_PARAM_STRING},
|
||||||
DEFAULT_VERSION_STRING},
|
|
||||||
{CN_FILTERS, MXS_MODULE_PARAM_STRING},
|
{CN_FILTERS, MXS_MODULE_PARAM_STRING},
|
||||||
{CN_WEIGHTBY, MXS_MODULE_PARAM_STRING},
|
{CN_WEIGHTBY, MXS_MODULE_PARAM_STRING},
|
||||||
{CN_LOG_AUTH_WARNINGS, MXS_MODULE_PARAM_BOOL, "true"},
|
{CN_LOG_AUTH_WARNINGS, MXS_MODULE_PARAM_BOOL, "true"},
|
||||||
|
|||||||
@ -33,9 +33,6 @@
|
|||||||
#define MIN_WRITEQ_HIGH_WATER 4096UL /**< Min high water mark of dcb write queue */
|
#define MIN_WRITEQ_HIGH_WATER 4096UL /**< Min high water mark of dcb write queue */
|
||||||
#define MIN_WRITEQ_LOW_WATER 512UL /**< Min low water mark of dcb write queue */
|
#define MIN_WRITEQ_LOW_WATER 512UL /**< Min low water mark of dcb write queue */
|
||||||
|
|
||||||
// Default version string sent to clients
|
|
||||||
#define DEFAULT_VERSION_STRING "5.5.5-10.2.12 " MAXSCALE_VERSION "-maxscale"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maximum length for configuration parameter value.
|
* Maximum length for configuration parameter value.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -203,22 +203,33 @@ static char* gw_default_auth()
|
|||||||
|
|
||||||
std::string get_version_string(SERVICE* service)
|
std::string get_version_string(SERVICE* service)
|
||||||
{
|
{
|
||||||
std::string rval;
|
std::string rval = DEFAULT_VERSION_STRING;
|
||||||
uint64_t intver = UINT64_MAX;
|
|
||||||
|
|
||||||
for (SERVER_REF* ref = service->dbref; ref; ref = ref->next)
|
if (service->version_string[0])
|
||||||
{
|
{
|
||||||
if (ref->server->version && ref->server->version < intver)
|
// User-defined version string, use it
|
||||||
|
rval = service->version_string;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint64_t intver = UINT64_MAX;
|
||||||
|
|
||||||
|
for (SERVER_REF* ref = service->dbref; ref; ref = ref->next)
|
||||||
{
|
{
|
||||||
rval = ref->server->version_string;
|
if (ref->server->version && ref->server->version < intver)
|
||||||
intver = ref->server->version;
|
{
|
||||||
|
rval = ref->server->version_string;
|
||||||
|
intver = ref->server->version;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the version string from service if no server version is available
|
// Older applications don't understand versions other than 5 and cause strange problems
|
||||||
if (rval.empty())
|
const char prefix[] = "5.5.5-";
|
||||||
|
|
||||||
|
if (strncmp(rval.c_str(), prefix, sizeof(prefix) - 1) != 0)
|
||||||
{
|
{
|
||||||
rval = service->version_string;
|
rval = prefix + rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
|
|||||||
Reference in New Issue
Block a user