Merge branch '2.3' into develop
This commit is contained in:
		| @ -47,6 +47,7 @@ For more details, please refer to: | |||||||
|  |  | ||||||
| For more details, please refer to: | For more details, please refer to: | ||||||
|  |  | ||||||
|  | * [MariaDB MaxScale 2.3.8 Release Notes](Release-Notes/MaxScale-2.3.8-Release-Notes.md) | ||||||
| * [MariaDB MaxScale 2.3.7 Release Notes](Release-Notes/MaxScale-2.3.7-Release-Notes.md) | * [MariaDB MaxScale 2.3.7 Release Notes](Release-Notes/MaxScale-2.3.7-Release-Notes.md) | ||||||
| * [MariaDB MaxScale 2.3.6 Release Notes](Release-Notes/MaxScale-2.3.6-Release-Notes.md) | * [MariaDB MaxScale 2.3.6 Release Notes](Release-Notes/MaxScale-2.3.6-Release-Notes.md) | ||||||
| * [MariaDB MaxScale 2.3.5 Release Notes](Release-Notes/MaxScale-2.3.5-Release-Notes.md) | * [MariaDB MaxScale 2.3.5 Release Notes](Release-Notes/MaxScale-2.3.5-Release-Notes.md) | ||||||
|  | |||||||
							
								
								
									
										49
									
								
								Documentation/Release-Notes/MaxScale-2.3.8-Release-Notes.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								Documentation/Release-Notes/MaxScale-2.3.8-Release-Notes.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | |||||||
|  | # MariaDB MaxScale 2.3.8 Release Notes | ||||||
|  |  | ||||||
|  | Release 2.3.8 is a GA release. | ||||||
|  |  | ||||||
|  | This document describes the changes in release 2.3.8, 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-2541](https://jira.mariadb.org/browse/MXS-2541) Crash with transaction_replay=true | ||||||
|  | * [MXS-2538](https://jira.mariadb.org/browse/MXS-2538) MaxScale sends wrong charset in some cases | ||||||
|  | * [MXS-2536](https://jira.mariadb.org/browse/MXS-2536) Hang on KILL /*QUERY*/ 1 | ||||||
|  | * [MXS-2525](https://jira.mariadb.org/browse/MXS-2525) before upgrade to 2.3, all works well ,after upgrade maxscale to 2.3.7,some programing drivers can not work well | ||||||
|  | * [MXS-2520](https://jira.mariadb.org/browse/MXS-2520) Readwritesplit won't connect to master for reads | ||||||
|  | * [MXS-2511](https://jira.mariadb.org/browse/MXS-2511) Maxscale c-connector version | ||||||
|  | * [MXS-2507](https://jira.mariadb.org/browse/MXS-2507) Hang on CREATE TABLE tab | ||||||
|  | * [MXS-2496](https://jira.mariadb.org/browse/MXS-2496) Service user with roles causes false warnings | ||||||
|  | * [MXS-2494](https://jira.mariadb.org/browse/MXS-2494) MySQLAuth load users query doesn't check mysql.user's plugin column for MariaDB 10.1+ | ||||||
|  | * [MXS-2491](https://jira.mariadb.org/browse/MXS-2491) Destructor dependency between different components of the log | ||||||
|  | * [MXS-2479](https://jira.mariadb.org/browse/MXS-2479) Don't throw error for PAM_TEXT_INFO in PAM conversation function | ||||||
|  | * [MXS-2473](https://jira.mariadb.org/browse/MXS-2473) Clarify documentation on regex-related options | ||||||
|  | * [MXS-2464](https://jira.mariadb.org/browse/MXS-2464) Crash in route_stored_query with ReadWriteSplit | ||||||
|  | * [MXS-2250](https://jira.mariadb.org/browse/MXS-2250) DESCRIBE on temporary table is routed to slave | ||||||
|  | * [MXS-2083](https://jira.mariadb.org/browse/MXS-2083) Maxadmin list servers gives a negative for the number of connections | ||||||
|  | * [MXS-1851](https://jira.mariadb.org/browse/MXS-1851) Using backend protocol as client protocol causes a crash | ||||||
|  | * [MXS-1700](https://jira.mariadb.org/browse/MXS-1700) Using MariaDBClient for backend protocol module causes a crash | ||||||
|  |  | ||||||
|  | ## 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). | ||||||
| @ -144,7 +144,7 @@ char* maxavro_read_string(MAXAVRO_FILE* file, size_t* size) | |||||||
|  |  | ||||||
|     if (maxavro_read_integer(file, &len)) |     if (maxavro_read_integer(file, &len)) | ||||||
|     { |     { | ||||||
|         if (file->buffer_ptr + len < file->buffer_end) |         if (file->buffer_ptr + len <= file->buffer_end) | ||||||
|         { |         { | ||||||
|             key = (char*)MXS_MALLOC(len + 1); |             key = (char*)MXS_MALLOC(len + 1); | ||||||
|             if (key) |             if (key) | ||||||
|  | |||||||
| @ -120,8 +120,7 @@ int check_file(const char* filename) | |||||||
|     return rval; |     return rval; | ||||||
| } | } | ||||||
|  |  | ||||||
| static struct option long_options[] = | static struct option long_options[] = { | ||||||
| { |  | ||||||
|     {"verbose", no_argument, 0, 'v'}, |     {"verbose", no_argument, 0, 'v'}, | ||||||
|     {"dump",    no_argument, 0, 'd'}, |     {"dump",    no_argument, 0, 'd'}, | ||||||
|     {"from",    no_argument, 0, 'f'}, |     {"from",    no_argument, 0, 'f'}, | ||||||
| @ -170,10 +169,17 @@ int main(int argc, char** argv) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     int rval = 0; |     int rval = 0; | ||||||
|     char pathbuf[PATH_MAX + 1]; |  | ||||||
|     for (int i = optind; i < argc; i++) |     for (int i = optind; i < argc; i++) | ||||||
|     { |     { | ||||||
|         if (check_file(realpath(argv[i], pathbuf))) |         char pathbuf[PATH_MAX + 1]; | ||||||
|  |  | ||||||
|  |         if (!realpath(argv[i], pathbuf)) | ||||||
|  |         { | ||||||
|  |             snprintf(pathbuf, sizeof(pathbuf), "%s", argv[i]); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (check_file(pathbuf)) | ||||||
|         { |         { | ||||||
|             fprintf(stderr, "Failed to process file: %s\n", argv[i]); |             fprintf(stderr, "Failed to process file: %s\n", argv[i]); | ||||||
|             rval = 1; |             rval = 1; | ||||||
|  | |||||||
| @ -1094,7 +1094,7 @@ add_test_executable(mxs2057_systemd_watchdog.cpp mxs2057_systemd_watchdog mxs205 | |||||||
| #add_test_executable_notest(long_test.cpp long_test_big replication LABELS readwritesplit REPL_BACKEND BIG_REPL_BACKEND UNSTABLE HEAVY) | #add_test_executable_notest(long_test.cpp long_test_big replication LABELS readwritesplit REPL_BACKEND BIG_REPL_BACKEND UNSTABLE HEAVY) | ||||||
|  |  | ||||||
| # Tries INSERTs with size close to 0x0ffffff * N | # Tries INSERTs with size close to 0x0ffffff * N | ||||||
| add_test_derived(different_size_rwsplit_big different_size_rwsplit replication LABELS readwritesplit UNSTABLE HEAVY REPL_BACKEND BIG_REPL_BACKEND UNSTABLE) | add_test_derived(different_size_rwsplit_big different_size_rwsplit replication LABELS readwritesplit REPL_BACKEND BIG_REPL_BACKEND UNSTABLE HEAVY ) | ||||||
|  |  | ||||||
| # Check how Maxscale works in case of one slave failure, only one slave is configured | # Check how Maxscale works in case of one slave failure, only one slave is configured | ||||||
| add_test_derived(slave_failover_big slave_failover replication.one_slave LABELS readwritesplit REPL_BACKEND BIG_REPL_BACKEND UNSTABLE HEAVY) | add_test_derived(slave_failover_big slave_failover replication.one_slave LABELS readwritesplit REPL_BACKEND BIG_REPL_BACKEND UNSTABLE HEAVY) | ||||||
| @ -1125,11 +1125,11 @@ add_test_derived(rwsplit_connect_big rwsplit_connect replication LABELS readwrit | |||||||
|  |  | ||||||
| # Regression cases for the bug "Hint filter don't work if listed before regex filter in configuration file" | # Regression cases for the bug "Hint filter don't work if listed before regex filter in configuration file" | ||||||
| # (different filter sequence and configuration, but the same test, see .cnf for details) | # (different filter sequence and configuration, but the same test, see .cnf for details) | ||||||
| add_test_derived(bug585_big bug587 bug585 LABELS regexfilter BIG_REPL_BACKEND REPL_BACKEND HEAVY UNSTABLE) | add_test_derived(bug585_big bug587 bug585 LABELS regexfilter BIG_REPL_BACKEND REPL_BACKEND UNSTABLE HEAVY) | ||||||
| add_test_derived(bug587_big bug587 bug587 LABELS regexfilter hintfilter BIG_REPL_BACKEND REPL_BACKEND HEAVY UNSTABLE) | add_test_derived(bug587_big bug587 bug587 LABELS regexfilter hintfilter BIG_REPL_BACKEND REPL_BACKEND UNSTABLE HEAVY) | ||||||
| add_test_derived(bug587_1_big bug587 bug587_1 LABELS regexfilter hintfilter BIG_REPL_BACKEND REPL_BACKEND HEAVY UNSTABLE) | add_test_derived(bug587_1_big bug587 bug587_1 LABELS regexfilter hintfilter BIG_REPL_BACKEND REPL_BACKEND UNSTABLE HEAVY) | ||||||
| # Regression case for the bug "Routing Hints route to server sometimes doesn't work" | # Regression case for the bug "Routing Hints route to server sometimes doesn't work" | ||||||
| add_test_derived(bug471_big bug471 bug471_big LABELS readwritesplit hintfilter BIG_REPL_BACKEND REPL_BACKEND HEAVY UNSTABLE) | add_test_derived(bug471_big bug471 bug471_big LABELS readwritesplit hintfilter BIG_REPL_BACKEND REPL_BACKEND UNSTABLE HEAVY) | ||||||
|  |  | ||||||
| set_tests_properties(different_size_rwsplit_big PROPERTIES TIMEOUT 3600) | set_tests_properties(different_size_rwsplit_big PROPERTIES TIMEOUT 3600) | ||||||
| set_tests_properties(different_size_rwsplit PROPERTIES TIMEOUT 3600) | set_tests_properties(different_size_rwsplit PROPERTIES TIMEOUT 3600) | ||||||
|  | |||||||
| @ -70,6 +70,7 @@ int main(int argc, char** argv) | |||||||
|         get_output(test); |         get_output(test); | ||||||
|  |  | ||||||
|         string gtid_old_master; |         string gtid_old_master; | ||||||
|  |         test.repl->connect(); | ||||||
|         if (find_field(test.repl->nodes[master_index], GTID_QUERY, GTID_FIELD, result_tmp) == 0) |         if (find_field(test.repl->nodes[master_index], GTID_QUERY, GTID_FIELD, result_tmp) == 0) | ||||||
|         { |         { | ||||||
|             gtid_old_master = result_tmp; |             gtid_old_master = result_tmp; | ||||||
| @ -119,6 +120,7 @@ int main(int argc, char** argv) | |||||||
|             test.maxscales->wait_for_monitor(); |             test.maxscales->wait_for_monitor(); | ||||||
|             get_output(test); |             get_output(test); | ||||||
|             char result[100]; |             char result[100]; | ||||||
|  |             test.repl->connect(); | ||||||
|             if (find_field(conn, sstatus_query.c_str(), "Master_Host", result) == 0) |             if (find_field(conn, sstatus_query.c_str(), "Master_Host", result) == 0) | ||||||
|             { |             { | ||||||
|                 test.expect(strcmp(result, test.repl->IP[0]) == 0, |                 test.expect(strcmp(result, test.repl->IP[0]) == 0, | ||||||
|  | |||||||
| @ -1727,7 +1727,7 @@ public: | |||||||
|         const Token* pDatabase = pName2->z ? pName1 : NULL; |         const Token* pDatabase = pName2->z ? pName1 : NULL; | ||||||
|  |  | ||||||
|         char name[pName->n + 1]; |         char name[pName->n + 1]; | ||||||
|         strncpy(name, pName->z, pName->n); |         memcpy(name, pName->z, pName->n); | ||||||
|         name[pName->n] = 0; |         name[pName->n] = 0; | ||||||
|  |  | ||||||
|         QcAliases aliases; |         QcAliases aliases; | ||||||
| @ -1735,7 +1735,7 @@ public: | |||||||
|         if (pDatabase) |         if (pDatabase) | ||||||
|         { |         { | ||||||
|             char database[pDatabase->n + 1]; |             char database[pDatabase->n + 1]; | ||||||
|             strncpy(database, pDatabase->z, pDatabase->n); |             memcpy(database, pDatabase->z, pDatabase->n); | ||||||
|             database[pDatabase->n] = 0; |             database[pDatabase->n] = 0; | ||||||
|  |  | ||||||
|             update_names(database, name, NULL, &aliases); |             update_names(database, name, NULL, &aliases); | ||||||
| @ -1991,13 +1991,13 @@ public: | |||||||
|         const Token* pDatabase = pName2->z ? pName1 : NULL; |         const Token* pDatabase = pName2->z ? pName1 : NULL; | ||||||
|  |  | ||||||
|         char name[pName->n + 1]; |         char name[pName->n + 1]; | ||||||
|         strncpy(name, pName->z, pName->n); |         memcpy(name, pName->z, pName->n); | ||||||
|         name[pName->n] = 0; |         name[pName->n] = 0; | ||||||
|  |  | ||||||
|         if (pDatabase) |         if (pDatabase) | ||||||
|         { |         { | ||||||
|             char database[pDatabase->n + 1]; |             char database[pDatabase->n + 1]; | ||||||
|             strncpy(database, pDatabase->z, pDatabase->n); |             memcpy(database, pDatabase->z, pDatabase->n); | ||||||
|             database[pDatabase->n] = 0; |             database[pDatabase->n] = 0; | ||||||
|  |  | ||||||
|             update_names(database, name, NULL, NULL); |             update_names(database, name, NULL, NULL); | ||||||
| @ -2194,14 +2194,14 @@ public: | |||||||
|  |  | ||||||
|         if (pDatabase) |         if (pDatabase) | ||||||
|         { |         { | ||||||
|             strncpy(database, pDatabase->z, pDatabase->n); |             memcpy(database, pDatabase->z, pDatabase->n); | ||||||
|             database[pDatabase->n] = 0; |             database[pDatabase->n] = 0; | ||||||
|  |  | ||||||
|             zDatabase = database; |             zDatabase = database; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         char table[pTable->n + 1]; |         char table[pTable->n + 1]; | ||||||
|         strncpy(table, pTable->z, pTable->n); |         memcpy(table, pTable->z, pTable->n); | ||||||
|         table[pTable->n] = 0; |         table[pTable->n] = 0; | ||||||
|  |  | ||||||
|         update_names(zDatabase, table, NULL, NULL); |         update_names(zDatabase, table, NULL, NULL); | ||||||
| @ -2302,14 +2302,14 @@ public: | |||||||
|  |  | ||||||
|                 if (pDatabase) |                 if (pDatabase) | ||||||
|                 { |                 { | ||||||
|                     strncpy(database, pDatabase->z, pDatabase->n); |                     memcpy(database, pDatabase->z, pDatabase->n); | ||||||
|                     database[pDatabase->n] = 0; |                     database[pDatabase->n] = 0; | ||||||
|  |  | ||||||
|                     zDatabase = database; |                     zDatabase = database; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 char table[pName->n + 1]; |                 char table[pName->n + 1]; | ||||||
|                 strncpy(table, pName->z, pName->n); |                 memcpy(table, pName->z, pName->n); | ||||||
|                 table[pName->n] = 0; |                 table[pName->n] = 0; | ||||||
|  |  | ||||||
|                 update_names(zDatabase, table, NULL, NULL); |                 update_names(zDatabase, table, NULL, NULL); | ||||||
| @ -2432,7 +2432,7 @@ public: | |||||||
|                 m_type_mask = QUERY_TYPE_WRITE; |                 m_type_mask = QUERY_TYPE_WRITE; | ||||||
|  |  | ||||||
|                 char zName[pName->n + 1]; |                 char zName[pName->n + 1]; | ||||||
|                 strncpy(zName, pName->z, pName->n); |                 memcpy(zName, pName->z, pName->n); | ||||||
|                 zName[pName->n] = 0; |                 zName[pName->n] = 0; | ||||||
|  |  | ||||||
|                 update_names("*any*", zName, NULL, NULL); |                 update_names("*any*", zName, NULL, NULL); | ||||||
| @ -3166,7 +3166,7 @@ public: | |||||||
|         char database[pDatabase ? pDatabase->n + 1 : 0]; |         char database[pDatabase ? pDatabase->n + 1 : 0]; | ||||||
|         if (pDatabase) |         if (pDatabase) | ||||||
|         { |         { | ||||||
|             strncpy(database, pDatabase->z, pDatabase->n); |             memcpy(database, pDatabase->z, pDatabase->n); | ||||||
|             database[pDatabase->n] = 0; |             database[pDatabase->n] = 0; | ||||||
|             zDatabase = database; |             zDatabase = database; | ||||||
|         } |         } | ||||||
| @ -3176,7 +3176,7 @@ public: | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         char name[pName->n + 1]; |         char name[pName->n + 1]; | ||||||
|         strncpy(name, pName->z, pName->n); |         memcpy(name, pName->z, pName->n); | ||||||
|         name[pName->n] = 0; |         name[pName->n] = 0; | ||||||
|  |  | ||||||
|         update_names(zDatabase, name, NULL, NULL); |         update_names(zDatabase, name, NULL, NULL); | ||||||
| @ -3375,7 +3375,7 @@ private: | |||||||
|  |  | ||||||
|         if (nDatabase) |         if (nDatabase) | ||||||
|         { |         { | ||||||
|             strncpy(fullname, zDatabase, nDatabase); |             memcpy(fullname, zDatabase, nDatabase); | ||||||
|             fullname[nDatabase] = 0; |             fullname[nDatabase] = 0; | ||||||
|             strcat(fullname, "."); |             strcat(fullname, "."); | ||||||
|         } |         } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Johan Wikman
					Johan Wikman