From 5edbf2c2bae105e526cbe83d96017fbec6b37abd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 28 Dec 2017 12:53:50 +0100 Subject: [PATCH 01/40] Added mariadb-connector-c-3.0.2-src --- .gitignore | 1 + .../mariadb-connector-c-3.0.2-src.tar.gz | Bin 0 -> 662569 bytes deps/mariadb-client-library/mariadb_client | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 deps/mariadb-client-library/mariadb-connector-c-3.0.2-src.tar.gz diff --git a/.gitignore b/.gitignore index b525ea914..b24cb90e2 100644 --- a/.gitignore +++ b/.gitignore @@ -81,6 +81,7 @@ deps/mariadb-client-library/mariadb_client-2.0.0-Linux-x86_64/ deps/mariadb-client-library/mariadb_client-2.0.0-src/ deps/mariadb-client-library/mariadb-connector-c-2.1.0-src/ deps/mariadb-client-library/mariadb-connector-c-2.3.1/ +deps/mariadb-client-library/mariadb-connector-c-3.0.2-src/ #glib deps/glib/glib-2.40.0/ diff --git a/deps/mariadb-client-library/mariadb-connector-c-3.0.2-src.tar.gz b/deps/mariadb-client-library/mariadb-connector-c-3.0.2-src.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..de98af6d297cd3c10f5d54bd8efa0a5c9a25dc58 GIT binary patch literal 662569 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­#Om{K`Gl!tX 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�p=uIv~C>)B)-_*(*AvvYufP) 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�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

uc` zPBWC!L0zaQvlsRzAC3H)=iFC9^z^dO9MUYa&;xv4AgjP)pLf( z^vAR5ju$Pj8#w1Avg8xN`S%B}JJ8vieBt{rcksss& z-6FfzZzvb&&G`k1$zia?2<-}=Eg7As@nJPxdADYDFhuA`QHOjcQAoV&F(n~;dI#~> z$c;qqd`9@W>aw|Vw*0<)2o%h|ojj!h_}HM)!(3xb0I|oJVe>}^(!NEuMr4T7A%)kW zQHK&~V_2tPV1lc**1&LD)x$#$-<6XnH?7goL{RYA`7v(%z>alWBQC1F{qj1Pay&S9&lf8fF(fTCYi zW_h)~7HQbI_DSaVXw^0!IVtU7|B(TU^{1`9FbQL1_n64Qt{E_#PK6s@_&Q zz&JbTJOjxRdw&GVwl?P3dvvW`eqrnZp|?rEkS9dRP%+nGwc8x05J^NB+*5v4Yt_wBH)R@?2yp|OKx1K_a2!f zZgekgez-V!_3HTx<()kwgkk8HUALUS27T!n-udE{Yo!JLED}p^tqfATD4e2Y$}q@c zxEi>`(c2}|K-P

LA`k%g&wC923F3C~@yNVQkYspg16SHO6 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

&uczA2M0d~6Rbpc#(FSd0Pw(r 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%0Dx9pTJtg)VTPwt5|Nc1Pqv_n zRAN%O>jjO8tQozHa1DzG5*o(KXvn1&t`@#C&+P|%ukiA7?)URm{;{U;XbcKu1C^WN zHUeQa>_%-^WuaUo=Ff(R*pHi#Z$C2N4eGVUjf=t>TGp%Rs%LG5P^%Ws_%e&>5#@~G z;w1rhHBgkDKTD_YV7HkdYn9c=15UHD6MP5 z4SsBISjqPz4Y~RA^=Ewjse4Pl=^ZX~v?&;4Gr)Z;VGW2e!v@oUg)*L=J}m{Fx>?30 zCY@ZtyOZOyW1`AE-SnOA3LWU4`{Ua6v)0=)Rhre)Fp(9y5VKfX499hW-@xrzTHjfEYxphYZKEG6%sXGB!S-SB@LJY2`qdvBGgttKpkL zb3jY|-OY;UH|}z7Qjb!okyYhV05sylRi75o0^6t9;Zl_U0~wx`bFKn(<0j+xuU1g7(%J5yeuyt?Tdo8b(VEucrx!Q5pdcF-n7J#(S(0YuQT29;)lR26f%LEh&;au z8*$iKf?eGVRYheErr;b3iSS3@?9=@*^)gem6B6VflP(*C&(6o={P!=0KKDgkB-Wg$ zXGL9IM+^|zidi8(G}V8FOP&PZK7(1B){FqkPRj#vC~^AG`yg_CPxX!IxpjClIer~H zfWxExS8onMh%=#tmiuooXZSw^o8-*@H&v{IYPZvhp;SuO9*TYk&;9M1QkW8wX7OjMfA4!oeHF7o=aP^JjcSx%l5fK+SMO6SE zVrWkm)$T8rb#N~evJ$e|j8a<30TemCE%gmv1G|urt`zn90JJv*QM<`l{+qBLh4X5Z z(O~pgE;<*5&6tZcudDei>dDxIuPGSEvCxtAN~F~Ly2E9m6Dyq6?Vr2_X@%nPXHCoX z{N&ed&(D6Hho6-qk0yyk7#Wj|m=6yUf`>9SQ1f|FEldh8sUO#3)j=c_VDpVH6zOT1 zUPDv2jZA9K$x`AF&`xlpu0RnoE4$oj*lRXlYs>d}-g`|(>R0X$NkkUYF`n8y?M*P= z$O}6@8}5Tzqc9^@4P(a21-(knz07tXGEbHimk1C2^4WhuanjA~o3Fe@Auwl9gCHLB zw{oP#2S!YCIWMjn!?Ae_=D10uu(GS^lxZp{T}?LrY~({e{?^w=uMc0n|G|02ja8;C zXv?7qV$uQ>6%0F3?620YL!0CsJB5b!_~qZukKdh5-cJ78;W^>s=noz*

X?aYiR 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 IrU39B0Ln)yj{pDw literal 0 HcmV?d00001 From a15917ead36846fc4425981c3aedfddca473200f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 14 Jan 2018 23:53:31 +0100 Subject: [PATCH 22/40] Link against libev --- deps/Makefile | 6 +++--- src/Makefile | 12 ++++++++---- src/main.cpp | 8 ++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/deps/Makefile b/deps/Makefile index 0cf7df996..be45ca2a7 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -11,9 +11,9 @@ endif PROXYSQLCLICKHOUSE := $(shell echo $(PROXYSQLCLICKHOUSE)) ifeq ($(PROXYSQLCLICKHOUSE),1) -default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre clickhouse-cpp lz4 cityhash microhttpd curl libev +default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre clickhouse-cpp lz4 cityhash microhttpd curl ev else -default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre microhttpd curl libev +default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre microhttpd curl ev endif .PHONY: default @@ -22,7 +22,7 @@ libev/libev/.libs/libev.a: cd libev && tar -zxf libev-4.24.tar.gz cd libev/libev && ./configure cd libev/libev && CC=${CC} CXX=${CXX} ${MAKE} -libev: libev/libev/.libs/libev.a +ev: libev/libev/.libs/libev.a curl/curl/lib/.libs/libcurl.a: diff --git a/src/Makefile b/src/Makefile index 2dc3f2777..5342acd39 100644 --- a/src/Makefile +++ b/src/Makefile @@ -44,10 +44,14 @@ CURL_DIR=$(DEPS_PATH)/curl/curl/ CURL_IDIR=$(CURL_DIR)/include CURL_LDIR=$(CURL_DIR)/lib/.libs +EV_DIR=$(DEPS_PATH)/libev/libev/ +EV_IDIR=$(EV_DIR) +EV_LDIR=$(EV_DIR)/.libs + IDIR=../include LDIR=../lib -IDIRS=-I$(IDIR) -I$(JEMALLOC_IDIR) -I$(MARIADB_IDIR) $(LIBCONFIG_IDIR) -I$(DAEMONPATH_IDIR) -I$(SQLITE3_DIR) -I$(CLICKHOUSE_CPP_DIR) -I$(MICROHTTPD_IDIR) -I$(CURL_IDIR) -LDIRS=-L$(LDIR) -L$(JEMALLOC_LDIR) $(LIBCONFIG_LDIR) -L$(RE2_PATH)/obj -L$(MARIADB_LDIR) -L$(DAEMONPATH_LDIR) -L$(PCRE_LDIR) -L$(MICROHTTPD_LDIR) -L$(CURL_LDIR) +IDIRS=-I$(IDIR) -I$(JEMALLOC_IDIR) -I$(MARIADB_IDIR) $(LIBCONFIG_IDIR) -I$(DAEMONPATH_IDIR) -I$(SQLITE3_DIR) -I$(CLICKHOUSE_CPP_DIR) -I$(MICROHTTPD_IDIR) -I$(CURL_IDIR) -I$(EV_IDIR) +LDIRS=-L$(LDIR) -L$(JEMALLOC_LDIR) $(LIBCONFIG_LDIR) -L$(RE2_PATH)/obj -L$(MARIADB_LDIR) -L$(DAEMONPATH_LDIR) -L$(PCRE_LDIR) -L$(MICROHTTPD_LDIR) -L$(CURL_LDIR) -L$(EV_DIR) UNAME_S := $(shell uname -s) @@ -68,9 +72,9 @@ MYCXXFLAGS=-std=c++11 $(IDIRS) $(OPTZ) $(DEBUG) $(PSQLCH) LDFLAGS+= NOJEMALLOC := $(shell echo $(NOJEMALLOC)) ifeq ($(NOJEMALLOC),1) -MYLIBS=-Wl,--export-dynamic -Wl,-Bstatic -lconfig -lproxysql -ldaemon -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lmicrohttpd -lcurl -Wl,-Bdynamic -lpthread -lm -lz -lrt -lcrypto -lssl $(EXTRALINK) +MYLIBS=-Wl,--export-dynamic -Wl,-Bstatic -lconfig -lproxysql -ldaemon -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lmicrohttpd -lcurl -lev -Wl,-Bdynamic -lpthread -lm -lz -lrt -lcrypto -lssl $(EXTRALINK) else -MYLIBS=-Wl,--export-dynamic -Wl,-Bstatic -lconfig -lproxysql -ldaemon -ljemalloc -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lmicrohttpd -lcurl -Wl,-Bdynamic -lpthread -lm -lz -lrt -lcrypto -lssl $(EXTRALINK) +MYLIBS=-Wl,--export-dynamic -Wl,-Bstatic -lconfig -lproxysql -ldaemon -ljemalloc -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lmicrohttpd -lcurl -lev -Wl,-Bdynamic -lpthread -lm -lz -lrt -lcrypto -lssl $(EXTRALINK) endif ifeq ($(UNAME_S),Darwin) diff --git a/src/main.cpp b/src/main.cpp index 09237ee46..693d13a17 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,6 +15,7 @@ #include #include #include +#include "ev.h" // MariaDB client library redefines dlerror(), see https://mariadb.atlassian.net/browse/CONC-101 #ifdef dlerror @@ -393,6 +394,13 @@ void ProxySQL_Main_init_main_modules() { GloMyMon=NULL; GloMyLogger=NULL; GloMyStmt=NULL; + + // initialize libev + if (!ev_default_loop (EVBACKEND_POLL | EVFLAG_NOENV)) { + fprintf(stderr,"could not initialise libev"); + exit(EXIT_FAILURE); + } + MyHGM=new MySQL_HostGroups_Manager(); GloMTH=new MySQL_Threads_Handler(); GloMyLogger = new MySQL_Logger(); From f4a0c4a2b5e58d1ad503251c12ba6149c5f65914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Tue, 16 Jan 2018 18:28:17 +0100 Subject: [PATCH 23/40] ProxySQL reads GTID information from proxysql_mysqlbinlog This is the first commit to pull data from proxysql_mysqlbinlog. It is still in Alpha phase, as it is missing a log of important logics, like error handling, retry mechanism, timeouts, etc --- include/MySQL_HostGroups_Manager.h | 213 ++++++++++++++++++++- include/proxysql_admin.h | 1 + include/proxysql_gtid.h | 14 +- lib/Makefile | 6 +- lib/MySQL_HostGroups_Manager.cpp | 290 +++++++++++++++++++++++++++++ lib/ProxySQL_Admin.cpp | 65 ++++++- src/main.cpp | 1 + 7 files changed, 583 insertions(+), 7 deletions(-) diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 3e909da1d..12fe5a29d 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -5,10 +5,14 @@ #include "proxysql_gtid.h" #include +#include #include "thread.h" #include "wqueue.h" + +#include "ev.h" + /* Enabling STRESSTEST_POOL ProxySQL will do a lot of loops in the connection pool This is for internal testing ONLY!!!! @@ -43,6 +47,201 @@ enum MySerStatus { MYSQL_SERVER_STATUS_SHUNNED_REPLICATION_LAG }; + +std::string gtid_executed_to_string(gtid_set_t& gtid_executed); +void addGtid(const gtid_t& gtid, gtid_set_t& gtid_executed); + +class GTID_Server_Data { + public: + char *address; + uint16_t port; + uint16_t mysql_port; + char *data; + size_t len; + size_t size; + size_t pos; + struct ev_io *w; + char uuid_server[64]; + gtid_set_t gtid_executed; + bool active; + GTID_Server_Data(struct ev_io *_w, char *_address, uint16_t _port, uint16_t _mysql_port) { + active = true; + w = _w; + size = 1024; // 1KB buffer + data = (char *)malloc(size); + uuid_server[0] = 0; + pos = 0; + len = 0; + address = strdup(_address); + port = _port; + mysql_port = _mysql_port; + } + void resize(size_t _s) { + char *data_ = (char *)malloc(_s); + memcpy(data_, data, (_s > size ? size : _s)); + size = _s; + free(data); + data = data_; + } + ~GTID_Server_Data() { + free(address); + free(data); + } + bool readall() { + bool ret = true; + if (size == len) { + // buffer is full, expand + resize(len*2); + } + int rc = 0; + rc = read(w->fd,data+len,size-len); + if (rc > 0) { + len += rc; + } else { + int myerr = errno; + if ( + (rc == 0) || + (rc==-1 && myerr != EINTR && myerr != EAGAIN) + ) { + ret = false; + } + } + return ret; + } + bool writeout() { + bool ret = true; + if (len==0) { + return ret; + } + int rc = 0; + rc = write(w->fd,data+pos,len-pos); + if (rc > 0) { + pos += rc; + if (pos >= len/2) { + memmove(data,data+pos,len-pos); + len = len-pos; + pos = 0; + } + } + return ret; + } + bool read_next_gtid() { + if (len==0) { + return false; + } + void *nlp = NULL; + nlp = memchr(data+pos,'\n',len-pos); + if (nlp == NULL) { + return false; + } + int l = (char *)nlp - (data+pos); + char rec_msg[80]; + if (strncmp(data+pos,(char *)"ST=",3)==0) { + // we are reading the bootstrap + char *bs = (char *)malloc(l+1-3); // length + 1 (null byte) - 3 (header) + memcpy(bs,data+pos+3,l+1-3); + char *saveptr1=NULL; + char *saveptr2=NULL; + //char *saveptr3=NULL; + char *token = NULL; + char *subtoken = NULL; + //char *subtoken2 = NULL; + char *str1 = NULL; + char *str2 = NULL; + //char *str3 = NULL; + for (str1 = bs; ; str1 = NULL) { + token = strtok_r(str1, ",", &saveptr1); + if (token == NULL) { + break; + } + int j = 0; + for (str2 = token; ; str2 = NULL) { + subtoken = strtok_r(str2, ":", &saveptr2); + if (subtoken == NULL) { + break; + } + j++; + if (j%2 == 1) { // we are reading the uuid + char *p = uuid_server; + for (unsigned int k=0; k= len/2) { + memmove(data,data+pos,len-pos); + len = len-pos; + pos = 0; + } + } +}; + + + class MySrvConnList { private: PtrArray *conns; @@ -184,10 +383,16 @@ class MySQL_HostGroups_Manager { std::thread *HGCU_thread; - std::unordered_map gtid_map; - pthread_rwlock_t gtid_rwlock; + std::thread *GTID_syncer_thread; + //pthread_t GTID_syncer_thread_id; + //pthread_t HGCU_thread_id; + public: + pthread_rwlock_t gtid_rwlock; + std::unordered_map gtid_map; + struct ev_async * gtid_ev_async; + struct ev_loop * gtid_ev_loop; struct { unsigned int servers_table_version; pthread_mutex_t servers_table_version_lock; @@ -220,6 +425,7 @@ class MySQL_HostGroups_Manager { wqueue queue; MySQL_HostGroups_Manager(); ~MySQL_HostGroups_Manager(); + void init(); void wrlock(); void wrunlock(); bool server_add(unsigned int hid, char *add, uint16_t p=3306, uint16_t gp=0, unsigned int _weight=1, enum MySerStatus status=MYSQL_SERVER_STATUS_ONLINE, unsigned int _comp=0, unsigned int _max_connections=100, unsigned int _max_replication_lag=0, unsigned int _use_ssl=0, unsigned int _max_latency_ms=0, char *comment=NULL); @@ -258,6 +464,9 @@ class MySQL_HostGroups_Manager { void update_group_replication_set_read_only(char *_hostname, int _port, int _writer_hostgroup, char *error); void update_group_replication_set_writer(char *_hostname, int _port, int _writer_hostgroup); void converge_group_replication_config(int _writer_hostgroup); + + SQLite3_result * get_stats_mysql_gtid_executed(); + void generate_mysql_gtid_executed_tables(); }; #endif /* __CLASS_MYSQL_HOSTGROUPS_MANAGER_H */ diff --git a/include/proxysql_admin.h b/include/proxysql_admin.h index e689f23cc..6fecd86d1 100644 --- a/include/proxysql_admin.h +++ b/include/proxysql_admin.h @@ -243,6 +243,7 @@ class ProxySQL_Admin { void stats___proxysql_servers_checksums(); void stats___proxysql_servers_metrics(); void stats___mysql_prepared_statements_info(); + void stats___mysql_gtid_executed(); int Read_Global_Variables_from_configfile(const char *prefix); int Read_MySQL_Users_from_configfile(); diff --git a/include/proxysql_gtid.h b/include/proxysql_gtid.h index bace8aaef..b2e11614c 100644 --- a/include/proxysql_gtid.h +++ b/include/proxysql_gtid.h @@ -10,12 +10,24 @@ typedef std::pair gtid_t; typedef std::pair gtid_interval_t; typedef std::unordered_map> gtid_set_t; +/* class Gtid_Server_Info { + public: gtid_set_t executed_gtid_set; - char *address; + char *hostname; uint16_t mysql_port; uint16_t gtid_port; bool active; + Gtid_Server_Info(char *_h, uint16_t _mp, uint16_t _gp) { + hostname = strdup(_h); + mysql_port = _mp; + gtid_port = _gp; + active = true; + }; + ~Gtid_Server_Info() { + free(hostname); + }; }; +*/ #endif /* PROXYSQL_GTID */ diff --git a/lib/Makefile b/lib/Makefile index b122483c1..0bd9edb8b 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -32,9 +32,13 @@ MICROHTTPD_IDIR=-I$(MICROHTTPD_DIR) -I$(MICROHTTPD_DIR)/src/include CURL_DIR=$(DEPS_PATH)/curl/curl CURL_IDIR=-I$(CURL_DIR)/include +EV_DIR=$(DEPS_PATH)/libev/libev/ +EV_IDIR=$(EV_DIR) + + IDIR=../include -IDIRS=-I$(IDIR) -I$(JEMALLOC_IDIR) -I$(MARIADB_IDIR) $(LIBCONFIG_IDIR) -I$(RE2_IDIR) -I$(SQLITE3_DIR) -I$(PCRE_PATH) -I/usr/local/include -I$(CLICKHOUSE_CPP_DIR) $(MICROHTTPD_IDIR) $(CURL_IDIR) +IDIRS=-I$(IDIR) -I$(JEMALLOC_IDIR) -I$(MARIADB_IDIR) $(LIBCONFIG_IDIR) -I$(RE2_IDIR) -I$(SQLITE3_DIR) -I$(PCRE_PATH) -I/usr/local/include -I$(CLICKHOUSE_CPP_DIR) $(MICROHTTPD_IDIR) $(CURL_IDIR) -I$(EV_DIR) LDIRS=-L$(JEMALLOC_PATH)/lib -L$(RE2_PATH)/obj -L$(INJECTION_PATH) diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index de09198b9..83f334035 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -8,6 +8,8 @@ #include "thread.h" #include "wqueue.h" +#include "ev.h" + #define SAFE_SQLITE3_STEP(_stmt) do {\ do {\ rc=sqlite3_step(_stmt);\ @@ -29,6 +31,20 @@ class MySrvC; class MySrvList; class MyHGC; +//static struct ev_async * gtid_ev_async; + +static pthread_mutex_t ev_loop_mutex; + +//static std::unordered_map gtid_map; + +static void gtid_async_cb(struct ev_loop *loop, struct ev_async *watcher, int revents) { + pthread_mutex_lock(&ev_loop_mutex); + MyHGM->generate_mysql_gtid_executed_tables(); + pthread_mutex_unlock(&ev_loop_mutex); + return; +} + + static int wait_for_mysql(MYSQL *mysql, int status) { struct pollfd pfd; int timeout, res; @@ -53,6 +69,173 @@ static int wait_for_mysql(MYSQL *mysql, int status) { } } +void reader_cb(struct ev_loop *loop, struct ev_io *w, int revents) { + pthread_mutex_lock(&ev_loop_mutex); + if (revents & EV_READ) { + GTID_Server_Data *sd = (GTID_Server_Data *)w->data; + bool rc = true; + rc = sd->readall(); + if (rc == false) { + delete sd; + ev_io_stop(MyHGM->gtid_ev_loop, w); + free(w); + } else { + sd->dump(); + } + } + pthread_mutex_unlock(&ev_loop_mutex); +} + +void connect_cb(EV_P_ ev_io *w, int revents) { + struct ev_io * c = w; + if (revents & EV_WRITE) { + int optval = 0; + socklen_t optlen = sizeof(optval); + if ((getsockopt(w->fd, SOL_SOCKET, SO_ERROR, &optval, &optlen) == -1) || + (optval != 0)) { + /* Connection failed; try the next address in the list. */ + int errnum = optval ? optval : errno; + ev_io_stop(MyHGM->gtid_ev_loop, w); + close(w->fd); + GTID_Server_Data * custom_data = (GTID_Server_Data *)w->data; + delete custom_data; + free(c); + } else { + ev_io_stop(MyHGM->gtid_ev_loop, w); + int fd=w->fd; + free(w); + struct ev_io * new_w = (struct ev_io*) malloc(sizeof(struct ev_io)); + ev_io_init(new_w, reader_cb, fd, EV_READ); + ev_io_start(MyHGM->gtid_ev_loop, new_w); + } + } +} + +struct ev_io * new_connector(char *address, uint16_t gtid_port, uint16_t mysql_port) { + struct sockaddr_in a; + int s; + + if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) { + perror("socket"); + close(s); + return NULL; + } + memset(&a, 0, sizeof(a)); + a.sin_port = htons(gtid_port); + a.sin_family = AF_INET; + if (!inet_aton(address, (struct in_addr *) &a.sin_addr.s_addr)) { + perror("bad IP address format"); + close(s); + return NULL; + } + ioctl_FIONBIO(s,1); + + int status = connect(s, (struct sockaddr *) &a, sizeof(a)); + if ((status == 0) || ((status == -1) && (errno == EINPROGRESS))) { + struct ev_io *c = (struct ev_io *)malloc(sizeof(struct ev_io)); + if (c) { + ev_io_init(c, connect_cb, s, EV_WRITE); + GTID_Server_Data * custom_data = new GTID_Server_Data(c, address, gtid_port, mysql_port); + c->data = (void *)custom_data; + return c; + } + /* else error */ + } + return NULL; +} + + +std::string gtid_executed_to_string(gtid_set_t& gtid_executed) { + std::string gtid_set; + for (auto it=gtid_executed.begin(); it!=gtid_executed.end(); ++it) { + std::string s = it->first; + s.insert(8,"-"); + s.insert(13,"-"); + s.insert(18,"-"); + s.insert(23,"-"); + s = s + ":"; + for (auto itr = it->second.begin(); itr != it->second.end(); ++itr) { + std::string s2 = s; + s2 = s2 + std::to_string(itr->first); + s2 = s2 + "-"; + s2 = s2 + std::to_string(itr->second); + s2 = s2 + ","; + gtid_set = gtid_set + s2; + } + } + gtid_set.pop_back(); + return gtid_set; +} + + + +void addGtid(const gtid_t& gtid, gtid_set_t& gtid_executed) { + auto it = gtid_executed.find(gtid.first); + if (it == gtid_executed.end()) + { + gtid_executed[gtid.first].emplace_back(gtid.second, gtid.second); + return; + } + + bool flag = true; + for (auto itr = it->second.begin(); itr != it->second.end(); ++itr) + { + if (gtid.second >= itr->first && gtid.second <= itr->second) + return; + if (gtid.second + 1 == itr->first) + { + --itr->first; + flag = false; + break; + } + else if (gtid.second == itr->second + 1) + { + ++itr->second; + flag = false; + break; + } + else if (gtid.second < itr->first) + { + it->second.emplace(itr, gtid.second, gtid.second); + return; + } + } + + if (flag) + it->second.emplace_back(gtid.second, gtid.second); + + for (auto itr = it->second.begin(); itr != it->second.end(); ++itr) + { + auto next_itr = std::next(itr); + if (next_itr != it->second.end() && itr->second + 1 == next_itr->first) + { + itr->second = next_itr->second; + it->second.erase(next_itr); + break; + } + } +} + +static void * GTID_syncer_run() { + //struct ev_loop * gtid_ev_loop; + //gtid_ev_loop = NULL; + MyHGM->gtid_ev_loop = ev_loop_new (EVBACKEND_POLL | EVFLAG_NOENV); + if (MyHGM->gtid_ev_loop == NULL) { + proxy_error("could not initialise GTID sync loop\n"); + exit(EXIT_FAILURE); + } + MyHGM->gtid_ev_async = (struct ev_async *)malloc(sizeof(struct ev_async)); + //ev_async_init(gtid_ev_async, gtid_async_cb); + //ev_async_start(gtid_ev_loop, gtid_ev_async); + ev_async_init(MyHGM->gtid_ev_async, gtid_async_cb); + ev_async_start(MyHGM->gtid_ev_loop, MyHGM->gtid_ev_async); + //ev_ref(gtid_ev_loop); + ev_run(MyHGM->gtid_ev_loop, 0); + //sleep(1000); + return NULL; +} + +//static void * HGCU_thread_run() { static void * HGCU_thread_run() { PtrArray *conn_array=new PtrArray(); while(1) { @@ -380,12 +563,28 @@ MySQL_HostGroups_Manager::MySQL_HostGroups_Manager() { MyHostGroups=new PtrArray(); incoming_replication_hostgroups=NULL; incoming_group_replication_hostgroups=NULL; + pthread_rwlock_init(>id_rwlock, NULL); + gtid_ev_async = (struct ev_async *)malloc(sizeof(struct ev_async)); +} +void MySQL_HostGroups_Manager::init() { + //conn_reset_queue = NULL; + //conn_reset_queue = new wqueue(); HGCU_thread = new std::thread(&HGCU_thread_run); + //pthread_create(&HGCU_thread_id, NULL, HGCU_thread_run , NULL); + + // gtid initialization; + GTID_syncer_thread = new std::thread(>ID_syncer_run); + + //pthread_create(>ID_syncer_thread_id, NULL, GTID_syncer_run , NULL); } MySQL_HostGroups_Manager::~MySQL_HostGroups_Manager() { queue.add(NULL); HGCU_thread->join(); + //pthread_join(HGCU_thread_id, NULL); + //pthread_join(GTID_syncer_thread_id, NULL); + GTID_syncer_thread->join(); + free(gtid_ev_async); while (MyHostGroups->len) { MyHGC *myhgc=(MyHGC *)MyHostGroups->remove_index_fast(0); delete myhgc; @@ -866,6 +1065,8 @@ bool MySQL_HostGroups_Manager::commit() { pthread_mutex_unlock(&GloVars.checksum_mutex); } + ev_async_send(gtid_ev_loop, gtid_ev_async); + __sync_fetch_and_add(&status.servers_table_version,1); pthread_cond_broadcast(&status.servers_table_version_cond); pthread_mutex_unlock(&status.servers_table_version_lock); @@ -877,6 +1078,64 @@ bool MySQL_HostGroups_Manager::commit() { } +void MySQL_HostGroups_Manager::generate_mysql_gtid_executed_tables() { + pthread_rwlock_wrlock(>id_rwlock); + // first, set them all as active = false + std::unordered_map::iterator it = gtid_map.begin(); + while(it != gtid_map.end()) { + GTID_Server_Data * gtid_si = it->second; + gtid_si->active = false; + it++; + } + + for (unsigned int i=0; ilen; i++) { + MyHGC *myhgc=(MyHGC *)MyHostGroups->index(i); + MySrvC *mysrvc=NULL; + for (unsigned int j=0; jmysrvs->servers->len; j++) { + mysrvc=myhgc->mysrvs->idx(j); + if (mysrvc->gtid_port) { + std::string s1 = mysrvc->address; + s1.append(":"); + s1.append(std::to_string(mysrvc->port)); + std::unordered_map ::iterator it2; + it2 = gtid_map.find(s1); + GTID_Server_Data *gtid_is=NULL; + if (it2!=gtid_map.end()) { + gtid_is=it2->second; + gtid_is->active = true; + } else { + // we didn't find it. Create it + /* + struct ev_io *watcher = (struct ev_io *)malloc(sizeof(struct ev_io)); + gtid_is = new GTID_Server_Data(watcher, mysrvc->address, mysrvc->port, mysrvc->gtid_port); + gtid_map.emplace(s1,gtid_is); + */ + struct ev_io * c = NULL; + c = new_connector(mysrvc->address, mysrvc->gtid_port, mysrvc->port); + if (c) { + gtid_is = (GTID_Server_Data *)c->data; + gtid_map.emplace(s1,gtid_is); + ev_io_start(MyHGM->gtid_ev_loop,c); + } + } + } + } + } + std::vector to_remove; + it = gtid_map.begin(); + while(it != gtid_map.end()) { + GTID_Server_Data * gtid_si = it->second; + if (gtid_si->active == false) { + to_remove.push_back(it->first); + } + it++; + } + for (std::vector::iterator it3=to_remove.begin(); it3!=to_remove.end(); ++it3) { + gtid_map.erase(*it3); + } + pthread_rwlock_unlock(>id_rwlock); +} + void MySQL_HostGroups_Manager::purge_mysql_servers_table() { for (unsigned int i=0; ilen; i++) { MyHGC *myhgc=(MyHGC *)MyHostGroups->index(i); @@ -2600,3 +2859,34 @@ void MySQL_HostGroups_Manager::converge_group_replication_config(int _writer_hos } pthread_mutex_unlock(&Group_Replication_Info_mutex); } + +SQLite3_result * MySQL_HostGroups_Manager::get_stats_mysql_gtid_executed() { + const int colnum = 3; + SQLite3_result * result = new SQLite3_result(colnum); + result->add_column_definition(SQLITE_TEXT,"hostname"); + result->add_column_definition(SQLITE_TEXT,"port"); + result->add_column_definition(SQLITE_TEXT,"gtid_executed"); + int k; + pthread_rwlock_wrlock(>id_rwlock); + std::unordered_map::iterator it = gtid_map.begin(); + while(it != gtid_map.end()) { + GTID_Server_Data * gtid_si = it->second; + char buf[64]; + char **pta=(char **)malloc(sizeof(char *)*colnum); + pta[0]=strdup(gtid_si->address); + sprintf(buf,"%d", (int)gtid_si->mysql_port); + pta[1]=strdup(buf); + //sprintf(buf,"%d", mysrvc->port); + string s1 = gtid_executed_to_string(gtid_si->gtid_executed); + pta[2]=strdup(s1.c_str()); + result->add_row(pta); + for (k=0; k=0) NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" // mysql_servers in v2.0.0 -#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V2_0_0 "CREATE TABLE mysql_servers (hostgroup_id INT CHECK (hostgroup_id>=0) NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_port INT NOT NULL DEFAULT 0 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" +#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V2_0_0 "CREATE TABLE mysql_servers (hostgroup_id INT CHECK (hostgroup_id>=0) NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_port INT CHECK (gtid_port <> port) NOT NULL DEFAULT 0 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" #define ADMIN_SQLITE_TABLE_MYSQL_SERVERS ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V2_0_0 @@ -276,6 +276,8 @@ static int http_handler(void *cls, struct MHD_Connection *connection, const char #define STATS_SQLITE_TABLE_MEMORY_METRICS "CREATE TABLE stats_memory_metrics (Variable_Name VARCHAR NOT NULL PRIMARY KEY , Variable_Value VARCHAR NOT NULL)" +#define STATS_SQLITE_TABLE_MYSQL_GTID_EXECUTED "CREATE TABLE stats_mysql_gtid_executed (hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_executed VARCHAR)" + #ifdef DEBUG #define ADMIN_SQLITE_TABLE_DEBUG_LEVELS "CREATE TABLE debug_levels (module VARCHAR NOT NULL PRIMARY KEY , verbosity INT NOT NULL DEFAULT 0)" #endif /* DEBUG */ @@ -1849,6 +1851,7 @@ void ProxySQL_Admin::GenericRefreshStatistics(const char *query_no_space, unsign bool stats_mysql_commands_counters=false; bool stats_mysql_query_rules=false; bool stats_mysql_users=false; + bool stats_mysql_gtid_executed=false; bool dump_global_variables=false; bool runtime_scheduler=false; @@ -1898,6 +1901,8 @@ void ProxySQL_Admin::GenericRefreshStatistics(const char *query_no_space, unsign { stats_mysql_query_rules=true; refresh=true; } if (strstr(query_no_space,"stats_mysql_users")) { stats_mysql_users=true; refresh=true; } + if (strstr(query_no_space,"stats_mysql_gtid_executed")) + { stats_mysql_gtid_executed=true; refresh=true; } if (strstr(query_no_space,"stats_proxysql_servers_checksums")) { stats_proxysql_servers_checksums = true; refresh = true; } @@ -1975,6 +1980,8 @@ void ProxySQL_Admin::GenericRefreshStatistics(const char *query_no_space, unsign stats___mysql_commands_counters(); if (stats_mysql_users) stats___mysql_users(); + if (stats_mysql_gtid_executed) + stats___mysql_gtid_executed(); // cluster if (stats_proxysql_servers_metrics) { @@ -3483,6 +3490,7 @@ bool ProxySQL_Admin::init() { insert_into_tables_defs(tables_defs_stats,"stats_mysql_query_digest", STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST); insert_into_tables_defs(tables_defs_stats,"stats_mysql_query_digest_reset", STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET); insert_into_tables_defs(tables_defs_stats,"stats_mysql_global", STATS_SQLITE_TABLE_MYSQL_GLOBAL); + insert_into_tables_defs(tables_defs_stats,"stats_mysql_gtid_executed", STATS_SQLITE_TABLE_MYSQL_GTID_EXECUTED); insert_into_tables_defs(tables_defs_stats,"stats_memory_metrics", STATS_SQLITE_TABLE_MEMORY_METRICS); insert_into_tables_defs(tables_defs_stats,"stats_mysql_users", STATS_SQLITE_TABLE_MYSQL_USERS); insert_into_tables_defs(tables_defs_stats,"global_variables", ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES); // workaround for issue #708 @@ -6483,6 +6491,57 @@ void ProxySQL_Admin::stats___mysql_users() { free(ads); } +void ProxySQL_Admin::stats___mysql_gtid_executed() { + int i; + statsdb->execute("DELETE FROM stats_mysql_gtid_executed"); + SQLite3_result *resultset=NULL; + resultset = MyHGM->get_stats_mysql_gtid_executed(); + if (resultset) { + int rc; + sqlite3_stmt *statement1=NULL; + sqlite3_stmt *statement32=NULL; + sqlite3 *mydb3=statsdb->get_db(); + char *query1=NULL; + char *query32=NULL; + query1=(char *)"INSERT INTO stats_mysql_gtid_executed VALUES (?1, ?2, ?3)"; + query32=(char *)"INSERT INTO stats_mysql_gtid_executed VALUES (?1, ?2, ?3), (?4, ?5, ?6), (?7, ?8, ?9), (?10, ?11, ?12), (?13, ?14, ?15), (?16, ?17, ?18), (?19, ?20, ?21), (?22, ?23, ?24), (?25, ?26, ?27), (?28, ?29, ?30), (?31, ?32, ?33), (?34, ?35, ?36), (?37, ?38, ?39), (?40, ?41, ?42), (?43, ?44, ?45), (?46, ?47, ?48), (?49, ?50, ?51), (?52, ?53, ?54), (?55, ?56, ?57), (?58, ?59, ?60), (?61, ?62, ?63), (?64, ?65, ?66), (?67, ?68, ?69), (?70, ?71, ?72), (?73, ?74, ?75), (?76, ?77, ?78), (?79, ?80, ?81), (?82, ?83, ?84), (?85, ?86, ?87), (?88, ?89, ?90), (?91, ?92, ?93), (?94, ?95, ?96)"; + + rc=sqlite3_prepare_v2(mydb3, query1, -1, &statement1, 0); + assert(rc==SQLITE_OK); + rc=sqlite3_prepare_v2(mydb3, query32, -1, &statement32, 0); + assert(rc==SQLITE_OK); + int row_idx=0; + int max_bulk_row_idx=resultset->rows_count/32; + max_bulk_row_idx=max_bulk_row_idx*32; + for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { + SQLite3_row *r1=*it; + int idx=row_idx%32; + if (row_idxfields[0], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*3)+2, atoi(r1->fields[1])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement32, (idx*3)+3, r1->fields[2], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + if (idx==31) { + SAFE_SQLITE3_STEP(statement32); + rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); + rc=sqlite3_reset(statement32); assert(rc==SQLITE_OK); + } + } else { // single row + rc=sqlite3_bind_text(statement1, 1, r1->fields[0], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 2, atoi(r1->fields[1])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement1, 3, r1->fields[2], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + SAFE_SQLITE3_STEP(statement1); + rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); + rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); + } + row_idx++; + } + sqlite3_finalize(statement1); + sqlite3_finalize(statement32); + delete resultset; + resultset = NULL; + } +} + void ProxySQL_Admin::save_scheduler_runtime_to_database(bool _runtime) { char *query=NULL; if (_runtime) { @@ -7374,7 +7433,7 @@ int ProxySQL_Admin::Read_MySQL_Servers_from_configfile() { } } server.lookupValue("port", port); - server.lookupValue("gtid_port", port); + server.lookupValue("gtid_port", gtid_port); if (server.lookupValue("hostgroup", hostgroup)==false) continue; server.lookupValue("status", status); if ( @@ -7395,7 +7454,7 @@ int ProxySQL_Admin::Read_MySQL_Servers_from_configfile() { char *o1=strdup(comment.c_str()); char *o=escape_string_single_quotes(o1, false); char *query=(char *)malloc(strlen(q)+strlen(status.c_str())+strlen(address.c_str())+strlen(o)+128); - sprintf(query,q, address.c_str(), port, hostgroup, compression, weight, status.c_str(), max_connections, max_replication_lag, use_ssl, max_latency_ms, o); + sprintf(query,q, address.c_str(), port, gtid_port, hostgroup, compression, weight, status.c_str(), max_connections, max_replication_lag, use_ssl, max_latency_ms, o); //fprintf(stderr, "%s\n", query); admindb->execute(query); if (o!=o1) free(o); diff --git a/src/main.cpp b/src/main.cpp index 693d13a17..2e54acd26 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -402,6 +402,7 @@ void ProxySQL_Main_init_main_modules() { } MyHGM=new MySQL_HostGroups_Manager(); + MyHGM->init(); GloMTH=new MySQL_Threads_Handler(); GloMyLogger = new MySQL_Logger(); GloMyStmt=new MySQL_STMT_Manager_v14(); From b2562a63ad8377cd3389b079e09e0e0b221a9a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 18 Jan 2018 12:01:38 +0100 Subject: [PATCH 24/40] Fixing bug on loading mysql servers to runtime Also fixed a bug related to concurrency in MySQL HGM --- lib/MySQL_HostGroups_Manager.cpp | 109 ++++++++++++++++++++----------- 1 file changed, 71 insertions(+), 38 deletions(-) diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 83f334035..6126111b0 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -20,6 +20,15 @@ } while (rc!=SQLITE_DONE);\ } while (0) +#define SAFE_SQLITE3_STEP2(_stmt) do {\ + do {\ + rc=sqlite3_step(_stmt);\ + if (rc==SQLITE_LOCKED || rc==SQLITE_BUSY) {\ + usleep(100);\ + }\ + } while (rc==SQLITE_LOCKED || rc==SQLITE_BUSY);\ +} while (0) + extern ProxySQL_Admin *GloAdmin; extern MySQL_Threads_Handler *GloMTH; @@ -660,7 +669,7 @@ bool MySQL_HostGroups_Manager::server_add(unsigned int hid, char *add, uint16_t rc=sqlite3_bind_int64(statement, 11, _max_latency_ms); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement, 12, comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); sqlite3_finalize(statement); @@ -717,7 +726,7 @@ int MySQL_HostGroups_Manager::servers_add(SQLite3_result *resultset) { rc=sqlite3_bind_int64(statement32, (idx*12)+11, atoi(r1->fields[10])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement32, (idx*12)+12, r1->fields[11], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); if (idx==31) { - SAFE_SQLITE3_STEP(statement32); + SAFE_SQLITE3_STEP2(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement32); assert(rc==SQLITE_OK); } @@ -734,7 +743,7 @@ int MySQL_HostGroups_Manager::servers_add(SQLite3_result *resultset) { rc=sqlite3_bind_int64(statement1, 10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 11, atoi(r1->fields[10])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 12, r1->fields[11], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -787,6 +796,10 @@ bool MySQL_HostGroups_Manager::commit() { if (error) { proxy_error("Error on %s : %s\n", query, error); } else { + if (GloMTH->variables.hostgroup_manager_verbose) { + proxy_info("Dumping mysql_servers JEFT JOIN mysql_servers_incoming\n"); + resultset->dump_to_stderr(); + } for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { SQLite3_row *r=*it; long long ptr=atoll(r->fields[0]); @@ -813,13 +826,17 @@ bool MySQL_HostGroups_Manager::commit() { // SELECT FROM mysql_servers whatever is not identical in mysql_servers_incoming, or where mem_pointer=0 (where there is no pointer yet) - query=(char *)"SELECT t1.*, t2.gtid_port, t2.weight, t2.status, t2.compression, t2.max_connections, t2.max_replication_lag, t2.use_ssl, t2.max_latency_ms, t2.comment FROM mysql_servers t1 JOIN mysql_servers_incoming t2 ON (t1.hostgroup_id=t2.hostgroup_id AND t1.hostname=t2.hostname AND t1.port=t2.port) WHERE mem_pointer=0 OR t1.weight<>t2.weight OR t1.status<>t2.status OR t1.compression<>t2.compression OR t1.max_connections<>t2.max_connections OR t1.max_replication_lag<>t2.max_replication_lag OR t1.use_ssl<>t2.use_ssl OR t1.max_latency_ms<>t2.max_latency_ms or t1.comment<>t2.comment"; + query=(char *)"SELECT t1.*, t2.gtid_port, t2.weight, t2.status, t2.compression, t2.max_connections, t2.max_replication_lag, t2.use_ssl, t2.max_latency_ms, t2.comment FROM mysql_servers t1 JOIN mysql_servers_incoming t2 ON (t1.hostgroup_id=t2.hostgroup_id AND t1.hostname=t2.hostname AND t1.port=t2.port) WHERE mem_pointer=0 OR t1.gtid_port<>t2.gtid_port OR t1.weight<>t2.weight OR t1.status<>t2.status OR t1.compression<>t2.compression OR t1.max_connections<>t2.max_connections OR t1.max_replication_lag<>t2.max_replication_lag OR t1.use_ssl<>t2.use_ssl OR t1.max_latency_ms<>t2.max_latency_ms or t1.comment<>t2.comment"; proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "%s\n", query); mydb->execute_statement(query, &error , &cols , &affected_rows , &resultset); if (error) { proxy_error("Error on %s : %s\n", query, error); } else { + if (GloMTH->variables.hostgroup_manager_verbose) { + proxy_info("Dumping mysql_servers JOIN mysql_servers_incoming\n"); + resultset->dump_to_stderr(); + } // optimization #829 int rc; sqlite3_stmt *statement1=NULL; @@ -838,7 +855,9 @@ bool MySQL_HostGroups_Manager::commit() { proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Server %s:%d , weight=%d, status=%d, mem_pointer=%llu, hostgroup=%d, compression=%d\n", r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]), (MySerStatus) atoi(r->fields[4]), ptr, atoi(r->fields[0]), atoi(r->fields[5])); //fprintf(stderr,"%lld\n", ptr); if (ptr==0) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Creating new server %s:%d , weight=%d, status=%d, compression=%d\n", r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]), (MySerStatus) atoi(r->fields[4]), atoi(r->fields[5]) ); + if (GloMTH->variables.hostgroup_manager_verbose) { + proxy_info("Creating new server in HG %d : %s:%d , gtid_port=%d, weight=%d, status=%s\n", atoi(r->fields[0]), r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]), atoi(r->fields[4]), (MySerStatus) atoi(r->fields[5])); + } MySrvC *mysrvc=new MySrvC(r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]), atoi(r->fields[4]), (MySerStatus) atoi(r->fields[5]), atoi(r->fields[6]), atoi(r->fields[7]), atoi(r->fields[8]), atoi(r->fields[9]), atoi(r->fields[10]), r->fields[11]); // add new fields here if adding more columns in mysql_servers proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Adding new server %s:%d , weight=%d, status=%d, mem_ptr=%p into hostgroup=%d\n", r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]), (MySerStatus) atoi(r->fields[4]), mysrvc, atoi(r->fields[0])); add(mysrvc,atoi(r->fields[0])); @@ -847,53 +866,62 @@ bool MySQL_HostGroups_Manager::commit() { rc=sqlite3_bind_int64(statement1, 2, atoi(r->fields[0])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 3, r->fields[1], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 4, atoi(r->fields[2])); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } else { bool run_update=false; MySrvC *mysrvc=(MySrvC *)ptr; // carefully increase the 2nd index by 1 for every new column added - if (atoi(r->fields[4])!=atoi(r->fields[12])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing gtid_port for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[4] , mysrvc->gtid_port , atoi(r->fields[12])); - mysrvc->weight=atoi(r->fields[12]); + if (atoi(r->fields[3])!=atoi(r->fields[13])) { + if (GloMTH->variables.hostgroup_manager_verbose) + proxy_info("Changing gtid_port for server %u:%s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->myhgc->hid , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]) , mysrvc->gtid_port , atoi(r->fields[13])); + mysrvc->gtid_port=atoi(r->fields[13]); } - if (atoi(r->fields[5])!=atoi(r->fields[13])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing weight for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[5] , mysrvc->weight , atoi(r->fields[13])); - mysrvc->weight=atoi(r->fields[13]); + if (atoi(r->fields[4])!=atoi(r->fields[14])) { + if (GloMTH->variables.hostgroup_manager_verbose) + proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing weight for server %d:%s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->myhgc->hid , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), atoi(r->fields[4]) , mysrvc->weight , atoi(r->fields[14])); + mysrvc->weight=atoi(r->fields[14]); } - if (atoi(r->fields[6])!=atoi(r->fields[14])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing status for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[6] , mysrvc->status , atoi(r->fields[14])); - mysrvc->status=(MySerStatus)atoi(r->fields[14]); + if (atoi(r->fields[5])!=atoi(r->fields[15])) { + if (GloMTH->variables.hostgroup_manager_verbose) + proxy_info("Changing status for server %d:%s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->myhgc->hid , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), atoi(r->fields[5]) , mysrvc->status , atoi(r->fields[15])); + mysrvc->status=(MySerStatus)atoi(r->fields[15]); if (mysrvc->status==MYSQL_SERVER_STATUS_SHUNNED) { mysrvc->shunned_automatic=false; } } - if (atoi(r->fields[7])!=atoi(r->fields[15])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing compression for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[7] , mysrvc->compression , atoi(r->fields[15])); - mysrvc->compression=atoi(r->fields[15]); + if (atoi(r->fields[6])!=atoi(r->fields[16])) { + if (GloMTH->variables.hostgroup_manager_verbose) + proxy_info("Changing compression for server %d:%s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->myhgc->hid , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), atoi(r->fields[6]) , mysrvc->compression , atoi(r->fields[16])); + mysrvc->compression=atoi(r->fields[16]); } - if (atoi(r->fields[8])!=atoi(r->fields[16])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing max_connections for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[8] , mysrvc->max_connections , atoi(r->fields[16])); - mysrvc->max_connections=atoi(r->fields[16]); + if (atoi(r->fields[7])!=atoi(r->fields[17])) { + if (GloMTH->variables.hostgroup_manager_verbose) + proxy_info("Changing max_connections for server %d:%s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->myhgc->hid , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), atoi(r->fields[7]) , mysrvc->max_connections , atoi(r->fields[17])); + mysrvc->max_connections=atoi(r->fields[17]); } - if (atoi(r->fields[9])!=atoi(r->fields[17])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing max_replication_lag for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[9] , mysrvc->max_replication_lag , atoi(r->fields[17])); - mysrvc->max_replication_lag=atoi(r->fields[17]); + if (atoi(r->fields[8])!=atoi(r->fields[18])) { + if (GloMTH->variables.hostgroup_manager_verbose) + proxy_info("Changing max_replication_lag for server %u:%s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->myhgc->hid , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), atoi(r->fields[8]) , mysrvc->max_replication_lag , atoi(r->fields[18])); + mysrvc->max_replication_lag=atoi(r->fields[18]); } - if (atoi(r->fields[10])!=atoi(r->fields[18])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing use_ssl for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[10] , mysrvc->use_ssl , atoi(r->fields[18])); - mysrvc->use_ssl=atoi(r->fields[18]); + if (atoi(r->fields[9])!=atoi(r->fields[19])) { + if (GloMTH->variables.hostgroup_manager_verbose) + proxy_info("Changing use_ssl for server %d:%s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->myhgc->hid , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), atoi(r->fields[9]) , mysrvc->use_ssl , atoi(r->fields[19])); + mysrvc->use_ssl=atoi(r->fields[19]); } - if (atoi(r->fields[11])!=atoi(r->fields[18])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing max_latency_ms for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[11] , mysrvc->max_latency_us , atoi(r->fields[19])); - mysrvc->max_latency_us=1000*atoi(r->fields[19]); + if (atoi(r->fields[10])!=atoi(r->fields[20])) { + if (GloMTH->variables.hostgroup_manager_verbose) + proxy_info("Changing max_latency_ms for server %d:%s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->myhgc->hid , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), atoi(r->fields[10]) , mysrvc->max_latency_us/1000 , atoi(r->fields[20])); + mysrvc->max_latency_us=1000*atoi(r->fields[20]); } - if (strcmp(r->fields[12],r->fields[20])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing comment for server %s:%d (%s:%d) from '%s' to '%s'\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[12], r->fields[20]); + if (strcmp(r->fields[11],r->fields[21])) { + if (GloMTH->variables.hostgroup_manager_verbose) + proxy_info("Changing comment for server %d:%s:%d (%s:%d) from '%s' to '%s'\n" , mysrvc->myhgc->hid , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[11], r->fields[21]); free(mysrvc->comment); - mysrvc->comment=strdup(r->fields[20]); + mysrvc->comment=strdup(r->fields[21]); } if (run_update) { rc=sqlite3_bind_int64(statement2, 1, mysrvc->weight); assert(rc==SQLITE_OK); @@ -908,7 +936,7 @@ bool MySQL_HostGroups_Manager::commit() { rc=sqlite3_bind_int64(statement2, 10, mysrvc->myhgc->hid); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement2, 11, mysrvc->address, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement2, 12, mysrvc->port); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement2); + SAFE_SQLITE3_STEP2(statement2); rc=sqlite3_clear_bindings(statement2); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement2); assert(rc==SQLITE_OK); } @@ -919,7 +947,7 @@ bool MySQL_HostGroups_Manager::commit() { } if (resultset) { delete resultset; resultset=NULL; } proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "DELETE FROM mysql_servers_incoming\n"); - mydb->execute("DELETE FROM mysql_servers_incoming"); + mydb->execute("DELETE FROM mysql_servers_incoming"); proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "DELETE FROM mysql_replication_hostgroups\n"); mydb->execute("DELETE FROM mysql_replication_hostgroups"); @@ -1131,6 +1159,11 @@ void MySQL_HostGroups_Manager::generate_mysql_gtid_executed_tables() { it++; } for (std::vector::iterator it3=to_remove.begin(); it3!=to_remove.end(); ++it3) { + it = gtid_map.find(*it3); + GTID_Server_Data * gtid_si = it->second; + ev_io_stop(MyHGM->gtid_ev_loop, gtid_si->w); + close(gtid_si->w->fd); + free(gtid_si->w); gtid_map.erase(*it3); } pthread_rwlock_unlock(>id_rwlock); @@ -1230,7 +1263,7 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table(int *_onlyhg) { rc=sqlite3_bind_text(statement32, (i*13)+12, mysrvc->comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement32, (i*13)+13, ptr); assert(rc==SQLITE_OK); } - SAFE_SQLITE3_STEP(statement32); + SAFE_SQLITE3_STEP2(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement32); assert(rc==SQLITE_OK); } @@ -1253,7 +1286,7 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table(int *_onlyhg) { rc=sqlite3_bind_text(statement1, 12, mysrvc->comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 13, ptr); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement1); + SAFE_SQLITE3_STEP2(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); } @@ -1348,7 +1381,7 @@ void MySQL_HostGroups_Manager::generate_mysql_group_replication_hostgroups_table rc=sqlite3_bind_int64(statement, 8, max_transactions_behind); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement, 9, r->fields[8], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - SAFE_SQLITE3_STEP(statement); + SAFE_SQLITE3_STEP2(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); std::map::iterator it2; From 46d7f9a14b0ca7e5de6d150e946b8d6a3f0e7c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 25 Jan 2018 19:45:17 +0100 Subject: [PATCH 25/40] Add support for GTID consistent reads This patch includes a new column mysql_query_rules.gtid_from_hostgroup If defined, it is used for GTID consistent read --- include/MySQL_HostGroups_Manager.h | 40 +++- include/MySQL_Thread.h | 2 +- include/mysql_backend.h | 2 +- include/query_processor.h | 5 +- lib/MySQL_HostGroups_Manager.cpp | 303 +++++++++++++++++++++++++++-- lib/MySQL_Session.cpp | 35 +++- lib/MySQL_Thread.cpp | 32 ++- lib/ProxySQL_Admin.cpp | 55 ++++-- lib/ProxySQL_Cluster.cpp | 11 +- lib/Query_Processor.cpp | 26 ++- 10 files changed, 455 insertions(+), 56 deletions(-) diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 12fe5a29d..b319e3669 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -64,6 +64,13 @@ class GTID_Server_Data { char uuid_server[64]; gtid_set_t gtid_executed; bool active; + GTID_Server_Data(struct ev_io *_w, char *_address, uint16_t _port, uint16_t _mysql_port); + void resize(size_t _s); + ~GTID_Server_Data(); + bool readall(); + bool writeout(); + bool read_next_gtid(); +/* GTID_Server_Data(struct ev_io *_w, char *_address, uint16_t _port, uint16_t _mysql_port) { active = true; w = _w; @@ -99,8 +106,9 @@ class GTID_Server_Data { len += rc; } else { int myerr = errno; + fprintf(stderr,"read returned %d bytes, error %d\n", rc, myerr); if ( - (rc == 0) || + //(rc == 0) || (rc==-1 && myerr != EINTR && myerr != EAGAIN) ) { ret = false; @@ -174,7 +182,7 @@ class GTID_Server_Data { uint64_t trx_from; uint64_t trx_to; sscanf(subtoken,"%lu-%lu",&trx_from,&trx_to); - fprintf(stdout,"BS from %s:%lu-%lu\n", uuid_server, trx_from, trx_to); + //fprintf(stdout,"BS from %s:%lu-%lu\n", uuid_server, trx_from, trx_to); std::string s = uuid_server; gtid_executed[s].emplace_back(trx_from, trx_to); } @@ -220,6 +228,28 @@ class GTID_Server_Data { std::cout << "current pos " << gtid_executed_to_string(gtid_executed) << std::endl << std::endl; return true; } +*/ + bool gtid_exists(char *gtid_uuid, uint64_t gtid_trxid); + void read_all_gtids(); + void dump(); +/* + bool gtid_exists(char *gtid_uuid, uint64_t gtid_trxid) { + std::string s = gtid_uuid; + auto it = gtid_executed.find(s); + fprintf(stderr,"Checking if server %s:%d has GTID %s:%lu ... ", address, port, gtid_uuid, gtid_trxid); + if (it == gtid_executed.end()) { + fprintf(stderr,"NO\n"); + return false; + } + for (auto itr = it->second.begin(); itr != it->second.end(); ++itr) { + if ((int64_t)gtid_trxid >= itr->first && (int64_t)gtid_trxid <= itr->second) { + fprintf(stderr,"YES\n"); + return true; + } + } + fprintf(stderr,"NO\n"); + return false; + } void read_all_gtids() { while (read_next_gtid()) { } @@ -238,6 +268,7 @@ class GTID_Server_Data { pos = 0; } } +*/ }; @@ -330,7 +361,7 @@ class MyHGC { // MySQL Host Group Container MySrvList *mysrvs; MyHGC(int); ~MyHGC(); - MySrvC *get_random_MySrvC(); + MySrvC *get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid); }; class Group_Replication_Info { @@ -442,7 +473,7 @@ class MySQL_HostGroups_Manager { void MyConn_add_to_pool(MySQL_Connection *); - MySQL_Connection * get_MyConn_from_pool(unsigned int, bool ff=false); + MySQL_Connection * get_MyConn_from_pool(unsigned int, bool ff, char * gtid_uuid, uint64_t gtid_trxid); void drop_all_idle_connections(); int get_multiple_idle_connections(int, unsigned long long, MySQL_Connection **, int); @@ -467,6 +498,7 @@ class MySQL_HostGroups_Manager { SQLite3_result * get_stats_mysql_gtid_executed(); void generate_mysql_gtid_executed_tables(); + bool gtid_exists(MySrvC *mysrvc, char * gtid_uuid, uint64_t gtid_trxid); }; #endif /* __CLASS_MYSQL_HOSTGROUPS_MANAGER_H */ diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index 3e56761fb..07dea2a5b 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -256,7 +256,7 @@ class MySQL_Thread void unregister_session_connection_handler(int idx, bool _new=false); void listener_handle_new_connection(MySQL_Data_Stream *myds, unsigned int n); void Get_Memory_Stats(); - MySQL_Connection * get_MyConn_local(unsigned int); + MySQL_Connection * get_MyConn_local(unsigned int, MySQL_Data_Stream *client_myds, char *gtid_uuid, uint64_t gtid_trxid); void push_MyConn_local(MySQL_Connection *); void return_local_connections(); }; diff --git a/include/mysql_backend.h b/include/mysql_backend.h index b78d223ba..855b2e05e 100644 --- a/include/mysql_backend.h +++ b/include/mysql_backend.h @@ -10,7 +10,7 @@ class MySQL_Backend void * operator new(size_t); void operator delete(void *); int hostgroup_id; - char gtid_uuid[48]; + char gtid_uuid[64]; uint64_t gtid_trxid; MySQL_Data_Stream *server_myds; // mysql_cp_entry_t *server_mycpe; diff --git a/include/query_processor.h b/include/query_processor.h index 3ce2da1a4..7c0cb2c9c 100644 --- a/include/query_processor.h +++ b/include/query_processor.h @@ -36,6 +36,7 @@ struct _Query_Processor_rule_t { char *OK_msg; int sticky_conn; int multiplex; + int gtid_from_hostgroup; int log; bool apply; char *comment; // #643 @@ -64,6 +65,7 @@ class Query_Processor_Output { char *OK_msg; int sticky_conn; int multiplex; + int gtid_from_hostgroup; int log; char *comment; // #643 std::string *new_query; @@ -93,6 +95,7 @@ class Query_Processor_Output { delay=-1; sticky_conn=-1; multiplex=-1; + gtid_from_hostgroup=-1; log=-1; new_query=NULL; error_msg=NULL; @@ -194,7 +197,7 @@ class Query_Processor { void wrlock(); // explicit write lock, to be used in multi-isert void wrunlock(); // explicit write unlock bool insert(QP_rule_t *qr, bool lock=true); // insert a new rule. Uses a generic void pointer to a structure that may vary depending from the Query Processor - QP_rule_t * new_query_rule(int rule_id, bool active, char *username, char *schemaname, int flagIN, char *client_addr, char *proxy_addr, int proxy_port, char *digest, char *match_digest, char *match_pattern, bool negate_match_pattern, char *re_modifiers, int flagOUT, char *replace_pattern, int destination_hostgroup, int cache_ttl, int reconnect, int timeout, int retries, int delay, int next_query_flagIN, int mirror_hostgroup, int mirror_flagOUT, char *error_msg, char *OK_msg, int sticky_conn, int multiplex, int log, bool apply, char *comment); // to use a generic query rule struct, this is generated by this function and returned as generic void pointer + QP_rule_t * new_query_rule(int rule_id, bool active, char *username, char *schemaname, int flagIN, char *client_addr, char *proxy_addr, int proxy_port, char *digest, char *match_digest, char *match_pattern, bool negate_match_pattern, char *re_modifiers, int flagOUT, char *replace_pattern, int destination_hostgroup, int cache_ttl, int reconnect, int timeout, int retries, int delay, int next_query_flagIN, int mirror_hostgroup, int mirror_flagOUT, char *error_msg, char *OK_msg, int sticky_conn, int multiplex, int gtid_from_hostgroup, int log, bool apply, char *comment); // to use a generic query rule struct, this is generated by this function and returned as generic void pointer void delete_query_rule(QP_rule_t *qr); // destructor Query_Processor_Output * process_mysql_query(MySQL_Session *sess, void *ptr, unsigned int size, Query_Info *qi); void delete_QP_out(Query_Processor_Output *o); diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 6126111b0..731180d3c 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -85,7 +85,15 @@ void reader_cb(struct ev_loop *loop, struct ev_io *w, int revents) { bool rc = true; rc = sd->readall(); if (rc == false) { - delete sd; + //delete sd; + std::string s1 = sd->address; + s1.append(":"); + s1.append(std::to_string(sd->port)); + std::unordered_map ::iterator it2; + it2 = MyHGM->gtid_map.find(s1); + if (it2 != MyHGM->gtid_map.end()) { + MyHGM->gtid_map.erase(it2); + } ev_io_stop(MyHGM->gtid_ev_loop, w); free(w); } else { @@ -96,6 +104,7 @@ void reader_cb(struct ev_loop *loop, struct ev_io *w, int revents) { } void connect_cb(EV_P_ ev_io *w, int revents) { + pthread_mutex_lock(&ev_loop_mutex); struct ev_io * c = w; if (revents & EV_WRITE) { int optval = 0; @@ -112,12 +121,16 @@ void connect_cb(EV_P_ ev_io *w, int revents) { } else { ev_io_stop(MyHGM->gtid_ev_loop, w); int fd=w->fd; - free(w); struct ev_io * new_w = (struct ev_io*) malloc(sizeof(struct ev_io)); + new_w->data = w->data; + GTID_Server_Data * custom_data = (GTID_Server_Data *)new_w->data; + custom_data->w = new_w; + free(w); ev_io_init(new_w, reader_cb, fd, EV_READ); ev_io_start(MyHGM->gtid_ev_loop, new_w); } } + pthread_mutex_unlock(&ev_loop_mutex); } struct ev_io * new_connector(char *address, uint16_t gtid_port, uint16_t mysql_port) { @@ -154,6 +167,209 @@ struct ev_io * new_connector(char *address, uint16_t gtid_port, uint16_t mysql_p } + +GTID_Server_Data::GTID_Server_Data(struct ev_io *_w, char *_address, uint16_t _port, uint16_t _mysql_port) { + active = true; + w = _w; + size = 1024; // 1KB buffer + data = (char *)malloc(size); + uuid_server[0] = 0; + pos = 0; + len = 0; + address = strdup(_address); + port = _port; + mysql_port = _mysql_port; +} + +void GTID_Server_Data::resize(size_t _s) { + char *data_ = (char *)malloc(_s); + memcpy(data_, data, (_s > size ? size : _s)); + size = _s; + free(data); + data = data_; +} + +GTID_Server_Data::~GTID_Server_Data() { + free(address); + free(data); +} + +bool GTID_Server_Data::readall() { + bool ret = true; + if (size == len) { + // buffer is full, expand + resize(len*2); + } + int rc = 0; + rc = read(w->fd,data+len,size-len); + if (rc > 0) { + len += rc; + } else { + int myerr = errno; + proxy_error("Read returned %d bytes, error %d\n", rc, myerr); + if ( + //(rc == 0) || + (rc==-1 && myerr != EINTR && myerr != EAGAIN) + ) { + ret = false; + } + } + return ret; +} + + +bool GTID_Server_Data::gtid_exists(char *gtid_uuid, uint64_t gtid_trxid) { + std::string s = gtid_uuid; + auto it = gtid_executed.find(s); + fprintf(stderr,"Checking if server %s:%d has GTID %s:%lu ... ", address, port, gtid_uuid, gtid_trxid); + if (it == gtid_executed.end()) { + fprintf(stderr,"NO\n"); + return false; + } + for (auto itr = it->second.begin(); itr != it->second.end(); ++itr) { + if ((int64_t)gtid_trxid >= itr->first && (int64_t)gtid_trxid <= itr->second) { + fprintf(stderr,"YES\n"); + return true; + } + } + fprintf(stderr,"NO\n"); + return false; +} + +void GTID_Server_Data::read_all_gtids() { + while (read_next_gtid()) { + } + } + +void GTID_Server_Data::dump() { + if (len==0) { + return; + } + read_all_gtids(); + //int rc = write(1,data+pos,len-pos); + fflush(stdout); + ///pos += rc; + if (pos >= len/2) { + memmove(data,data+pos,len-pos); + len = len-pos; + pos = 0; + } +} + +bool GTID_Server_Data::writeout() { + bool ret = true; + if (len==0) { + return ret; + } + int rc = 0; + rc = write(w->fd,data+pos,len-pos); + if (rc > 0) { + pos += rc; + if (pos >= len/2) { + memmove(data,data+pos,len-pos); + len = len-pos; + pos = 0; + } + } + return ret; +} + +bool GTID_Server_Data::read_next_gtid() { + if (len==0) { + return false; + } + void *nlp = NULL; + nlp = memchr(data+pos,'\n',len-pos); + if (nlp == NULL) { + return false; + } + int l = (char *)nlp - (data+pos); + char rec_msg[80]; + if (strncmp(data+pos,(char *)"ST=",3)==0) { + // we are reading the bootstrap + char *bs = (char *)malloc(l+1-3); // length + 1 (null byte) - 3 (header) + memcpy(bs,data+pos+3,l+1-3); + char *saveptr1=NULL; + char *saveptr2=NULL; + //char *saveptr3=NULL; + char *token = NULL; + char *subtoken = NULL; + //char *subtoken2 = NULL; + char *str1 = NULL; + char *str2 = NULL; + //char *str3 = NULL; + for (str1 = bs; ; str1 = NULL) { + token = strtok_r(str1, ",", &saveptr1); + if (token == NULL) { + break; + } + int j = 0; + for (str2 = token; ; str2 = NULL) { + subtoken = strtok_r(str2, ":", &saveptr2); + if (subtoken == NULL) { + break; + } + j++; + if (j%2 == 1) { // we are reading the uuid + char *p = uuid_server; + for (unsigned int k=0; kaddress; + s1.append(":"); + s1.append(std::to_string(mysrvc->port)); + std::unordered_map ::iterator it2; + it2 = gtid_map.find(s1); + GTID_Server_Data *gtid_is=NULL; + if (it2!=gtid_map.end()) { + gtid_is=it2->second; + if (gtid_is->active == true) { + ret = gtid_is->gtid_exists(gtid_uuid,gtid_trxid); + } + } + proxy_info("Checking if server %s has GTID %s:%lu . %s\n", s1.c_str(), gtid_uuid, gtid_trxid, (ret ? "YES" : "NO")); + pthread_rwlock_unlock(>id_rwlock); + return ret; +} void MySQL_HostGroups_Manager::generate_mysql_gtid_executed_tables() { pthread_rwlock_wrlock(>id_rwlock); @@ -1143,7 +1379,9 @@ void MySQL_HostGroups_Manager::generate_mysql_gtid_executed_tables() { if (c) { gtid_is = (GTID_Server_Data *)c->data; gtid_map.emplace(s1,gtid_is); + //pthread_mutex_lock(&ev_loop_mutex); ev_io_start(MyHGM->gtid_ev_loop,c); + //pthread_mutex_unlock(&ev_loop_mutex); } } } @@ -1563,7 +1801,7 @@ void MySQL_HostGroups_Manager::push_MyConn_to_pool_array(MySQL_Connection **ca) wrunlock(); } -MySrvC *MyHGC::get_random_MySrvC() { +MySrvC *MyHGC::get_random_MySrvC(char * gtid_uuid, uint64_t gtid_trxid) { MySrvC *mysrvc=NULL; unsigned int j; unsigned int sum=0; @@ -1576,8 +1814,15 @@ MySrvC *MyHGC::get_random_MySrvC() { if (mysrvc->status==MYSQL_SERVER_STATUS_ONLINE) { // consider this server only if ONLINE if (mysrvc->ConnectionsUsed->conns_length() < mysrvc->max_connections) { // consider this server only if didn't reach max_connections if ( mysrvc->current_latency_us < ( mysrvc->max_latency_us ? mysrvc->max_latency_us : mysql_thread___default_max_latency_ms*1000 ) ) { // consider the host only if not too far - sum+=mysrvc->weight; - TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + if (gtid_trxid) { + if (MyHGM->gtid_exists(mysrvc, gtid_uuid, gtid_trxid)) { + sum+=mysrvc->weight; + TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + } + } else { + sum+=mysrvc->weight; + TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + } } } } else { @@ -1608,8 +1853,15 @@ MySrvC *MyHGC::get_random_MySrvC() { mysrvc->time_last_detected_error=0; // if a server is taken back online, consider it immediately if ( mysrvc->current_latency_us < ( mysrvc->max_latency_us ? mysrvc->max_latency_us : mysql_thread___default_max_latency_ms*1000 ) ) { // consider the host only if not too far - sum+=mysrvc->weight; - TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + if (gtid_trxid) { + if (MyHGM->gtid_exists(mysrvc, gtid_uuid, gtid_trxid)) { + sum+=mysrvc->weight; + TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + } + } else { + sum+=mysrvc->weight; + TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + } } } } @@ -1637,8 +1889,15 @@ MySrvC *MyHGC::get_random_MySrvC() { mysrvc->time_last_detected_error=0; // if a server is taken back online, consider it immediately if ( mysrvc->current_latency_us < ( mysrvc->max_latency_us ? mysrvc->max_latency_us : mysql_thread___default_max_latency_ms*1000 ) ) { // consider the host only if not too far - sum+=mysrvc->weight; - TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + if (gtid_trxid) { + if (MyHGM->gtid_exists(mysrvc, gtid_uuid, gtid_trxid)) { + sum+=mysrvc->weight; + TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + } + } else { + sum+=mysrvc->weight; + TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + } } } } @@ -1652,7 +1911,7 @@ MySrvC *MyHGC::get_random_MySrvC() { unsigned int New_sum=0; unsigned int New_TotalUsedConn=0; - // we will now scan again to ignore overloaded server + // we will now scan again to ignore overloaded servers for (j=0; jidx(j); if (mysrvc->status==MYSQL_SERVER_STATUS_ONLINE) { // consider this server only if ONLINE @@ -1660,8 +1919,15 @@ MySrvC *MyHGC::get_random_MySrvC() { if (len < mysrvc->max_connections) { // consider this server only if didn't reach max_connections if ( mysrvc->current_latency_us < ( mysrvc->max_latency_us ? mysrvc->max_latency_us : mysql_thread___default_max_latency_ms*1000 ) ) { // consider the host only if not too far if ((len * sum) <= (TotalUsedConn * mysrvc->weight * 1.5 + 1)) { - New_sum+=mysrvc->weight; - New_TotalUsedConn+=len; + if (gtid_trxid) { + if (MyHGM->gtid_exists(mysrvc, gtid_uuid, gtid_trxid)) { + New_sum+=mysrvc->weight; + New_TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + } + } else { + New_sum+=mysrvc->weight; + New_TotalUsedConn+=len; + } } } } @@ -1689,7 +1955,14 @@ MySrvC *MyHGC::get_random_MySrvC() { if (len < mysrvc->max_connections) { // consider this server only if didn't reach max_connections if ( mysrvc->current_latency_us < ( mysrvc->max_latency_us ? mysrvc->max_latency_us : mysql_thread___default_max_latency_ms*1000 ) ) { // consider the host only if not too far if ((len * sum) <= (TotalUsedConn * mysrvc->weight * 1.5 + 1)) { - New_sum+=mysrvc->weight; + if (gtid_trxid) { + if (MyHGM->gtid_exists(mysrvc, gtid_uuid, gtid_trxid)) { + New_sum+=mysrvc->weight; + TotalUsedConn+=mysrvc->ConnectionsUsed->conns_length(); + } + } else { + New_sum+=mysrvc->weight; + } if (k<=New_sum) { proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 7, "Returning MySrvC %p, server %s:%d\n", mysrvc, mysrvc->address, mysrvc->port); return mysrvc; @@ -1746,12 +2019,12 @@ MySQL_Connection * MySrvConnList::get_random_MyConn(bool ff) { return NULL; // never reach here } -MySQL_Connection * MySQL_HostGroups_Manager::get_MyConn_from_pool(unsigned int _hid, bool ff) { +MySQL_Connection * MySQL_HostGroups_Manager::get_MyConn_from_pool(unsigned int _hid, bool ff, char * gtid_uuid, uint64_t gtid_trxid) { MySQL_Connection * conn=NULL; wrlock(); status.myconnpoll_get++; MyHGC *myhgc=MyHGC_lookup(_hid); - MySrvC *mysrvc=myhgc->get_random_MySrvC(); + MySrvC *mysrvc=myhgc->get_random_MySrvC(gtid_uuid, gtid_trxid); if (mysrvc) { // a MySrvC exists. If not, we return NULL = no targets conn=mysrvc->ConnectionsFree->get_random_MyConn(ff); if (conn) { diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index f5dd58fe5..9935d73d3 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -3821,7 +3821,11 @@ void MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C void MySQL_Session::handler___client_DSS_QUERY_SENT___server_DSS_NOT_INITIALIZED__get_connection() { // Get a MySQL Connection + bool with_gtid = false; MySQL_Connection *mc=NULL; + MySQL_Backend * _gtid_from_backend = NULL; + char uuid[64]; + uint64_t trxid = 0; #ifdef STRESSTEST_POOL int i=100; while (i) { @@ -3839,10 +3843,37 @@ void MySQL_Session::handler___client_DSS_QUERY_SENT___server_DSS_NOT_INITIALIZED } #else if (session_fast_forward == false) { - mc=thread->get_MyConn_local(mybe->hostgroup_id); // experimental , #644 + if (qpo->gtid_from_hostgroup >= 0) { + _gtid_from_backend = find_backend(qpo->gtid_from_hostgroup); + if (_gtid_from_backend) { + if (_gtid_from_backend->gtid_uuid[0]) { + with_gtid = true; + } + } + } + if (with_gtid) { + int l = index(_gtid_from_backend->gtid_uuid,':') - _gtid_from_backend->gtid_uuid; + trxid = strtoull(index(_gtid_from_backend->gtid_uuid,':')+1, NULL, 10); + int m; + int n=0; + for (m=0; mgtid_uuid[m] != '-') { + uuid[n]=_gtid_from_backend->gtid_uuid[m]; + n++; + } + } + uuid[n]='\0'; + mc=thread->get_MyConn_local(mybe->hostgroup_id, NULL, uuid, trxid); + } else { + mc=thread->get_MyConn_local(mybe->hostgroup_id, NULL, NULL, 0); + } } if (mc==NULL) { - mc=MyHGM->get_MyConn_from_pool(mybe->hostgroup_id, session_fast_forward); + if (trxid) { + mc=MyHGM->get_MyConn_from_pool(mybe->hostgroup_id, session_fast_forward, uuid, trxid); + } else { + mc=MyHGM->get_MyConn_from_pool(mybe->hostgroup_id, session_fast_forward, NULL, 0); + } } else { thread->status_variables.ConnPool_get_conn_immediate++; } diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index aa35399b1..a90598df8 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -4504,16 +4504,42 @@ void MySQL_Thread::Get_Memory_Stats() { } -MySQL_Connection * MySQL_Thread::get_MyConn_local(unsigned int _hid) { +MySQL_Connection * MySQL_Thread::get_MyConn_local(unsigned int _hid, MySQL_Data_Stream *client_myds, char *gtid_uuid, uint64_t gtid_trxid) { unsigned int i; + std::vector parents; MySQL_Connection *c=NULL; +// MySQL_Connection *_candidate = NULL; // this will be used when we will pass optional parameters for (i=0; ilen; i++) { c=(MySQL_Connection *)cached_connections->index(i); if (c->parent->myhgc->hid==_hid) { - c=(MySQL_Connection *)cached_connections->remove_index_fast(i); - return c; + if (gtid_uuid) { + // we first check if we already excluded this parent (MySQL Server) + MySrvC *mysrvc = c->parent; + std::vector::iterator it; + it = find(parents.begin(), parents.end(), mysrvc); + if (it != parents.end()) { + // we didn't exclude this server (yet?) + bool gtid_found = false; + gtid_found = MyHGM->gtid_exists(mysrvc, gtid_uuid, gtid_trxid); + if (gtid_found) { + c=(MySQL_Connection *)cached_connections->remove_index_fast(i); + return c; + } else { + parents.push_back(mysrvc); // stop evaluating this server +// if (_candidate == NULL) { +// _candidate = c; // this server is a potential candidate +// } + } + } + } else { + c=(MySQL_Connection *)cached_connections->remove_index_fast(i); + return c; + } } } +// if (_candidate) { +// return _candidate; +// } return NULL; } diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index ab4aac789..dfa229ff6 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -216,14 +216,16 @@ static int http_handler(void *cls, struct MHD_Connection *connection, const char #define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_1 "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR DEFAULT 'CASELESS' , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , OK_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1,2)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_1 +#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V2_0_0 "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR DEFAULT 'CASELESS' , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , OK_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1,2)) , gtid_from_hostgroup INT UNSIGNED , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" + +#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V2_0_0 //#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_0b #define ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES "CREATE TABLE global_variables (variable_name VARCHAR NOT NULL PRIMARY KEY , variable_value VARCHAR NOT NULL)" #define ADMIN_SQLITE_RUNTIME_GLOBAL_VARIABLES "CREATE TABLE runtime_global_variables (variable_name VARCHAR NOT NULL PRIMARY KEY , variable_value VARCHAR NOT NULL)" -#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" +//#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" // mysql_replication_hostgroups in v1.0 #define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_0 "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , UNIQUE (reader_hostgroup))" @@ -256,7 +258,7 @@ static int http_handler(void *cls, struct MHD_Connection *connection, const char #define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE runtime_mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0) , check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only')) NOT NULL DEFAULT 'read_only' , comment VARCHAR NOT NULL DEFAULT '' , UNIQUE (reader_hostgroup))" -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_QUERY_RULES "CREATE TABLE runtime_mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , OK_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1,2)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" +#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_QUERY_RULES "CREATE TABLE runtime_mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , OK_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1,2)) , gtid_from_hostgroup INT UNSIGNED , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" #define ADMIN_SQLITE_TABLE_RUNTIME_SCHEDULER "CREATE TABLE runtime_scheduler (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '')" @@ -5439,15 +5441,15 @@ void ProxySQL_Admin::save_mysql_query_rules_from_runtime(bool _runtime) { //char *a=(char *)"INSERT INTO mysql_query_rules VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")"; char *a=NULL; if (_runtime) { - a=(char *)"INSERT INTO runtime_mysql_query_rules (rule_id, active, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, OK_msg, sticky_conn, multiplex, log, apply, comment) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"; + a=(char *)"INSERT INTO runtime_mysql_query_rules (rule_id, active, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, OK_msg, sticky_conn, multiplex, gtid_from_hostgroup, log, apply, comment) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"; } else { - a=(char *)"INSERT INTO mysql_query_rules (rule_id, active, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, OK_msg, sticky_conn, multiplex, log, apply, comment) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"; + a=(char *)"INSERT INTO mysql_query_rules (rule_id, active, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, OK_msg, sticky_conn, multiplex, gtid_from_hostgroup, log, apply, comment) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"; } for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { SQLite3_row *r=*it; int arg_len=0; - char *buffs[31]; // number of fields - for (int i=0; i<31; i++) { + char *buffs[32]; // number of fields + for (int i=0; i<32; i++) { if (r->fields[i]) { char *o=escape_string_single_quotes(r->fields[i],false); int l=strlen(o)+4; @@ -5495,13 +5497,14 @@ void ProxySQL_Admin::save_mysql_query_rules_from_runtime(bool _runtime) { buffs[25], // OK_msg ( strcmp(r->fields[26],"-1")==0 ? "NULL" : r->fields[26] ), // sticky_conn ( strcmp(r->fields[27],"-1")==0 ? "NULL" : r->fields[27] ), // multiplex - ( strcmp(r->fields[28],"-1")==0 ? "NULL" : r->fields[28] ), // log - ( strcmp(r->fields[29],"-1")==0 ? "NULL" : r->fields[29] ), // apply - buffs[30] // comment + ( strcmp(r->fields[28],"-1")==0 ? "NULL" : r->fields[28] ), // gtid_from_hostgroup + ( strcmp(r->fields[29],"-1")==0 ? "NULL" : r->fields[29] ), // log + ( strcmp(r->fields[30],"-1")==0 ? "NULL" : r->fields[30] ), // apply + buffs[31] // comment ); //fprintf(stderr,"%s\n",query); admindb->execute(query); - for (int i=0; i<31; i++) { + for (int i=0; i<32; i++) { free(buffs[i]); } free(query); @@ -6902,7 +6905,7 @@ char * ProxySQL_Admin::load_mysql_query_rules_to_runtime() { int affected_rows=0; if (GloQPro==NULL) return (char *)"Global Query Processor not started: command impossible to run"; SQLite3_result *resultset=NULL; - char *query=(char *)"SELECT rule_id, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, ok_msg, sticky_conn, multiplex, log, apply, comment FROM main.mysql_query_rules WHERE active=1 ORDER BY rule_id"; + char *query=(char *)"SELECT rule_id, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, ok_msg, sticky_conn, multiplex, gtid_from_hostgroup, log, apply, comment FROM main.mysql_query_rules WHERE active=1 ORDER BY rule_id"; admindb->execute_statement(query, &error , &cols , &affected_rows , &resultset); if (error) { proxy_error("Error on %s : %s\n", query, error); @@ -6957,9 +6960,10 @@ char * ProxySQL_Admin::load_mysql_query_rules_to_runtime() { r->fields[24], // OK_msg (r->fields[25]==NULL ? -1 : atol(r->fields[25])), // sticky_conn (r->fields[26]==NULL ? -1 : atol(r->fields[26])), // multiplex - (r->fields[27]==NULL ? -1 : atol(r->fields[27])), // log - (atoi(r->fields[28])==1 ? true : false), - r->fields[29] // comment + (r->fields[27]==NULL ? -1 : atol(r->fields[27])), // gtid_from_hostgroup + (r->fields[28]==NULL ? -1 : atol(r->fields[28])), // log + (atoi(r->fields[29])==1 ? true : false), + r->fields[30] // comment ); GloQPro->insert(nqpr, false); } @@ -7162,7 +7166,7 @@ int ProxySQL_Admin::Read_MySQL_Query_Rules_from_configfile() { int i; int rows=0; admindb->execute("PRAGMA foreign_keys = OFF"); - char *q=(char *)"INSERT OR REPLACE INTO mysql_query_rules (rule_id, active, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, ok_msg, sticky_conn, multiplex, log, apply, comment) VALUES (%d, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s)"; + char *q=(char *)"INSERT OR REPLACE INTO mysql_query_rules (rule_id, active, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, ok_msg, sticky_conn, multiplex, gtid_from_hostgroup, log, apply, comment) VALUES (%d, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %s)"; for (i=0; i< count; i++) { const Setting &rule = mysql_query_rules[i]; int rule_id; @@ -7217,6 +7221,7 @@ int ProxySQL_Admin::Read_MySQL_Query_Rules_from_configfile() { int sticky_conn=-1; int multiplex=-1; + int gtid_from_hostgroup = -1; // variable for parsing log int log=-1; @@ -7266,6 +7271,7 @@ int ProxySQL_Admin::Read_MySQL_Query_Rules_from_configfile() { rule.lookupValue("sticky_conn", sticky_conn); rule.lookupValue("multiplex", multiplex); + rule.lookupValue("gtid_from_hostgroup", gtid_from_hostgroup); rule.lookupValue("log", log); @@ -7305,6 +7311,7 @@ int ProxySQL_Admin::Read_MySQL_Query_Rules_from_configfile() { ( OK_msg_exists ? strlen(OK_msg.c_str()) : 0 ) + 4 + strlen(std::to_string(sticky_conn).c_str()) + 4 + strlen(std::to_string(multiplex).c_str()) + 4 + + strlen(std::to_string(gtid_from_hostgroup).c_str()) + 4 + strlen(std::to_string(log).c_str()) + 4 + strlen(std::to_string(apply).c_str()) + 4 + ( comment_exists ? strlen(comment.c_str()) : 0 ) + 4 + @@ -7390,6 +7397,7 @@ int ProxySQL_Admin::Read_MySQL_Query_Rules_from_configfile() { OK_msg.c_str(), ( sticky_conn >= 0 ? std::to_string(sticky_conn).c_str() : "NULL") , ( multiplex >= 0 ? std::to_string(multiplex).c_str() : "NULL") , + ( gtid_from_hostgroup >= 0 ? std::to_string(gtid_from_hostgroup).c_str() : "NULL") , ( log >= 0 ? std::to_string(log).c_str() : "NULL") , ( apply == 0 ? 0 : 1) , comment.c_str() @@ -7679,6 +7687,21 @@ void ProxySQL_Admin::disk_upgrade_mysql_query_rules() { configdb->execute("INSERT INTO mysql_query_rules (rule_id,active,username,schemaname,flagIN,client_addr,proxy_addr,proxy_port,digest,match_digest,match_pattern,negate_match_pattern,re_modifiers,flagOUT,replace_pattern,destination_hostgroup,cache_ttl,reconnect,timeout,retries,delay,mirror_flagOUT,mirror_hostgroup,error_msg,sticky_conn,multiplex,log,apply,comment) SELECT rule_id,active,username,schemaname,flagIN,client_addr,proxy_addr,proxy_port,digest,match_digest,match_pattern,negate_match_pattern,re_modifiers,flagOUT,replace_pattern,destination_hostgroup,cache_ttl,reconnect,timeout,retries,delay,mirror_flagOUT,mirror_hostgroup,error_msg,sticky_conn,multiplex,log,apply,comment FROM mysql_query_rules_v140b"); } + rci=configdb->check_table_structure((char *)"mysql_query_rules",(char *)ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_1); + if (rci) { + // upgrade is required + proxy_warning("Detected version v1.4.1 of table mysql_query_rules\n"); + proxy_warning("ONLINE UPGRADE of table mysql_query_rules in progress\n"); + // drop any existing table with suffix _v141 + configdb->execute("DROP TABLE IF EXISTS mysql_query_rules_v141"); + // rename current table to add suffix _v141 + configdb->execute("ALTER TABLE mysql_query_rules RENAME TO mysql_query_rules_v141"); + // create new table + configdb->build_table((char *)"mysql_query_rules",(char *)ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES,false); + // copy fields from old table + configdb->execute("INSERT INTO mysql_query_rules (rule_id,active,username,schemaname,flagIN,client_addr,proxy_addr,proxy_port,digest,match_digest,match_pattern,negate_match_pattern,re_modifiers,flagOUT,replace_pattern,destination_hostgroup,cache_ttl,reconnect,timeout,retries,delay,mirror_flagOUT,mirror_hostgroup,error_msg,sticky_conn,multiplex,log,apply,comment) SELECT rule_id,active,username,schemaname,flagIN,client_addr,proxy_addr,proxy_port,digest,match_digest,match_pattern,negate_match_pattern,re_modifiers,flagOUT,replace_pattern,destination_hostgroup,cache_ttl,reconnect,timeout,retries,delay,mirror_flagOUT,mirror_hostgroup,error_msg,sticky_conn,multiplex,log,apply,comment FROM mysql_query_rules_v141"); + } + configdb->execute("PRAGMA foreign_keys = ON"); } diff --git a/lib/ProxySQL_Cluster.cpp b/lib/ProxySQL_Cluster.cpp index 5be0b9e18..a7effa860 100644 --- a/lib/ProxySQL_Cluster.cpp +++ b/lib/ProxySQL_Cluster.cpp @@ -574,12 +574,12 @@ void ProxySQL_Cluster::pull_mysql_query_rules_from_peer() { proxy_info("Cluster: Fetching MySQL Query Rules from peer %s:%d started\n", hostname, port); rc_conn = mysql_real_connect(conn, hostname, username, password, NULL, port, NULL, 0); if (rc_conn) { - rc_query = mysql_query(conn,"SELECT rule_id, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, ok_msg, sticky_conn, multiplex, log, apply, comment FROM runtime_mysql_query_rules"); + rc_query = mysql_query(conn,"SELECT rule_id, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, ok_msg, sticky_conn, multiplex, gtid_from_hostgroup, log, apply, comment FROM runtime_mysql_query_rules"); if ( rc_query == 0 ) { MYSQL_RES *result = mysql_store_result(conn); GloAdmin->admindb->execute("DELETE FROM mysql_query_rules"); MYSQL_ROW row; - char *q = (char *)"INSERT INTO mysql_query_rules (rule_id, active, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, ok_msg, sticky_conn, multiplex, log, apply, comment) VALUES (?1 , ?2 , ?3 , ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24, ?25, ?26, ?27, ?28, ?29, ?30, ?31)"; + char *q = (char *)"INSERT INTO mysql_query_rules (rule_id, active, username, schemaname, flagIN, client_addr, proxy_addr, proxy_port, digest, match_digest, match_pattern, negate_match_pattern, re_modifiers, flagOUT, replace_pattern, destination_hostgroup, cache_ttl, reconnect, timeout, retries, delay, next_query_flagIN, mirror_flagOUT, mirror_hostgroup, error_msg, ok_msg, sticky_conn, multiplex, gtid_from_hostgroup, log, apply, comment) VALUES (?1 , ?2 , ?3 , ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24, ?25, ?26, ?27, ?28, ?29, ?30, ?31, ?32)"; sqlite3_stmt *statement1 = NULL; sqlite3 *mydb3 = GloAdmin->admindb->get_db(); rc=sqlite3_prepare_v2(mydb3, q, -1, &statement1, 0); @@ -613,9 +613,10 @@ void ProxySQL_Cluster::pull_mysql_query_rules_from_peer() { rc=sqlite3_bind_text(statement1, 26, row[24], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // OK_msg rc=sqlite3_bind_text(statement1, 27, row[25], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // sticky_conn rc=sqlite3_bind_text(statement1, 28, row[26], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // multiplex - rc=sqlite3_bind_text(statement1, 29, row[27], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // log - rc=sqlite3_bind_text(statement1, 30, row[28], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // apply - rc=sqlite3_bind_text(statement1, 31, row[29], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // comment + rc=sqlite3_bind_text(statement1, 29, row[27], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // gtid_from_hostgroup + rc=sqlite3_bind_text(statement1, 30, row[28], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // log + rc=sqlite3_bind_text(statement1, 31, row[29], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // apply + rc=sqlite3_bind_text(statement1, 32, row[30], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); // comment SAFE_SQLITE3_STEP(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); diff --git a/lib/Query_Processor.cpp b/lib/Query_Processor.cpp index c87e5187f..b9336c635 100644 --- a/lib/Query_Processor.cpp +++ b/lib/Query_Processor.cpp @@ -42,7 +42,7 @@ class QP_rule_text { char **pta; int num_fields; QP_rule_text(QP_rule_t *QPr) { - num_fields=32; // this count the number of fields + num_fields=33; // this count the number of fields pta=NULL; pta=(char **)malloc(sizeof(char *)*num_fields); itostr(pta[0], (long long)QPr->rule_id); @@ -91,10 +91,11 @@ class QP_rule_text { pta[25]=strdup_null(QPr->OK_msg); itostr(pta[26], (long long)QPr->sticky_conn); itostr(pta[27], (long long)QPr->multiplex); - itostr(pta[28], (long long)QPr->log); - itostr(pta[29], (long long)QPr->apply); - pta[30]=strdup_null(QPr->comment); // issue #643 - itostr(pta[31], (long long)QPr->hits); + itostr(pta[28], (long long)QPr->gtid_from_hostgroup); + itostr(pta[29], (long long)QPr->log); + itostr(pta[30], (long long)QPr->apply); + pta[31]=strdup_null(QPr->comment); // issue #643 + itostr(pta[32], (long long)QPr->hits); } ~QP_rule_text() { for(int i=0; irule_id=rule_id; newQR->active=active; @@ -463,6 +464,7 @@ QP_rule_t * Query_Processor::new_query_rule(int rule_id, bool active, char *user newQR->OK_msg=(OK_msg ? strdup(OK_msg) : NULL); newQR->sticky_conn=sticky_conn; newQR->multiplex=multiplex; + newQR->gtid_from_hostgroup = gtid_from_hostgroup; newQR->apply=apply; newQR->comment=(comment ? strdup(comment) : NULL); // see issue #643 newQR->regex_engine1=NULL; @@ -614,7 +616,7 @@ SQLite3_result * Query_Processor::get_stats_query_rules() { SQLite3_result * Query_Processor::get_current_query_rules() { proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 4, "Dumping current query rules, using Global version %d\n", version); - SQLite3_result *result=new SQLite3_result(32); + SQLite3_result *result=new SQLite3_result(33); #ifdef PROXYSQL_QPRO_PTHREAD_MUTEX pthread_rwlock_rdlock(&rwlock); #else @@ -649,6 +651,7 @@ SQLite3_result * Query_Processor::get_current_query_rules() { result->add_column_definition(SQLITE_TEXT,"OK_msg"); result->add_column_definition(SQLITE_TEXT,"sticky_conn"); result->add_column_definition(SQLITE_TEXT,"multiplex"); + result->add_column_definition(SQLITE_TEXT,"gtid_from_hostgroup"); result->add_column_definition(SQLITE_TEXT,"log"); result->add_column_definition(SQLITE_TEXT,"apply"); result->add_column_definition(SQLITE_TEXT,"comment"); // issue #643 @@ -822,7 +825,9 @@ Query_Processor_Output * Query_Processor::process_mysql_query(MySQL_Session *ses qr1->match_digest, qr1->match_pattern, qr1->negate_match_pattern, (char *)re_mod.c_str(), qr1->flagOUT, qr1->replace_pattern, qr1->destination_hostgroup, qr1->cache_ttl, qr1->reconnect, qr1->timeout, qr1->retries, qr1->delay, qr1->next_query_flagIN, qr1->mirror_flagOUT, qr1->mirror_hostgroup, - qr1->error_msg, qr1->OK_msg, qr1->sticky_conn, qr1->multiplex, qr1->log, qr1->apply, + qr1->error_msg, qr1->OK_msg, qr1->sticky_conn, qr1->multiplex, + qr1->gtid_from_hostgroup, + qr1->log, qr1->apply, qr1->comment); qr2->parent=qr1; // pointer to parent to speed up parent update (hits) if (qr2->match_digest) { @@ -1034,6 +1039,11 @@ __internal_loop: proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "query rule %d has set multiplex: %d. Connection will%s multiplex\n", qr->rule_id, qr->multiplex, (qr->multiplex == 0 ? " NOT" : "" )); ret->multiplex=qr->multiplex; } + if (qr->gtid_from_hostgroup >= 0) { + // Note: negative gtid_from_hostgroup means this rule doesn't change the gtid_from_hostgroup + proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "query rule %d has set gtid from hostgroup: %d. A new session will be created\n", qr->rule_id, qr->gtid_from_hostgroup); + ret->gtid_from_hostgroup = qr->gtid_from_hostgroup; + } if (qr->log >= 0) { // Note: negative log means this rule doesn't change proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 5, "query rule %d has set log: %d. Query will%s logged\n", qr->rule_id, qr->log, (qr->log == 0 ? " NOT" : "" )); From 9a6b176d3144d10e0f497bfdc4a67af3f38172b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 26 Jan 2018 16:19:48 +0100 Subject: [PATCH 26/40] Expanding stats_mysql_connection_pool Added counters of queries using gtid sync Added PR #1343 for FR #1207 --- include/MySQL_HostGroups_Manager.h | 14 ++++++++++++++ include/MySQL_Session.h | 3 +++ lib/MySQL_HostGroups_Manager.cpp | 25 ++++++++++++++++++++----- lib/MySQL_Session.cpp | 4 +++- lib/ProxySQL_Admin.cpp | 10 +++++----- lib/mysql_connection.cpp | 3 +++ 6 files changed, 48 insertions(+), 11 deletions(-) diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index b319e3669..3aad02122 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -317,6 +317,7 @@ class MySrvC { // MySQL Server Container unsigned int compression; unsigned int max_connections; unsigned int max_replication_lag; + unsigned int max_connections_used; // The maximum number of connections that has been opened unsigned int connect_OK; unsigned int connect_ERR; // note that these variables are in microsecond, while user defines max lantency in millisecond @@ -325,6 +326,7 @@ class MySrvC { // MySQL Server Container time_t time_last_detected_error; unsigned int connect_ERR_at_time_last_detected_error; unsigned long long queries_sent; + unsigned long long queries_gtid_sync; unsigned long long bytes_sent; unsigned long long bytes_recv; bool shunned_automatic; @@ -337,6 +339,18 @@ class MySrvC { // MySQL Server Container ~MySrvC(); void connect_error(int); void shun_and_killall(); + /** + * Update the maximum number of used connections + * @return + * the maximum number of used connections + */ + unsigned int update_max_connections_used() + { + unsigned int connections_used = ConnectionsUsed->conns_length(); + if (max_connections_used < connections_used) + max_connections_used = connections_used; + return max_connections_used; + } }; class MySrvList { // MySQL Server List diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index 3d8f8a8b9..edcd4f5a4 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -172,6 +172,9 @@ class MySQL_Session bool session_fast_forward; bool started_sending_data_to_client; // this status variable tracks if some result set was sent to the client, of if proysql is still buffering everything + + bool with_gtid; + MySQL_STMTs_meta *sess_STMTs_meta; StmtLongDataHandler *SLDH; diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 731180d3c..edff48a18 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -652,6 +652,8 @@ MySrvC::MySrvC(char *add, uint16_t p, uint16_t gp, unsigned int _weight, enum My queries_sent=0; bytes_sent=0; bytes_recv=0; + max_connections_used=0; + queries_gtid_sync=0; time_last_detected_error=0; connect_ERR_at_time_last_detected_error=0; shunned_automatic=false; @@ -2030,6 +2032,7 @@ MySQL_Connection * MySQL_HostGroups_Manager::get_MyConn_from_pool(unsigned int _ if (conn) { mysrvc->ConnectionsUsed->add(conn); status.myconnpoll_get_ok++; + mysrvc->update_max_connections_used(); } } wrunlock(); @@ -2210,7 +2213,7 @@ void MySQL_HostGroups_Manager::set_incoming_group_replication_hostgroups(SQLite3 } SQLite3_result * MySQL_HostGroups_Manager::SQL3_Connection_Pool(bool _reset) { - const int colnum=12; + const int colnum=14; proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 4, "Dumping Connection Pool\n"); SQLite3_result *result=new SQLite3_result(colnum); result->add_column_definition(SQLITE_TEXT,"hostgroup"); @@ -2221,7 +2224,9 @@ SQLite3_result * MySQL_HostGroups_Manager::SQL3_Connection_Pool(bool _reset) { result->add_column_definition(SQLITE_TEXT,"ConnFree"); result->add_column_definition(SQLITE_TEXT,"ConnOK"); result->add_column_definition(SQLITE_TEXT,"ConnERR"); + result->add_column_definition(SQLITE_TEXT,"MaxConnUsed"); result->add_column_definition(SQLITE_TEXT,"Queries"); + result->add_column_definition(SQLITE_TEXT,"Queries_GTID_sync"); result->add_column_definition(SQLITE_TEXT,"Bytes_sent"); result->add_column_definition(SQLITE_TEXT,"Bytes_recv"); result->add_column_definition(SQLITE_TEXT,"Latency_us"); @@ -2284,23 +2289,33 @@ SQLite3_result * MySQL_HostGroups_Manager::SQL3_Connection_Pool(bool _reset) { if (_reset) { mysrvc->connect_ERR=0; } - sprintf(buf,"%llu", mysrvc->queries_sent); + sprintf(buf,"%u", mysrvc->max_connections_used); pta[8]=strdup(buf); + if (_reset) { + mysrvc->max_connections_used=0; + } + sprintf(buf,"%llu", mysrvc->queries_sent); + pta[9]=strdup(buf); if (_reset) { mysrvc->queries_sent=0; } + sprintf(buf,"%llu", mysrvc->queries_gtid_sync); + pta[10]=strdup(buf); + if (_reset) { + mysrvc->queries_gtid_sync=0; + } sprintf(buf,"%llu", mysrvc->bytes_sent); - pta[9]=strdup(buf); + pta[11]=strdup(buf); if (_reset) { mysrvc->bytes_sent=0; } sprintf(buf,"%llu", mysrvc->bytes_recv); - pta[10]=strdup(buf); + pta[12]=strdup(buf); if (_reset) { mysrvc->bytes_recv=0; } sprintf(buf,"%u", mysrvc->current_latency_us); - pta[11]=strdup(buf); + pta[13]=strdup(buf); result->add_row(pta); for (k=0; kexecute("BEGIN"); statsdb->execute("DELETE FROM stats_mysql_connection_pool"); - char *a=(char *)"INSERT INTO stats_mysql_connection_pool VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")"; + char *a=(char *)"INSERT INTO stats_mysql_connection_pool VALUES (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\")"; for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { SQLite3_row *r=*it; int arg_len=0; - for (int i=0; i<12; i++) { + for (int i=0; i<14; i++) { arg_len+=strlen(r->fields[i]); } char *query=(char *)malloc(strlen(a)+arg_len+32); - sprintf(query,a,r->fields[0],r->fields[1],r->fields[2],r->fields[3],r->fields[4],r->fields[5],r->fields[6],r->fields[7],r->fields[8],r->fields[9],r->fields[10],r->fields[11]); + sprintf(query,a,r->fields[0],r->fields[1],r->fields[2],r->fields[3],r->fields[4],r->fields[5],r->fields[6],r->fields[7],r->fields[8],r->fields[9],r->fields[10],r->fields[11],r->fields[12],r->fields[13]); statsdb->execute(query); free(query); } diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 8810e0152..a42bc6ed4 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -710,6 +710,9 @@ handler_again: __sync_fetch_and_add(&parent->queries_sent,1); __sync_fetch_and_add(&parent->bytes_sent,query.length); myds->sess->thread->status_variables.queries_backends_bytes_sent+=query.length; + if (myds->sess->with_gtid == true) { + __sync_fetch_and_add(&parent->queries_gtid_sync,1); + } if (async_exit_status) { next_event(ASYNC_QUERY_CONT); } else { From 35ee631844bd25b0ce449484ec89f06632eb854a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Tue, 30 Jan 2018 16:55:50 +0100 Subject: [PATCH 27/40] Further improvement for handling GTID Statistics collected aboout GTID queries Statistics displayed on HTTP server Count number of GTID events per server Online upgrade of all mysql_connections tables Fixed path for libev --- include/MySQL_HostGroups_Manager.h | 1 + include/MySQL_Thread.h | 5 +++ include/ProxySQL_Statistics.hpp | 19 +++++++++-- lib/MySQL_HostGroups_Manager.cpp | 21 +++++++----- lib/MySQL_Session.cpp | 3 ++ lib/MySQL_Thread.cpp | 40 ++++++++++++++++++++++ lib/ProxySQL_Admin.cpp | 14 ++++---- lib/ProxySQL_HTTP_Server.cpp | 16 ++++++--- lib/ProxySQL_Statistics.cpp | 53 +++++++++++++++++++++++------- lib/mysql_connection.cpp | 3 +- src/Makefile | 2 +- 11 files changed, 142 insertions(+), 35 deletions(-) diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 3aad02122..b74d3a6a5 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -62,6 +62,7 @@ class GTID_Server_Data { size_t pos; struct ev_io *w; char uuid_server[64]; + unsigned long long events_read; gtid_set_t gtid_executed; bool active; GTID_Server_Data(struct ev_io *_w, char *_address, uint16_t _port, uint16_t _mysql_port); diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index 07dea2a5b..c7fd31da2 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -216,6 +216,7 @@ class MySQL_Thread unsigned long long frontend_stmt_close; unsigned long long queries; unsigned long long queries_slow; + unsigned long long queries_gtid; unsigned long long queries_backends_bytes_sent; unsigned long long queries_backends_bytes_recv; unsigned long long query_processor_time; @@ -226,6 +227,8 @@ class MySQL_Thread unsigned long long ConnPool_get_conn_immediate; unsigned long long ConnPool_get_conn_success; unsigned long long ConnPool_get_conn_failure; + unsigned long long gtid_binlog_collected; + unsigned long long gtid_session_collected; unsigned int active_transactions; } status_variables; @@ -459,6 +462,8 @@ class MySQL_Threads_Handler unsigned long long get_total_frontend_stmt_close(); unsigned long long get_total_queries(); unsigned long long get_slow_queries(); + unsigned long long get_gtid_queries(); + unsigned long long get_gtid_session_collected(); unsigned long long get_queries_backends_bytes_recv(); unsigned long long get_queries_backends_bytes_sent(); unsigned int get_active_transations(); diff --git a/include/ProxySQL_Statistics.hpp b/include/ProxySQL_Statistics.hpp index 2ac8e340c..48f964fd7 100644 --- a/include/ProxySQL_Statistics.hpp +++ b/include/ProxySQL_Statistics.hpp @@ -6,7 +6,11 @@ //#include "wqueue.h" #include -#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS "CREATE TABLE mysql_connections (timestamp INT NOT NULL, Client_Connections_aborted INT NOT NULL, Client_Connections_connected INT NOT NULL, Client_Connections_created INT NOT NULL, Server_Connections_aborted INT NOT NULL, Server_Connections_connected INT NOT NULL, Server_Connections_created INT NOT NULL, ConnPool_get_conn_failure INT NOT NULL, ConnPool_get_conn_immediate INT NOT NULL, ConnPool_get_conn_success INT NOT NULL, Questions INT NOT NULL, Slow_queries INT NOT NULL, PRIMARY KEY (timestamp))" +#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_V1_4 "CREATE TABLE mysql_connections (timestamp INT NOT NULL, Client_Connections_aborted INT NOT NULL, Client_Connections_connected INT NOT NULL, Client_Connections_created INT NOT NULL, Server_Connections_aborted INT NOT NULL, Server_Connections_connected INT NOT NULL, Server_Connections_created INT NOT NULL, ConnPool_get_conn_failure INT NOT NULL, ConnPool_get_conn_immediate INT NOT NULL, ConnPool_get_conn_success INT NOT NULL, Questions INT NOT NULL, Slow_queries INT NOT NULL, PRIMARY KEY (timestamp))" + +#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_V2_0 "CREATE TABLE mysql_connections (timestamp INT NOT NULL, Client_Connections_aborted INT NOT NULL, Client_Connections_connected INT NOT NULL, Client_Connections_created INT NOT NULL, Server_Connections_aborted INT NOT NULL, Server_Connections_connected INT NOT NULL, Server_Connections_created INT NOT NULL, ConnPool_get_conn_failure INT NOT NULL, ConnPool_get_conn_immediate INT NOT NULL, ConnPool_get_conn_success INT NOT NULL, Questions INT NOT NULL, Slow_queries INT NOT NULL, GTID_consistent_queries INT NOT NULL, PRIMARY KEY (timestamp))" + +#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_V2_0 #define STATSDB_SQLITE_TABLE_SYSTEM_CPU "CREATE TABLE system_cpu (timestamp INT NOT NULL, tms_utime INT NOT NULL, tms_stime INT NOT NULL, PRIMARY KEY (timestamp))" @@ -14,7 +18,11 @@ #define STATSDB_SQLITE_TABLE_SYSTEM_MEMORY "CREATE TABLE system_memory (timestamp INT NOT NULL, allocated INT NOT NULL, resident INT NOT NULL, active INT NOT NULL, mapped INT NOT NULL, metadata INT NOT NULL, retained INT NOT NULL, PRIMARY KEY (timestamp))" #endif -#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_HOUR "CREATE TABLE mysql_connections_hour (timestamp INT NOT NULL, Client_Connections_aborted INT NOT NULL, Client_Connections_connected INT NOT NULL, Client_Connections_created INT NOT NULL, Server_Connections_aborted INT NOT NULL, Server_Connections_connected INT NOT NULL, Server_Connections_created INT NOT NULL, ConnPool_get_conn_failure INT NOT NULL, ConnPool_get_conn_immediate INT NOT NULL, ConnPool_get_conn_success INT NOT NULL, Questions INT NOT NULL, Slow_queries INT NOT NULL, PRIMARY KEY (timestamp))" +#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_HOUR_V1_4 "CREATE TABLE mysql_connections_hour (timestamp INT NOT NULL, Client_Connections_aborted INT NOT NULL, Client_Connections_connected INT NOT NULL, Client_Connections_created INT NOT NULL, Server_Connections_aborted INT NOT NULL, Server_Connections_connected INT NOT NULL, Server_Connections_created INT NOT NULL, ConnPool_get_conn_failure INT NOT NULL, ConnPool_get_conn_immediate INT NOT NULL, ConnPool_get_conn_success INT NOT NULL, Questions INT NOT NULL, Slow_queries INT NOT NULL, PRIMARY KEY (timestamp))" + +#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_HOUR_V2_0 "CREATE TABLE mysql_connections_hour (timestamp INT NOT NULL, Client_Connections_aborted INT NOT NULL, Client_Connections_connected INT NOT NULL, Client_Connections_created INT NOT NULL, Server_Connections_aborted INT NOT NULL, Server_Connections_connected INT NOT NULL, Server_Connections_created INT NOT NULL, ConnPool_get_conn_failure INT NOT NULL, ConnPool_get_conn_immediate INT NOT NULL, ConnPool_get_conn_success INT NOT NULL, Questions INT NOT NULL, Slow_queries INT NOT NULL, GTID_consistent_queries INT NOT NULL, PRIMARY KEY (timestamp))" + +#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_HOUR STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_HOUR_V2_0 #define STATSDB_SQLITE_TABLE_SYSTEM_CPU_HOUR "CREATE TABLE system_cpu_hour (timestamp INT NOT NULL, tms_utime INT NOT NULL, tms_stime INT NOT NULL, PRIMARY KEY (timestamp))" @@ -22,7 +30,11 @@ #define STATSDB_SQLITE_TABLE_SYSTEM_MEMORY_HOUR "CREATE TABLE system_memory_hour (timestamp INT NOT NULL, allocated INT NOT NULL, resident INT NOT NULL, active INT NOT NULL, mapped INT NOT NULL, metadata INT NOT NULL, retained INT NOT NULL, PRIMARY KEY (timestamp))" #endif -#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_DAY "CREATE TABLE mysql_connections_day (timestamp INT NOT NULL, Client_Connections_aborted INT NOT NULL, Client_Connections_connected INT NOT NULL, Client_Connections_created INT NOT NULL, Server_Connections_aborted INT NOT NULL, Server_Connections_connected INT NOT NULL, Server_Connections_created INT NOT NULL, ConnPool_get_conn_failure INT NOT NULL, ConnPool_get_conn_immediate INT NOT NULL, ConnPool_get_conn_success INT NOT NULL, Questions INT NOT NULL, Slow_queries INT NOT NULL, PRIMARY KEY (timestamp))" +#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_DAY_V1_4 "CREATE TABLE mysql_connections_day (timestamp INT NOT NULL, Client_Connections_aborted INT NOT NULL, Client_Connections_connected INT NOT NULL, Client_Connections_created INT NOT NULL, Server_Connections_aborted INT NOT NULL, Server_Connections_connected INT NOT NULL, Server_Connections_created INT NOT NULL, ConnPool_get_conn_failure INT NOT NULL, ConnPool_get_conn_immediate INT NOT NULL, ConnPool_get_conn_success INT NOT NULL, Questions INT NOT NULL, Slow_queries INT NOT NULL, PRIMARY KEY (timestamp))" + +#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_DAY_V2_0 "CREATE TABLE mysql_connections_day (timestamp INT NOT NULL, Client_Connections_aborted INT NOT NULL, Client_Connections_connected INT NOT NULL, Client_Connections_created INT NOT NULL, Server_Connections_aborted INT NOT NULL, Server_Connections_connected INT NOT NULL, Server_Connections_created INT NOT NULL, ConnPool_get_conn_failure INT NOT NULL, ConnPool_get_conn_immediate INT NOT NULL, ConnPool_get_conn_success INT NOT NULL, Questions INT NOT NULL, Slow_queries INT NOT NULL, GTID_consistent_queries INT NOT NULL, PRIMARY KEY (timestamp))" + +#define STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_DAY STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_DAY_V2_0 #define STATSDB_SQLITE_TABLE_SYSTEM_CPU_DAY "CREATE TABLE system_cpu_day (timestamp INT NOT NULL, tms_utime INT NOT NULL, tms_stime INT NOT NULL, PRIMARY KEY (timestamp))" @@ -83,6 +95,7 @@ class ProxySQL_Statistics { SQLite3_result * get_system_memory_metrics(int interval); #endif SQLite3_result * get_MySQL_Query_Cache_metrics(int interval); + void disk_upgrade_mysql_connections(); }; #endif /* CLASS_PROXYSQL_STATISTICS_H */ diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index edff48a18..63cc31d86 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -179,6 +179,7 @@ GTID_Server_Data::GTID_Server_Data(struct ev_io *_w, char *_address, uint16_t _p address = strdup(_address); port = _port; mysql_port = _mysql_port; + events_read = 0; } void GTID_Server_Data::resize(size_t _s) { @@ -221,18 +222,18 @@ bool GTID_Server_Data::readall() { bool GTID_Server_Data::gtid_exists(char *gtid_uuid, uint64_t gtid_trxid) { std::string s = gtid_uuid; auto it = gtid_executed.find(s); - fprintf(stderr,"Checking if server %s:%d has GTID %s:%lu ... ", address, port, gtid_uuid, gtid_trxid); +// fprintf(stderr,"Checking if server %s:%d has GTID %s:%lu ... ", address, port, gtid_uuid, gtid_trxid); if (it == gtid_executed.end()) { - fprintf(stderr,"NO\n"); +// fprintf(stderr,"NO\n"); return false; } for (auto itr = it->second.begin(); itr != it->second.end(); ++itr) { if ((int64_t)gtid_trxid >= itr->first && (int64_t)gtid_trxid <= itr->second) { - fprintf(stderr,"YES\n"); +// fprintf(stderr,"YES\n"); return true; } } - fprintf(stderr,"NO\n"); +// fprintf(stderr,"NO\n"); return false; } @@ -359,14 +360,15 @@ bool GTID_Server_Data::read_next_gtid() { default: break; } - fprintf(stdout,"%s:%lu\n", uuid_server, rec_trxid); + //fprintf(stdout,"%s:%lu\n", uuid_server, rec_trxid); std::string s = uuid_server; gtid_t new_gtid = std::make_pair(s,rec_trxid); addGtid(new_gtid,gtid_executed); + events_read++; //return true; } } - std::cout << "current pos " << gtid_executed_to_string(gtid_executed) << std::endl << std::endl; + //std::cout << "current pos " << gtid_executed_to_string(gtid_executed) << std::endl << std::endl; return true; } @@ -1339,7 +1341,7 @@ bool MySQL_HostGroups_Manager::gtid_exists(MySrvC *mysrvc, char * gtid_uuid, uin ret = gtid_is->gtid_exists(gtid_uuid,gtid_trxid); } } - proxy_info("Checking if server %s has GTID %s:%lu . %s\n", s1.c_str(), gtid_uuid, gtid_trxid, (ret ? "YES" : "NO")); + //proxy_info("Checking if server %s has GTID %s:%lu . %s\n", s1.c_str(), gtid_uuid, gtid_trxid, (ret ? "YES" : "NO")); pthread_rwlock_unlock(>id_rwlock); return ret; } @@ -3182,11 +3184,12 @@ void MySQL_HostGroups_Manager::converge_group_replication_config(int _writer_hos } SQLite3_result * MySQL_HostGroups_Manager::get_stats_mysql_gtid_executed() { - const int colnum = 3; + const int colnum = 4; SQLite3_result * result = new SQLite3_result(colnum); result->add_column_definition(SQLITE_TEXT,"hostname"); result->add_column_definition(SQLITE_TEXT,"port"); result->add_column_definition(SQLITE_TEXT,"gtid_executed"); + result->add_column_definition(SQLITE_TEXT,"events"); int k; pthread_rwlock_wrlock(>id_rwlock); std::unordered_map::iterator it = gtid_map.begin(); @@ -3200,6 +3203,8 @@ SQLite3_result * MySQL_HostGroups_Manager::get_stats_mysql_gtid_executed() { //sprintf(buf,"%d", mysrvc->port); string s1 = gtid_executed_to_string(gtid_si->gtid_executed); pta[2]=strdup(s1.c_str()); + sprintf(buf,"%llu", (int)gtid_si->events_read); + pta[3]=strdup(buf); result->add_row(pta); for (k=0; k (unsigned int)mysql_thread___long_query_time*1000) { __sync_add_and_fetch(&sess->thread->status_variables.queries_slow,1); } + if (sess->with_gtid) { + __sync_add_and_fetch(&sess->thread->status_variables.queries_gtid,1); + } assert(mysql_stmt==NULL); if (stmt_info) { stmt_info=NULL; diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index a90598df8..64ed813b7 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -3409,6 +3409,7 @@ MySQL_Thread::MySQL_Thread() { status_variables.queries=0; status_variables.queries_slow=0; + status_variables.queries_gtid=0; status_variables.queries_backends_bytes_sent=0; status_variables.queries_backends_bytes_recv=0; status_variables.query_processor_time=0; @@ -3420,6 +3421,7 @@ MySQL_Thread::MySQL_Thread() { status_variables.ConnPool_get_conn_success=0; status_variables.ConnPool_get_conn_failure=0; status_variables.active_transactions=0; + status_variables.gtid_session_collected = 0; match_regexes=NULL; @@ -3763,6 +3765,18 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_GlobalStatus(bool _memory) { pta[1]=buf; result->add_row(pta); } + { // Queries with GTID consistent read + pta[0]=(char *)"GTID_consistent_queries"; + sprintf(buf,"%llu",get_gtid_queries()); + pta[1]=buf; + result->add_row(pta); + } + { // Queries with GTID session state + pta[0]=(char *)"GTID_session_collected"; + sprintf(buf,"%llu",get_gtid_session_collected()); + pta[1]=buf; + result->add_row(pta); + } { // Servers_table_version pta[0]=(char *)"Servers_table_version"; sprintf(buf,"%u",MyHGM->get_servers_table_version()); @@ -4342,6 +4356,32 @@ unsigned long long MySQL_Threads_Handler::get_slow_queries() { return q; } +unsigned long long MySQL_Threads_Handler::get_gtid_queries() { + unsigned long long q=0; + unsigned int i; + for (i=0;istatus_variables.queries_gtid,0); + } + } + return q; +} + +unsigned long long MySQL_Threads_Handler::get_gtid_session_collected() { + unsigned long long q=0; + unsigned int i; + for (i=0;istatus_variables.gtid_session_collected,0); + } + } + return q; +} + unsigned long long MySQL_Threads_Handler::get_queries_backends_bytes_recv() { unsigned long long q=0; unsigned int i; diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 82f2f1cd7..9b7ba5583 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -278,7 +278,7 @@ static int http_handler(void *cls, struct MHD_Connection *connection, const char #define STATS_SQLITE_TABLE_MEMORY_METRICS "CREATE TABLE stats_memory_metrics (Variable_Name VARCHAR NOT NULL PRIMARY KEY , Variable_Value VARCHAR NOT NULL)" -#define STATS_SQLITE_TABLE_MYSQL_GTID_EXECUTED "CREATE TABLE stats_mysql_gtid_executed (hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_executed VARCHAR)" +#define STATS_SQLITE_TABLE_MYSQL_GTID_EXECUTED "CREATE TABLE stats_mysql_gtid_executed (hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_executed VARCHAR , events INT NOT NULL)" #ifdef DEBUG #define ADMIN_SQLITE_TABLE_DEBUG_LEVELS "CREATE TABLE debug_levels (module VARCHAR NOT NULL PRIMARY KEY , verbosity INT NOT NULL DEFAULT 0)" @@ -6506,8 +6506,8 @@ void ProxySQL_Admin::stats___mysql_gtid_executed() { sqlite3 *mydb3=statsdb->get_db(); char *query1=NULL; char *query32=NULL; - query1=(char *)"INSERT INTO stats_mysql_gtid_executed VALUES (?1, ?2, ?3)"; - query32=(char *)"INSERT INTO stats_mysql_gtid_executed VALUES (?1, ?2, ?3), (?4, ?5, ?6), (?7, ?8, ?9), (?10, ?11, ?12), (?13, ?14, ?15), (?16, ?17, ?18), (?19, ?20, ?21), (?22, ?23, ?24), (?25, ?26, ?27), (?28, ?29, ?30), (?31, ?32, ?33), (?34, ?35, ?36), (?37, ?38, ?39), (?40, ?41, ?42), (?43, ?44, ?45), (?46, ?47, ?48), (?49, ?50, ?51), (?52, ?53, ?54), (?55, ?56, ?57), (?58, ?59, ?60), (?61, ?62, ?63), (?64, ?65, ?66), (?67, ?68, ?69), (?70, ?71, ?72), (?73, ?74, ?75), (?76, ?77, ?78), (?79, ?80, ?81), (?82, ?83, ?84), (?85, ?86, ?87), (?88, ?89, ?90), (?91, ?92, ?93), (?94, ?95, ?96)"; + query1=(char *)"INSERT INTO stats_mysql_gtid_executed VALUES (?1, ?2, ?3, ?4)"; + query32=(char *)"INSERT INTO stats_mysql_gtid_executed VALUES (?1, ?2, ?3, ?4), (?5, ?6, ?7, ?8), (?9, ?10, ?11, ?12), (?13, ?14, ?15, ?16), (?17, ?18, ?19, ?20), (?21, ?22, ?23, ?24), (?25, ?26, ?27, ?28), (?29, ?30, ?31, ?32), (?33, ?34, ?35, ?36), (?37, ?38, ?39, ?40), (?41, ?42, ?43, ?44), (?45, ?46, ?47, ?48), (?49, ?50, ?51, ?52), (?53, ?54, ?55, ?56), (?57, ?58, ?59, ?60), (?61, ?62, ?63, ?64), (?65, ?66, ?67, ?68), (?69, ?70, ?71, ?72), (?73, ?74, ?75, ?76), (?77, ?78, ?79, ?80), (?81, ?82, ?83, ?84), (?85, ?86, ?87, ?88), (?89, ?90, ?91, ?92), (?93, ?94, ?95, ?96), (?97, ?98, ?99, ?100), (?101, ?102, ?103, ?104), (?105, ?106, ?107, ?108), (?109, ?110, ?111, ?112), (?113, ?114, ?115, ?116), (?117, ?118, ?119, ?120), (?121, ?122, ?123, ?124), (?125, ?126, ?127, ?128), (?129, ?130, ?131, ?132)"; rc=sqlite3_prepare_v2(mydb3, query1, -1, &statement1, 0); assert(rc==SQLITE_OK); @@ -6520,9 +6520,10 @@ void ProxySQL_Admin::stats___mysql_gtid_executed() { SQLite3_row *r1=*it; int idx=row_idx%32; if (row_idxfields[0], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*3)+2, atoi(r1->fields[1])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement32, (idx*3)+3, r1->fields[2], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement32, (idx*4)+1, r1->fields[0], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*4)+2, atoi(r1->fields[1])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement32, (idx*4)+3, r1->fields[2], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*4)+4, atoll(r1->fields[3])); assert(rc==SQLITE_OK); if (idx==31) { SAFE_SQLITE3_STEP(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); @@ -6532,6 +6533,7 @@ void ProxySQL_Admin::stats___mysql_gtid_executed() { rc=sqlite3_bind_text(statement1, 1, r1->fields[0], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 2, atoi(r1->fields[1])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 3, r1->fields[2], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 4, atoll(r1->fields[3])); assert(rc==SQLITE_OK); SAFE_SQLITE3_STEP(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); diff --git a/lib/ProxySQL_HTTP_Server.cpp b/lib/ProxySQL_HTTP_Server.cpp index 8273c3f17..054056b4e 100644 --- a/lib/ProxySQL_HTTP_Server.cpp +++ b/lib/ProxySQL_HTTP_Server.cpp @@ -634,27 +634,33 @@ int ProxySQL_HTTP_Server::handler(void *cls, struct MHD_Connection *connection, free(ts); - nm = (char **)malloc(sizeof(char *)*4); + nm = (char **)malloc(sizeof(char *)*6); nm[0] = (char *)"ConnPool_get_conn_failure"; nm[1] = (char *)"ConnPool_get_conn_immediate"; nm[2] = (char *)"ConnPool_get_conn_success"; nm[3] = (char *)"Questions"; - nl = (char **)malloc(sizeof(char *)*4); + nm[4] = (char *)"Slow_queries"; + nm[5] = (char *)"GTID_consistent_queries"; + nl = (char **)malloc(sizeof(char *)*6); nl[0] = (char *)"ConnPool failure"; nl[1] = (char *)"ConnPool immediate"; nl[2] = (char *)"ConnPool success"; nl[3] = (char *)"Questions"; - nv = (char **)malloc(sizeof(char *)*4); + nl[4] = (char *)"Slow Queries"; + nl[5] = (char *)"GTID Consistent Queries"; + nv = (char **)malloc(sizeof(char *)*6); nv[0] = extract_values(mysql_metrics_sqlite,8,true); nv[1] = extract_values(mysql_metrics_sqlite,9,true); nv[2] = extract_values(mysql_metrics_sqlite,10,true); nv[3] = extract_values(mysql_metrics_sqlite,11,true); + nv[4] = extract_values(mysql_metrics_sqlite,12,true); + nv[5] = extract_values(mysql_metrics_sqlite,13,true); ts = extract_ts(mysql_metrics_sqlite,true); - s1 = generate_chart((char *)"myChart2",ts,4,nm,nl,nv); + s1 = generate_chart((char *)"myChart2",ts,6,nm,nl,nv); s->append(s1->c_str()); free(nm); free(nl); - for (int aa=0 ; aa<4 ; aa++) { + for (int aa=0 ; aa<6 ; aa++) { free(nv[aa]); } free(nv); diff --git a/lib/ProxySQL_Statistics.cpp b/lib/ProxySQL_Statistics.cpp index 904aacc73..5615b1ad3 100644 --- a/lib/ProxySQL_Statistics.cpp +++ b/lib/ProxySQL_Statistics.cpp @@ -96,10 +96,37 @@ void ProxySQL_Statistics::init() { insert_into_tables_defs(tables_defs_statsdb_disk,"mysql_query_cache_hour", STATSDB_SQLITE_TABLE_MYSQL_QUERY_CACHE_HOUR); insert_into_tables_defs(tables_defs_statsdb_disk,"mysql_query_cache_day", STATSDB_SQLITE_TABLE_MYSQL_QUERY_CACHE_DAY); + disk_upgrade_mysql_connections(); + check_and_build_standard_tables(statsdb_mem, tables_defs_statsdb_disk); check_and_build_standard_tables(statsdb_disk, tables_defs_statsdb_disk); } +void ProxySQL_Statistics::disk_upgrade_mysql_connections() { + int rci; + rci=statsdb_disk->check_table_structure((char *)"mysql_connections",(char *)STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_V1_4); + if (rci) { + proxy_warning("Detected version v1.4 of table mysql_connections\n"); + proxy_warning("ONLINE UPGRADE of table mysql_connections in progress\n"); + statsdb_disk->execute("ALTER TABLE mysql_connections ADD COLUMN GTID_consistent_queries INT NOT NULL"); + proxy_warning("ONLINE UPGRADE of table mysql_connections completed\n"); + } + rci=statsdb_disk->check_table_structure((char *)"mysql_connections_hour",(char *)STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_HOUR_V1_4); + if (rci) { + proxy_warning("Detected version v1.4 of table mysql_connections_hour\n"); + proxy_warning("ONLINE UPGRADE of table mysql_connections_hour in progress\n"); + statsdb_disk->execute("ALTER TABLE mysql_connections_hour ADD COLUMN GTID_consistent_queries INT NOT NULL"); + proxy_warning("ONLINE UPGRADE of table mysql_connections_hour completed\n"); + } + rci=statsdb_disk->check_table_structure((char *)"mysql_connections_day",(char *)STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_DAY_V1_4); + if (rci) { + proxy_warning("Detected version v1.4 of table mysql_connections_day\n"); + proxy_warning("ONLINE UPGRADE of table mysql_connections_day in progress\n"); + statsdb_disk->execute("ALTER TABLE mysql_connections_day ADD COLUMN GTID_consistent_queries INT NOT NULL"); + proxy_warning("ONLINE UPGRADE of table mysql_connections_day completed\n"); + } +} + void ProxySQL_Statistics::print_version() { fprintf(stderr,"Standard ProxySQL Statistics rev. %s -- %s -- %s\n", PROXYSQL_STATISTICS_VERSION, __FILE__, __TIMESTAMP__); } @@ -210,8 +237,8 @@ SQLite3_result * ProxySQL_Statistics::get_mysql_metrics(int interval) { int affected_rows; char *error = NULL; char *query = NULL; - char *query1 = (char *)"SELECT SUBSTR(FROM_UNIXTIME(timestamp),0,20) ts, timestamp, Client_Connections_aborted, Client_Connections_connected, Client_Connections_created, Server_Connections_aborted, Server_Connections_connected, Server_Connections_created, ConnPool_get_conn_failure, ConnPool_get_conn_immediate, ConnPool_get_conn_success, Questions FROM mysql_connections WHERE timestamp BETWEEN %d AND %d ORDER BY timestamp"; - char *query2 = (char *)"SELECT SUBSTR(FROM_UNIXTIME(timestamp),0,20) ts, timestamp, Client_Connections_aborted, Client_Connections_connected, Client_Connections_created, Server_Connections_aborted, Server_Connections_connected, Server_Connections_created, ConnPool_get_conn_failure, ConnPool_get_conn_immediate, ConnPool_get_conn_success, Questions FROM mysql_connections_hour WHERE timestamp BETWEEN %d AND %d ORDER BY timestamp"; + char *query1 = (char *)"SELECT SUBSTR(FROM_UNIXTIME(timestamp),0,20) ts, timestamp, Client_Connections_aborted, Client_Connections_connected, Client_Connections_created, Server_Connections_aborted, Server_Connections_connected, Server_Connections_created, ConnPool_get_conn_failure, ConnPool_get_conn_immediate, ConnPool_get_conn_success, Questions, Slow_queries, GTID_consistent_queries FROM mysql_connections WHERE timestamp BETWEEN %d AND %d ORDER BY timestamp"; + char *query2 = (char *)"SELECT SUBSTR(FROM_UNIXTIME(timestamp),0,20) ts, timestamp, Client_Connections_aborted, Client_Connections_connected, Client_Connections_created, Server_Connections_aborted, Server_Connections_connected, Server_Connections_created, ConnPool_get_conn_failure, ConnPool_get_conn_immediate, ConnPool_get_conn_success, Questions, Slow_queries, GTID_consistent_queries FROM mysql_connections_hour WHERE timestamp BETWEEN %d AND %d ORDER BY timestamp"; time_t ts = time(NULL); switch (interval) { case 1800: @@ -535,7 +562,7 @@ void ProxySQL_Statistics::MySQL_Threads_Handler_sets(SQLite3_result *resultset) char *query1=NULL; //char *query2=NULL; //char *query3=NULL; - query1=(char *)"INSERT INTO mysql_connections VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)"; + query1=(char *)"INSERT INTO mysql_connections VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13)"; rc=sqlite3_prepare_v2(mydb3, query1, -1, &statement1, 0); assert(rc==SQLITE_OK); //rc=sqlite3_prepare_v2(mydb3, query2, -1, &statement2, 0); @@ -544,8 +571,8 @@ void ProxySQL_Statistics::MySQL_Threads_Handler_sets(SQLite3_result *resultset) //assert(rc==SQLITE_OK); - uint64_t mysql_connections_values[12]; - for (int i=0; i<12; i++) { + uint64_t mysql_connections_values[13]; + for (int i=0; i<13; i++) { mysql_connections_values[i]=0; } mysql_connections_values[0] = time(NULL); @@ -596,9 +623,13 @@ void ProxySQL_Statistics::MySQL_Threads_Handler_sets(SQLite3_result *resultset) mysql_connections_values[11]=atoi(r1->fields[1]); continue; } + if (!strcasecmp(r1->fields[0],"GTID_consistent_queries")) { + mysql_connections_values[12]=atoi(r1->fields[1]); + continue; + } } - for (int i=0; i<12; i++) { + for (int i=0; i<13; i++) { rc=sqlite3_bind_int64(statement1, i+1, mysql_connections_values[i]); assert(rc==SQLITE_OK); } @@ -621,20 +652,20 @@ void ProxySQL_Statistics::MySQL_Threads_Handler_sets(SQLite3_result *resultset) } free(error); } else { - char buf[512]; + char buf[1024]; if (resultset2->rows_count == 0) { - sprintf(buf,"INSERT INTO mysql_connections_hour SELECT timestamp/3600*3600 , MAX(Client_Connections_aborted), AVG(Client_Connections_connected), MAX(Client_Connections_created), MAX(Server_Connections_aborted), AVG(Server_Connections_connected), MAX(Server_Connections_created), MAX(ConnPool_get_conn_failure), MAX(ConnPool_get_conn_immediate), MAX(ConnPool_get_conn_success), MAX(Questions), MAX(Slow_queries) FROM mysql_connections WHERE timestamp < %ld GROUP BY timestamp/3600", (ts/3600)*3600); + sprintf(buf,"INSERT INTO mysql_connections_hour SELECT timestamp/3600*3600 , MAX(Client_Connections_aborted), AVG(Client_Connections_connected), MAX(Client_Connections_created), MAX(Server_Connections_aborted), AVG(Server_Connections_connected), MAX(Server_Connections_created), MAX(ConnPool_get_conn_failure), MAX(ConnPool_get_conn_immediate), MAX(ConnPool_get_conn_success), MAX(Questions), MAX(Slow_queries), MAX(GTID_consistent_queries) FROM mysql_connections WHERE timestamp < %ld GROUP BY timestamp/3600", (ts/3600)*3600); statsdb_disk->execute(buf); } else { SQLite3_row *r = resultset2->rows[0]; if (r->fields[0]) { time_t t = atol(r->fields[0]); if (ts >= t + 3600) { - sprintf(buf,"INSERT INTO mysql_connections_hour SELECT timestamp/3600*3600 , MAX(Client_Connections_aborted), AVG(Client_Connections_connected), MAX(Client_Connections_created), MAX(Server_Connections_aborted), AVG(Server_Connections_connected), MAX(Server_Connections_created), MAX(ConnPool_get_conn_failure), MAX(ConnPool_get_conn_immediate), MAX(ConnPool_get_conn_success), MAX(Questions), MAX(Slow_queries) FROM mysql_connections WHERE timestamp >= %ld AND timestamp < %ld GROUP BY timestamp/3600", t+3600 , (ts/3600)*3600); + sprintf(buf,"INSERT INTO mysql_connections_hour SELECT timestamp/3600*3600 , MAX(Client_Connections_aborted), AVG(Client_Connections_connected), MAX(Client_Connections_created), MAX(Server_Connections_aborted), AVG(Server_Connections_connected), MAX(Server_Connections_created), MAX(ConnPool_get_conn_failure), MAX(ConnPool_get_conn_immediate), MAX(ConnPool_get_conn_success), MAX(Questions), MAX(Slow_queries), MAX(GTID_consistent_queries) FROM mysql_connections WHERE timestamp >= %ld AND timestamp < %ld GROUP BY timestamp/3600", t+3600 , (ts/3600)*3600); statsdb_disk->execute(buf); } } else { - sprintf(buf,"INSERT INTO mysql_connections_hour SELECT timestamp/3600*3600 , MAX(Client_Connections_aborted), AVG(Client_Connections_connected), MAX(Client_Connections_created), MAX(Server_Connections_aborted), AVG(Server_Connections_connected), MAX(Server_Connections_created), MAX(ConnPool_get_conn_failure), MAX(ConnPool_get_conn_immediate), MAX(ConnPool_get_conn_success), MAX(Questions), MAX(Slow_queries) FROM mysql_connections WHERE timestamp < %ld GROUP BY timestamp/3600", (ts/3600)*3600); + sprintf(buf,"INSERT INTO mysql_connections_hour SELECT timestamp/3600*3600 , MAX(Client_Connections_aborted), AVG(Client_Connections_connected), MAX(Client_Connections_created), MAX(Server_Connections_aborted), AVG(Server_Connections_connected), MAX(Server_Connections_created), MAX(ConnPool_get_conn_failure), MAX(ConnPool_get_conn_immediate), MAX(ConnPool_get_conn_success), MAX(Questions), MAX(Slow_queries), MAX(GTID_consistent_queries) FROM mysql_connections WHERE timestamp < %ld GROUP BY timestamp/3600", (ts/3600)*3600); statsdb_disk->execute(buf); } } @@ -723,7 +754,7 @@ void ProxySQL_Statistics::MySQL_Query_Cache_sets(SQLite3_result *resultset) { } free(error); } else { - char buf[512]; + char buf[1024]; if (resultset2->rows_count == 0) { sprintf(buf,"INSERT INTO mysql_query_cache_hour SELECT timestamp/3600*3600 , MAX(count_GET), MAX(count_GET_OK), MAX(count_SET), MAX(bytes_IN), MAX(bytes_OUT), MAX(Entries_Purged), AVG(Entries_In_Cache), AVG(Memory_bytes) FROM mysql_query_cache WHERE timestamp < %ld GROUP BY timestamp/3600", (ts/3600)*3600); statsdb_disk->execute(buf); diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index a42bc6ed4..19a61e3a6 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -1716,7 +1716,8 @@ bool MySQL_Connection::get_gtid(char *buff, uint64_t *trx_id) { if (mysql_session_track_get_first(mysql, SESSION_TRACK_GTIDS, &data, &length) == 0) { memcpy(buff,data,length); buff[length]=0; - fprintf(stderr,"GTID=%s\n",buff); + //fprintf(stderr,"GTID=%s\n",buff); + __sync_fetch_and_add(&myds->sess->thread->status_variables.gtid_session_collected,1); ret = true; } } diff --git a/src/Makefile b/src/Makefile index 5342acd39..bbfcf0df9 100644 --- a/src/Makefile +++ b/src/Makefile @@ -51,7 +51,7 @@ EV_LDIR=$(EV_DIR)/.libs IDIR=../include LDIR=../lib IDIRS=-I$(IDIR) -I$(JEMALLOC_IDIR) -I$(MARIADB_IDIR) $(LIBCONFIG_IDIR) -I$(DAEMONPATH_IDIR) -I$(SQLITE3_DIR) -I$(CLICKHOUSE_CPP_DIR) -I$(MICROHTTPD_IDIR) -I$(CURL_IDIR) -I$(EV_IDIR) -LDIRS=-L$(LDIR) -L$(JEMALLOC_LDIR) $(LIBCONFIG_LDIR) -L$(RE2_PATH)/obj -L$(MARIADB_LDIR) -L$(DAEMONPATH_LDIR) -L$(PCRE_LDIR) -L$(MICROHTTPD_LDIR) -L$(CURL_LDIR) -L$(EV_DIR) +LDIRS=-L$(LDIR) -L$(JEMALLOC_LDIR) $(LIBCONFIG_LDIR) -L$(RE2_PATH)/obj -L$(MARIADB_LDIR) -L$(DAEMONPATH_LDIR) -L$(PCRE_LDIR) -L$(MICROHTTPD_LDIR) -L$(CURL_LDIR) -L$(EV_LDIR) UNAME_S := $(shell uname -s) From f3794c81a5271e05fd40ef87955d00a812780530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 1 Feb 2018 02:38:09 +0100 Subject: [PATCH 28/40] Add DEFAULT 0 for stats tables --- lib/ProxySQL_Statistics.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ProxySQL_Statistics.cpp b/lib/ProxySQL_Statistics.cpp index 5615b1ad3..5d6ede7eb 100644 --- a/lib/ProxySQL_Statistics.cpp +++ b/lib/ProxySQL_Statistics.cpp @@ -108,21 +108,21 @@ void ProxySQL_Statistics::disk_upgrade_mysql_connections() { if (rci) { proxy_warning("Detected version v1.4 of table mysql_connections\n"); proxy_warning("ONLINE UPGRADE of table mysql_connections in progress\n"); - statsdb_disk->execute("ALTER TABLE mysql_connections ADD COLUMN GTID_consistent_queries INT NOT NULL"); + statsdb_disk->execute("ALTER TABLE mysql_connections ADD COLUMN GTID_consistent_queries INT NOT NULL DEFAULT 0"); proxy_warning("ONLINE UPGRADE of table mysql_connections completed\n"); } rci=statsdb_disk->check_table_structure((char *)"mysql_connections_hour",(char *)STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_HOUR_V1_4); if (rci) { proxy_warning("Detected version v1.4 of table mysql_connections_hour\n"); proxy_warning("ONLINE UPGRADE of table mysql_connections_hour in progress\n"); - statsdb_disk->execute("ALTER TABLE mysql_connections_hour ADD COLUMN GTID_consistent_queries INT NOT NULL"); + statsdb_disk->execute("ALTER TABLE mysql_connections_hour ADD COLUMN GTID_consistent_queries INT NOT NULL DEFAULT 0"); proxy_warning("ONLINE UPGRADE of table mysql_connections_hour completed\n"); } rci=statsdb_disk->check_table_structure((char *)"mysql_connections_day",(char *)STATSDB_SQLITE_TABLE_MYSQL_CONNECTIONS_DAY_V1_4); if (rci) { proxy_warning("Detected version v1.4 of table mysql_connections_day\n"); proxy_warning("ONLINE UPGRADE of table mysql_connections_day in progress\n"); - statsdb_disk->execute("ALTER TABLE mysql_connections_day ADD COLUMN GTID_consistent_queries INT NOT NULL"); + statsdb_disk->execute("ALTER TABLE mysql_connections_day ADD COLUMN GTID_consistent_queries INT NOT NULL DEFAULT 0"); proxy_warning("ONLINE UPGRADE of table mysql_connections_day completed\n"); } } From 82e2c802b95a6d2da1533724cb60b9e5e7014de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 1 Feb 2018 17:53:25 +0100 Subject: [PATCH 29/40] Fix for bug #1342 --- lib/mysql_connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 19a61e3a6..4737b4380 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -1550,7 +1550,7 @@ void MySQL_Connection::ProcessQueryAndSetStatusFlags(char *query_digest_text) { } if (strncasecmp(query_digest_text,"SET ",4)==0) { // For issue #555 , multiplexing is disabled if --safe-updates is used (see session_vars definition) - for (unsigned int i = 0; i < sizeof(session_vars); i++) { + for (unsigned int i = 0; i < sizeof(session_vars)/sizeof(char *); i++) { if (strcasestr(query_digest_text,session_vars[i])!=NULL) { set_status_user_variable(true); break; From f9789aa5404fcd541d489740b49de9ed358a74e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 19 Jan 2018 15:53:25 +0100 Subject: [PATCH 30/40] 1st commit on SSL client side --- .gitignore | 2 ++ lib/MySQL_Session.cpp | 8 +++++++- lib/MySQL_Thread.cpp | 8 +++++--- src/main.cpp | 41 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 61c01f85d..eafdea43d 100644 --- a/.gitignore +++ b/.gitignore @@ -113,6 +113,8 @@ deps/pcre/pcre/ deps/curl/curl/ deps/curl/curl-7.57.0/ +deps/libev/libev-4.24/ + #protobuf deps/protobuf/protobuf-2.6.1/ diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 287a9932f..74396a689 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -3141,7 +3141,11 @@ void MySQL_Session::handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE( //(default_hostgroup>=0 && session_type == PROXYSQL_SESSION_MYSQL) (default_hostgroup>=0 && ( session_type == PROXYSQL_SESSION_MYSQL || session_type == PROXYSQL_SESSION_SQLITE ) ) || - strncmp(client_myds->myconn->userinfo->username,mysql_thread___monitor_username,strlen(mysql_thread___monitor_username))==0 + ( + client_myds->encrypted==false + && + strncmp(client_myds->myconn->userinfo->username,mysql_thread___monitor_username,strlen(mysql_thread___monitor_username))==0 + ) ) // Do not delete this line. See bug #492 ) { if (session_type == PROXYSQL_SESSION_ADMIN) { @@ -3304,12 +3308,14 @@ void MySQL_Session::handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE( } else { client_addr = strdup((char *)""); } + if (client_myds->encrypted == false) { char *_s=(char *)malloc(strlen(client_myds->myconn->userinfo->username)+100+strlen(client_addr)); sprintf(_s,"ProxySQL Error: Access denied for user '%s'@'%s' (using password: %s)", client_myds->myconn->userinfo->username, client_addr, (client_myds->myconn->userinfo->password ? "YES" : "NO")); client_myds->myprot.generate_pkt_ERR(true,NULL,NULL,2,1045,(char *)"28000", _s); __sync_add_and_fetch(&MyHGM->status.client_connections_aborted,1); free(_s); client_myds->DSS=STATE_SLEEP; + } } } diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 64ed813b7..f5410efc2 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -1752,10 +1752,12 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t int intv=atoi(value); if (intv > 10 && intv <= 65535) { variables.server_capabilities=intv; - if (variables.server_capabilities & CLIENT_SSL) { +// if (variables.server_capabilities & CLIENT_SSL) { // for now disable CLIENT_SSL - variables.server_capabilities &= ~CLIENT_SSL; - } +// variables.server_capabilities &= ~CLIENT_SSL; +// } + variables.server_capabilities |= CLIENT_SSL; + return true; } else { return false; diff --git a/src/main.cpp b/src/main.cpp index 2e54acd26..1b2f85eb4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,11 +17,14 @@ #include #include "ev.h" + // MariaDB client library redefines dlerror(), see https://mariadb.atlassian.net/browse/CONC-101 #ifdef dlerror #undef dlerror #endif +static pthread_mutex_t *lockarray; +#include // this fuction will be called as a deatached thread @@ -106,7 +109,33 @@ struct cpu_timer unsigned long long begin; }; -/* + +static void lock_callback(int mode, int type, const char *file, int line) { + (void)file; + (void)line; + if(mode & CRYPTO_LOCK) { + pthread_mutex_lock(&(lockarray[type])); + } else { + pthread_mutex_unlock(&(lockarray[type])); + } +} + +static unsigned long thread_id(void) { + unsigned long ret; + ret = (unsigned long)pthread_self(); + return ret; +} + +static void init_locks(void) { + int i; + lockarray = (pthread_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); + for(i = 0; i Date: Fri, 2 Feb 2018 08:51:18 +0100 Subject: [PATCH 31/40] Added experimental (not completed) support for SSL client side --- include/MySQL_Data_Stream.h | 12 +- include/proxysql.h | 1 + lib/MySQL_Protocol.cpp | 32 ++-- lib/MySQL_Session.cpp | 78 ++++++-- lib/mysql_data_stream.cpp | 345 +++++++++++++++++++++++++++++++++++- 5 files changed, 435 insertions(+), 33 deletions(-) diff --git a/include/MySQL_Data_Stream.h b/include/MySQL_Data_Stream.h index aef35683f..90add5008 100644 --- a/include/MySQL_Data_Stream.h +++ b/include/MySQL_Data_Stream.h @@ -5,7 +5,9 @@ #include "cpp.h" -#define QUEUE_T_DEFAULT_SIZE 32768 +//#define QUEUE_T_DEFAULT_SIZE 32768 +#define QUEUE_T_DEFAULT_SIZE 8192 +#define MY_SSL_BUFFER 8192 typedef struct _queue_t { void *buffer; @@ -43,12 +45,16 @@ class MyDS_real_query { } }; +enum sslstatus { SSLSTATUS_OK, SSLSTATUS_WANT_IO, SSLSTATUS_FAIL}; + class MySQL_Data_Stream { private: int array2buffer(); int buffer2array(); void generate_compressed_packet(); + enum sslstatus do_ssl_handshake(); + void queue_encrypted_bytes(const char *buf, size_t len); public: void * operator new(size_t); void operator delete(void *); @@ -90,6 +96,10 @@ class MySQL_Data_Stream MySQL_Session *sess; // pointer to the session using this data stream MySQL_Backend *mybe; // if this is a connection to a mysql server, this points to a backend structure SSL *ssl; + BIO *rbio_ssl; + BIO *wbio_ssl; + char *ssl_write_buf; + size_t ssl_write_len; struct sockaddr *client_addr; struct { diff --git a/include/proxysql.h b/include/proxysql.h index 7f00706ff..3c292e6c1 100644 --- a/include/proxysql.h +++ b/include/proxysql.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include diff --git a/lib/MySQL_Protocol.cpp b/lib/MySQL_Protocol.cpp index 0bade1ae3..9df98f526 100644 --- a/lib/MySQL_Protocol.cpp +++ b/lib/MySQL_Protocol.cpp @@ -1327,14 +1327,21 @@ bool MySQL_Protocol::process_pkt_handshake_response(unsigned char *pkt, unsigned pkt += sizeof(uint32_t); charset = *(uint8_t *)pkt; // see bug #810 + if ( (*myds)->encrypted == false ) { // client wants to use SSL + if (len == sizeof(mysql_hdr)+32) { + (*myds)->encrypted = true; + use_ssl = true; + return false; + } + } if (charset==0) { charset=mysql_thread___default_charset; } pkt += 24; - if (len==sizeof(mysql_hdr)+32) { - (*myds)->encrypted=true; - use_ssl=true; - } else { +// if (len==sizeof(mysql_hdr)+32) { +// (*myds)->encrypted=true; +// use_ssl=true; +// } else { user = pkt; pkt += strlen((char *)user) + 1; @@ -1410,20 +1417,21 @@ bool MySQL_Protocol::process_pkt_handshake_response(unsigned char *pkt, unsigned // currently proxysql doesn't know any sha1_pass for that specific user, let's set it! GloMyAuth->set_SHA1((char *)user, USERNAME_FRONTEND,reply); } - if (userinfo->sha1_pass) free(userinfo->sha1_pass); + if (userinfo->sha1_pass) + free(userinfo->sha1_pass); userinfo->sha1_pass=sha1_pass_hex(reply); } - } } } } - if (_ret_use_ssl==true) { - // if we reached here, use_ssl is false , but _ret_use_ssl is true - // it means that a client is required to use SSL , but it is not - ret=false; - } } - proxy_debug(PROXY_DEBUG_MYSQL_PROTOCOL,1,"Handshake (%s auth) , capabilities:%u char:%u, use_ssl:%s\n", +// if (_ret_use_ssl==true) { +// // if we reached here, use_ssl is false , but _ret_use_ssl is true +// // it means that a client is required to use SSL , but it is not +// ret=false; +// } +// } + proxy_debug(PROXY_DEBUG_MYSQL_PROTOCOL,1,"Handshake (%s auth) , capabilities:%u char:%u, use_ssl:%s\n", (capabilities & CLIENT_SECURE_CONNECTION ? "new" : "old"), user, password, pass, db, max_pkt, capabilities, charset, ((*myds)->encrypted ? "yes" : "no")); assert(sess); assert(sess->client_myds); diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 74396a689..bcd5f5fc0 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -1900,7 +1900,8 @@ __get_pkts_from_client: handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE(&pkt, &wrong_pass); break; case STATE_SSL_INIT: - handler___status_CONNECTING_CLIENT___STATE_SSL_INIT(&pkt); + handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE(&pkt, &wrong_pass); + //handler___status_CONNECTING_CLIENT___STATE_SSL_INIT(&pkt); break; default: proxy_error("Detected not valid state client state: %d\n", client_myds->DSS); @@ -3129,8 +3130,59 @@ void MySQL_Session::handler___status_CHANGING_USER_CLIENT___STATE_CLIENT_HANDSHA } void MySQL_Session::handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE(PtrSize_t *pkt, bool *wrong_pass) { + bool is_encrypted = client_myds->encrypted; + bool handshake_response_return = client_myds->myprot.process_pkt_handshake_response((unsigned char *)pkt->ptr,pkt->size); + + if ( + (is_encrypted == false) && // the connection was encrypted + (handshake_response_return == false) && // the authentication didn't complete + (client_myds->encrypted == true) // client is asking for encryption + ) { + // use SSL + client_myds->DSS=STATE_SSL_INIT; + client_myds->rbio_ssl = BIO_new(BIO_s_mem()); + client_myds->wbio_ssl = BIO_new(BIO_s_mem()); + client_myds->ssl=SSL_new(GloVars.global.ssl_ctx); + SSL_set_fd(client_myds->ssl, client_myds->fd); + SSL_set_accept_state(client_myds->ssl); + SSL_set_bio(client_myds->ssl, client_myds->rbio_ssl, client_myds->wbio_ssl); +/* + while (!SSL_is_init_finished(client_myds->ssl)) { + int ret = SSL_do_handshake(client_myds->ssl); + int ret2; + if (ret != 1) { + //ERR_print_errors_fp(stderr); + ret2 = SSL_get_error(client_myds->ssl, ret); + fprintf(stderr,"%d\n",ret2); + } + + } +*/ +// if (!SSL_is_init_finished(client_myds->ssl)) { +// int n = SSL_do_handshake(client_myds->ssl); +// +// } + //ioctl_FIONBIO(client_myds->fd,0); + +// bool connected = false; +// while (connected) { +// if (!SSL_accept(client_myds->ssl)==-1) { +// if (SSL_do_handshake(client_myds->ssl)==-1) { +// ERR_print_errors_fp(stderr); +// } else { +// connected = true; +// } +// } + //ioctl_FIONBIO(client_myds->fd,1); + //int my_ssl_error; + //int n = SSL_accept(client_myds->ssl); + //my_ssl_error = SSL_get_error(client_mmyds->ssl); + return; + } + if ( - (client_myds->myprot.process_pkt_handshake_response((unsigned char *)pkt->ptr,pkt->size)==true) + //(client_myds->myprot.process_pkt_handshake_response((unsigned char *)pkt->ptr,pkt->size)==true) + (handshake_response_return == true) && ( //(default_hostgroup<0 && ( session_type == PROXYSQL_SESSION_ADMIN || session_type == PROXYSQL_SESSION_STATS || session_type == PROXYSQL_SESSION_SQLITE) ) @@ -3156,7 +3208,7 @@ void MySQL_Session::handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE( } } l_free(pkt->size,pkt->ptr); - if (client_myds->encrypted==false) { + //if (client_myds->encrypted==false) { if (client_myds->myconn->userinfo->schemaname==NULL) { client_myds->myconn->userinfo->set_schemaname(default_schema,strlen(default_schema)); } @@ -3246,25 +3298,26 @@ void MySQL_Session::handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE( (strcmp(client_addr,(char *)"::1")==0) ) { // we are good! - client_myds->myprot.generate_pkt_OK(true,NULL,NULL,2,0,0,0,0,NULL); + client_myds->myprot.generate_pkt_OK(true,NULL,NULL, (is_encrypted ? 3 : 2), 0,0,0,0,NULL); status=WAITING_CLIENT_DATA; client_myds->DSS=STATE_CLIENT_AUTH_OK; } else { char *a=(char *)"User '%s' can only connect locally"; char *b=(char *)malloc(strlen(a)+strlen(client_myds->myconn->userinfo->username)); sprintf(b,a,client_myds->myconn->userinfo->username); - client_myds->myprot.generate_pkt_ERR(true,NULL,NULL,2,1040,(char *)"42000", b); + client_myds->myprot.generate_pkt_ERR(true,NULL,NULL, (is_encrypted ? 3 : 2), 1040,(char *)"42000", b); free(b); } free(client_addr); } else { // we are good! - client_myds->myprot.generate_pkt_OK(true,NULL,NULL,2,0,0,0,0,NULL); + client_myds->myprot.generate_pkt_OK(true,NULL,NULL, (is_encrypted ? 3 : 2), 0,0,0,0,NULL); status=WAITING_CLIENT_DATA; client_myds->DSS=STATE_CLIENT_AUTH_OK; } } - } else { +// } else { +/* // use SSL client_myds->DSS=STATE_SSL_INIT; client_myds->ssl=SSL_new(GloVars.global.ssl_ctx); @@ -3274,7 +3327,8 @@ void MySQL_Session::handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE( ERR_print_errors_fp(stderr); } ioctl_FIONBIO(client_myds->fd,1); - } +*/ +// } } else { l_free(pkt->size,pkt->ptr); proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Wrong credentials for frontend: disconnecting\n"); @@ -3308,18 +3362,19 @@ void MySQL_Session::handler___status_CONNECTING_CLIENT___STATE_SERVER_HANDSHAKE( } else { client_addr = strdup((char *)""); } - if (client_myds->encrypted == false) { + //if (client_myds->encrypted == false) { char *_s=(char *)malloc(strlen(client_myds->myconn->userinfo->username)+100+strlen(client_addr)); sprintf(_s,"ProxySQL Error: Access denied for user '%s'@'%s' (using password: %s)", client_myds->myconn->userinfo->username, client_addr, (client_myds->myconn->userinfo->password ? "YES" : "NO")); - client_myds->myprot.generate_pkt_ERR(true,NULL,NULL,2,1045,(char *)"28000", _s); + client_myds->myprot.generate_pkt_ERR(true,NULL,NULL, (is_encrypted ? 3 : 2), 1045,(char *)"28000", _s); __sync_add_and_fetch(&MyHGM->status.client_connections_aborted,1); free(_s); client_myds->DSS=STATE_SLEEP; - } + //} } } void MySQL_Session::handler___status_CONNECTING_CLIENT___STATE_SSL_INIT(PtrSize_t *pkt) { +/* if (client_myds->myprot.process_pkt_handshake_response((unsigned char *)pkt->ptr,pkt->size)==true) { l_free(pkt->size,pkt->ptr); client_myds->myprot.generate_pkt_OK(true,NULL,NULL,3,0,0,0,0,NULL); @@ -3332,6 +3387,7 @@ void MySQL_Session::handler___status_CONNECTING_CLIENT___STATE_SSL_INIT(PtrSize_ perror("Hitting a not implemented feature: https://github.com/sysown/proxysql-0.2/issues/124"); assert(0); } +*/ } diff --git a/lib/mysql_data_stream.cpp b/lib/mysql_data_stream.cpp index 74499e0b1..a1cd5ef7b 100644 --- a/lib/mysql_data_stream.cpp +++ b/lib/mysql_data_stream.cpp @@ -72,6 +72,56 @@ static void __dump_pkt(const char *func, unsigned char *_ptr, unsigned int len) +//enum sslstatus { SSLSTATUS_OK, SSLSTATUS_WANT_IO, SSLSTATUS_FAIL}; + +static enum sslstatus get_sslstatus(SSL* ssl, int n) +{ + int err = SSL_get_error(ssl, n); + switch (err) { + case SSL_ERROR_NONE: + return SSLSTATUS_OK; + case SSL_ERROR_WANT_WRITE: + case SSL_ERROR_WANT_READ: + return SSLSTATUS_WANT_IO; + case SSL_ERROR_ZERO_RETURN: + case SSL_ERROR_SYSCALL: + default: + return SSLSTATUS_FAIL; + } +} + + +void MySQL_Data_Stream::queue_encrypted_bytes(const char *buf, size_t len) { + ssl_write_buf = (char*)realloc(ssl_write_buf, ssl_write_len + len); + memcpy(ssl_write_buf + ssl_write_len, buf, len); + ssl_write_len += len; + //proxy_info("New ssl_write_len size: %u\n", ssl_write_len); +} + +enum sslstatus MySQL_Data_Stream::do_ssl_handshake() { + char buf[MY_SSL_BUFFER]; + enum sslstatus status; + int n = SSL_do_handshake(ssl); + status = get_sslstatus(ssl, n); + //proxy_info("SSL status = %d\n", status); + /* Did SSL request to write bytes? */ + if (status == SSLSTATUS_WANT_IO) { + //proxy_info("SSL status is WANT_IO %d\n", status); + do { + n = BIO_read(wbio_ssl, buf, sizeof(buf)); + //proxy_info("BIO read = %d\n", n); + if (n > 0) { + //proxy_info("Queuing %d encrypted bytes\n", n); + queue_encrypted_bytes(buf, n); + } else if (!BIO_should_retry(wbio_ssl)) { + //proxy_info("BIO_should_retry failed\n"); + return SSLSTATUS_FAIL; + } + } while (n>0); + } + return status; +} + void * MySQL_Data_Stream::operator new(size_t size) { return l_alloc(size); } @@ -122,6 +172,10 @@ MySQL_Data_Stream::MySQL_Data_Stream() { DSS=STATE_NOT_CONNECTED; encrypted=false; ssl=NULL; + rbio_ssl = NULL; + wbio_ssl = NULL; + ssl_write_len = 0; + ssl_write_buf = NULL; net_failure=false; CompPktIN.pkt.ptr=NULL; CompPktIN.pkt.size=0; @@ -193,6 +247,15 @@ MySQL_Data_Stream::~MySQL_Data_Stream() { if ( (myconn) && (myds_type==MYDS_FRONTEND) ) { delete myconn; myconn=NULL; } if (encrypted) { if (ssl) SSL_free(ssl); +/* + SSL_free() should also take care of these + if (rbio_ssl) { + BIO_free(rbio_ssl); + } + if (wbio_ssl) { + BIO_free(wbio_ssl); + } +*/ } if (multi_pkt.ptr) { l_free(multi_pkt.size,multi_pkt.ptr); @@ -257,6 +320,9 @@ void MySQL_Data_Stream::shut_soft() { void MySQL_Data_Stream::shut_hard() { proxy_debug(PROXY_DEBUG_NET, 4, "Shutdown hard fd=%d. Session=%p, DataStream=%p\n", fd, sess, this); set_net_failure(); + if (encrypted) { + SSL_set_quiet_shutdown(ssl, 1); + } if (fd >= 0) { shutdown(fd, SHUT_RDWR); close(fd); @@ -287,10 +353,125 @@ void MySQL_Data_Stream::check_data_flow() { } int MySQL_Data_Stream::read_from_net() { + if (encrypted) { + //proxy_info("Entering\n"); + } if ((revents & POLLIN)==0) return 0; - int r; + int r=0; int s=queue_available(queueIN); - r = ( encrypted ? SSL_read (ssl, queue_w_ptr(queueIN), s) : recv(fd, queue_w_ptr(queueIN), s, 0) ); + if (encrypted) { + // proxy_info("Queue available of %d bytes\n", s); + } + if (encrypted == false) { + if (pkts_recv) { + r = recv(fd, queue_w_ptr(queueIN), s, 0); + } else { + if (queueIN.partial == 0) { + // we are reading the very first packet + // to avoid issue with SSL, we will only read the header and eventually the first packet + r = recv(fd, queue_w_ptr(queueIN), 4, 0); + if (r == 4) { + // let's try to read a whole packet + mysql_hdr Hdr; + memcpy(&Hdr,queueIN.buffer,sizeof(mysql_hdr)); + r += recv(fd, queue_w_ptr(queueIN)+4, Hdr.pkt_length, 0); + } + } else { + r = recv(fd, queue_w_ptr(queueIN), s, 0); + } + } + } else { +/* + if (!SSL_is_init_finished(ssl)) { + int ret = SSL_do_handshake(ssl); + int ret2; + if (ret != 1) { + //ERR_print_errors_fp(stderr); + ret2 = SSL_get_error(ssl, ret); + fprintf(stderr,"%d\n",ret2); + } + return 0; + } else { + r = SSL_read (ssl, queue_w_ptr(queueIN), s); + } +*/ + if (s < MY_SSL_BUFFER) { + return 0; // no enough space for reads + } + char buf[MY_SSL_BUFFER]; + //ssize_t n = read(fd, buf, sizeof(buf)); + int n = recv(fd, buf, sizeof(buf), 0); + //proxy_info("SSL recv of %d bytes\n", n); + if (n > 0) { + //on_read_cb(buf, (size_t)n); + + char buf2[MY_SSL_BUFFER]; + int n2; + enum sslstatus status; + char *src = buf; + int len = n; + while (len) { + n2 = BIO_write(rbio_ssl, src, len); + //proxy_info("BIO_write with len = %d and %d bytes\n", len , n2); + if (n2 <= 0) { + shut_soft(); + return -1; + } + src += n2; + len -= n2; + if (!SSL_is_init_finished(ssl)) { + //proxy_info("SSL_is_init_finished NOT completed\n"); + if (do_ssl_handshake() == SSLSTATUS_FAIL) { + //proxy_info("SSL_is_init_finished failed!!\n"); + shut_soft(); + return -1; + } + if (!SSL_is_init_finished(ssl)) { + //proxy_info("SSL_is_init_finished yet NOT completed\n"); + return 0; + } + } else { + //proxy_info("SSL_is_init_finished completed\n"); + } + } + n2 = SSL_read (ssl, queue_w_ptr(queueIN), s); + r = n2; + //proxy_info("Read %d bytes from SSL\n", r); + if (n2 > 0) { + } +/* + do { + n2 = SSL_read(ssl, buf2, sizeof(buf2)); + if (n2 > 0) { + + } + } while (n > 0); +*/ + status = get_sslstatus(ssl, n2); + //proxy_info("SSL status = %d\n", status); + if (status == SSLSTATUS_WANT_IO) { + do { + n2 = BIO_read(wbio_ssl, buf2, sizeof(buf2)); + //proxy_info("BIO_read with %d bytes\n", n2); + if (n2 > 0) { + queue_encrypted_bytes(buf2, n2); + } else if (!BIO_should_retry(wbio_ssl)) { + shut_soft(); + return -1; + } + } while (n2>0); + } + if (status == SSLSTATUS_FAIL) { + shut_soft(); + return -1; + } + } else { + r = n; + //r += SSL_read (ssl, queue_w_ptr(queueIN), s); + //proxy_info("Read %d bytes from SSL\n", r); + } + } +//__exit_read_from_next: proxy_debug(PROXY_DEBUG_NET, 5, "read %d bytes from fd %d into a buffer of %d bytes free\n", r, fd, s); //proxy_error("read %d bytes from fd %d into a buffer of %d bytes free\n", r, fd, s); if (r < 1) { @@ -314,11 +495,61 @@ int MySQL_Data_Stream::read_from_net() { int MySQL_Data_Stream::write_to_net() { int bytes_io=0; int s = queue_data(queueOUT); - if (s==0) return 0; + int n; + if (encrypted) { + //proxy_info("Data in write buffer: %d bytes\n", s); + } + if (s==0) { + if (encrypted == false) { + return 0; + } + if (ssl_write_len == 0 && wbio_ssl->num_write == wbio_ssl->num_read) { + return 0; + } + } VALGRIND_DISABLE_ERROR_REPORTING; // splitting the ternary operation in IF condition for better readability if (encrypted) { bytes_io = SSL_write (ssl, queue_r_ptr(queueOUT), s); + //proxy_info("Used SSL_write to write %d bytes\n", bytes_io); + if (ssl_write_len || wbio_ssl->num_write > wbio_ssl->num_read) { + //proxy_info("ssl_write_len = %d , num_write = %d , num_read = %d\n", ssl_write_len , wbio_ssl->num_write , wbio_ssl->num_read); + char buf[MY_SSL_BUFFER]; + do { + n = BIO_read(wbio_ssl, buf, sizeof(buf)); + //proxy_info("BIO read = %d\n", n); + if (n > 0) { + //proxy_info("Setting %d byte in queue encrypted\n", n); + queue_encrypted_bytes(buf, n); + } + else if (!BIO_should_retry(wbio_ssl)) { + //proxy_info("BIO_should_retry failed\n"); + shut_soft(); + return -1; + } + } while (n>0); + } + if (ssl_write_len) { + n = write(fd, ssl_write_buf, ssl_write_len); + //proxy_info("Calling write() on SSL: %d\n", n); + if (n>0) { + if ((size_t)n < ssl_write_len) { + memmove(ssl_write_buf, ssl_write_buf+n, ssl_write_len-n); + } + ssl_write_len -= n; + ssl_write_buf = (char*)realloc(ssl_write_buf, ssl_write_len); + //proxy_info("new ssl_write_len: %u\n", ssl_write_len); + //if (ssl_write_len) { + // return n; // stop here + //} else { + // rc = n; // and continue + //} + //bytes_io += n; + } else { + shut_soft(); + return -1; + } + } } else { #ifdef __APPLE__ bytes_io = send(fd, queue_r_ptr(queueOUT), s, 0); @@ -326,6 +557,9 @@ int MySQL_Data_Stream::write_to_net() { bytes_io = send(fd, queue_r_ptr(queueOUT), s, MSG_NOSIGNAL); #endif } + if (encrypted) { + //proxy_info("bytes_io: %d\n", bytes_io); + } VALGRIND_ENABLE_ERROR_REPORTING; if (bytes_io < 0) { if (encrypted==false) { @@ -365,10 +599,31 @@ void MySQL_Data_Stream::set_pollout() { if (DSS > STATE_MARIADB_BEGIN && DSS < STATE_MARIADB_END) { _pollfd->events = myconn->wait_events; } else { + _pollfd->events = POLLIN; + //if (PSarrayOUT->len || available_data_out() || queueOUT.partial || (encrypted && !SSL_is_init_finished(ssl))) { if (PSarrayOUT->len || available_data_out() || queueOUT.partial) { - _pollfd->events = POLLIN | POLLOUT; - } else { - _pollfd->events = POLLIN; + _pollfd->events |= POLLOUT; + } + if (encrypted) { + if (ssl_write_len || wbio_ssl->num_write > wbio_ssl->num_read) { + _pollfd->events |= POLLOUT; + } else { + if (!SSL_is_init_finished(ssl)) { + //proxy_info("SSL_is_init_finished NOT completed\n"); + if (do_ssl_handshake() == SSLSTATUS_FAIL) { + //proxy_info("SSL_is_init_finished failed!!\n"); + shut_soft(); + return; + } + if (!SSL_is_init_finished(ssl)) { + //proxy_info("SSL_is_init_finished yet NOT completed\n"); + return; + } + } else { + //proxy_info("SSL_is_init_finished completed\n"); + } + _pollfd->events |= POLLOUT; + } } } proxy_debug(PROXY_DEBUG_NET,1,"Session=%p, DataStream=%p -- Setting poll events %d for FD %d , DSS=%d , myconn=%p\n", sess, this, _pollfd->events , fd, DSS, myconn); @@ -377,18 +632,87 @@ void MySQL_Data_Stream::set_pollout() { int MySQL_Data_Stream::write_to_net_poll() { int rc=0; if (active==0) return rc; +/* + if (encrypted && !SSL_is_init_finished(ssl)) { + int ret = SSL_do_handshake(ssl); + int ret2; + if (ret != 1) { + //ERR_print_errors_fp(stderr); + ret2 = SSL_get_error(ssl, ret); + fprintf(stderr,"%d\n",ret2); + } + return 0; + } +*/ + if (encrypted) { + if (!SSL_is_init_finished(ssl)) { + //proxy_info("SSL_is_init_finished completed: NO!\n"); + if (do_ssl_handshake() == SSLSTATUS_FAIL) { + //proxy_info("SSL_is_init_finished failed!!\n"); + shut_soft(); + return -1; + } + } else { + //proxy_info("SSL_is_init_finished completed: YES\n"); + } +/* + if (!SSL_is_init_finished(ssl)) { + proxy_info("SSL_is_init_finished completed: NO!\n"); + if (fd>0 && sess->session_type == PROXYSQL_SESSION_MYSQL) { + set_pollout(); + return 0; + } + } +*/ + //proxy_info("ssl_write_len: %u\n", ssl_write_len); + if (ssl_write_len) { + int n = write(fd, ssl_write_buf, ssl_write_len); + //proxy_info("Calling write() on SSL: %d\n", n); + if (n>0) { + if ((size_t)n < ssl_write_len) { + memmove(ssl_write_buf, ssl_write_buf+n, ssl_write_len-n); + } + ssl_write_len -= n; + ssl_write_buf = (char*)realloc(ssl_write_buf, ssl_write_len); + //proxy_info("new ssl_write_len: %u\n", ssl_write_len); + if (ssl_write_len) { + return n; // stop here + } else { + rc = n; // and continue + } + } else { + shut_soft(); + return -1; + } + } + } proxy_debug(PROXY_DEBUG_NET,1,"Session=%p, DataStream=%p --\n", sess, this); + bool call_write_to_net = false; if (queue_data(queueOUT)) { + call_write_to_net = true; + } + if (call_write_to_net == false) { + if (encrypted) { + if (ssl_write_len || wbio_ssl->num_write > wbio_ssl->num_read) { + call_write_to_net = true; + } + } + } + if (call_write_to_net) { if (sess->session_type == PROXYSQL_SESSION_MYSQL) { if (poll_fds_idx>-1) { // NOTE: attempt to force writes if (net_failure==false) - rc=write_to_net(); + rc += write_to_net(); } } else { - rc=write_to_net(); + rc += write_to_net(); } } - if (fd>0 && sess->session_type == PROXYSQL_SESSION_MYSQL) set_pollout(); + if (fd>0 && sess->session_type == PROXYSQL_SESSION_MYSQL) { + // PROXYSQL_SESSION_MYSQL is a requirement, because it uses threads pool + // the other session types do not + set_pollout(); + } return rc; } @@ -454,6 +778,9 @@ int MySQL_Data_Stream::buffer2array() { memcpy((unsigned char *)queueIN.pkt.ptr + queueIN.partial, queue_r_ptr(queueIN),b); queue_r(queueIN,b); queueIN.partial+=b; + if (queueIN.partial == 80) { + proxy_info("Breakpoint\n"); + } ret+=b; } if ((queueIN.pkt.size>0) && (queueIN.pkt.size==queueIN.partial) ) { From aa71b6ebfad6c0257f1a65c1ca6366e45ffd7b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 9 Feb 2018 19:07:35 +0100 Subject: [PATCH 32/40] At startup, generate new SSL key and certificate Certificate is self signed --- src/main.cpp | 98 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 91 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 1b2f85eb4..73acc7396 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -136,6 +136,58 @@ static void init_locks(void) { CRYPTO_set_locking_callback((void (*)(int, int, const char *, int))lock_callback); } +int ssl_mkit(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days) { + X509 *x; + EVP_PKEY *pk; + RSA *rsa; + X509_NAME *name = NULL; + + if ((pkeyp == NULL) || (*pkeyp == NULL)) { + if ((pk = EVP_PKEY_new()) == NULL) { + abort(); + return (0); + } + } else + pk = *pkeyp; + + if ((x509p == NULL) || (*x509p == NULL)) { + if ((x = X509_new()) == NULL) + goto err; + } else + x = *x509p; + + rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL); + if (!EVP_PKEY_assign_RSA(pk, rsa)) { + abort(); + goto err; + } + rsa = NULL; + + X509_set_version(x, 3); + ASN1_INTEGER_set(X509_get_serialNumber(x), serial); + X509_gmtime_adj(X509_get_notBefore(x), 0); + X509_gmtime_adj(X509_get_notAfter(x), (long)60 * 60 * 24 * days); + X509_set_pubkey(x, pk); + + name = X509_get_subject_name(x); + + X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, (const unsigned char *)"US", -1, -1, 0); + X509_NAME_add_entry_by_txt(name, "CN", + MBSTRING_ASC, (const unsigned char *)"ProxySQL LLC", -1, -1, 0); + + X509_set_issuer_name(x, name); + + if (!X509_sign(x, pk, EVP_md5())) + goto err; + + *x509p = x; + *pkeyp = pk; + return (1); + err: + return (0); + +} + void ProxySQL_Main_init_SSL_module() { SSL_library_init(); SSL_METHOD *ssl_method; @@ -145,22 +197,54 @@ void ProxySQL_Main_init_SSL_module() { GloVars.global.ssl_ctx = SSL_CTX_new(ssl_method); if (GloVars.global.ssl_ctx==NULL) { ERR_print_errors_fp(stderr); - abort(); + proxy_error("Unable to initialize SSL. Shutting down...\n"); + exit(EXIT_SUCCESS); // we exit gracefully to not be restarted } + BIO *bio_err; + X509 *x509 = NULL; + EVP_PKEY *pkey = NULL; - if ( SSL_CTX_use_certificate_file(GloVars.global.ssl_ctx, "newreq.pem", SSL_FILETYPE_PEM) <= 0 ) { + CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); + + bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); + + if (ssl_mkit(&x509, &pkey, 512, 0, 730) == 0) { + proxy_error("Unable to initialize SSL. Shutting down...\n"); + exit(EXIT_SUCCESS); // we exit gracefully to not be restarted + } + + RSA_print_fp(stdout, pkey->pkey.rsa, 0); + X509_print_fp(stdout, x509); + + PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL); + PEM_write_X509(stdout, x509); + + + + int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); + + if ( SSL_CTX_use_certificate(GloVars.global.ssl_ctx, x509) <= 0 ) { ERR_print_errors_fp(stderr); - abort(); + proxy_error("Unable to use SSL certificate. Shutting down...\n"); + exit(EXIT_SUCCESS); // we exit gracefully to not be restarted } - if ( SSL_CTX_use_PrivateKey_file(GloVars.global.ssl_ctx, "privkey.pem", SSL_FILETYPE_PEM) <= 0 ) { + if ( SSL_CTX_use_PrivateKey(GloVars.global.ssl_ctx, pkey) <= 0 ) { ERR_print_errors_fp(stderr); - abort(); + proxy_error("Unable to use SSL key. Shutting down...\n"); + exit(EXIT_SUCCESS); // we exit gracefully to not be restarted } if ( !SSL_CTX_check_private_key(GloVars.global.ssl_ctx) ) { - fprintf(stderr, "Private key does not match the public certificate\n"); - abort(); + proxy_error("Private key does not match the public certificate\n"); + exit(EXIT_SUCCESS); // we exit gracefully to not be restarted } init_locks(); + + X509_free(x509); + EVP_PKEY_free(pkey); + + + CRYPTO_mem_leaks(bio_err); + BIO_free(bio_err); } From a449f509782000d8f0f4ec953b9ebdeb63a2b27c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 9 Feb 2018 19:09:53 +0100 Subject: [PATCH 33/40] Do not print SSL key and cert in errorlog --- src/main.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 73acc7396..d9557169a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -213,16 +213,13 @@ void ProxySQL_Main_init_SSL_module() { exit(EXIT_SUCCESS); // we exit gracefully to not be restarted } - RSA_print_fp(stdout, pkey->pkey.rsa, 0); - X509_print_fp(stdout, x509); + //RSA_print_fp(stdout, pkey->pkey.rsa, 0); + //X509_print_fp(stdout, x509); - PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL); - PEM_write_X509(stdout, x509); + //PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL); + //PEM_write_X509(stdout, x509); - - int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); - if ( SSL_CTX_use_certificate(GloVars.global.ssl_ctx, x509) <= 0 ) { ERR_print_errors_fp(stderr); proxy_error("Unable to use SSL certificate. Shutting down...\n"); From 61dab7a0839d0b8ed6430e28cda82c8f6df59e9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 9 Feb 2018 19:10:30 +0100 Subject: [PATCH 34/40] Remove key and cert files --- src/cacert.pem | 12 ------------ src/privkey.pem | 9 --------- 2 files changed, 21 deletions(-) delete mode 100644 src/cacert.pem delete mode 100644 src/privkey.pem diff --git a/src/cacert.pem b/src/cacert.pem deleted file mode 100644 index 48039a20a..000000000 --- a/src/cacert.pem +++ /dev/null @@ -1,12 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIB0zCCAX2gAwIBAgIJAPN/LP8jMKjmMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQwHhcNMTQxMTE1MDAyOTU0WhcNMTcxMTE0MDAyOTU0WjBF -MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50 -ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKlv -SvA4vKYJ0henWm+sJ0qOfC64lYpe+cFQXSPQ4n8AwL1mxQRyCFUtwdTYosU/B0di -djWJsN6aXI8cyCG7rmsCAwEAAaNQME4wHQYDVR0OBBYEFPRCYy6vBwfTsft+NxWe -+qKkFzPEMB8GA1UdIwQYMBaAFPRCYy6vBwfTsft+NxWe+qKkFzPEMAwGA1UdEwQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADQQA5i9xD5pMXisVYxgYX48ea648dMG0qLbZA -t3gIE2bGaR4zoJVtuoqD4d5/2cG7yI1CVIlPpCE/sUF4LVFTsOby ------END CERTIFICATE----- diff --git a/src/privkey.pem b/src/privkey.pem deleted file mode 100644 index d8cb2280f..000000000 --- a/src/privkey.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIBPAIBAAJBAKlvSvA4vKYJ0henWm+sJ0qOfC64lYpe+cFQXSPQ4n8AwL1mxQRy -CFUtwdTYosU/B0didjWJsN6aXI8cyCG7rmsCAwEAAQJBAKXt1PC+T5k3YuVBQmK8 -sFnmghzrLZ+t9V9oyV4K8dU3GoFY/wd/iGKvQsFtV6XrEAumgFzGXRYzDvduA5CH -SFkCIQDVMvy5Ru6HPiHo4BvI9ef3KShvw/y+LP+k2yRby6onpQIhAMtzGyznjnlE -bGF2k/57LeQ8PltbubO2sHzDhL0GnSDPAiEAweECLkMw+1Anai0TV2c4sW1+VlU2 -bINjX7nhkJDfhfkCIBucLW30ptMyQ/seGouIr/uvaU8Arb0D6AOmjRcSFLTlAiEA -ruRIE+CbQRN2/HZkYSpR0BGY7FlSN/M8kY8NHTmeznQ= ------END RSA PRIVATE KEY----- From 3f2eb9e3f385d8a6e24aae02c492235335adac2a Mon Sep 17 00:00:00 2001 From: Nick Vyzas Date: Fri, 16 Feb 2018 17:42:15 +0200 Subject: [PATCH 35/40] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8f8bdb0d5..29be38ebc 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,13 @@ Introduction ============ -ProxySQL is a high performance, high availability, protocol aware proxy for MySQL and forks (like Percona Server and MariaDB). +ProxySQL is a high performance, high availability, protocol aware proxy for MySQL and forks (like Percona Server and MariaDB). All the while getting the unlimited freedom that comes with a GPL license. Its development is driven by the lack of open source proxies that provide high performance. + Official website: http://www.proxysql.com/ Benchmarks and old blog posts can be found at http://www.proxysql.blogspot.com/ Forum: https://groups.google.com/forum/#proxysql/ - Wiki: https://github.com/sysown/proxysql/wiki/ +Linkedin group: https://www.linkedin.com/groups/13581070/ From 0968b8e16c269ff15c6545a0998add5e49b112e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Wed, 21 Feb 2018 08:27:19 +0100 Subject: [PATCH 36/40] Incorrect set event to POLLOUT when using SSL --- lib/mysql_data_stream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mysql_data_stream.cpp b/lib/mysql_data_stream.cpp index a1cd5ef7b..3641a4e59 100644 --- a/lib/mysql_data_stream.cpp +++ b/lib/mysql_data_stream.cpp @@ -619,10 +619,10 @@ void MySQL_Data_Stream::set_pollout() { //proxy_info("SSL_is_init_finished yet NOT completed\n"); return; } + _pollfd->events |= POLLOUT; } else { //proxy_info("SSL_is_init_finished completed\n"); } - _pollfd->events |= POLLOUT; } } } From 245a80538ae7662f4809633d00c69ca1f0e35e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Wed, 21 Feb 2018 08:28:10 +0100 Subject: [PATCH 37/40] Changing QUEUE_T_DEFAULT_SIZE back to 32K SSL_read uses records of up to 16KB: https://wiki.openssl.org/index.php/Manual:SSL_read(3) If the read buffer is too small, data is not read correctly --- include/MySQL_Data_Stream.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/MySQL_Data_Stream.h b/include/MySQL_Data_Stream.h index 90add5008..f7fecf0af 100644 --- a/include/MySQL_Data_Stream.h +++ b/include/MySQL_Data_Stream.h @@ -5,8 +5,7 @@ #include "cpp.h" -//#define QUEUE_T_DEFAULT_SIZE 32768 -#define QUEUE_T_DEFAULT_SIZE 8192 +#define QUEUE_T_DEFAULT_SIZE 32768 #define MY_SSL_BUFFER 8192 typedef struct _queue_t { From cd44fcf470dc20f0a789eea53bcec2105ad52a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Wed, 21 Feb 2018 09:53:47 +0100 Subject: [PATCH 38/40] Error handling for failing writes with SSL --- lib/mysql_data_stream.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/mysql_data_stream.cpp b/lib/mysql_data_stream.cpp index 3641a4e59..896a05d17 100644 --- a/lib/mysql_data_stream.cpp +++ b/lib/mysql_data_stream.cpp @@ -546,8 +546,13 @@ int MySQL_Data_Stream::write_to_net() { //} //bytes_io += n; } else { - shut_soft(); - return -1; + int myds_errno=errno; + if (n==0 || (n==-1 && myds_errno != EINTR && myds_errno != EAGAIN)) { + shut_soft(); + return 0; + } else { + return -1; + } } } } else { @@ -681,8 +686,13 @@ int MySQL_Data_Stream::write_to_net_poll() { rc = n; // and continue } } else { - shut_soft(); - return -1; + int myds_errno=errno; + if (n==0 || (n==-1 && myds_errno != EINTR && myds_errno != EAGAIN)) { + shut_soft(); + return 0; + } else { + return -1; + } } } } From 9c4d097917ab171e708a981fc70e7a61eacbe8f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 23 Feb 2018 16:49:38 +0100 Subject: [PATCH 39/40] Added retry mechanism for missing binlog reader --- include/MySQL_HostGroups_Manager.h | 2 + lib/MySQL_HostGroups_Manager.cpp | 89 +++++++++++++++++++++++++----- 2 files changed, 76 insertions(+), 15 deletions(-) diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index b74d3a6a5..a2eac2e90 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -439,6 +439,8 @@ class MySQL_HostGroups_Manager { std::unordered_map gtid_map; struct ev_async * gtid_ev_async; struct ev_loop * gtid_ev_loop; + struct ev_timer * gtid_ev_timer; + bool gtid_missing_nodes; struct { unsigned int servers_table_version; pthread_mutex_t servers_table_version_lock; diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 63cc31d86..0e9503de5 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -47,12 +47,31 @@ static pthread_mutex_t ev_loop_mutex; //static std::unordered_map gtid_map; static void gtid_async_cb(struct ev_loop *loop, struct ev_async *watcher, int revents) { + if (glovars.shutdown) { + ev_break(loop); + } pthread_mutex_lock(&ev_loop_mutex); + MyHGM->gtid_missing_nodes = false; MyHGM->generate_mysql_gtid_executed_tables(); pthread_mutex_unlock(&ev_loop_mutex); return; } +static void gtid_timer_cb (struct ev_loop *loop, struct ev_timer *timer, int revents) { + ev_timer_stop(loop, timer); + ev_timer_set(timer, 3, 0); + if (glovars.shutdown) { + ev_break(loop); + } + if (MyHGM->gtid_missing_nodes) { + pthread_mutex_lock(&ev_loop_mutex); + MyHGM->gtid_missing_nodes = false; + MyHGM->generate_mysql_gtid_executed_tables(); + pthread_mutex_unlock(&ev_loop_mutex); + } + ev_timer_start(loop, timer); + return; +} static int wait_for_mysql(MYSQL *mysql, int status) { struct pollfd pfd; @@ -88,11 +107,15 @@ void reader_cb(struct ev_loop *loop, struct ev_io *w, int revents) { //delete sd; std::string s1 = sd->address; s1.append(":"); - s1.append(std::to_string(sd->port)); + s1.append(std::to_string(sd->mysql_port)); + MyHGM->gtid_missing_nodes = true; + proxy_warning("GTID: failed to connect to ProxySQL binlog reader on port %d for server %s:%d\n", sd->port, sd->address, sd->mysql_port); std::unordered_map ::iterator it2; it2 = MyHGM->gtid_map.find(s1); if (it2 != MyHGM->gtid_map.end()) { - MyHGM->gtid_map.erase(it2); + //MyHGM->gtid_map.erase(it2); + it2->second = NULL; + delete sd; } ev_io_stop(MyHGM->gtid_ev_loop, w); free(w); @@ -115,8 +138,21 @@ void connect_cb(EV_P_ ev_io *w, int revents) { int errnum = optval ? optval : errno; ev_io_stop(MyHGM->gtid_ev_loop, w); close(w->fd); + MyHGM->gtid_missing_nodes = true; GTID_Server_Data * custom_data = (GTID_Server_Data *)w->data; - delete custom_data; + GTID_Server_Data *sd = custom_data; + std::string s1 = sd->address; + s1.append(":"); + s1.append(std::to_string(sd->mysql_port)); + proxy_warning("GTID: failed to connect to ProxySQL binlog reader on port %d for server %s:%d\n", sd->port, sd->address, sd->mysql_port); + std::unordered_map ::iterator it2; + it2 = MyHGM->gtid_map.find(s1); + if (it2 != MyHGM->gtid_map.end()) { + //MyHGM->gtid_map.erase(it2); + it2->second = NULL; + delete sd; + } + //delete custom_data; free(c); } else { ev_io_stop(MyHGM->gtid_ev_loop, w); @@ -454,8 +490,11 @@ static void * GTID_syncer_run() { MyHGM->gtid_ev_async = (struct ev_async *)malloc(sizeof(struct ev_async)); //ev_async_init(gtid_ev_async, gtid_async_cb); //ev_async_start(gtid_ev_loop, gtid_ev_async); + MyHGM->gtid_ev_timer = (struct ev_timer *)malloc(sizeof(struct ev_timer)); ev_async_init(MyHGM->gtid_ev_async, gtid_async_cb); ev_async_start(MyHGM->gtid_ev_loop, MyHGM->gtid_ev_async); + ev_timer_init(MyHGM->gtid_ev_timer, gtid_timer_cb, 3, 0); + ev_timer_start(MyHGM->gtid_ev_loop, MyHGM->gtid_ev_timer); //ev_ref(gtid_ev_loop); ev_run(MyHGM->gtid_ev_loop, 0); //sleep(1000); @@ -794,6 +833,7 @@ MySQL_HostGroups_Manager::MySQL_HostGroups_Manager() { incoming_replication_hostgroups=NULL; incoming_group_replication_hostgroups=NULL; pthread_rwlock_init(>id_rwlock, NULL); + gtid_missing_nodes = false; gtid_ev_async = (struct ev_async *)malloc(sizeof(struct ev_async)); } void MySQL_HostGroups_Manager::init() { @@ -813,6 +853,7 @@ MySQL_HostGroups_Manager::~MySQL_HostGroups_Manager() { HGCU_thread->join(); //pthread_join(HGCU_thread_id, NULL); //pthread_join(GTID_syncer_thread_id, NULL); + ev_async_send(gtid_ev_loop, gtid_ev_async); GTID_syncer_thread->join(); free(gtid_ev_async); while (MyHostGroups->len) { @@ -1337,10 +1378,12 @@ bool MySQL_HostGroups_Manager::gtid_exists(MySrvC *mysrvc, char * gtid_uuid, uin GTID_Server_Data *gtid_is=NULL; if (it2!=gtid_map.end()) { gtid_is=it2->second; - if (gtid_is->active == true) { - ret = gtid_is->gtid_exists(gtid_uuid,gtid_trxid); + if (gtid_is) { + if (gtid_is->active == true) { + ret = gtid_is->gtid_exists(gtid_uuid,gtid_trxid); + } } - } + } //proxy_info("Checking if server %s has GTID %s:%lu . %s\n", s1.c_str(), gtid_uuid, gtid_trxid, (ret ? "YES" : "NO")); pthread_rwlock_unlock(>id_rwlock); return ret; @@ -1352,7 +1395,9 @@ void MySQL_HostGroups_Manager::generate_mysql_gtid_executed_tables() { std::unordered_map::iterator it = gtid_map.begin(); while(it != gtid_map.end()) { GTID_Server_Data * gtid_si = it->second; - gtid_si->active = false; + if (gtid_si) { + gtid_si->active = false; + } it++; } @@ -1370,6 +1415,11 @@ void MySQL_HostGroups_Manager::generate_mysql_gtid_executed_tables() { GTID_Server_Data *gtid_is=NULL; if (it2!=gtid_map.end()) { gtid_is=it2->second; + if (gtid_is == NULL) { + gtid_map.erase(it2); + } + } + if (gtid_is) { gtid_is->active = true; } else { // we didn't find it. Create it @@ -3197,14 +3247,23 @@ SQLite3_result * MySQL_HostGroups_Manager::get_stats_mysql_gtid_executed() { GTID_Server_Data * gtid_si = it->second; char buf[64]; char **pta=(char **)malloc(sizeof(char *)*colnum); - pta[0]=strdup(gtid_si->address); - sprintf(buf,"%d", (int)gtid_si->mysql_port); - pta[1]=strdup(buf); - //sprintf(buf,"%d", mysrvc->port); - string s1 = gtid_executed_to_string(gtid_si->gtid_executed); - pta[2]=strdup(s1.c_str()); - sprintf(buf,"%llu", (int)gtid_si->events_read); - pta[3]=strdup(buf); + if (gtid_si) { + pta[0]=strdup(gtid_si->address); + sprintf(buf,"%d", (int)gtid_si->mysql_port); + pta[1]=strdup(buf); + //sprintf(buf,"%d", mysrvc->port); + string s1 = gtid_executed_to_string(gtid_si->gtid_executed); + pta[2]=strdup(s1.c_str()); + sprintf(buf,"%llu", (int)gtid_si->events_read); + pta[3]=strdup(buf); + } else { + string host = it->first; + pta[0]=strdup(host.c_str()); + sprintf(buf,"%d", (int)0); + pta[1]=strdup(buf); + pta[2]=strdup((char *)"NULL"); + pta[3]=strdup((char *)"0"); + } result->add_row(pta); for (k=0; k Date: Fri, 23 Feb 2018 17:19:41 +0100 Subject: [PATCH 40/40] Variable mysql-binlog_reader_connect_retry_msec This variable control the retry interval to connect to binlog reader --- include/MySQL_Thread.h | 1 + lib/MySQL_HostGroups_Manager.cpp | 4 ++-- lib/MySQL_Thread.cpp | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index c7fd31da2..fc57c8d57 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -394,6 +394,7 @@ class MySQL_Threads_Handler int query_processor_regex; int long_query_time; int hostgroup_manager_verbose; + int binlog_reader_connect_retry_msec; char *init_connect; char *default_sql_mode; char *default_time_zone; diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 0e9503de5..2b81f201b 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -59,7 +59,7 @@ static void gtid_async_cb(struct ev_loop *loop, struct ev_async *watcher, int re static void gtid_timer_cb (struct ev_loop *loop, struct ev_timer *timer, int revents) { ev_timer_stop(loop, timer); - ev_timer_set(timer, 3, 0); + ev_timer_set(timer, __sync_add_and_fetch(&GloMTH->variables.binlog_reader_connect_retry_msec,0)/1000, 0); if (glovars.shutdown) { ev_break(loop); } @@ -493,7 +493,7 @@ static void * GTID_syncer_run() { MyHGM->gtid_ev_timer = (struct ev_timer *)malloc(sizeof(struct ev_timer)); ev_async_init(MyHGM->gtid_ev_async, gtid_async_cb); ev_async_start(MyHGM->gtid_ev_loop, MyHGM->gtid_ev_async); - ev_timer_init(MyHGM->gtid_ev_timer, gtid_timer_cb, 3, 0); + ev_timer_init(MyHGM->gtid_ev_timer, gtid_timer_cb, __sync_add_and_fetch(&GloMTH->variables.binlog_reader_connect_retry_msec,0)/1000, 0); ev_timer_start(MyHGM->gtid_ev_loop, MyHGM->gtid_ev_timer); //ev_ref(gtid_ev_loop); ev_run(MyHGM->gtid_ev_loop, 0); diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index f5410efc2..9e30c0138 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -258,6 +258,7 @@ static char * mysql_thread_variables_names[]= { (char *)"autocommit_false_is_transaction", (char *)"verbose_query_error", (char *)"hostgroup_manager_verbose", + (char *)"binlog_reader_connect_retry_msec", (char *)"threshold_query_length", (char *)"threshold_resultset_size", (char *)"query_digests_max_digest_length", @@ -368,6 +369,7 @@ MySQL_Threads_Handler::MySQL_Threads_Handler() { variables.throttle_connections_per_sec_to_hostgroup=1000000; variables.max_transaction_time=4*3600*1000; variables.hostgroup_manager_verbose=1; + variables.binlog_reader_connect_retry_msec=3000; variables.threshold_query_length=512*1024; variables.threshold_resultset_size=4*1024*1024; variables.query_digests_max_digest_length=2*1024; @@ -628,6 +630,7 @@ int MySQL_Threads_Handler::get_variable_int(char *name) { if (!strcasecmp(name,"throttle_connections_per_sec_to_hostgroup")) return (int)variables.throttle_connections_per_sec_to_hostgroup; if (!strcasecmp(name,"max_transaction_time")) return (int)variables.max_transaction_time; if (!strcasecmp(name,"hostgroup_manager_verbose")) return (int)variables.hostgroup_manager_verbose; + if (!strcasecmp(name,"binlog_reader_connect_retry_msec")) return (int)variables.binlog_reader_connect_retry_msec; if (!strcasecmp(name,"threshold_query_length")) return (int)variables.threshold_query_length; if (!strcasecmp(name,"threshold_resultset_size")) return (int)variables.threshold_resultset_size; if (!strcasecmp(name,"query_digests_max_digest_length")) return (int)variables.query_digests_max_digest_length; @@ -895,6 +898,10 @@ char * MySQL_Threads_Handler::get_variable(char *name) { // this is the public f sprintf(intbuf,"%d",variables.hostgroup_manager_verbose); return strdup(intbuf); } + if (!strcasecmp(name,"binlog_reader_connect_retry_msec")) { + sprintf(intbuf,"%d",variables.binlog_reader_connect_retry_msec); + return strdup(intbuf); + } if (!strcasecmp(name,"threshold_query_length")) { sprintf(intbuf,"%d",variables.threshold_query_length); return strdup(intbuf); @@ -1315,6 +1322,15 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t return false; } } + if (!strcasecmp(name,"binlog_reader_connect_retry_msec")) { + int intv=atoi(value); + if (intv >= 200 && intv <= 120000) { + __sync_lock_test_and_set(&variables.binlog_reader_connect_retry_msec,intv); + return true; + } else { + return false; + } + } if (!strcasecmp(name,"threshold_query_length")) { int intv=atoi(value); if (intv >= 1024 && intv <= 1*1024*1024*1024) {

$}XY6Cp}3fce~+@O}=X2ad6;fGE8A<9^yIqj_3E*_HL zVA;ajl`Wtg(GCts%9?q3rvZ)A1@=8?0BNJ0YYxhq=Hd_b?X9?Y9@Vge5572U(Vm*k zM9JTn3Qaw_AQ$9cKDP}tqL;V9?=S{Q=|+4PRBvL}_{wN6Be`noB&FjkdPf8|0Ed0h zM`qr2p0;*GRLT1*I7k)Gk9o{sq~qjYQ}rZ4X^xcwUOd+lS|t6JWDPiL;FYJg6W*3- zRyHp5h4WiuY-)Tc`$HMNm8*~bV+ErjmPh@Zd_g61I=OP=W;y zZXG>)DE^2ndm5eE*p^-NU$)$}^|b>I4&88ZsIK&a>*l01^jp*RyLMq~jx3Ue_RK#e zc)Z}qfWHeF)_YUohU99jCo+ZiJhVm|+PD69G0dpxC zOsN!XTFFza!YSeHM7Z{M&I!Q14^l3)#99wIlHU45+I`!Ki*!$2th5^M+PSVV z@wEn7K|_EE{kHY^v2F-{kK%C>+XliLZnJm3CA;`Lhu+aV+%_`FHGt8ufQ-9T* z5SXmdr@$E4Y}}(U@Nc9VPol-&RPDj?<)Zk=CXiTECE3RGYUdw-aS=7w7C06b*-I@R znhq5K$H4SOBN8^3Tgz)=j-mNQi*3>Z?UM-)Y=6KKqx_@Ih!BMU(nnXxsx@?Z?fg1S zuLnu@0!Kbj0W=~aTD1=v70RlKLPQL5I*x{+n*4%tXm2ZD|=RR+56#6z`i*b1#l zHU+P4zsFj%&lbX13D-%dPe2Uu1RMD^Nk(XCU5LbfFgM7DLps-*tCofi}?%_ zi^S-b4R%&~TfoFgIi)eWNeilK@aeD*Q9=6rK^X*eIKA{9e)aCr%i368#;2{`e78*H z$n%%@wG2Z@uv_%ly~eyCii_$)LIh|;)o=Yjcz5beRUh9}wH-0aC&b~7$1w_vF}&sK zO7)qlYB&bKF3&Fzs;&mwCix#8~)6E2wGrMu$UT$>srKV0?9a_HW>3y$e6bp z%WoNMEj)}kuX+qaxaPQ%NB1(-oJ1x9qGOmph(pZ+1 z{*P_9y^uI^=?gUqz0Vnt6=RnVGR-Yf)J}jIy}1gqTChc$!{#Kdxw=;n9OCMWR9*FH z|7v=LXF`36KbP{ua5~Dkd{0UeM=+;pn2yJ{Xh|y#!;N*v>8Kq*{_B!i7s;L~LWFyI zUUynSog<)=g*jspFFRK6+6NXn?UnQg1GK1MFmQYOti8dyNVjsLl%m1;1|((9RZ)*l zU^U53+Zm&s7@iQKO<~nfPhIVH!Rf-iOxWoLlVj05@@k#yzzGHMB)5@xG?1F*&uX0g znjZ;#N^-ku4r|Lxf~$hSy&-C2<^Z_u1D4&2m6LqHXj62}{GMvwh3V-BR;iJ1FZT zx0%H1d1k5>ZVa?yep_g^MQxe5DaZ=vn*+N8s;B}>Hh}rPU1>sm;P24rfz^g&kOo{a zAdlB*6@(gRr53H$qP1GIUW+zr(c@b5q!u+B>Tgs1Ro^z%cg+n-BHU8Hx75!oO^Xq+ zqP|~MpRcL%YpTpTw4#200_|Ys6=-Q4ntGysZ9xOAwZ|0k|FJ!LVrsu;&x}~b8&)+7!H7)#W=fA?od6oaJ@!xg+ zyMcdgdDS-leL{cNSK;r+whx)7EtN(VaX1VCPFEy`pm4EZLO^EAB71^PAWl#=QbMq1 zsTWMJF0o3sE{ieFOABnRh{|LKo-7?}xIe!+RffAp^*!w@#@IugBT!q#ddGc}QjsYx zLT)UGTpG0J2n2zU8G6z*$RT^qb`vdbVM%a%Ln%e(hV*bCkP+{>T=#$>Zwy)?@i^lI zU6U{D$P7D?nP$=5Nj3ljpvp?dRqqIiW;R^ZX-nPXjD1~E_+~3S8T4u#(TR^7G^i~$ zN~pe$$6Y%`SZY_w`m}DS6+DeKh727MY=2(CbdL06vJv z7YX>XjI?(b;WScDxN^EJT0rhvj(gc80>vQSaXOuV#w5n#uIrBmli9q#eZq()b`E8pS=k81m@BC8J9R-i}kea50;V4VU5Z z1%^B!Q87j|TD!=oO^iuNDjd7eNYMp;9l;gR+t$E|di(2zbtARV)uf&Om*I2w(n<58NyGNb-$ zpk#t&HL4!0204}M=0g&qFe<5|+673BE23w84QPs&e|RH_HY$V=!W7T5_5+LAtj%u& z6FFLB?JpLCo!{K4i8nvgY0(%GA>Dz|J)_%g%reE-+=7>ypjvH$w$F_v%N4$<=E@BQ z43ot7#&}m?S|kl|fp88_x3p#ye_vXviugugt<{I`EUpALpbi%`06#os6$Shftew48 z-@JPVP&0Zq=ZL8!AI}=JtWFon=%@{YgU41iUju-pwzR^-j0+r0#B|`-Z3uFMpJc{r ziW7$6sW09k6rhu42~(^>7uyl0kKyh>VPU?T&;G*j?PI^j_c zG-Q3XZKPh26#6P2|7znEObeXJ)@ws#z_aP=b2+#LWXQt`X_l%8a-WxAQS$vYF~n<< z^1j8|Sy2ou(3t&>2i(lT{x#b9^`j>U+*e6nHn#;FG)KVFIGukKM*<-=;0UN6o|4W< z{U{HrI1T+_*=cwRHSKBW4?{?hY9RoExUQ~#)*1KD$!QPZy}?Buf~g$RVv$vP0(?(g z(`L~%6#>3j8PIQ@aO7H=_BRO!C6^Tf1413DulheMOtf!;Dpx2nPtDwQE~JK78Hy}L*o6N5 zo%%p7vO&^;W0_;aYw)9FvNf3tXcOkAwX`8jY54@>`>h9QXz;th{Rd61FD5-V5Z$PX zgXhG5qZm&Pl;?{3B)*d!4-)ZiLv_#z;)_dqt6>)*>_GYE>hz6yhnNiH698dPi9ibm zdtqYMiBRoM4F`xE+z_IsIo55co4-Mg>j)Z!A9Q1szrNSgOze3&nWR@N0IA?)ljiydIf0?$_T$590_#8Q)0SEwE8-5Q7Eu<^ zLX~5LGE=3qM#q#mJzW`#V`Xn4WEHyuxR$XuxW0C5tLdQ11oRIKQAbdBmxLB68A4wx zVR_1HWW~XUGtkMhWVsh4C+2b9aBq#!N#yGtG@~xLIi7K5#UF$04?;$wM{C$s{WZ1^ zc4Kq}C;uITk7?E3ASfcp79v<$hfXax>*lQQ^2F-7$@T|#9Zm<&2fgcII_Su*w+hfJ zvxy_1fTk;kv^W8DM?`%3Ya#B6db66Xqc#`Llb0IP|PD<(}v ze`wt;E~Qokbp^tE*e)y3exd7-bi;5+T3Lds06Hx3gk=sRtqcZM9d5FBd|-jgd|MNn zW8ALznpy%uN`evegtIblH@A@i0VW9##}xO-8mo2=0*K)DWLEj2!MaRzwy*g>x)NZ8 z1Hux6zgbr{U{AD)UbUlMT4Y%?4@K#ffOoNh3#iiFigeyiG@xp?%IVeB4H4{moxG=A zzg4hSD30QZ<+ubpsWa8&`$7vr+x=8=aIG}~PpHQ;a5Asar@68?jMmzEa2z@TiN}M{ z`4^Mn!FAoi>2Y-3abS-+@wNpMvXHPG@IjWd)Pyy_J3wqskTEn05@~KUoY6dWnB{VC z46pjb_8e7Rri?Lq*Z`k5tU8uq5RaI9($+L!3ARF(>p*q!cyo1pnTpp*S9i_KKvZ!i zWPugt)`5#+Rjt&URSADO?q7fw(S6abHOsI~bWfYo;1Xz%A#Z+c;S*%iv)Q6Kb&J}l zN6mJTwH0Vgj7qKn1sb>ln6-$C_dV{AF;ps7P*Bu-#`OzD>#MiZ5pOpSt$Q5r!g}5A+b4>aof%U z8gquQudtbiLZs0tV~*u&R&(gTSnWG3?c)1k{q1c>^@3S9;PY<+nd_+~S_~w0`EQr} zrTSQm?QI@TXDKL_7`KNWzM9Umg{(gMsmWD9b%HyAdc9(`8ah?M?}5CT2o#NK(m=jB zdT3Dr5x#!`66eWJp_ne+GrvHfg5n*5mjcr(s@vj^HxEy3L$xuI&kA|o{YCsve0pIS z^659|RmMkeVIi;7;=?$CKn9Fv$lV#kSuEw*64eIkAmDB)-npr7t$F@r#E%gZZLCB1 zmI`LX5{W3{hpP#BoeRcGo^yYe#14v^wQT)uO_Hm|V0F$y9&-f*ElmV;ZfoFS=@l6bdMymFiz9u5#=- zY>-TgxDF`M3&%!WK^q&%uei}$khQMs*ri#)Xr6U(IZ%=&LndN!QO`^iF+(MHZ8a05 z9=PmZT)O(zpNy*p3kr@3NvpuL7GXhz+&7_aLl~lfWQ9{=$|Jh zf1B&Zpbe_%DoR`%n?4jv&_@+Ia~=|0#IgWgdX^a!662|K+!Y(>ILeL~4&(`#0g)Od zj5Jd;*z_HAR@Pgpjs2kfDH}0}#ER&FJ%}jw1-D}#5Ar$pSdBPk#4vkl!7e2S(;aHRR0+h(cm{`_I z8?Owq(MS9p(dOWEvco`}As1oce>onpO6DbgiW=aCK>K4po~S?SV}`fv55cJyK0^L9 zcP@R4gl?vps6XW7klSngs^o-I8_lL3p;V#rcV_hRE*pCKihV!{(unPb67+=a;o4W! z0{}7UH1&0AuCA_%I9_y^Rn=7a$7?MzTG1jtl3u6yK&(A!Ian|Y+R>DTphK)UKO`lU zRGXH3xQrG1(T7Bem{Kdr7>tQSqAwI%xPS(?7#^(b5eMsbY<^4=XU?zd1fN%)dOW_E zveh^>4*<7|E&=Z57;|!odAlaFVd|w7V3J4;m{u*aR;BfLJ$e!~*A@#`(WchS%)e^Y zsWaWoN+Vh~t$46Ix{}%n6DwY1pszfEle%7II%3zc*YAP*3NM;S)#=?X#+~jPpgOf7 z$R`YYAmJ=`D5s|>0nUrB@pukxrSj?qeCUuOaSo<6~I?9v*C#v9jX#Zm_;Oi9K)c0 zMNrLvmXA+&a}{2!$4e{7f-0^&87nfAOghWU%h4Wszne%Fn#cP@@yXZ_JPs!$%$pS= z{BPjKm7J(5wef5GiXBCvjWLW6{F5)10ea-s$u6WRfRb209a>C(vQk5?O2yzQ!pnI= z@NI}j{SiT{T3Pu2R{mCv{&T?cl_gt+78gzpPfN!v$He<8R_ioJb@qcpI`TfD=qb#vsu$&|AX2D4TM3%K$cA$ zoo{rk8OA!-=j#?3IDYdI(I5UY)=}*9Xr%vINSiZxgTn2;+1r zSv4A|@AWS%%Z-pO|3vjTqK73DHF``-hWeohQ^qItZi4Z=LyrDIX#`xWFA@o>$_jEv z#nhjGbaXR<=F9Wu*4<`&vlSs5cC*o1)$uUb z@afqkdU%yxsPD*hL2ZCTM1p<@axj&uECaQ{?C}D1pRZ_>D=&_YU+tWpz1llD*?GBl z_Tu>H)!E5EPfqt<8GilWkyi*aaRTi0GesWujxA>oDdy~NI5GQcqlT`rPw@PDwnb`g zdn;-=(uyJ+G^DpwpdJCD!&da*m+^zZmree1_`o-baS7GFYYdYOyeo8Y6C>m_pixCt ztNN)qZBJXda(C(Xx|2=PtMjaa8P9ohxQ8XjhIjx(<;6HjDpbnJcImkXW+Qd)Cp~I( zaXJJ{ytP_As@|E#Ee}ddk?d!0OsL)sxKiX zRD^wfm{}8OkB6%s0M&#V@weG#^lkRbPz^AvNg7g-cQC3{by`-(q8Vt8nksKcO^99( zIOF=wVCIkBF7s-KU-D(i5NOr|zXN@Rnm47FH8raBX4T?9stXUL7^Gz7@v20IJcE1| z*a}cB!?UPwPWE1&t*`zlMue{qQ@aJav4>=dA;=rxNnv^Fe!HDS3K3EtMRxf zY}Y)nw6CD3QzR5m0PVi`<3H2t+`>9z;fvqSw4i1S1IqwLWI$iL`0WL7?uuW>*WF`` zffRAuJx#@$x|L*CUL`1q zlfld|{_4Ru@%W;nn^r%+fBO#V07tU*`Tl?;wA;^=oT$^)XikLyulf^|i|jrF5z1e4 z^`XA#Wp^4*4H7$jdsX|DCSAeLKd{Mw$5ZwwXY0E9-VLyr)v zc=~&Be~@8Bd7t$n6bHvqi4Rf8t=0_m>kycgfnpyax)1!RTqh`?)cy@Kt3YXQkABqA z+2(c?1PG8v5PE82fAlihtm*Kc0o0xs0nnqfrat%IU}n@8v9(3d=hK|0yz7hb3ASFF z&bJr8VakV!nkIzxt6|#s6IGKuq2ON{!NqU%FBbm}o=WFo?&0~Wn3+)z^dT< z;5f;HM0OOo4yY-KA@f=%VT}?Uuw$F5If5-lH)W0LsylxaLbvzt&{Q#sKG#{HdV{nEXJCnCz_|(7|A&>$nqp=)$ z>t%rT(5MTKZj_zd*qUAA?~JxOVFsiZV`v{{80DtCd_8EbqGqYiRd!x=zz}%RY05lO z;7HGxm7I^sRZKJbTk=!(>+69Yrq|j_gDvXLcvK@0kOq5L;T5ie)WMC{qSwbqr)S5Q z&r}`Evy&foFij(lzJd!{ZB(5>!4))ZL10($;0y)FBrccfAaM@srW-crT;K|82)v8T zmp#Y!uZk9ed7r)_i1EauA67Nm5oqHAVim?=)qCboW;s`pddWA?WvgHd}erNW(EkB@SiMeyARuziAm15XCd4Pj2 zn3Z-XW3|Jq&|Ql7S1Sa9N`y}(_vA1;K|UHEJpdAfv?TzQXxQqi41pG05X<(e_s-}> zcT~fMs%`U?dT-2Ec7%E|7CeQ&y1SrC@?mBb*B@&uh@YZ z1@4;d0}JIl2`*A61}hjf=t>@XolD0PV*Yt0NDZy$bUznF5McL;csHQ%_zN0L_Kw`q z4^rH~DW@m2KcpRb$gAhv06g*m3J(YSY{Ily-URRAEx#8?t?&CzAe9b{ZCfgFzWWZ# zUyX1YOAr-czm=CJ7m-No#~iC25w9jh0c*Xp_!y!a>nor>eDF)-0T0{P_Sq)frcIAd z%Y4uEcFJom9+jcJi@M}o*Zr0^k=mYzF!Wryuz2kZrhqQYMSS#a4=^q6eK&)>ryCFY zmd(hTz~9z8@6`Xg@V_4X?-KquhW|BzAFDr6KN9z~y!;NDh@yHY+T@&tXpvFG0$^f@ zb>kvkRRnyyX|nubPkm@84r&*EK2w+bbWic|T;wuPVIg_x8V!4ZQ_Ov5sYytVd2CQ}{@ z@bG+yx#?AXcz51HGBp3)yuzda>iDfkhN*(HtlGxGG?-{&Q$+N}oy&2BzpOv>}RIByQV$};&woMx&iW!t&yPK<>n@~yZUaq#@Y@)Kg z2Q!?X!DnmEokL6xg&`_TYaN8_0Ou=x&N%Lh&WLnZS+cmf~#4uZN2+1di* zKv;F#k{nJ5tS5gQT>(W-PmL*hP%!g`y%~6x{72OH$>j^y=l3@ehk5W6b=*W8rpT|p{n|U zv6_+MWE{Cc$fN#n3Aq%nw!hdjH|k?CUPs9u&geC_hPZ_KTIP4SaQO-yZg0u|&;<*3 znv2rB_4z41M{+G>TSY_qxG-0fbF4nf3=gF|>Fz+`7KB+&{|_^LWlLMSAa}lGpLF5M zcG}@fy{lJ(9x>n6yBl9NH}3@Gk#C6h*P?nIh_}PUe@Yne9RA-B0E*83%O9==_YnWP z-q_g4`G2piuYL9Z{sMoVey=uF+q$+Eo6C*G==<%3r=z&@E10N(Tirsx+(lWcwY;{t zjfd~4j+B)py92MR`h>q%)&9>@MW7WWndnO01fZrz;487X9f5cj3dMc;NLLFq!LEn( z38ciB)VuxhB6;;~E&gZa|GwUN{^QQey+;7&84m_^F0D#c7o$hp3#z?u>UBssex;;D z@SZb%<4HHVNha#r1v-UMs>?Zk)KM)fF*Y%M-XxiBSdYv&OK)j6=O|OeT>Uzlo)7w+ zMbyV_Ev~PwV%2a>bx(UUtE#$LIt6HUsue>}_DXBH1B;KFM(&f|a2|!f)m`G49#O;F zeiwSf?zN9`=d(;A|24HdtAAG9-^&Ote!G}XvN?tTo&2E#0GrPrI|5X}{E&m7 zOZ~v8Jm^W35wPc{(nf z`Tq;WfAjuA@Hcy*F@x2Oy744tcU6&!6hp`gqP_$1-cS~>X*-iMXzvWjTBT|u)=Z+0 zo*KyD214MTrx_sLo{p!J7^27<>-Q5g9_<{wJUZS#{o$4Rjf|)qTgOZ$Xe11X`xNpN zX32YiFEQ&ut4ByP={PZsK*|q@`=AF{1NMvo#sdUp&cb=aiBAz%D59Xh4te~UmJs=f zP&dYesl&NP!T;Q7O32go$^zK*Cs{H;kK))2Ry9tjV>%}fCz%1%7S1@N!Ex|CtMoCB zJI*=@xr$NRDj2q$S5@Q9kaw%oL_FqTa*SmFPhOGh#SDNESeOaWD_#SHBT^2XL*mMZ zx}46uKUhEz39X{VXk;}N7DABHSS&I&qUoY1dAM8>a4~)B<8rLqI zcM3F&PGsAQ%ch+jlV?B;rZ*WaPp8YnWU~2aG(CR=C_er7YT}Q6>yI9F)6OFvYQ4GK zTvor!5uLy`j%(3>VFdk-?E;4jLwRo1V4G3&Dw$lSU4k4^%bfyf+i0{Ltv;!*HQd_I zF-@u3s*_G1PE_=IjO*Ea^7t{J)0{jzj2iWg=K4ncadU0GzUG{`lcal*T=xM??bvO1 zXK;}MXLF_68nvEyz3z0?g-nO_pOS2l++c4j%epf~8|vyA*l5+)i+}*s2Rbh6<=)}h z>G9s)$=MGcMu3(6jPE|PXCeT(14Kp!=ii5yCFl8}$;g1RX9s7Pv33Kxeb%2ic}gkQ zE$A32?UqwR*wJIcMhHJ9F>d1XSMl{lDLWk?ic5 zGwsZoGiOdICtuc0PBc^dsRw?`|D(XUF>fj`_5dJWUul#)<(6&?pph350`5ITO2(r#BU$kx4bJ*+srFA{B7c@MJ}#8RtM|o{3SK zEiix@G1MdCWceeTg6^hNz%H5TFH#rCaqT(|T;LM(-{GVIl>O9wHYkVo@x}UE>_9AZV9!;=c5Vce9OxKOOI6xXHriHQSwnxzcF?i#yjNk$)DIOm7piS! zD040tPbfI}vl19TL~v#8il-#DG!kcsL(OH~^(&VZXrhxAV7MYF=uj&JVSrruj%$G6oJ$Wo6+$=4z5H_83(kBgh_e{CMinF zH~B0LNCVkvs>Y8^bCAlxdwD$Q#xAGcb7ML_A($p(Wsu3F@*o@y{-usaY~Ig@qVY;eHzF_Z$7g9{%A1>d>pB}ERnz%FiXngw!T zLQ^9)!xwFh;8B&XhE<(Cx>i7o(=~XS{Slyi@GeP@M_s9b@P7jolwQ?X8~TP}19;J5 zJ(Xx7`&`gU~<=M%^C_!V1 z3?B#4EJ1517n3F++Fh?z7NR;KXLO zAy4x*+RJc*%b%+J5ep0ZQxA$54?C;_oF5^TTxmpT+!2bt2NNqNf~0~!5FoUXP(>Du zX8^s#;6R;pbPAowIcNww+f8VtiQEx}IxSiY>8vRcuTSdd@<~}%GcXmosA59eAW183Yy(CMiI&(zKsjU)fMPQdwk>8e`L@55J1Y=Sr^^6}>>3Mz4jn2LQNXYDW{|s(5en*2uvkyItp;UgNfk;Qdtm%%e$y2AwX1$Z-{%m{+Tn)%I1(lQa>k| z8L401EV4lu4%Rt2B0(w6shLgKP@27qo85e?lqIJppvAJEL&7!`I^afyQZ{7X3N>3; zKb7bkl>w>=7Ri{ZacDFlGvcN#b`D*}!Gk3Zm1+_% zY*wW*XEU!N6!4L~Xy!V?;nvlqozEU3ucS>;zol^l-qSG{HY3~Yx2rtAx5D%lUe&=y zA#7%jOzx6`6`0g+tqWO{Dg3S?DCpjrVoEzk?FdzlXtYFHL>!)uR)?>~&l$fi03$C; zy8fE!)-~?49zDf5MF{<(t_QI5q>x0TlY{)9XaALoZj?o-jpNJB055xb8X#wnLLQ#> zj%KzH7Pto*P%fY=Pzs01jR_D1_g^(%Eu<0yr6weMf{?aU`cYH~9Jf|=AT)mteXvn8 zJMtWz4-uuL!%-cQeSQUzm@!8N0VR}>Qj#C>H~98I(}?(Pl)3?AGD_rcvgxVt;U;5xVmceelu?ixHukibBI z2M7>?Bm`dWdhdU@-?~qA^*Xgrt<_as=j@FJ%c)7{Px4j((x{Mm$KfFU?j|LvmB80g znB99E;DTHGbuz1=*Gh#EW`xafITe>YDQ1YW$_Z?-vG8`h)xXqkux*tQDB&^J7-~@m z1&+eSl5eZrYIcltZ9&Pmd?1fTDUR^I!PCpIO1%>we7Nlg%T%r*^i2)gZ_n}1WFd7QY;F2Id77ErO`t>B^YI;O4I_U;Fv z3{oudQn5~tE4SEO&074usE+E$AR-m#9tqeJUhUyd;n=*+HLd)5kH7$QB&(7)JS8g= zaO4R$Wuk|4p-k2nr)v)@5+~FR@q-Og;!dZ1O~z}r`OWHd8Lkx#NiB3LX_lf|)678@ zzinDV+P!~|9^S2E_npU1t|wzXbp7f@*k;wY$}V`yAnmjnel@JY&9thWK8J2mC(loK z`9FR%1(Gs9JkC&^@n3GE~Bk*q8RG%*Ixfo z3{DD~U}R>}&Z=d5fbJ4k-we2Ve#23EVuI(Rn3!P(HEc5T#;9zO#D^+N%AhO6~IByey|wq#1CHpDjccV>1C@!h0}apPwxRT(RT_@&hx0 zxR9Tu)yzouwx(F7u`e#Z%2kCq8`F#_%Qmnv<^OV%>qDIwP-|9YY@>e{3zqdhI^6t@jw*pt9>gR6`A76O%n2owmg5BwKynaX$JGdp>bXv zImtXLqC&Sdt7Ul|L7erPDVoEEE=fdms1LRoS5pkiP5d-ZY*)$_MZPC@Z(Ek;$JhG^ z%#?>O-4u2Wwj~fNYy;GG5Gv&RrpBNm4s{PJ6M3_$7~RLw_yF5AO`2{!0hfJ`)a|^8 zwc}gK_aaKo+hd6)gsY}Ke*7VHJ-o6m@?_vC5kyg9 z?{&D17bB-nC*rh2vbH5(qLue(slNMlG=r9QDavEgGCZ4B5t9OUha`kYo`2A9cmBKW zyRk+t$!ZiMi1%O+EaVBzC8<;Br2oO4ZFS^vn=#2_N|;3I#*_&aCxaK8qJF4MU6=3A%KJM^itsbO zKY|oRIN~#0B&uE7N)$z1CHf@WeLyjHek%;dv>keP8`-1eYlpegK)K~pzc{}d@$!iY_+O`*xlslD#%=3Y4V?dAQesJPMY@C$Iu+GK4u^=CupK! zc0;?rx;L548ZXwRqP?nkc34<{FWGcO?hh_%773P6P(%aGusLPNyp@Hifq~9G14v!8 zzD(V*=ajeEXCXpuO>8cDfN%EDpdnL z)g>QVq=W2AjxGhc1}=8ego0d)Ti)dR+e@e^WkfXlItBfF8DX`(8um4H!gn*efyXFW z-bG=3X^qltrL8|Q52)z#FR{Yz!qssuDz(DwU-v?Lunv4q5?7(!iTcDI?>O^h@=GmW z-dO2aWn`sOy;TBSU6Z95spaN`&ZwyYl!c1u{}_+;2l98wSF3Cnlh{svA|e}e3?+1G zeU}oBH_E4!eTa8{Y^(|2&z(VU0)`z4glo4dY6(aFPOu0hii?3`x@0MT< z?Dnk8GGN--14)H~LjByYPopNF7|n0Y-9bZlIz+n6_67O*@W5#^40nYkmRUKtcw4#q za54kToBFM)SL-gY->Pf&%DLlKFU45-j~O2)20L_mEvl1$Xfl5dMMY)Rq+LW{H9)oq zAH~eJUel3En^#@*Yj(f(w+0QS;w-Ki0_VbnUO^vEW&vUk0u-@iax7mCxm@( zBy_+GcP1BlSWvyI#Y)oicfqQeHb+CIZW}pr8!h4s9*MedDVfMNkSavJvTW8~ols|8*l$rVjM`jr zaalwM|&zx zkjPVWOl%%;aYZJn1zb$4F0=1x-*|&j?umHaGA^Dxsj76wackQG&X+=IGR+p>@{pEU z5zn~7)g9O*bWm#T=EGMIyABwAnHSVn+FYI7!9U2@JVsGe9cbj;woW#LvEjPd`&fJ4 z+8T22=>VW9DFlhK`B1Xo3XuM?Qa1qW<0+Q%lOd=N5=P>0MRa3q`BV4q}ZsPIo z;nB&e<4J!upBb?%-p9`aMp&n4Xz%gJWEIvbk1XN;rQN>Z;Kw|F?_%A1RYt*b901LU zJBL=%w-Jp0XhTZbe((wXMvXV`wL+`Qm^4~n#@_#Jf;Hh>MD<2{Ss`=44SHu2qwA4| ze2da49&P=^{wr+jR0M&gKY^#{aD9AUi}w}zyCJu}=C$uT#_zWXY-X8rO49)tRMJJD zA%wKD;ut)A^XoXf%+T45pzSH{cn2Ojvyg4}?Ij^$)aR zJUN>Uj3t_|hQoQnMd(#W13beYYbIA(CYf?8J!`9%cY}*B?Cl-Tx~&M|MlmC%vbOzJ zSfOWvpw|AQOHjf%-T9IHhuH7647Jg2P0C2;vT>!V5Z5wMrzH&CS#|t5&wFS-V}w82 zcHHpJBRNVP{OCc2nI140J1K=lgrd(U!z>mnxefHSCqm>sl`XcsCXvT-GMubLqh-{C zk9cuJA8_G#q99^u*At{4g3n3tmb1em@TovSH8C9!M!Db12wGtX4ydY`11iw9<LE}J8Y@h9@!x27Kfj2Z2 z)P$$m-JyL)Z@|@F`vaIBYon!^u>{S`%8R1^{64;$D9g*guK@GoleLx zQ~07H2k3aI)x=*qqit|u<=9gey)j3c^pnz~KMw*X{zQ6i#Y{hlxI8QV3~bP%;&+?a zG$oAU%|PLWuoPayl2mgAjXtG$fN5-}d{Zv;c>?4&E}j3_1gVT!#>-VqHx3=$7)dZ! zr!|bBr7vBxUZXQ%z6V-bIi0@Dtr0fVw%QQc*I5xAJ6Nuxu#X&Gbb~`JR@A<+G0p{4 zvdPOU5M6xKq#zGZSL^C;TzvO6XNNA~m5}jgUHU}_t%MEZ{x!?Jl6PcpDAa|%nburF zv2UQgZ}47;$QAw(HOT3JC-=+|jhfwQo=)%a-7pot4H4_yrGR9Wtix zPRWGi#{^-{q63wcjkr@ka?bKvMcwG?-MxC8;+%a2P3s`AER+$V_KBY*EroWzp>$z$ z@BwW3xFgs++Mt8r^s-uzfLxcM+b!n_^bo_|mEHXZ93Z?+<1~IuAz{qju}MQk%K-`0V^F4jm+6g15zQu1D;Ozi4%*))k`q^#D*5mf%D zTHSRv2&_Be)7@du5>r4jDwmYFiMb%OaHE`OXB0f8%tRLuIbM`nmXGR7d(Yb3rLrJD z@T^RyeE(pv*!JbIoSEPbf-30y^R<69|!26KE{GOcmSa?<+J-#KV>l)uko`D~) zmWm0r!EoNrNoHh}#yL1l=2xbxpH=2h)vYau7sVDGs?k=nDg`r@U?j3N)i}_o!h%W5 zOWJTUXZu+O0lQ4h%IG%A4UASZP%E>U(o2O;kXej&dRZ5ZKiJF+b;|*}!K%<0E-#&M zIub?oK6(PK#|$yf=Cw+QP@~ii*H48cEC=!J3&Er@YJWwku>y_^v&jIK)UM_?{!Xb4 zr5qs;a(21(TQ(@4u@BY?u|**s*-}#zL%r(a=L@%LYk~%@aZ)5J`c&G~-pzR!+gIg( z=%&?O+mbs3>?7TP1ghICfr4jquR!0ZB5IWQECb;+LAlyNPsfzJNbm0nhJJ_Io0)&; zz<+X%<^yCz#h(Or7YQU~ezP1R9pPkW=Y{irYm*g%9<7O9u+deKr-J?oxl{LCX=mp! zmA&wWT%}k24kCg=YlO+LHhyA9tMY#%NvSIbML%Pn)tk~R@~bd?=g;JSOP$$I`9&ap7zJ+Zf{xt!KQy5{sLr z;pqc+a|`#L7IZIe{$Cgwr)1F?`n^`JH$hDT)g!pXwJZ0~(QIi^HabH$m$KYP4L6xG z<$#nBQ^nG2Pjx9OE=c|(M!&aDyR4X?yFlW((@Pyg@+G_}f0eK?!jb)=Cfj+DZ!Ec6 zKptIOB0Tz&FY`8s0F`X@aQ*P57`^0gll}R`c`}k#MJaB!rQu+*R4!BJoqn_&h7^cE z*?1_ji;!jUcCcpw>Q{Ly$)rdQ5VgX-+}a1&&r$0ywcTUZIOOP~_83bNo99>WT$Ckq zGDv=p(B)@4lZG>ZM?&NF^9Uk^IHAXIS3g8t7N+iri?F>06XR3F0suJC;wTIj}!Q=f6Njexeu!?{yv40%& z7Z!jR!G%@SvV1JHuJ5X->S4{+3iUax8;o`}&D9d)9JUiXsQX=G26m)v{cE8&&it@p z$;42*C}X>51Wg0qS>lI8L*(<4TI5|a3sLLZE=S<@aYCE0Vz^O&@a2iM2hP90oSP(m z+j=Ukw6-4^3Wo~IvmHkcUVzk}R&(K%5f~*dwoP4HN)MnLSEc7%zlH1g)EW`4S_qw{ zbU)xgB|E}g6)Co>SFA-(8zpO=sdvjuaRIdfs?^6pI+*0*Uxxo&M{LaOO%s$ z2H4Go3s3vO4z@RsE2a7)3BvUFo`_obW`(-(&9yJ)x;C9J&A!fGw5sPv?jrwM+awO+ zXj0~1M1wLzhJ)lXjy~cFt(t!uk`&)~;i1>@s{A_cFoD+mY|yMQkg(}S0;JRW=KttP zYaK$Iyci1IJxC?G6UOE`0ABL;3H5nN9oynUR+QlcG`ZF7GX&cXtkpH%fHuHo;#|Yt z?EL}rdY9stm0gzw`z2Gy=`-gYP)Ph32dOE4?M>vR;FSy_oAd?dnf}rMehT9jGR7tv zTWx#hPw>oPxrWpD=;AF{*p%z~`Hk4@x3-ZR-vQ+$pRe~bCrkOE zZDko1--Ada_b%CDnn46vYT0`cv@Vrv*m+QFGf^I%?+dUgzx-W|l#ySy90$N`lXtG> z`QrIPLZ}lx=T-MEI^Q`o#YiW?itD5{lU@6PoB4rv;g@zP9ck##b~OhrF0w?HfA`EV zZ=zD+iQ$Qf6vdpbv^7KYOIrvg`*dfj*(Cf-M-7`|i^Xo5^r5 zR%+7m`<6o@mi*y1aAfe!%(yq;W7pk;Z)6i^ST2@7j? zTr*IH?y;Yot|=ZhDq{?aI+D^Al1Q;_O(pg>lfP2e6ry@4YhXCT5kgV{F*nc{OTNEn z3~BwORt=gy&FyX~Vaj5`KN3J?I5tIkSZJvpQlQ|lSul=CP1vl!pc%U}YgFv?6VTWL z6X>hJN;tEs&&k)(t9Jp1vjToIB!n`qs;yWQZJt%pY4DF}ANt>}MoCSdD-44pI50GP z-cPnms9|`ulrbUY6>F#~s$k8nkFt>Js~9pB`b8Jvm!}E017qA*NNnr`ly$@KQD%~a z?Z;vlKeB1kZxL9nWevZZAo}iOuD&-W!6-(QaKp%sc!+`^%t2ki$*$!-b8_BA3lD3{ z)gK+(M{5*B{4nuJvp+E^kD8ULgIxljL*(}Ui`<9QUgiz!$yM$V@OZCD$nfEg^eqcu zFkuuz(yb7`f>);8oRx``_UeFmDwCduN$Q%ePt?ew5HoOt#qtvKWB40(;HVoS8SYpt{xwZr+%jOuRYpl63l5l@rTzJUP zb`J6uDNAm_iCBNvE*d$KHNbSb%A#ZnXmvU9-MuY<&+>JJJYW;{bpwc%fKszl+yvhK z0I3+!3@+IOeHw5Fex2d=QsGp!|9+TJe1UQ%>^%`Yf_wSS9?DXuCJS(wOZhuScXz6@ z7|H(RGwN+w}f-$4RHM*^0nL1p7k0M3k%)Hg(tORHv-b)pcaxJC-$q0_l8~nvZ1{Qm8l6 z=Uu9Cs<_F?PcW!&v!Vto4kk5p#v^v-U}m{bSzC(X2%TUO>i)dY)i`YV2e-s_l%bhs37VvU1LRgR|~GJ{7Uwfm{?wp@)D2O*IaH z>Ff72?Vnvq)P6Fu@dV9YIoa`ixX*~!QFhiL92=}D-UL^5xT(4Cz8^gCy2Mo50JyF_ zU=#a*RJ<8^*Dn=JQTKv?eXNJf{IccW*Y7VTt%TYN8SDqaZJ!)%R$ zfKD!NMoa|HzHY@fo@ad)nIY4V2ok!5!52t35|4-fB{f8Oh1M(L6TwO1V*dG_CMd=21yB zGCi9}dQ1?hw@LeaQe0V0)4Z+R%jf07bY)Wd1*6%3BZ<4GpC>FdtkG-PHA9Tyds?{` zh#jXkOjje`c6rGC^n(jv2J(U`yaN;F>wG-z{zS}L2VJdmew`g}uO@fY2pZ#Ey2T~* z>xEK^1c!ajKBioz>W&t91H z7?qqv(<_8b$ z1UHo<&%gPepL~`LG8;JG(>&>ix@=(f##J-&6Nxqh1*#B%?{FwHUB3%n4Ur>onJ3+sQB*)OQtQ5ksmcT#&b1Ufg06;=$HiERxHr zQTluI$O05$t77U>Ip^}$kpGzDWzE5n+mvpjO*YK}dhAz!(L2FenHu>?@CQk^BE!8g zbp*S-8WHN}(^fpT!4Rsv9io1T+H3+p*;H#b$m}2qpq z!EvtI$bgcvxMrT<_$5%j(=_RMNn50)rm3qO!tsM7LQRxFLaa&#K#0TJ7oXr5%}~=b zp+*LWBm2U^@?Lnj*+bze^y z7`APfAQdjG@HwXL-=d-T;=4wp-=ApevIys&47S1?6zJ7BovmM|g#`WTtWE2rowI=# zd5}DchK48^amUR4>E)yUzJ9UsvVc2$YtU@ZaWyrXfEAf3I+(^%U;sg?_Q}HPm4*24 zdG{^Th)T=lXXQ>Hp+N$(}Th^@1fB$yU*a{#*C3ehaZwfL9H?= zN3i`S+Ek`282Xi0WgYWoN7ui-3^0k}U%P>&%=4LFCkLzM(~&KqZZTJi8x0BX2c()# zxqRE8KdznnwK)iNgqc_QM4G*Kj?&_J{ww2L6GhS3tJM^Y-)CAI$Dh*SIQq!9yu0N4 zR&Y|Fb48Z-GEQ#;gvxY}e(hAttHE)qlW_v-;H`rvZ~4a{AzTrK%-f1OiK9QTIwOw| zE4*GSp;U%V&vy!mzDp&oLxEYA+b~P8>_Z@e@^aPYN@DYGD-wrO16(cC%dNfW8>v## z^W|20AxDY1(9Y?|Q(dg55$6r_a2XXW7x=GXvPEHq4?>^DH-E}@Q*^G>y!(cox#GFa z_}_rAOx_-)92vSjVaAhjBX))+8N8;HJWUnH{GIWm;Bl`*puVX_#s*HF>WP_BC8_+V zU$5ri(4eNMz^!UMX0EsiYlyh6k?N4D>Q8aY+JI7g;uOG^H{OM8}8F0(OzW|z>HFdumZQb{7nQ` zp^A>0E)SxgOq2<6)6CYoh1$M?n$V(ahGF|ke~8N>F%OE|SS@`=1c4s~6OYWdWtpX) z)Xa`KZORZt4Q8tLi3;zKJ_Me&AVFwtWjuz6cTy6|MERFJpC!Q#V+{cQ=N5v7`BA$o zRKppV<45sd&6%Ck9)Tb(AEX49zU8tFIMS&9Qq3`oxC@K`!LGCR9hsUhl`6PPK2y$F zb6xpy0=U55$TZYjyp$TYJ(#-CK$4TQ-_$FczemB03iR&$d$f-P z5*Z?3ZG9YmPS&^FFDftZr)mFk?LvWyiln=qglAp+-9TmENs(b5P3J{rii}Q~LOp4` z$y4Sf(%<%%xoLVS2kX!T{8^wO=1{r!3SW@$)e;NlVd|*Qr?Jv;zo+@?TOXu1IjxVv z`8X*_S^CH^kgv=>TrdSET`vY=O5Q-jVN#4BUutMq2{FIt!db$&`@HJv^J)LW;%0;d6Vbf4z5CUg%a`Fx#+ZF!$I%f?;tJ+ z)c$1fN^21MH*<@(gszmYf)e2qlSY7EhcFdnJNz5pS^pPimF{($7K1R?gQ4t!UpHpu zU@>L#{m`tIqv1Zm;1_evT$_v;lQnw7&|P%_>B&`jv+pEZ9IM1eq!g{9I)0^S^&56h zV2nfsU?f3|01V0HO!2%YO2|YI>ai=u|6`a;P>6bF%X!AdcF0l)(9)<7=K78&;I0~|+^RfUC-3>iO z1zacn;Yezh<@j)5#S#i1h8NC}d;;qPa^9I2V%ji9{?;qmT^^HqPw@qGXw`&5q5#1(882FXwzOg)lc8A;hg7G3-=3YL8P*lF09dYR85% z?wxJl)#&wwr7}4^4h$EP*B~5D8|u!VE(rY2SrCI{Ns?Bbd8L320^7IZ%#*ni`f57y zPuDCka!Mt0>}LtFt@L0P;eOax%CO?16~Re1w)@tl@l^9~=%b-vCXbYAIhW=FzN`;{ zRUHnQMljk=r2%!rhoLUlTo2rFYV99tOM^R4F{wCtPZC28FTTS4Y{e#ZpJT6pujj@^ zlciCG7-ci;K1Q14!*cO$`t`^}bxv9G(`ZX=`}mGfi`I-)kV+XMl3M?6eK%V%U&jdB zQOR0TjLY|~j?8&+${%ZB;t}aC?_7aQDO`@9c&DWRY0TLIX_6jJiPhWX>y^Qwmy)$* ztm@7!Rq(-G0cK@V?dyv=R>qaH2@tI8FR-Lj7M%1mA9~D+wlaAzQc;u=w)`8cpk*Bq zIYLBCsA8{Y!5{e&E&X0g;`BynYkHSQ&O>>*cfr+n%lA^#jPYtAI{OwRs1h(|<%xX7 zgNhn#v1y?6t5rbcOU};3cc0!j5sJJylO@zy^I(*hAwER*AZsQKIiH@i1F^rB;=Qk0 zFH4`H!%Ogl@1^?uRA|INLA&7}K(nVhEQbiV60U&lzRkG*p3S-72}SWG%70Oy8j$bw zyP;h%aAwl>%2A=E*i8L8z~&Kk?0&Jb$uuLp-MBzWK~ssXzu;l zruB9Lku0(9?ItmcNrkbk#;6dGpvIDzb+kl)ECS*+qM9WPJzly~rGcyh?p2Fv;+1jm zynTw_%sL>!Mk}@r(mZt{9gu>JS3>sDns%CK776isK)^m#z_XYG zCx}i~oPT0;$lG+x;~hqd-~1ux{d$u8%be|YCal~@5zo7H!t$6j`4?A(55~Y-YQaF} zcz=tWcesVkC%keaMhB;t0TlrZ&!phNL(DcLT50Q^FVz zT>9j=|1n(`cD;Q31_6!SE)rr+Hc!}pv!sLmBv^H~<~FS~qhO=*sJCd`akLuC022p% zk_LRdRB}w#q8~hmiN{%v)Cd}t{Vg~j$Uk=Sd<9$BP zC#vSCc@CsW6E`Q=b<8lIV#Z@p1^zi=^wR@2^bnwKnjUkfg!ef!VUAugXS}FUaA6;j zPM;w2Il^eAYJIjIPNEpS;$jJy z4|BT_ce@cDOaPv!cJhWY@U5Y$__GbJMWVWrIe)w|NAMx{8`#`1iZ@T-Z__SuEHH5j zD*sJ1_z*7o1~yUR2)jpdn70peBG!jkACX&VI(O}Ld#}t>!sh{*#~x*c9Ha3_KT!pJ zU076u_Oq~-%<(j7=rM`(+f2TVwFDL0v@*AQ$ihS|-$$jHx3{1fz!Et2+0%@QIaNqB z%`39a7*stbDvFPYP^Xb}D%i;Eb!s8AYnChJs?b6`fxp~}0Eq2;-V@tHbc^xeywIa( zHhynwFpB0NUb@WTkT;1p293m9tv~WhjGoN!!|()C*#nTWDdV*!e=7G2AmjGQ69t9) zg_f38u`tWFD#sO0(S!B{#x`5HI zqorq2@n=2|fIkE*9UOXRyOMMK+DxC-iO}@>rTv5Cl+ot@z5txwdg}Qv|Ha|oYjD`a z+mqY!kFUp%Vq`QyM%c)Xi*8_BQ%uGWS!9BlQCIMd(z=ooZBuT;rSIv9UPAR_A1X8> zl49Qm(OD{gwUw?irSotHp7Sm#@v*ilEECCi;an2=M`2Sh?Da0O zja6E)pPI=b^T51hTEkX<%;{wkBXl3@8-xJgM4ms^js(So@CaM8=L_~G-ArXMm5m`B z_9Ynp5XO&>TJZ)01l&6dk;UT`NW2wD><~=!5lZA2 zek)#kyT%N~eti=Q1xMA!29s1pZEz|PTvRE9Dj)o6UowC)Jdv2ZNBmYv)3+2k`rRDi za9+`_<(nMB%$%YfYMKNByPO?fZ70T5`gC#dQ!J|JeagRdo7b$0W$BB(0o&KC|2X_a z{qLn?`zZf@c+LEm-Z7ZD5I2%iAK3+mjlOsZ?oD3!+b1uHZqBQn@MCYKPCN;-n#df8 zrkS6S46)i^E9&t%XR}gNlt)*?mfu7>NUOQ0Z>;r_`Y{!kI`%k#&kK&-?vv_pI&O;G6D51e=G2?upJlFK z#|WC3FXE#j4;g$Sp0P%$B$)-Y0nyB2gF_K%x0Pbv*X8Fb$vEdtPGI0gGE;hXGMbuN z;kIDpFMZE2_$uOV&)0AN%K*oQ*{mQF@1ufqlftk971rcG{%~!hP;J+hvNbt*F^X*j z6d7c70%Q%<416h|uy-A9X5z0Kp^7zTnxn#Y{m5CI2Hu30RCV=Dt<%+=!$cI~_ic1q zC?)}UC;+C7Hww{&S*1F_RpQ6xc_BY;N7>I93;G>lBF~SHZP{E&ARv~ujDtAVp&m(<_C+kZY9HqS9`$D*(KgVOQCl`sN5pNAcl7iF$jWgCrYiRt3e z=QbdV0BFm?a$B3j`g?N)Vu=V>XI3Az!qorzM&`oAN}d0Kmzl+^9OVCPkgH zkGvv-U>lvv@J!07({Zn(0~yi9q3KG}>pA#v>0qgRN52kRpiiIEYj zC{vsT$P`OPQvCzG>=SK06GIeI=CM0i6zAI^W|X7vf(-Q{Ly5ThUL4`_vF3O*>-h|^oAL}_SlFH7ta1!Rth?&KIc%KxoTi1 z_fgg%Atn4!gC7=-BWSFrqjSaG%H@jiQL5W`7eXMetR_tx#NM#eqVOMP!jb-f9Nd1S z?87F)t=F6O+1XNhEcma{<@Z4Omm-Zp>1G)oCGgl5+EZoD4(@h^42#}{L&2-k18? z3BkbVkHo(nr#LL8OQ~HmJVw9XOCBt*3F$OMZ7OQK*y*Nms34B)sIDUUs<_L&YEy;g za?>P#&JvvQ_{`~W2m@iO&5pvRB(VFS<25|w-w zw=uQmO3#KWp5su&6q)U-{HOI8?I^>!KCy)t=8TG>IA0wzg4y85Ee}Qsr6beB z>^VhkpBqT=o!Hw4V>HutAm@3O32fYAUN`K=A_iCgJsuMxAE8CVY>QiG-h!CMa#xg| z^B-W>+gAA_qG6yb)utih26+l`pXolbDK|vP_9a2qvE4lC4vdWU4R=ma^xwIz=q}QM ztRq6=F%mO?rB!D~y9HIf3Q-*+YFS2Rvyq?Sod|+~Xe*lj!RIP%=@JrS@e*x@Lw!Uc zQ9g*C48H1|;!^gFf@~idFAPn)m`xerfP!&MCF3P4f&}$J%*NPRP4$xN!&`F7bm~JB zq$KY9gflyfdRp}XBMD71%7?a02j8g=p)l!mhD64>4*?7BS&0j24y3$wW{ExX76vAX zy)&f@Z4aCU+Am05K@z@JUf`CuVh4CftKTS+QA_*=Cbml-T~PKt!&>ftji+$z@^2J- z?n%dyF<7A^D`&S@0Xgc|x8~vE3xFUUH znEe>(D?KI7Qz{-U8@b{ZSz7Z=gjew-|z71s>aJk%e@Q$YB2I)`hR?j z0dvRC!gVRksl0Ok|K*+qQhOA`Z=vGOKuZH-=tSF~VYHiL|Ik4Gv5thcf`B&eE}MmZ zwb7zYwo$@s=@lqv4vv&K#B8TfdKU9JW&v^Io$ebOeAv2dY2j&Y4*bODXXDvNf&I>$ z+L*!iG-jlklCA!tYnV7bsiS94g&>JSg)%)o4BpP}&#J$X{Z+G${J+^)^Kip#ym+-$ zAeWC8TjSDQcJ3!a0li-~gkdK;6~LxK*RHeSFZmB>LMzY8Gopnx&%EUqKRL)P(o{uXpz*V!rO-#D9UQPTTr&8bdiA>3- zl`NGFQ+X`GAcaZYd9PFu6kXTdS9Z^jY+yMHsvOTiP#`O<=}QjWCQ_M}NOf=jsx9}4 zOxA4v!Js@*Z32IdHIdc-S;!3Vdn%r|KIKYALE(^GOQ>g zxSmVPclR|u^P^$~f!~gAb2hAFA_?0gD%r#>xtMkid4$V%gFPOcMk`f0Sp$|_akZM7 zzsxPHUkPp#CI2-1nU0PrSp-OFm!@;cQvJ_YnKs$N4!$jn(r-gwe~BbJdr$DW|1`cf zo1qu=UZZ9g5==%s-Q>5ITv-+aH?J!zZNEbl&Ib&g|V>l7mu`R$!p&4tUtruj4{ddeDKRuqN>$6RPKi&_T z<{xhh5ChU9&W2OdHk;T=uTBmbHAPVqK*O;bvYwl0`JX|^3iGxY1eJ(1Bv}W)FO*XX zuEEyaSl>h`q@46OoSo-$m+U8E46CNR(b6+J(6j~nCJtq{9wBIf5N+Ur1sM9vt>58s zbQ6^-NTiSX^XHHyzhkZLwJov@h(z-vMvgU*ww@R2EH{ueE zqYt4ojs0j#Jl7+-%acQR_Fn&A2AA18$uDOvINtE~bgUaZ_IZAl?%_OL!2@rCG=~-M zQE>)Rr1t?*k-jvUl@3OV5FGf zA%#ORV;rLqyEYsasjL{;+%2?eu7h8p@^mhrGYC?UT);L`x+XYD6O}V;;ooZ2b1->K zRVo6iwun7hDzgvh<>M+K|5LoHkkX&to&OIR$H&f@7I)=cvWeYR84bR5N4MisI7Nck zITKX9UxQ4L22H_1SW@Q4Aj5Y<5|mhhu2h_$!;WI~=4F{bxXM6+A!_;dmHReL|8Nt` zo)i;godSx0o8asU=Vm79aE2i+2GkJ)PHzfFIm+?)ieKXbPW_ z&`4H?m9qhmdIqQHK-sFBE*oH=m%%5_WUTW>R1nf!Lt}wIS=+Ba{4+rvg0(*3{%@7| zl7~>3k%f9j;2_k|65OLpp2RV*>-j#E-vNPzAdrDt|C^ zr{KnPYY@G2Dq5;hN*djH4{>lt^5!^6k6}mv*(XRSq-oEm%G$1Rn#*{|m-1-T>Lgsc zv$<8G0<0i28IH$4PE5IOnSI>r?$1?OXoY8!60dQKzrO@QxyY`&73O~m{gnf}a!r3N zKR6*0@o5wJuOVnZOT4`j*D2AhQ3 zM~^n>It9Om%IBarbdW~HN}3 zmO02^OCIF1-^Zim{o63TPF-(9#@7(V+ZAwj4jBs9p;`&2znn{O2$ESua5B-Vh*@h&DL}2)3Z+}M; z7lRr>k~mT(jR^y3yB(I-2`RjsMVRVWXL7m$f0nB!w86jLjNDRI23ZO2EuE8V9m4RD z{8w88m5J8iubP8F$8sbRF6J$Sj0;4s_Lo%wev1e3t5EJcTCb7a%x|xC2K*vqKCJ7w z;6XHHVWw>1nUi5Zt~MvP$%KDHA6l%{@3|82rgfc8bRROoM zB7^;wOd14Soe&+$KE@wCdSBxnon2?J``D#D)6*OCz-p2*l_6Wo zzix?4s6l|3aI1g*(b+5PpT}Bs(e-19OU9R*Xax>58|*A`2>|;cW>)LcyX;^9NxKnX zU?X3cOC{XKTg!J-KHqzOp8B6@=PW0OYlj$uH$R1=SXoj6J_CkxRgBD-QxxTUgs~zF zlTHp-oDe2sTAjCch6@dQ4aGmX!$D{==d9JS2kt=x*%%yR)*~Ieg$9PZBd2vG*kvwk zv^qItSZ{UrPIk_w1QRUi2eU3yqYNY!l^^ALNp$n57!uTxa$f)5(C1&q>|$e`Tf;v* zy!w)y9!iU1{SvsL=YNTOEqk@1XSO;flPTHmsy^IhIO5OurkwA^aWF>{;Etip8%de7 zp0wxvzcjx*M;^XD7@5Dm_`D2_LcXQET1~$4WWDkn&F6Wa%!&T8FMi@*45M@$OcAh} zEcib)Kfj7yzak4@eBF1dw0)HZx2%3&d3rr2>;E6DW2NuomV=P<%yn}sjX6>$fL;f4 z{9FHl)r6|oNm%SWJs$0(Z%tbOBB#cww zQEL3js8=DI)Z3 sRTIxH;WIHF0FsX)137HxRURNf+gIeF-$Oe+pIi6i>|Ch_O&j zn<~o=)OR(+rBVB;3SShk41PSy0Zw!L_QGrQk?3qkO47hEKG+h|d{;^R**O$@>3WPI#mtxz7@ZXxTWjv$yBV+}EZflxq8C`;`HUGg?jP=s)WY z>kx{tpAVwID2Cl;e`4w})kaPI_p#{0z*fWFT<=;!MfS)2VRew= zjOn46ff{r$lx*xcrd^J;hYaMTBF5!63d3yq^_+}3p|umbj7o8y01I51@_l(_H2(lm z0PeThAi2c4ehC?eD6BeU^)KH8pUz4z62-zsa^~@pXWTqX-AAxXSXGRo=TrD^>`cdG z`2+79ejt`-tGB0{3;5A$LuItJM_nPTa;Lye92*A0=i!C)E7mf@wrD%3GHc;CyqOin z&+glOj&{yMzzRm7F8U@$UkQ=Ew^oHBB$&D)Yt=W+h!ye|wNW!)!C_@8ZX%SPwW3}$oIL82iCo0(#H4PQ<2P${nnRQ}E;Nsa z!UHmVjhUaf0j=u_K}wuKpp3|~4c#_931eCAIX<2JGPX8>Z;Ez&g_v9|Y#&#}X&Mz= z4HSzsl+o&v6M`A7@nb%bO{r05m~gjk7tqN`T4%~EmB>l)t&8awC`oPK#NsQ%GM@aj zIwJ|{B{$YG)hE%8;S36lr0rQf(*V9zdPs7Z=E_g^#Eeujj#SndONv9|-|PbM(#EGY zYPSDw2*4{dbsa&O>nNX?FiTh5SB$kdm<>V?%Vd?6PmF_R_Ibi%$g2^rfITM z-!;SLv)Q{JF%iGqt=6a>?U6ldA8GX{9j(5zBhR45pGu9@VR@!Q^30>21rcvA)Hij{ zTr3Jx!dZg3+@TXn0gi&z_b#6Va_u)cEJ=5@sc0@)FGQ0 z>KDkRo0*wi@EbE}^`|{6ix?^KoD&i0LYAh}??umW6OCh5V*+%Yv^2lW zaC*U45WyILEJghP2RlH-zXDaliA~9bT1$|VROWAfg}X^ePL!Xi^FaodjK;{eQ#wRu zXjCu+b;d_SA+W%JdrNe9E7@pdp8Q6${h!(9pAbdl9E*hv5=R0|B zqNk;xKN&zuiU+*#12yf*SxL0CQ~SV7=V3mRaSvD$uj}!4MZR`N%jsB3^P;n;yZw*i(rdXd)-q0sle!Hh-j<2%tHX z%<3xO#iz1nlr*-kc0^T0b$ym;1Qke#+(hIJlr%uxA?<{%CUWe+>5J#PO!6XS60#ti zB^YRt8bl05?4z3l z#t*oLLQC=kE<8=MFfVYnxh3P*x=auCCbZ1?+87FjAJgqMg0lC2<9K-dr}2>YZg zPr?>VShGxWtP+qB34=!`DliKpB1;fLnRw!HGQ>6%wj)uL?2^$3QCtq0a*ok}!GVL6kO7XN;E}S@Pog2Wv$MPY~c#mW(nn>0k^TukqYbZP`rC zQL;d&&yM>=2Hn7M8Ih~1+rg7i-nT*gXbFa-F`ndXu`-na*-=0`5e%?P21tQqez_yR z%1#6jIJV3Esbqqz2|?tEOhBeXOB!c8ga)Tcq?((lJ=aV!fzedL zL{^0?AhX_M_XoBg0S#VkqfseBL`QOS#n!yA%fU8~QpC8L%86i7lfoms8LwP*q_cLZ z%r4bMea(bYt)_AIdb?DEV=>MF#h4}?K{a-;Q{?~uyPrtF{BW(_Qo~hsS+ZNnx%9nD% z|8sN*~j#>u;O9`O5d#9@hTRswb8d zk2~(*u7|EO=S&@Q(U^;@mNyz!{JU{jtoZ$7C!Y|1=Hl^poqtB@4$H64CqEq-vtQY0 zx#pA|hljd+aC_~Ik#7eaUN>^Y&J8;ox2+n#{fK+NSv6vZYv+4Y+aGC~*3~ihs5v_} z9@p!(U(Wt<*HvdOxZ<3JeUHd{<%QXE``x=}{RMZQymG$V{rJu=3l4qopnw1Iz{Ed$ z?C;DS?z*s`yz1>$tL7KJ^Z2@nJ3oH!yc=_l9q{!b*LMrI-*Z>V4tL%Czn4w;sr{{j zyQ;t3b@ExCpE$XB#>h{*y}I8jd-0`pKhFN}isu(Tdd=WP56yhBY4N{*`}pZ$AFXTu z`ID^&Jo>{A)+ejoSO3=gpjYZ&Z8@&_x)1*|^2Fp}=XU+TcIIi1KQj5ehRai*O#0Mu zRPgGretfe1;?Ihz>!w`w#-TfpzOMO$Awv)P@$9@*&qbpm^Vh6=arw53BWrwDp6AJ$ z|5fh1oHOf7Hmq7dV&t*qEsuQt{m~~ceRS@xkzG5!S#t3^joWJ?$Jg24|MD$=bIyH> zp8IUs#TU$*Fk+^quXS1PgC2hPxI_B1|7*p7;`gque$V!Cuih8`TUzy^=bX(KIEqZZfyUpDmI#2U+?$#1TIC2Q8xLst(l&Fr`B0ZaE2Lhq*h zkM(X}xlgy=fx|y~sp!&2e?I5TRcDOY@nW*-wtdIE_VcHYOsT ze_Q?10q?HvyX*48CF?d9-CDNZKjW##KY6Fh_wv%`HvQ}5CHs`Vv2aaJVc+fR$Gqd2 zUvH_(J9g`HUEaU_=k1Be!Zq(+v2MWc@sC#AV!C91>w-*K^wmxvb?14)~OZ8eKl|OkrNjkRPocKSm zeia{HUUE}avU&UAThrRyV>HUw{epJ6MU2mVdy5EBQBa)B) zd%>XXYx`N2%zXdb1G~NO(bqN4FRbsiY0(*ZmhP|aGpy*Tg)isMop91Au^0B=_T~f6 znv1U~Pp-M->26m#yH71R&hzWMmDU|oZ#nLi+Frp2pMK!h>RSh#?Vfbo^QT`~*>1|c z`s5xd|A8&rSG@La&u+i&yKG+YoO4R&4XiqD#zWcHF8OrDv>x;No__XGj~sCC-1o2f zYTfYZzicU3-RrO^rysWPgz%>Qc6H5K@Pc*w(NFlN9Xr&XIDPUD3->?!xhJNt8+G@W zq436U&(H39xNXr#E1o{$!s2}k$EJS2`inPDv)(fHpi7qxnCSZM+81W@yzk8?Zv5k4 zbnQ$H$5}>$NRUeIP&yO zt(RXi@Q#m9+`sD$D?MXxyZ4}ZU-oM_#((YD%T2$VazibL#$GI+S#_}O)N_w{;@zH0 zRy0l=)$;iHc|A5J{l$Z1GW*_%ldinH=#AN%CJY;%^Tvyl9_rC+^&$PQ zvYm9DZ{pzO_=5KRPI%+U1ygUfR}Xxm>Dc~>-rFY}KKAf$8jd;g_2DP3ySt_7$YTob zf28lWO=~{9e0kpbbMKmVO!woS8(-b+#xd@uvg2w`>GOptyX{TaYcG6w-}`+o^j-PU zYRh%oKfmz9XlUjUc}FekcDet~0~bG;-TmO?El0hue(MYFFE-r#O;w=x#!C+HRXp48 zyx-dv4S!|nLnjY>=!%+my4+Ct)eWDF{XE`%SKS$>X75|oXMl6S_oIJbvbM`{(|@>b zQTyoMZkc&jY44+^Ol`TWY53&$na3+0gCM@}>tCL`F*w zzwz3*>rXv()<>5$F57p2WLkFm!nd!uWYY4Hm+n_Q@sY*9_xtGN%U^lo!drU0H07md z4%^bU^AOt+w=Jx39KYYf=V$NRZ)5*K?^GUYp1(PJk-L9wmu>&<-tbj&<;>Tf8oM%O zKJ=(D_grn7cR!$nu0JMP$X*PgiJ;}@?8zSwfXicO7|F1hISg$GQq zkJ++%>RoqC8ny1o!{0otp*eefPUES~k942^)8_rIIcxcS6aUrn$}y8q{Bhld>%aR{ zimX^^J@4&v4)67B{r0(L|4=u@j%yMSC))C_oVIjZR!49m+wE@w|UN- z;$IIt{)gg&P8s{=5nq4y*q`ma&Y3*t_9cgYH|m}(Uu0i=@X9Za-@0z=)6$=3JaflM z6`$YY{&UJ{m+sRoXV>pL=N)!J?A|%Q&O7p#o0nhSty{x2)An2a#@v@5+*;q~;Zk4u zvh8<&kbA@K^p;ivuH-2!Rms>u2u6)_F^T&O7_VD93^?Bp)3oc)1SyXbv z0h7L%d;8_X+P<3;IPdFwhL>!19q?LJo-eXw%(g40 zH(Y=C5r?1HYtHuz;uGe_m)zFtj{bA*iO;ls`Sdq=*M9QMh3_=3S#tc=cgH={Wl{8u z>%P3AvUu>d(&>ixj&0_pXPnwx1-OC{J7(rH)d{p$=x+F@c56vvc7ej^|8yl-?3)ln}=AED?jYE z;OUh&Jdky8-({u09p>b=F%6I!t1+U`0BEc>K+@~`=`&}YkhBr^^fYq z+HPO>)ek4u{&MOO2OM6Jx@-3P`{ch@^-8Mx+x&-rU$$<|O|xdrnmBsn%#CMXcJ0f_ zV~#rIrmI&S+Uxh3uD7?o@x_#lS>K-5-d-0ib>B8?)vzhCw?>~a@Otk!@4{K8Yt6S< zdfFBqT(K(|NnYsvpzo2lzc%-dq2rI7dehU-kLxyY%DHCYKL9vhd-i?&iQr7pz(F)iHsZwM82XSG;y}ysj)b_mO!+4(QY@dph)wOfzsx360`^oiobexKHT=bJyiy|J-({rNw2dF0PK4(xh%-|i)^ zR%JH@POWdmFz3_nbh`7?6RL8&0GAc zcf?%{uf6lmTOWM?$W+hC^TQXIB3I7OTb(>2F!`7}?yvi0>=7&ObbL2rQR$B}p1#EL zMaAZW5B<61!I!M1O=Cy=F{XJ=SL?|U`>JJYjqAwp77(~A6`CxSeG*w|MpRld!6*os$uJfOq=)E&#!Mk^0RH- zKAT!P_u37m4;6lL;J2UEXGf2_?7i^v=L6*jJQx~v$(sF+u1#H6Qt{69$z_}F-gf>W zbBkWRIXL$Aq0(1tn)bP8TfaYYz0a0cPN3#GW_L-9=Yp@4X3Z1R&#dXxh~^Z zUjNj$UoBjF;?qxb{pHx#+UmPK_eSvNXWIKd;GXBW@X8~lWj$_f{^-~V8?QR%kA8Qr zo_ogjualpR99a0I`^K)#>vB%Lx5xTjv)acF8U5+5Z|1MAI&b_<)`u6*exdkn&wfA8 zesAiyrQ45wbHxeETkeW)`rzna4rsmg>7%ze=We@aTlV&EZYuxy`D42rxaHiNvwEMs zZpA0(KaxAVPvycd&Y1GR+9`|sB}}{S``mZUs~6sQ{dvJ30{w6NDS2$N?Y#$UZ@*^e z+}l6Brsn)xmiEcH_q!L)l3upIy!n;G_A5B?q-U$j4?6MCU+;M1fJObAH%_?vnM*c* zxaf%w4r%zM*BOgGo#I<_>(}(Dp8DsrOGkWp zSl8Tm;xXyQ_I0lw^I*?SPj9>Dy=xx-c+I2Vz5VE6eSW!W*Do)1KXbI})QXS4ykqIK z%dWlCJ>%Dn8~dDgjI;jCtA`(Z#l2l8CEC9@u;&9;ZasW+FYk??)K0y7)gL|n+|~1w z?9&eNM||vlMt*}kT>-n>x$+8&HRjcm2zSM_kw3knQ}a_Dc7vsly(x-tx_&ga54l{PEh;f3I5Zd+hp`yH($|`H^pb z|7PJ!FIB&OWzGZlJhFWGzrMZl^M@byoiO*Y@moK5`R%*zU3*Q-mK}o*$Z1*m`W446 z-eP&>HFMe7g)jd2QqS$HZl8bZb4lmiUEdz{Ywj8CfA0Kh>*m^xAAJ_R?B=f51g6|{ z?v{rieZJ(Oo6mD~b=*8@ap1b|9|+ol->ePJSn%(>xB4Id^D%SV-EU{tT^`>2{==s| z{7I$1@Mzy@@7;W#Z_V0+KA(5%z;j&}cR%`~B4^y9haFO${ORssfUwhd}ADlWe zwS4DO6Gv{oa>pO@z8*35m6sn3PC9x>@h_L$kr$llYkVkg-qRyKy>#)ZxB0(YSpRKp z{{^uhzZiGQ149dYT-STt>zh~peA0?V$MrhotY+6WNAK5`+ke4rpDn7~K6^qze(>83 zS7sk|Rn_Os@9lSYqV4Lb)vsLpm3)c|U!8N&VJ2-?=xu@cfelo><&vQ}?wO{c)kI-%YOnoOjkSk*t>< z+I(c)SyyzwC%k>>&Y#a5IH_*%YpKWY9NhoJe&=j_u~FKua-(DRm!3-(jZL~&fByO@ zU0TPyy>`=}`fJBem_GUvk0bQkmwBt=dDeBFgZ68GxAdN6kDPe*&xhY_U;N5*Z?~WS z$^}b@HMZLxtiN;D1NR3f9Nlg02mS3?zw})5-HrE7Em%6^+U3)v#qEVZRrETjSJ4m8 z-bN!KiC^4~sq z_5rVcR1@6RcF%}M7reK#?>8HUE+~GZ;a2CpukZY5`>J8>C+7{%8M#ltieGkx7QEQ- z;=9v_M_&H)#Rq#HYI|!-#eFI7DfPCx88tHwxapy{HqE$VOGBXlu=`RA-|wFzjmcg2 zLsjl~UtDVYYSLTV)@~WswXJ0M)n`7xYFXsnr*apqj>HZ=?U(TD`@ebZ%jfn#`2Hu0 zj$eA|C%z}Hp0Ts6czBd-2JWHXN7Vckr*?&6`%1op8;P@VKXr zn)Cj3TaWzriRLven=Pa6-#TfZUrNrof9v|jt%GJr$NskI(sRE!;Q8)H-MOp(onPNM z-+Jr8$Gx-kvc9=}4qgyAX~Ez?LyvuWcl~Ai6;tvn&S2Ga@ie@^UwaKZYX!G_CEzP7G#*h4cLY<+(kf9sB?<3H5SpLeSF z-qlB(Rk7*IOU_?vFL{1a_`Vr^*X(OcG5f9Ioz5C7uH+^^QIKH|L<5A-Z4`m8eXR<}34dv@z7Z>%|c#EefjRkm-Q zeS!V<6ZWq;xM%&ln|cqr&C+~!Af7m6-sQdjAA3(5Bw1Bm3}h{P1rlN?6~X5qPWRe9 z-LHG5XL@F5shORb-C^e|^8pJBHNNS2J@efD82k0?&JG_!f-z-`V2P9okqDx(l312e z69o$a!-ugXEEtf5RH9-u0=g*-ASp2C>)v-?zn<9zHvY=i{+NFE-Sf^p_ug~QIrn_@ ze|0JI{AZqj_yc>s^~6ad-~94OjO3&68hYI`O@@Vb!p}AlF_?DyR9Qyfx z-uI`w_B{8+uUz$!f4buzx~_S0_>RM8|Nh-q{q*6(k9_~V+urxU(KmLT@v~q2!M$&L z_J(H$F8I~*!7E;W{WE`d&&qG#x&Edv9(nXFiQ7N-jUH!e?OkpA9>4S5uYc?dHy(W` zJ9BmVvio27+Thb)zvhY0Ulm_@$&POs_|nstpMLl47eDs&ZJ9Tma_#k}UjDB)J@@9% zeRp8b%fENUsRQr4WBl7M{_WV*k} z+aIfxw;q1aPtSPamXik0n%nb(&zwKv|IU3s`0>Fny#MMe`+6^)UEKQJw|?l9)4!Sd z**#mHc>DX-zk1-5ZFil1ZFSu_<@Q_u!|r_X?q^Q=R@!7p8Mb#4Q}J9pooykq}|N8a<$*MIBCC3p6{^czoI{`#CA$t_Qwy?f-`cU*Jx18;ca(@T%v@TuQ?wqyCNOA~EJzxC~3K6%dNFQ2y5)*Fuq z1h%sF+J)|%dT0m)m{TD=O&#;zIaYTMjpqz2vXEd2mEBfS%T)9qE4 zdZduf{hATXn+SGC5hM}H#4te6A`C4;(YMljyhY#I7vuMBM&(iqAgu!EY=EpW*zj24 zU8mucYfB2G3}@VJIOGgr7n*SCZX%W*S1dg_HE!8EcBn5IpPKHbe$xgXS);Wl)U`UZwjybmBQ-@It)6#i?fm5?UoO?4X^0%*zg(5TopuByxz4L>dfi_ z#_!Q9wt+!UGi9V-ddNc`RJRJNV;>AWpKf^NMHeLHOuFQyOJzVlhkih-{-p-E%x3td zCKt+BU&O?71H1~G!WpcU7movoU1%DdS|CA>z2jqA;Lr9HcI*(=u>HI>^w@G69Qf7W z{`1?v(QbK*{p}Zajc3MJcDl>n?)ADmvpz9fT;E?TEViGw19~~|VK=qrtfWe$IQW+9 z7yH|GPLGYW;R|cMYn7D>pkb|5%2mI2t-qbR^upixINfg1D~Q2Q)?>x)y$hQN?`eLbf8uly$gkSybrkhue+NEfWYX$GLxJ16g}=%92gZ=?SuFMBdQv@|ou!m* zyG{yk|5CZmd_He?F6KI2TYYK8z%cYFXn=3!fCTVYFYqHwDpc=p-!(O6?OLw+4gR#% z(~-}$r%xP0Fk7t=f(9PE1%LI9!@ejT8Um)#-;Vw#sZ3|eF3e`_UOU&D>r7?3dovk+ zbtk2zI@YT@w(ECm^;wwc9ZU6EsieJu><+uok=>qdertQWY2YW66yxKY6QfdLdW?_v z4vEw4=+JR~p zAe;uu4gRC-;U{{_PIaljeJv%4n%Z~FRq5?TCV$zJd7ysj09K31Ny`?+KQ#l`v0)mg zSNiY70SdStaM1qtgUHh&;*xO&sy!NSwM7#k9N?-28sJWd5B1_!$aLC;tZnCL7qr7J zfY)GW9pepI{_$2DB%u%QwYpo1Wvpx_meK#Ld{RET8yU_fs ztI%ynp5;3u?`1M5K8By=y7IZ^XL;L>z{}@QplEv5)!7+&))~bmZ+Aue+C7nHT|JpX z6u+KabZpt42)t}A`i*Qp`Ycz7KFiz2H^ixwWWgD4-Gw=_K+dayD2dXEl^(5@Y8H#V z>Cqu;-}daF-CYe;gB&N*OT<;+EWwZS9fhyOzZO z4epff=t^QJp;rctq_Lc&kU~t~cibMWVFy<1y0MFDJGrQ~C#}t0Q~`!|Qnjqt;-!k| z0FTR072ce}x(G}uXj;P0V=lZJ0>nr*soxjss6Qz5#&lUhTp+n5*NYy^hjFy~Np@mK zw^6j)dlb25`nUqo8UP5BK9&z*EF)!BR0%+W6oo)GOkmRBAQI?db3MZvOq^GZjFJQA zFp6ve^ZWUA7YR=hNqw9)P}=#lE|wjy68Mm_Q+-2&he2ubsT_h4`YPnQqE$HNu|uI_)`r2*)~gDJmZRcCg+p6b z%Yf*El4se7i005Xe6Ay7jL>M};W{{)Xm_Hbqw#!rO##w$90n260FGj$t=AqS4g2mD zMoH^c)jH5ivlEp^SU5|tzJf4e507fib|k>iI=Jk?$0(}+r>(5R5Gf^&8A%Jwh*(Zi z+8626=eRr_=)p5ey;A?~Y2Idxr^hlCH&Oc0n(nS`as1j9)5}mpMOk50As)~Wq*lJbB_Y{|% zD#qxwAY$l4l;E0ncnW1QOmAiGOx&FKOlocyVx5 zKq#-u-^P@ys=PMB(US>cAV_^GvR|=34Y(^dmFX0czN^pLAgJGZ_&}r zN&2l7#}}B4DOb)S_-Zt&+8}nD$FW(Ld0lWTtrQ? zOzKE5O{yk3*YDU!P;3T*s#yI1Dy7(-ik>$OyaN_Uc~Ktcz;Z49&tDQp#-LP$}sSAdg5*7qF~ zCwXyWjPQk47^#lOMoKN2&D?j-+M~ zb;?E*6q{!kgJazUhCeri))Gsqr2^Y&-IXIJDd!DI=X6|&iiyBfAp$<^yoRX&V}dDG z@|kCnl8srVMZYwpa|ERoxUg+c#;WaI2ErmsvniD^;{!_Dv7>$TVv{q%@x|;__sN_} z#k47XK#BB!(es;6-wx5D#6SScth8F@E`WLsO%qC2syI~;YjE3igthQcj;%%m^mWn$ z)R`k@ac>RdGYDe1)~tP661?HVP&CKw#-_OK~jo1W>FE7V*;j7S0aO9QB9wu zVzsD|$z1T-lW|cBYA(8jYpKNmKq`h2Z_`#TuTIlWiI`zXAlKlATx{CA%3fn6O*HE< z8C!tNHhQtSRUc$8pQ*sZqZDLC9Nw%d!PT;C6*C%;UlAVasm8ZqXh=F4Y0{FEkeIrv zs#MBgz8O^O3QvTw_l3PE?MiNKL`yNYsMrYbzQS*KMLK(^02EfK zrl}*N5wfllWi<@YO$N}HYxJ>YS9BlLXhl4XQN@#Hv5pv;iG@lDb>FV34%O8RnCChHu*qJzHsV}N9KtRb5uM_)EOwNyt z&CTqVWadW8)WG!Y=)jmX8wT$5chc)3Y!M-{m zrxevB!1JCoct0sw>UA@<1zQp``oLB~F3#MJuaSMOSQcK8J157driW+f(xlbI3=YrC z&d*H2B!pJE-TX=vPQfJk@W{a2SkqfHWwc$46C6`AHZPlz(XrX#=`aQ+0=wr%M#cvw z<|ik{F4Fn=jrQrW;m9@(@0Yzz!wc^kg*_~)f!X0*7cq^RFbB02Ho?-N&<>%T?Z>e( z21h3brY~wD{p|4G*~nN2W_FH_;zQjoRT)C1nWP4CN4A3tfV#l{JeO=g0jRl&Jrk1` zP9UuS##GH`JC7_WF-vGWi0FuMDcM2E(A36HGz|v`HU^YJn)av?gU#vj%-bxIpwxAj z+%~9up}|dA^H)eb!~XTgHwdqqPy!}nDwC9Xt6w!Ce+#*=}Gw%nqDR>)`y-*^@ij&(QG4QD)bH(Qds zFEMN@F;$D|gaa01t&8PdWJ-Ojf$6HDeU&aXSgQ4v%Y>qms`9OFUOJYQ?np|zdCP8U z9ZK{^BRrkZK6<&-(DqcM&sDHODBq{4E!AAqRu~)Ti;A?U=qieu9g(8i_Jw=4lB9Qu z?~omwCT>)#ZGN-mk!)yefK+QlmUD+GKgG0C(L&=>0(qbvE~<-0rOiQCx~Lc}1&|Dp zUMYVdweUtrhK9*n9^qb59y}u7#+1o6EaLj62pHkW8snC%Jc**;g4;Ogf~K4yEDKac z*S416kn-7j3dfSWn6wJ!vye=fkrq(eLRau4k|Ve{PX*e;Nfbnn8}yyR1-jxmIOP7K zcw^k;lnJ^;t_GVPq3M0E(`8~R`(VHGYPRAgQ^KjK_)9d2ypXG_Jk4Q^JA9wf5hka; z?32owq(m8m?qyBL3)~@;^MMv&S(@LBacsymNHAvJ95W_5utfWmiyw3Hv+Clb;6|q` z-*)=KBy2nl*Uv% z_xxb$)NJ{5-Xrh8(p_5V3q1WC!^tnDy-`fZ4ss5lR~sQy;3n2VzO*V9YjvbS`4HCv zrd?Am3s})|fg(j#J>x)WhyDBlTTqM(DUv)?uhl9_1r5znBH7wTNg}%#fo>~{RAaYfE@z_El<5Pb?hu=4rEHy>+CN*6iwED+ z36&Z*F!_<*NTjN=p@m?L!0U8DO3fwW!c=EXs)73vHy|-?_>x^-e}V5Y^&Ks;k-(B( zb&-_F$FLYU9pH%afspj!BNv*1EkdA#PGViqHXpvqFPYN+sm}Q!NwFJ>0Q`@zTDef~K zGrjZ+HBJ)h0mTk8#?s;?~EK2}m(`H$ZPHvP*3v zmrLMMCB%|PLLfbmDW)R~r!FbbS!68LR_koZNB7K3#)AJP;J>9ru;8LgEM!C7V3jqk zv49itD&w1v@G@h;KzrXcEj4v9r(_pnMTyIfzK+!kOa^bR$|TE4_0Ueyp2DwrhDzQV zv0XMqatAd{c7~?}OHS&u-B(u{j=t~`$E>=+;WUE?N+1{;4P``7aDCPc_@lsnTEfI^^uP_=nzKj?U2aaGN+P)4RntvVJZEobq7Q!R!sNo6T2z*Ov{ zRu=SJ6~7dm_WT)tv$YglpD?e8@(6UxWuc(y{F0+6Z2iTrdOo>jHCR-28chU+qbEjw zTquYuH|1bPNwpYK(vTHF0#+y@$g<{0j|klpVM_g4 z2^S-tg1$?+_yfs1e6j?@YnGXqxo8m)#jhlfL|>S;l9^(Lp@8BJLjG?&LxBuI_k7L% z_*Pt0rkLS)38LRBD4b;jjInou;F%Empp&HV3=aVc;tZ7At`jC;gp+^(h!$%R3rHueh?%817#H_HiE$_?4=H^Som`}L^L+LfpmDq=y zSBznii;j(A9NGM&F0o^Q4P%+AoQrpY*^iksiCju?GpdCvS4bUmLp9PE<}~pRx+GG? zd}Y4%(9P?2uTsIJLJb$gQArXtO=CcHRi7j58sz!Hep`m}L{6GuC2BVk(N{&};azMx zYM6D8+0TIPznU~KZM);H%x1$>tp0C%U;ov{k*s}x)?YD8_FYR@Qb0DuF>y8ogTsxD zeE=snyPKmkNF$gSX}B8681K#h{&szKbK8<@1MWVSP{U$=Hf#H{8O7bCbjR}) zMI)h+eS(Z%y8{>16R%j0a+7B!x)W6#n26QNP&m= z^9-FkO}{%Ei7~nfide46WYiqC+7%h(=g(ZW*!n=C%pCDrxfEytn2{iD_`TPvv%34O z%qjqw?7=+F&Nfcx#a4|58n?w9=)PBz8@$FK+jamoAmqLdoUsPM-N;%@>diV(Fr0I+ za*imJ*{$fH2C-$1fV!(~1;3j|7C2RD99p03M8WpCqCA4AspXTokwIYRSY>f{g0IHt zZY=G1=^EZl(lI*;1(nA75@E>k4nz89Udl9K_`189V$d{i5IKE@c{xa@fUR^3dp_|i z(f3n#2rU#0f~PaIp%%o*@w1O%?hE}sHA|{N@fnL(RXc>SgbNWK#vUR96CzSzBp?eH zZbIq{faur=2eOnp?)H{ffynPdhrqbR?g{P+P^WZ-nvn8J>7WPJ)MUmyh zOy^2`FAMy(#=*N_HQd!%8>r(IcP;PBw(g|%2YPS?erKGxy6O3@$>@c^BLHE9CTJGj zoeI(9V|JLqYEvzu3Z`hagK-;X1XQP?5qEurzX$^+O~yf)sS?F!w6hwaUtlNEM0#}0 zdLOg;-m;NfRNlhJ*aI@uqUVoVP9t_3pSSI5QgbTl-2ja?G`i>%_F2MHbh+Bl29_c;!?g}tkMmvVpbgevor5;mhPaHb z^g_(1+l>Yx#Oso-$-qkSm?0_E@?vMN0+qn3ds5UpPkVV>=$9(erk>f45B2k*^}J=s{=?Y-H4zy1#1 zY`=4q3q)2nR~4*nH8tT-VR;Z`651C~x94w37p@yVb2rwDU{YrcYb|y)YwQ0dUClDH z{dF@9>xx>APz6xTG8b|X46xFL+(>TkL|*DbZY040a;Sq|??hhWLXOQ^E1by7UC3h9 zs&yit)>u^SY7r@5y~v?uQ!R*i1!m6+86qH5pc`7nJ(!M;D6NODNwlH7zs+o^T7Pd> zD_vAF$bZPc4!8fwP}jkE7P%Kgr;730{fP078IdYm9v0V0LyOTi_%WIW-#JX(ix7Wf zi-Se1eqp0b8{ZcxzU1zbh7=StIZdyng0@|F)PQrhur7pCMAU_-#I~pT;l}aU0Pl$z z9nNlxqslKrFbt35bUs1y0d%S$ZIP}knHb_Z0mT&3U!y(fO6s>>Lx)3cwyZ^2CW3>tI-BH32kEwEVx_)Se_@tPBH3G6$rsDrc6eq zjZiNKFEsQ~CcluliPswpfWZ2xsSU9+@MSot(nbL0Zd%E{Lg!zqPVYb}Hxi~oq8p{G zEN^lXXQ*qW8GpCVxB)tijU<>zQvH7E+XU{2Z%jvPj!y)L5eOO z6dQOzhO$+zEXcVsxWFqE=dy>;M!u_|y?P?jcyxU;IBESNj?Wqns%Bbtvb=b@Kc{X=}0kq~Cf_tpdwE&d|XL|GAy zU6Ub9(|9P+;MhpK%PBzaRK1pJ&0pxc+zI@rVyO#EYp#9>JXH@_m8CC9ny_gg9JP@w z=4b)Agki=g-6$Y63dk>}YJ&#v2Dw|mr*KO0Om?huVfxF&)V)Uf8M zYcaHnw9V7$<#l=^Q(1EpgCSg|IJS9xU@6EZh6iBO^g^VWH$fs0*t>2sa)2!WC*-yL zAm=KZW?6?(nPDz!dQjliFI2mD`(_-lEULfiT&jQzzkm+y2-#-Qg*+s7T;?zZ)C}w! zR!Z4EM3+x))k!vcs_$U6;IGwrxsxvym!vIhaN!pGq-I;Bfn!7ieXS)qN2GO0ddh7* zxskuH;>>Lr+Aa3yMr{FL!XhjHN5dHhv^vfH$S{sP6-jYDv9>c_LzajK(Pu>3UzxcNbh`V)m3Ufj>2!}4dJSd`HwLj94KB>l zU1!Ltc;(wc@IR<32o6{x;H+V>-a~3EbOc!Pw2VzLy5i9bD+IVPis{&s#{{&TIGwzO zG9Sm~1zhZLD{ZhHG8n4UON4$73cMDY;Cc(%T)Wr!U$;3*if^unPpaSPoyP z!!9fd{ofTJa~S<^c*(s#$Ug$pzygg9?g@!;VfC;_6}4e?*n6+e(RaJ#M93INp~H80 zfq(^fdBcsuu(3p||zUKA`>?L|ptCQq85l~wW6B{v#KFCY5 zj%CawACnD4EL+UmHD_>xWeTIa9mLRVF)Shg;41$cs){nCW;o%LLo=J}aL0AB!@UHB zl1r+#P=`KORA0p6Ua~p$7e1Y%@dDT4DIv^>#$t?UJ@f^~8v&qT5 z(g&LIw(&b!Pfi>)HWw*Wug-!c6+PJ`LylYK`Pf}ux#%;A8%2tENhaiO4rMiXe8(5| zB^L(atiCWx=7LKQ__C1nW6^GZ#DvF8o=2TQ@;WOk5Z465s!Eg_QL}haedR{k;g#bl z6t-fSo6RR#McOMS8>4e6B@Z5pX9&F}vGEfK;YF5|e zi4e~~kcp@+>}~-XzQnm1GV)NZCx}L*vqpSuYFRYHPDXbcIaD!t_^2#Rx`BQuJ9zGo zorDe>=?iTt_B#lT4RO9yRsu3b1rvylcbJO2l64}zgux^mETx^mtEhdO?8!jm!+owq zFuyu_mgEq_X6!?}BI0F_3x)y_7H~pve9z1acD#;HFt1w0D#7xP*hRcCW!&g)C z)pQ#ia|66^5R`{(ohFSM->`I%V_eWJ1BX#ict+<1h zT)qOk`iEb_h zemEAoQUYRK^8%|yd`huP88ag^gRv}I?0kcSTKOA77fJNA+eY&Voq6Qq78nY1e4JV7 z*Y-ONr8uajAYd6LKhy@e=iP-Y1qe1KJt?ly@DsbMwJ#cJoJNC^)8Q*@-ipPmZ5|$A z7sZrpN$QXkO(SDy9h%vIyJVUUZgzZe17xAjCQ+e$1~G8MkASFjgg!QX;n{kcsdJg5 zHO1_BvPuE4SBX!(eql1?$3k0!PhAfKJGglUH7rAd;z2b62k7 z8pxkdmNgK!$GjA)8?FtUPg;jGgS>iRe#2Zj>1^?eX%irso^X6%`pRR_#DpLss&a4Q-43>~6 zNTh#39##xXu32gn0%U1HtF35}XWE(@t}%3)9eo_=%Nksm8i(~W?;ypvf?)VVF0T4> zccC6t8$6SSi3_Z9ly$)zVTORN)RG-VFc3EE%&R=LP97T^k15nHA%5Y8=9S$ak)a+J z)>Iw3)o?Dj>bsFgI)mEr5X}cWx_~(GV>KU0q#P+cPDP&GPE|2V5~hc>8p=t=syGw} z8CaNn8C@7?#t=y40Gc3PcuF%HB<_oJk1+WJ9#;S>oK~z8cu~nS9UVN9r+F-!<-nUt zLk+VT$u$+V%1bTL(sYML6fOXB; zSsTvjUJ`{<#->t^Ol24)R`}m@u*Tu}!M&kGLBuef3>l zuud>pKu?X^n1iTh7mKE?n^| z23b8YR~Ega6qt|=ifWpaCk%0I?Qnq0H9tcRp7ad`jI)Ii^|#q7ve=~*rnEZSRlP=T z>I{5m`*~VNf$Gk;L1q69@2;?_cLd$G^+?U~$pc(+3Rj2d&J78x?CPY{8EZYXzm z1=s5hSzCwa+M|3|?35cAiRQ-R7<_vs;GjDYwFF_U(gVqw<})$r z)CVgkm|xD##B*ooA>4zocB>$-*tpkh#U=^FPLuK!>|Z#779Z;)!tTl?F3#Z{WaOa4 zpwU(%9;=Tq-cqSF%+Ir6QQImEfYY^ijyc~kUNL6-08Jk(8$uw-rSM6s^^mnxwPUU8g6fWeVYFDk4i#ssnnYAlo#s%RKR z$=v=n`f3Ue_m2WWo!t$ZL`cx;Ok+zRu5eOjQ+MgHVT!UeHNxFQ=7FT6J4jv%vvH*F ztD-a`yW*&>P}MKa7(oJe6#ylYO+WP=ywB~5PNG?^Z7UP}W-Yw$O_kKD!=MH~0y{7^naD`Hh@mbj4+o>E~^ za_Nx-zoY`wH;5G<4G>-RnxSn=t79$MyN@b@u6D81$7dU2B1<9HlH9vTiNBNHqeM*%c36}4Cw&nL*hjRY}Skd|6Flay*9 z=IzxROUvKh*yoB{hp3=&ceDvKK2!E3%&2Vp3ALHT$jqJ#peoE6a3h z5VJLW4S^N&D--fn+1osr^HMIJ;_I@b0+wdXhdxR#OXL}#44fdK3@DA-T9gK7)>e!l z&X6p2iuE7!3B^g>tKc~UxA!dQ)I2tw+{9wMQ7>A4YdN}_lI~+M)gB6VD@fMvC+ z#Vi~kRU1_Bd$X(@P1hHICpAGU6gTD-c(1qAV2-hb)Jp)yf(91{G0CEHfnCMXJOFbw z;yQ3^a4wJlN-V@8qD=b0NCujj5F3vt^_N+HDF~ae0yT`s2$HU#UJx+Cu=_M{cPr36 zq>!sZ!$QB%Eg{;5t?+{(+R?aDR0{LD#0YJaE-MkUZ=R^(OnJfo79f zXZJ`@7We@DbEQv$In7H0j*o*|eJ&B<@Q1m;#lactQTyS0i_B9cTN*<*>0w-qVqnj& zu!^G0v?$&~CT!BSTo=BkkLRd8L^V2Xr-0bixq9C0Q1g>Exg$5NO~*9ZALzUrN|b0Y z!ihoAiANjfiXhf!9A~Cz(RyxylnDKqrCSzp8z-9P(6balj}J)p5lGWu3)_|0#V9=t zRus4c`7kF3Kd@_y34&QPBAF8*3dX6sGtK71EQCCNbVz_O-}sOKH<*=>fNX*aBK8-R zCi^N2K8ZW#{UY0x5gwR?V#x6ZgxsW?tZLyrj?H*rh3k&xV;YD;f#%oa@|ggoipxih zd^I#bP)+_IG5v%jroBH{Ojog(_CAQll(iS)1YSX7x4j_3$S7>I!8lJhgls?XcMj_BMcBDu4=+H^A(9fao#Kp_@szKYbT^a13KY=EoBYa;cC1n|c^}cAGN}>L@FIep zG(A~9$Zm60Mch&*9?glQe!LO5s_-mVionohr(9m8YvUCg;|zV*qD2Uuj@MpI7ZeW5 z4KdDkmTMtTFYE`YvbvroMQ!19m5`2pAkBx86!0YnPfH(Q7I9D@L;4K{6MvyJ zzUoz*;eQ3fl!6Z7;1~!JluaUm`;Uxz;FJK@s9K)QYJ;+`Afelk5nOOXoep_W#giw8 zyauXqGCHE#qo?o$fvYyNV=QWCkf$Wtv;RLsHtkXWaga?zlVTy8M!Wbx$mT-Ez*^8| zgvG1}Vp^3aS`7c{Kup`r-bVs4L#zJ6c~-R)`x1n#8TQpHP?={8BxE8TG$BsYD|RD! zQ>V~mcb6OH6`9EZ4cm~JnD16iX7B&`Y_>H6W^84z(>hnq{l5S{Bw8ai@DLHumZ&U1 zhp?i28*~Vj#px4L1dm-6WiCh@!F=Vz;U(w6g!?Af=CfE^j%17A0FBru3>Gg6-u&2V zQMs;$7(FTtmCfKP#)3F9U{+lBA^Yf}TUjGo*7c~7+e1bOPO}s>vJf(YlWH8hH1XiW zJ9qQ+HuGUp!TjUQ`LqTQ(3lHz#l-YaU`KVtYOY6!$}&q$N%+MhX#iaV*F{Vo#(AR! zKSYB(%CcdgO)wLhy-r*?HATSK@$(o-AIY5G6*+Th5rEu)7wPoPosM#8D|kQ2BhgNb z9UqSJDcF~75@}6?X}vUvCPE*II6Jd(N|gEx5CpN46lctM3AfCPd^9r(T0lfQ1WyT9 z+*SBG6{W7w&ZgE)EtOxOI06RDLdNTQmV9gVbL$22Q?e`(mhHPXKvCUc3rN(Nbd0 zqshdpGFfu>>A8oliRNWK!_YF|I!9yU=R%y~PQ!fKGIK+RsPgw|;4NF+*fkdodemf+ z>l~=aIlLJ-Ony6Pm2BZ%YNNV240YhhP9Nk77eA!AIhyR`N~2+jQK4*B1z>pLmhLmb z>%+tpWUC-QS(Q7I`J@Ogpo7X}G(HQ4l?$}`<#dHa&WR+NE5m6M?5K|j^RZp$eMldrx4 znU{xw-*_(E;u5)1d3^Sp11sZ-5Gii6;w(Z}LVylQK(Ev-gB^Bj>k3en9(BIT%H3WH ztF&g%1aZVcBCY}Dm{X6d&}c)8J71GioI+(x@^|meH3{H{ZP-z?!w}&X7Qt>o_etEd z=%-WnETNzR4=o-&wWYYVhWBR|DjTJ!(aE zB39G5ZWDm)Bhk>b6?rIv>>Z`e130vBFpG;tglef6LdK*a%WO^_DFYxf1Hy5^u=PML z3A$5w7N+wop!rFqFMG#(LV4i75sp~0e?qW*b=r}kU;z|0W0YNgoW7HWx#PbKU~KW( z=+6;`NxF8ugwt3mN2DtGA_V3d6wIS-P{oN2v7ztn8(NlNkoh#`mtB1mA^{fAE%b-X zUUI?FrifmK=-#>kp&Uc-GnO*AaH4u3K6(#Yh6y4Ya)<~PIPiRODcP$yl?&j`EC@uZ zz>UePlkn6FTLn-2#;uYnBy$(jMirw)kXWMh4U_(oDi0xAaJlm-+QqX(*Z?^$1=Yn@ zK%G~=j=5;K-@B`43aMZiyi;1|ut}>UOlDOOy>3cz$?^?~y%~Us5rzQMx-hK_X(?vU zYdUqqNG%3lz1dn%1M!SzY_uR3h+3uHwBnM#EHl!9%0h+hji@I`+eX|Z%xkT;>&nR; z!=~-H2ND{F9MBLq0V_|K=Ku#9c^(iG#@aE8pnL{-4iJqlR}L@roV+r?kZx?85a^|N zg*E?MAq|NSLEr8gzcIyC$p~9djy?OuM8G#mr$oNBv+l1g7-4LV>PT06_OF55hSUoS z5{kDY1MclrxA}y55<%!B2fN3~Iu%owqx>!@${C>;q>YdOjWWnzz8Kh@qwi|G0^luZ ztR<&Z!M7NY!O^W zE>=ccvY||}9x?`ZpR&d+qGseA(IKuQM7k;(^%|x zCGxhOWzyR!@J5&FiEM)6V{f3{9%K`wtY<=orYFcUKFWIZzju`3rC!<=JuI>oUb<%+TAEbd4gqVwUH{7=`#D9rmWrdLY2yOsu zQUcK;zD4d^xU=7`22G}@@I91LbG7AliL(MqH zv!}R|G|?d_ljn%f?*%df%mpFvkZ%1p=%c#DMGoTSIXEf#s27#g$=GQ}Ef_MMG(wHa zastDJkYS;8#^^dA=YlJ0X?*Mk)zOCKSCyvJ2F(lI4eHv*=zTiFl(!A8}E*mC(o2*z^`9Ylq|Ht(N>^ejeV|qbAy)qG+(l}6q z$0|4t%|7>xJzht}5h1nbB7K_|(sz#;oK_KJ5U{u(t(3E2vz$v3Pm_=HltE3vb z?>l$C+;=XFAEO+&Y_cRXd zq?r1a!LlO2&5Uov{`?ekWONZRah#31lThRd+5^hMc-Cn>P>)Cy$asRRQm8vypu~9P zHaxu|Ac89Et=wrKC!&lG_D*v~d%mqRi{!Y$ArWD9fYz(Y+ia49Ty9rn$Rv21-I9~o z%1dOGKUQC5QPy+~spBS(%DaR&Rvz{0a`ONJEW`n3rK3AI<&xQrZ zq5e{w$soNH6iBUj0vq0{{lH=c+lvqZO1?MudG|D~!|r1x2g7Ewu6kO%fiS(r>4KGThZ#2PA#4NL=Z0|6p&p6y5855YP4gEHj z-&zgWmoP|31d>fL^`7oHa*8kwS1M_>bu`+tj_K)tL-p>h+v z13g`^1|HfE`pV6l;A1AvfFMfb2a{oO%I)F%3@RGStN^RkK<2r-MXns6A+I@8h z54rndfmlv|G6=~5KO}kv=~NO!>k8X^oNOdb@aat7X2TYB;^l!a|MZO|V0uMbgd3n_Sjh?LSXY zF=RG(D2jT-3vu%cZo%Ozs9WDiA?lD6dgBsfFoZ%~@hRdRsBMOXw+_Qns+~ZZD|k+t z^{BJ?W$ntMOo9cd0Fdhn$EZm+9W-x>nY?zqdv58!`rh@`9U{;AKfXNve)st0>myuO z-l^Bp^3Ll1SXa9 zbddEnoECaMN16-<)!^+%*-KnuTU6NkgsP+x*SUUEth5R5q>#^I;Eu~baUt7Oh#V;l z4u+C&37BHsP*W^DXNcqLqq_02z+=R(4pln$zUVxNrBJdewXqoeYBL*0sg0}8qWeb} z1u~*HEv`geJ4?%a;GMl4w=(E4Edcb{f=uZ7=*F9q!TR5(Y{}xAWPvXieBqyH){~ms z{Ea}wkpgV8#+hlY@TG79S{hyTs8u`9`k)Xra1hH)F{j&vcp&vSUZmQnNQ1*(*a{&2 zQ3z-G^Yd(S3$IN;dO$sCFXOG<6N67_gYhH~VWQ-2K7dl)7@nV2!c{WzeDZP)<0XH0suz1U*a^TQ5Y#WZ=JYEP2ipoWLGj6L@QjEHw6cM^a?ji>fddJe@a@S4_V?eNJLRrcL}?U@)|FS zAPlcx!5HG!SRy#X0smmeZ~1|&FFL~TaZ=9!eq9$amo6_0jkvMrwr0yLlo;MK@QFmm zoe!#~9;y6qd{hx50IzJ<;){aPJV7n_wBGY3U}#IIS@qOl4JMk~{WW9+D$;=aBn1)g z&TQ&bPVX(LpfMTN4VP3Qi_o8nTf$}guSxQ?wf4^pl zgbj^j)xB?+_`1xUj7UHMHbC6`6%6~Z7|i+Z;reoXu$OFpxz%g)14D7^c7m_?(`Gs zrA!GFi;-qLhd{DUQ^*t+mkBq-2fErfrC2{WYrT zp8s-9qN`KQmh?EeH@b&y8U=~kNq=%LZI9O4$-N7DhVyE71o{yqdy+RcFW`-1dc!A% z_ZjE?lgDeg*X|wMV=hqFig$pngJGyG{L6ziq}j`|O2ArCq20Ani{7V{o=L8jYI1WY z+je0n*U~k^lE$tbWqDk?UaQdEMiEg#DnMG~>@3bWTZ5O+h-Y+r>i(KS$>ENS&L{EL zP_iaoHv-F&?JwktpaA;?E?GE9aCoaYuV>pg>`XeOw1$~?kHh;SRcHWrNN93Y5_nwB z-{Y&;@?j2?UCgiO1ppPwxu*jpb<`#~0now1LU%;W%N}Z)z@y-7wX&Vrpy!GoWaB`r zCGp-S${ooI<+IS>{^Q~}Q4g3U+!Obv_uQ(!zDEl-y=UE0%vA+H+`kt%{wRpf&Ecfb z7=MmEuz6&quWs0Y(3eL8U>1O;OUr;jZqa~*>Rv^N4ONPPCO8__%Pu*4^WkGN!$XSf7Z$s>gYY_zWw3Dm+3PVJpd^d1Svl0-# zCX8Z68KNPerlF*4Es?0Srr{~;IuCNOoxdMkLRd>N2|{lC5TMho1lon7%!1|x1JX`@ znR9aHWQ5N)M>w)g_>D%L$|&oG6z7}y!oe1Goe~8R5&(^cJa*vKa37w)Ai8q<@M~+w zwbgya6A9H(bhWE-N4O#-UTA0=?MXaP>rB+Dox-j44a=g2StJVHrok8uIqn-4aOt=B zaM2!DF1D5Xmuj_JxPJfMa`W1_+xq=0GGa6&0tAij2v@!j5kqbR&ZEsQdwLUI%8{zqYudDQA(n+5#xwg=r2?pA zIIZYfnH8fvo7}K!aEy-_Q$Achv!|sNEay9x2VPk$j|}Q2D1tF=NMI&cR9&VxD%Xsq z;)5NR2mp@jpALygX4m;3^8qwk7V8WEJ`+-ZI}ybwNRQl3wjW|V^JeeS_Y9;In37wF zu8Q;wAs8U4S@5}LWkU*Dv^rapYi@-?_ByB@WoU|tF~i_pRvJe*)8dBlvV_VohMJAo zpWoRuP({y6O)=vh8a6A6gg6WqZ=5olUHNpd!QSy%UOzs6D^hA{%GMecmu(Xj6}Orh zu*_=G{MnA&J=%|yI4?K(#2uMC%#tC*ol+S+x~n04RfW)HXec^H*t4gR^(fy8?Xuy7 zi9qod)yubd+nq?qZA*Ix#Z{iwR_3hmj}|v=FrM10DuYI^2?{I-x6;=^R)kjeW}ugeva!S~~4rGHRLEEE_sDJReCH zlqTE)*lEf6*mi0Y=MrN>ykD$Xj-?SS>cX$@FeQZ*=7(t^u@0I^Lvp*Ku0Nu-qVb8F zT{}n>du_C|c);56hy@W7t4fnm&jZ+kQ-(J6xDR&-2^P%)M9XAWm_tx#f(V7g`n$;x zCpy|VpBYUxdpAJL4Bakr#&y$o3{5luh#*pd%@Rp-qopQ6kVY6xNByg$-yuC80PcdE z)_@1#sT*Au*IL$m;>HXJ!x3l&D~j3lOM~6#WDc1kG11O=&0JG-b>{L&+7W)k7&c4o z9q<77PiNU66{HxyR8Hhq6rk|9eq&0!&X`j|gGIu`>6V)bO|3}X7U2Y&OSO0>e9Ps# zu3RBtE-yQVWrIN}_4^D`C^9L6W~1X*;U!Gkp_Cq8bYmOq<&Yr&vD?Xs;>vys27$U} z#^F4x9S3|2MJ}mkHOjswfQ#Z_&X;>n$G)ovJf2y>CucdIZJ$aH4n;nC5h&8B&NF|yrVv{LqOCPG< z5w@4P?2@mzN-LoZUGuDP+P1Yg;$+E!fG{Z^fwN#iN`f_OE)XMe)Swzcd>A0w)ruMf z4W;7p;kb9%nky~?Zfy_h?*W6FeK%+mxOB>L9{kBRhP=J_Oy`X>uz9sTU_fIG?zD@- zuDDsLbfvmoC`$szKrL)3mgSq7(>9|4!KpRW#PLw82sG8p`;IH{eVu$>6TwHo`g}(9qS4A@7N>`EYE4wBFoQaRl{c zc$1A!!Hu;Wyen65_!0K~fXqFT+Wkg0AC>Y=4B#zxFvnY;>~?(^Jr0_>_kuF%;QGI;1>h(SoXW4 z`a^md9k)cYpLvbP^^1N#%iQ?4aEVbza|-7+k(LOo){DI|G~s56m>@9-@8Iz0@Z`I8 zM20KGbfWYc@`Whdn&$@%lXdd~#k+w`KSc~kkXP6p!*O}CPS9yxQzTt3sW_o-L2&?9 zB0iJBXos$7i}Cg+8V!QCm2<0b6t6jKFvlzPBm>I|rPLw4GWVf>!|Z&TM$S&y-$GST zxIF~gbj+c|(G`J_DtmMHJ1XYfprYLWBh@|9En(chcV=tu4NXg-6u4r5VoSFuCvqEQ zF^alp1V=L)f$E0MOC(#Q7liTLo+`5nmkC(csqx_g)yQ;$)1x@(x$X(k3~r>8{r> zxNec_^w5~XV9R(D7@JwzRf6|y3;`G{emy%RkkVyi5U{1&i``{qdu#B7;#aQ${R~~u z^n2RU9a#y)c;PWtsb(a@;GApin4c?sL^GD`V@tfn zjL&{77M&MtuYzM`xjqF?*vlAgfl3|R(YXi6U5=t_tZE} zB7?0e!IsXP?u`hYQn!?!DHz8^^He`Yd#{gMt0g{fyIakWtYv;DpZFa^9uey!Bl8W; z06oun-T+<1#R+WzGpoX7#EttP8)j8*VB=m=uaq5ZnviJtf<@1io<_)Kre*4WRsd89 zx~;@ylWr-&*~&y?5J3hCBUj86T)^iDOXR3GyjQ-|tE3FSQS3XL%QVWY7%i6#JXt`b z+uUr4P_uVkZHZUyVKON>xeN|n6Wj@h);V+$T<2vL@D?vFn1i>)q^7wFQZQ&R-`zO| z>sOLavk!xgxiQf0gL*WbSr!Ovok2vnK>-IYjt&z;v1&_QkiBWySP;;Kn_K8F!6?Hk z8p%a{Co$lj9SH>1qTFgEoG=?@om0mvumR1w6-}sOUf?ng;h{L7f+Wt#`hfK)$(00D z`HPa#FJvgDW<3~F3jwRVz0p`@?a;JI8Y*Y*!pSDuQjEXD1R`#AGpRz@Bf;IAPa#tU zq0xx!lpr|4r5+>L5wWl=O|0AM=ykg5u8?D%J-Ohc8yW{zuo=i7c1b)Gupi9(p+GtFd&Kru|zGos1R5*706pyGHv_|0770_4o)>EMDB15>^ypIM9+J0<5O>vGlg z7pbVWZpuG%)7BA>%=xs${G8&ufna4$>#*U$qSb;|nGhoIhP?~X z4u%*z7$fQOnQT3eh771^&`qfb0&X#8k+0n6JSUCs;|e{HFg;5a^)h?G$X^%R78e#9 zsWtPR3=lom9A>S$9CBXt7ck4RF0caE^P6IBC>#(2C#C{I)S-GpD+Cw^ly$l^F$%sd zV)~+yKrjy@6?s(0q+&ztJ8p9kcY*txN z-LFS4q4-q6mx|XCWdK1F0j0z;v4>6RPwSS*vKOwGt*H}E7RL|6p$dXTE2DL;w+Yy2 z*MUmK3rZ_n^n%=|Kt~cCPFSpmZ&N2HfSjxFR4RlP@wb@ zWEzt`h$B#=Y(npsaqn5361Qlrm2w?G$MbRRVXFCL#~^9WGgXLCUE+O@4w_6}S`)QM*zng%Hw?6&)r{lM6!$XhZ^K zgF4G7N7B-m9mu3gs!i;TRK*Z0eiPz@$$14Z=sB|TGYYXF%SV85Om76nDUdLOXRa1_ zsPYNNpCz{{hV1yOD+0AUk>&^}#cXQe9m#@J&|X^N({3L`3H^xDUI>$Dtk{!kHB4Gg z%w%c!1vrm2@N*Lvt}VoOs^2hZ5`k6Alx!;y-IqhT^b zTAEJM%id)nu9f3QiZLK zF2ewW(rt@{ED&WDu|AMj=u-47yVu|pfk%W)hhk4|uG1R}lekI7z%ydfD1)|WIhuW7 znJFE?S#|O*jO3LR@IHnYziEe2r-ZXQta|-l6X-I9U?jZM?ZVp~SD+4+hBVOqFW|`( zY46!a8OAx(_i1}F{ii4Qs!cs8H|qbM=VX*XGBdV7iy+p51x`4rX*4?0kZ3Z6i`-?7 zt_-Ab+dJNKPkM_p4*Hy@Zwye_krVX-*?5hI0GntYOJJrS=;Vn^K@&_=(!mY2G|}A$ z0l$6Lt0k0@aJ;SLPfwElmj|unpR#o0l6gv__jc&TF@%X{7kx5xDWTUTWY8PP{cu7KPVsfPvY zr1muk82Il^iTZMX_h`Y=7y;^HLYWz%>ULc*`u0>j^Z|w^5vEgnp+LkGdErW-{75&f5H?5&hGFt1~fk=Dzu0Dd6@9bYa!jk64Cf z>(kqJ+xWWc4e4jJ@l^m!2d?Z_)2u@@-ENn66extGV{XyhGr7S4ElF&i*%U0B?EU6w zJ(JJ3@b_HcxjN(YR}@Xordbi&E5!p4Ts@(A`GlgumWngHQYgS1RwTI3w-pFjO^rBk z->Wcif4e2RdV}+l!d)S3p10fK)!nmfhu75uTb#Lb%`WFH4xPdGp(ouW>~yrbscmJGK8w^KLCpymf~%K4N0(=jJnlfY?Raq<#`dRq~HU#4w2? z)5M2b?W9SMwfPz38s!W}ZFJ%kBOSq3ORF=}PbHap?2grXqJOuo$L>AbueNNlVB_ef z@eynF{qJeRr2kDS&;8*G#BZs@R{I|drm3k_wLhSLK~`JppQ*ooP5cwq`x15pq|iBMSo<-x(p{%QZ)!_yN`M&0jC zU{YKs8!Bc?5r<}AR67@d*}8j0t7w~~oLD=Q6q+umg+tSr7I1G0YKW}QlIarkU$ick zP>{sB5sMSq9tn8UcH?t!;zmYCDdhZzKA=+YSw50sYt{^DEBVV`Dn)fR&`i0EY{vB@ zrke?msut1oL|IeSp7B)Us_V2 z)UGb)GjLvv8aRi4l1aqvb$A4&?>?vLi`R8$141rb`So-AS;8wqFw-)n!7qrWlSvAG zLDZEDeOMapV?V^^*VwF48CCOac;ksi4W7$KK%`W&o=H-DlBF9hqFXK9aN#a1VbQ`} z_Rivk`_W6cKU-1KEtf7YTwpwdrTbaN$cDQySFIK$%YenTbFq9TRtS*gptidRkCo$p zClf&J*t5`Zrz~7i@rr#mKR>_G3uGzhf|n_;PY<8>ze8!FUmm^eKYjh;#ZUdG`+Luc zADq1E%C^xb;K@HhmmSW>1=RoHy}=ehbqkfGpWti;#+g1vc5>a46XAB1zlPA?vCNcKuFDYyALUnnaCJE^ z;eU-^y|l;wf~f&T{dX{4|MADaJO3L4fBWzZjFOXVFe|2=LFYktqucA0)4}IpWx@aJ zj?=3Tu4BXf+unYN|8@W3|89QK>;1>(gUtsIwtEjA^tRpiy^XES2mi70dknxF5X7#^ zX;I9UJ-6!jxO4v||8Vzgc6;3owA-Fv7H8=tan}c2x^(REjnaH$u1S?I_G=!(yHxP) zUU78;UjWvJYvyYDkp6WF4$0t!MPGv}Ec^zg6Mgl5fM_E50DvU^yPr*`w1aTY$` z?b$b^1XG<3i zIYhL@s56D1e47~o7Jj^rYI0BiHuC>!(9I{mjr`wu@WpmT{(rHx`G@@f9sW59Kg!=d z`G)@cO(T1k4f^t>`S4A{tpc~XpL|3A{iabmeKZ@&xAxOF4S~(UFaGau8jYiLoINH; z;8RbCMc>q6!x}%3&G>Qh4I9f`A;;u?Egv_Y=V#^Pr1SjG|D>9K#lLM^+&7o+8+(Wd za!(%q`JcW$zy6^y-fI6tmX+?{!|PbS|2MaLz0J!0f3W? znFN!qQ8zEv@M1ZEn`Ll!Z`5Dg@n3LvhdbvYa{*sY1DG#;5H<7fn;SnTPn-gfrP;yeFa|7d^zY5(cr-YMUldkK`j#(^fTlC^f=Z4WYvQi?KqW39cwKaVi? z;NJ$lf#!2mfh%nlRS3*?Z}jL5jDxAK!;tl39S`V@8cJFBD!$=U z3eX!5=?$BMJ8G5BDnM^+NgXhk=?uB3*j2gK#y9xr;kTNdZF*x3E(48POgF4aKDwH% z2B~`zuV6esPJ3%KmS>yP*Xgkl-5>B9g1J6PHb^Hduk+d9A|V@4lU+&xp=z}Rl!LyM z-ec_enVUAgv*Fhd>1!(V{*z>Lr}nW&(PO>JW6Tr#IC$&<{r2mUmO}qNu&K#cUr9r5 z)8vJZ*EgLWU)6rfrTGyZczCxCJiJ>69yHuq{1c!=O(t8n)t* znpdq`50a0zlK=T1`^DkWL93>KFKq!(lSxQg^Z4dQ{JhTzTK9M_e!PAyI6hL6dxdkBM*RS$aoANTgD z2-gjWetMAupt2avlD*`3KIxo75@g8^3{CzKu`Fc*Ad(_00ka8lp|m>IDbxx`93;s& zK#(y`fy~B~43>GAG=C@zA2ObBDTlMt6J9Yb`v&1rFKjjph*Xl7KDQ$=DM;rrj{ga* z>L2z&9o&2MQ~mOAisRtwrb+qHB)J*D%dvC>p08sfEIznA9(|o3rymfO4ll}_0Cbrt z95)1n%coi4;n0+c?f!j8QcK0%zmKSubSni>s!zCE9}N*UEg{O`h{QoBHAYGtY2{GlV6gr@VVrd`}Ymt8waA?{QECI zLsQG1`$L8!>8~E{eYw}~gJe0KJ6YzoqPxOwZX?1A(_Y}MRVAdmo&Ifa_xbaedky=}7`+)z zv}kNU$)+KZ)Z63-PDVj40K}&YQhJn5xdiu<$GB6y}6oe1X4mGKCZT3iEOia=DO z{2fI*(ktEM$8-uI4Ug@&ngRkT1;NukgTMuBh@kwD>={O(m<}^cW(MAw1hUdWSQsjBgWO1)RBVasokM@*oER!rVHQUI}B7Es16l4K6200Py1E>B|#kqJW4~ zpqGH0;>d6^OG^aXzdYec7;QZAP9r*zs6jXrkOnt$HazCTLU@IoCfCLEjf5RCZr_x{ z5yMC+^YY~LUN?DNhNl*XpYu}SNr?mnIr@^OOd}?YGtBKd;0EJtDUD$2ArR;ZzljnW zc?{eXjMFz6Wx)1!A0Usp5z#QeJWtM$GxJH(bRSw++d6#1V$_v(ICA^Q=fm+d;oDnV zy$y*KyOw;~6iupIR?g9Y$s3Yt!}RF>#jtOCh_fv7t0OvFos^`8e?`rBZsj@+h?g4p zq(Gtg?e*royjXAj1)lwrk+twLOL|m9R~4JwcjEAQ%N`EcIC%C6r5kd$INj7=KM_%& z6~Z(0I&DOG_UA6|X;&#WN+#q;1|<+(pu}Y7k2hq9)|GKxq=F5 zuKtP170-SFBA>7Dz~Elv(VtFH219{<((O_Ds|@8qF4=5En#pi-d8kHA=$HipY8eCf zsj5qG`*^f;kXo8mW2aGRq(01(ZCcF7_Wk>|Vq2$~8VDQoHTyDt)xV^GPG{Me(42mV zEZHr~Y&vUhxSI;i^J6Rw#PtXO7;CKfD-z197bqS@>v+*We6$T`P$)@nsdT`-qN#8< zcjwpx<0V>B^i%ScJ9sxX0CBHn^e;#bC-mRo7hJUN7o>#|t?6#k9JD-<unE;s5_V{r?vfZp9fQeU5RAHZLZl{CqxDgTh?_ z0Kb##|Hs|qqr;xwBE4LYVzWZ+?jH+~o>n&@C7J4@#&o18GkFA&@TLIg9I!X11B7b7acsa@l<;*$8B z#2gg{TPN;Dx#NFxcX^+R6H-9YWZeb1WotWU#NZs0H-{ORZL zjpKcH>p7yBUVIY*aaqg4Z#!SRV!$2)om+3&TG|Qzr-c@}Lgj$+_LcPxlY{KSJQ4Sy%cU+A#Q6U0#xK*9RQq?K#TnsBaS8 z>@*}=gr0CK@JWEnJm3Fe|2as6M^RJ!kB=(bI{ZB>tESBoM;=V@$?3~uH~iDU2&W4O#%x%v<@F0^i1O4!{y0agX6 z`gPy88otB3>^udL$sC#>40exB4wE<8&2=#yGEr$Z0jtZ4KkWY3UNF=@yf|4j={@uPLI35e{iEh29cP@YUdReY$li>< zfGot{+R57ZZ17}zW6k|Fn7w;a&c^WPbToc4%HP4C<7xS1YqPi3s%_@(>F)7i(9YB? zcBj`ZYU@@!G%rtj3m)C}017f|-DTAMzS`a6eI?(V!a_dnyQb_=)8~`?ool$DOGiko&FjkIH}EW>UuDH| zQ|Zg*XxOGXMpHRjx89y-(8|{}r!Wd{{YAQKf*tULuYvW}9_|P2-u5gSV`ux@L;ft3iTwYCS^{b%& z?Y?^`SO&+3C$KV1F}EF5Q+~5*ECs2l#?r6JR%#`<>lJFuhyN8XF@xmz>;vaorsdV? z@zcYDgT6bx_74t^7@P(cZ&nY%NpLlrx{i$cvz=&l)x5q4WK?M*RM1M2e)P@qO&Xp@ zN%Gm%G(8`us7ofDM;jXt>%M$c^X2xo1@s833iurhXoq6jg&X^9o?jx{G-aY?;b;dK1tx8)_QU=txcJ+YL^5vJI?qn4ol*{Taak}uvyREH_mJwqJC;H*!$O)ID(}Q4T zSAPnYakz>_7=E&{7nH!KBB+cFrQs8lAJSB3@A8t!bHMBL;-mur0PlQiqAK&(R@?Yz zXSg>ekkdI6Hh-Mod?w!IZY;+G3}DS?ej*zzLA)v{G0bBBcu1$(b z2QFDsafL zAS7m3>bJ%863X05nvk@)oMponl>rw-Y8kU=@*Vr+X6!Eb*#MvV{MKXQgi_dRgITPs zJO0`fZV`^*LHwDhZ!sBj%@m)`s4VDe;i*`evE*6^dKbJ zqVF~szgMR;NX1L4y=A2fs|1;1bM(OJLbM=CLKHZ0tTEvYGveCy#Ls z;0I`r%kx(9&wSMU6Mk;Bx%{0$bI`7-2(JQz){1xE*1o*C;N{3t7msJnnAMF*ZKvydwV=Ho0K3#LZ`}C{ zzm$L2b7Kz6=%{%{Z~nWTz{SoEqd)xXfBgI7 S-yi?XzyAvw{$XYSATR)nuKVZ! literal 0 HcmV?d00001 diff --git a/deps/mariadb-client-library/mariadb_client b/deps/mariadb-client-library/mariadb_client index 9e54dc141..fc72bf037 120000 --- a/deps/mariadb-client-library/mariadb_client +++ b/deps/mariadb-client-library/mariadb_client @@ -1 +1 @@ -mariadb-connector-c-2.3.1 \ No newline at end of file +mariadb-connector-c-3.0.2-src \ No newline at end of file From 69596e230a7d6742eae70e25e9c8fab73e1d5ffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 28 Dec 2017 15:02:43 +0100 Subject: [PATCH 02/40] Apply patches to mariadb_connector_c_3.0.2 #1126 --- deps/Makefile | 18 +-- deps/mariadb-client-library/ma_alloc.c.patch | 9 ++ .../mariadb-client-library/ma_charset.c.patch | 8 ++ .../ma_password.c.patch | 56 +++++++++ .../mariadb_async.c.patch | 31 +++++ .../mariadb_lib.c.patch | 110 ++++++++++++++++++ deps/mariadb-client-library/mysql.h.patch | 16 +-- .../unittest_basic-t.c.patch | 11 ++ .../unittest_charset.c.patch | 71 +++++++++++ 9 files changed, 314 insertions(+), 16 deletions(-) create mode 100644 deps/mariadb-client-library/ma_alloc.c.patch create mode 100644 deps/mariadb-client-library/ma_charset.c.patch create mode 100644 deps/mariadb-client-library/ma_password.c.patch create mode 100644 deps/mariadb-client-library/mariadb_async.c.patch create mode 100644 deps/mariadb-client-library/mariadb_lib.c.patch create mode 100644 deps/mariadb-client-library/unittest_basic-t.c.patch create mode 100644 deps/mariadb-client-library/unittest_charset.c.patch diff --git a/deps/Makefile b/deps/Makefile index 52a2d110d..c1b4e9895 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -69,18 +69,20 @@ jemalloc: jemalloc/jemalloc/lib/libjemalloc.a mariadb-client-library/mariadb_client/include/my_config.h: - cd mariadb-client-library && rm -rf mariadb-connector-c-2.3.1 - cd mariadb-client-library && tar -zxf mariadb-connector-c-2.3.1-src.tar.gz + cd mariadb-client-library && rm -rf mariadb-connector-c-3.0.2-src + cd mariadb-client-library && tar -zxf mariadb-connector-c-3.0.2-src.tar.gz cd mariadb-client-library/mariadb_client && cmake . # cd mariadb-client-library/mariadb_client && cmake . -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl # this is needed on MacOSX - cd mariadb-client-library/mariadb_client && patch libmariadb/libmariadb.c < ../libmariadb.c.patch - cd mariadb-client-library/mariadb_client && patch libmariadb/net.c < ../net.c.patch - cd mariadb-client-library/mariadb_client && patch libmariadb/mysql_async.c < ../mysql_async.c.patch - cd mariadb-client-library/mariadb_client && patch libmariadb/password.c < ../password.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/mariadb_lib.c < ../mariadb_lib.c.patch +# cd mariadb-client-library/mariadb_client && patch libmariadb/net.c < ../net.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/mariadb_async.c < ../mariadb_async.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/ma_password.c < ../ma_password.c.patch # cd mariadb-client-library/mariadb_client && patch libmariadb/ma_secure.c < ../ma_secure.c.patch cd mariadb-client-library/mariadb_client && patch include/mysql.h < ../mysql.h.patch - cd mariadb-client-library/mariadb_client && patch libmariadb/my_alloc.c < ../my_alloc.c.patch - cd mariadb-client-library/mariadb_client && patch libmariadb/my_charset.c < ../my_charset.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/ma_alloc.c < ../ma_alloc.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/ma_charset.c < ../ma_charset.c.patch + cd mariadb-client-library/mariadb_client && patch unittest/libmariadb/basic-t.c < ../unittest_basic-t.c.patch + cd mariadb-client-library/mariadb_client && patch unittest/libmariadb/charset.c < ../unittest_charset.c.patch cd mariadb-client-library/mariadb_client && CC=${CC} CXX=${CXX} ${MAKE} # cd mariadb-client-library/mariadb_client/include && make my_config.h diff --git a/deps/mariadb-client-library/ma_alloc.c.patch b/deps/mariadb-client-library/ma_alloc.c.patch new file mode 100644 index 000000000..04104d0a4 --- /dev/null +++ b/deps/mariadb-client-library/ma_alloc.c.patch @@ -0,0 +1,9 @@ +@@ -85,7 +85,7 @@ + if (! next) + { /* Time to alloc new block */ + get_size= MAX(Size+ALIGN_SIZE(sizeof(MA_USED_MEM)), +- (mem_root->block_size & ~1) * (mem_root->block_num >> 2)); ++ (mem_root->block_size & ~1) * ( (mem_root->block_num >> 2) > 4 ? 4 : (mem_root->block_num >> 2) ) ); + + if (!(next = (MA_USED_MEM*) malloc(get_size))) + { diff --git a/deps/mariadb-client-library/ma_charset.c.patch b/deps/mariadb-client-library/ma_charset.c.patch new file mode 100644 index 000000000..456accdcc --- /dev/null +++ b/deps/mariadb-client-library/ma_charset.c.patch @@ -0,0 +1,8 @@ +@@ -732,6 +732,7 @@ + { 247, 1, UTF8_MB4, UTF8_MB4"_vietnamese_ci", "", 65001, "UTF-8", 1, 4, mysql_mbcharlen_utf8, check_mb_utf8_valid}, + + { 254, 1, UTF8_MB3, UTF8_MB3"_general_cs", "", 65001, "UTF-8", 1, 3, mysql_mbcharlen_utf8, check_mb_utf8_valid}, ++ { 255, 1, UTF8_MB4, UTF8_MB4"_0900_ai_ci", "", 65001, "UTF-8", 1, 4, mysql_mbcharlen_utf8, check_mb_utf8_valid}, + { 576, 1, UTF8_MB3, UTF8_MB3"_croatian_ci", "", 65001, "UTF-8", 1, 3, mysql_mbcharlen_utf8mb3, check_mb_utf8mb3_valid}, /*MDB*/ + { 577, 1, UTF8_MB3, UTF8_MB3"_myanmar_ci", "", 65001, "UTF-8", 1, 3, mysql_mbcharlen_utf8mb3, check_mb_utf8mb3_valid}, /*MDB*/ + { 578, 1, UTF8_MB3, UTF8_MB3"_thai_520_w2", "", 65001, "UTF-8", 1, 3, mysql_mbcharlen_utf8mb3, check_mb_utf8mb3_valid}, /*MDB*/ diff --git a/deps/mariadb-client-library/ma_password.c.patch b/deps/mariadb-client-library/ma_password.c.patch new file mode 100644 index 000000000..2ba8f9352 --- /dev/null +++ b/deps/mariadb-client-library/ma_password.c.patch @@ -0,0 +1,56 @@ +@@ -105,6 +105,35 @@ + } + } + ++unsigned char decode_char(char x) { ++ if (x >= '0' && x <= '9') ++ return (x - 0x30); ++ else if (x >= 'A' && x <= 'F') ++ return(x - 0x37); ++ else if (x >= 'a' && x <= 'f') ++ return(x - 0x57); ++ else { ++ fprintf(stderr,"%s:%d:%s(): [ERROR in libmariadbclient]: \n", __FILE__, __LINE__, __func__); ++ return 0; ++ } ++} ++ ++void unhex_pass(unsigned char *out, const char *in) { ++ int i=0; ++ for (i=0;imysql, parms->csname), ++ (parms->mysql, parms->csname, parms->charsetnr), + parms->mysql, + int, + r_int) + } + int STDCALL +-mysql_set_character_set_start(int *ret, MYSQL *mysql, const char *csname) ++mysql_set_character_set_start(int *ret, MYSQL *mysql, const char *csname, uint charsetnr) + { + MK_ASYNC_START_BODY( + mysql_set_character_set, +@@ -500,6 +501,7 @@ + WIN_SET_NONBLOCKING(mysql) + parms.mysql= mysql; + parms.csname= csname; ++ parms.charsetnr= charsetnr; + }, + 1, + r_int, diff --git a/deps/mariadb-client-library/mariadb_lib.c.patch b/deps/mariadb-client-library/mariadb_lib.c.patch new file mode 100644 index 000000000..d5dbcc070 --- /dev/null +++ b/deps/mariadb-client-library/mariadb_lib.c.patch @@ -0,0 +1,110 @@ +@@ -1494,9 +1494,16 @@ + + mysql->client_flag= client_flag; + ++ { ++ volatile my_bool net_blocking = ma_pvio_is_blocking(net->pvio); ++ if (!net_blocking) ++ ma_pvio_blocking(net->pvio, TRUE, 0); + if (run_plugin_auth(mysql, scramble_data, scramble_len, + scramble_plugin, db)) + goto error; ++ if (!net_blocking) ++ ma_pvio_blocking(net->pvio, FALSE, 0); ++ } + + if (mysql->client_flag & CLIENT_COMPRESS) + net->compress= 1; +@@ -1625,7 +1632,7 @@ + if (!mysql_real_connect(&tmp_mysql,mysql->host,mysql->user,mysql->passwd, + mysql->db, mysql->port, mysql->unix_socket, + mysql->client_flag | CLIENT_REMEMBER_OPTIONS) || +- mysql_set_character_set(&tmp_mysql, mysql->charset->csname)) ++ mysql_set_character_set(&tmp_mysql, mysql->charset->csname, NULL)) + { + if (ctxt) + my_context_install_suspend_resume_hook(ctxt, NULL, NULL); +@@ -1671,6 +1678,7 @@ + { + if (mysql->stmts) + { ++/* + LIST *li_stmt= mysql->stmts; + + for (; li_stmt; li_stmt= li_stmt->next) +@@ -1679,6 +1687,7 @@ + stmt->mysql= NULL; + SET_CLIENT_STMT_ERROR(stmt, CR_STMT_CLOSED, SQLSTATE_UNKNOWN, function_name); + } ++*/ + mysql->stmts= NULL; + } + } +@@ -1948,6 +1957,33 @@ + return; + } + ++void STDCALL ++mysql_close_no_command(MYSQL *mysql) ++{ ++ if (mysql) /* Some simple safety */ ++ { ++ ++ if (mysql->methods) { ++ if (mysql->net.pvio) { ++ free_old_query(mysql); ++ mysql->status=MYSQL_STATUS_READY; /* Force command */ ++ mysql->options.reconnect=0; ++ end_server(mysql); ++ } ++ } ++ mysql_close_memory(mysql); ++ mysql_close_options(mysql); ++ mysql->host_info=mysql->user=mysql->passwd=mysql->db=0; ++ ++ /* Clear pointers for better safety */ ++ bzero((char*) &mysql->options,sizeof(mysql->options)); ++ mysql->net.pvio= 0; ++ if (mysql->free_me) ++ free(mysql); ++ } ++ return; ++} ++ + + /************************************************************************** + ** Do a query. If query returned rows, free old rows. +@@ -3425,18 +3461,27 @@ + mariadb_get_charset_info(mysql, cs); + } + +-int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname) ++int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname, uint charsetnr) + { + const MARIADB_CHARSET_INFO *cs; + +- if (!csname) ++ if (!csname && !charsetnr) + goto error; + +- if ((cs= mysql_find_charset_name(csname))) +- { +- char buff[64]; ++ if (csname) { ++ cs = mysql_find_charset_name(csname); ++ } else { ++ cs = mysql_find_charset_nr(charsetnr); ++ } ++ if (cs) ++ { ++ char buff[128]; ++ if (csname) { // default behavior ++ snprintf(buff, 63, "SET NAMES %s", cs->csname); ++ } else { ++ snprintf(buff, 63, "SET NAMES %s COLLATE %s", cs->csname, cs->name); ++ } + +- snprintf(buff, 63, "SET NAMES %s", cs->csname); + if (!mysql_real_query(mysql, buff, (unsigned long)strlen(buff))) + { + mysql->charset= cs; diff --git a/deps/mariadb-client-library/mysql.h.patch b/deps/mariadb-client-library/mysql.h.patch index 8ef51000b..ab93317cc 100644 --- a/deps/mariadb-client-library/mysql.h.patch +++ b/deps/mariadb-client-library/mysql.h.patch @@ -1,23 +1,23 @@ -@@ -404,7 +404,7 @@ +@@ -490,7 +490,7 @@ unsigned long STDCALL mysql_thread_id(MYSQL *mysql); const char * STDCALL mysql_character_set_name(MYSQL *mysql); void STDCALL mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *cs); -int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname); +int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname, uint charsetnr); - MYSQL * STDCALL mysql_init(MYSQL *mysql); - int STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, -@@ -424,6 +424,7 @@ + my_bool STDCALL mariadb_get_infov(MYSQL *mysql, enum mariadb_value value, void *arg, ...); + my_bool STDCALL mariadb_get_info(MYSQL *mysql, enum mariadb_value value, void *arg); +@@ -509,6 +509,7 @@ const char *unix_socket, unsigned long clientflag); void STDCALL mysql_close(MYSQL *sock); -+void STDCALL mysql_close_no_command(MYSQL *sock); ++void STDCALL mysql_close_no_command(MYSQL *sock); int STDCALL mysql_select_db(MYSQL *mysql, const char *db); int STDCALL mysql_query(MYSQL *mysql, const char *q); int STDCALL mysql_send_query(MYSQL *mysql, const char *q, -@@ -515,7 +516,7 @@ - int STDCALL mysql_stmt_close_start(my_bool *ret, MYSQL_STMT *stmt); - int STDCALL mysql_stmt_close_cont(my_bool *ret, MYSQL_STMT * stmt, int status); +@@ -608,7 +609,7 @@ + int STDCALL mysql_stmt_next_result_cont(int *ret, MYSQL_STMT *stmt, int status); + int STDCALL mysql_set_character_set_start(int *ret, MYSQL *mysql, - const char *csname); + const char *csname, uint charsetnr); diff --git a/deps/mariadb-client-library/unittest_basic-t.c.patch b/deps/mariadb-client-library/unittest_basic-t.c.patch new file mode 100644 index 000000000..3f0737041 --- /dev/null +++ b/deps/mariadb-client-library/unittest_basic-t.c.patch @@ -0,0 +1,11 @@ +--- /tmp/basic-t.c 2017-12-28 14:55:55.958512116 +0100 ++++ unittest/libmariadb/basic-t.c 2017-12-28 14:56:08.770490417 +0100 +@@ -48,7 +48,7 @@ + rc= mysql_query(mysql, "CREATE TABLE a (a varchar(200))"); + check_mysql_rc(rc, mysql); + +- rc= mysql_set_character_set(mysql, "utf8"); ++ rc= mysql_set_character_set(mysql, "utf8", 0); + check_mysql_rc(rc, mysql); + + for (i=0; i < 10; i++) diff --git a/deps/mariadb-client-library/unittest_charset.c.patch b/deps/mariadb-client-library/unittest_charset.c.patch new file mode 100644 index 000000000..ceb58ea2e --- /dev/null +++ b/deps/mariadb-client-library/unittest_charset.c.patch @@ -0,0 +1,71 @@ +--- /tmp/charset.c 2017-12-28 14:58:14.174281738 +0100 ++++ unittest/libmariadb/charset.c 2017-12-28 14:59:53.510120540 +0100 +@@ -74,12 +74,12 @@ + char *csname= (char*) "utf8"; + char *csdefault= (char*)mysql_character_set_name(mysql); + +- FAIL_IF(mysql_set_character_set(mysql, csname), mysql_error(mysql)); ++ FAIL_IF(mysql_set_character_set(mysql, csname, 0), mysql_error(mysql)); + + mysql_get_character_set_info(mysql, &cs); + + FAIL_IF(strcmp(cs.csname, "utf8") || strcmp(cs.name, "utf8_general_ci"), "Character set != UTF8"); +- FAIL_IF(mysql_set_character_set(mysql, csdefault), mysql_error(mysql)); ++ FAIL_IF(mysql_set_character_set(mysql, csdefault, 0), mysql_error(mysql)); + + return OK; + } +@@ -542,7 +542,7 @@ + } + /* Retrieve character set information. */ + +- mysql_set_character_set(mysql, "latin1"); ++ mysql_set_character_set(mysql, "latin1", 0); + bug30472_retrieve_charset_info(mysql, + character_set_name_1, + character_set_client_1, +@@ -551,7 +551,7 @@ + + /* Switch client character set. */ + +- FAIL_IF(mysql_set_character_set(mysql, "utf8"), "Setting cs to utf8 failed"); ++ FAIL_IF(mysql_set_character_set(mysql, "utf8", 0), "Setting cs to utf8 failed"); + + /* Retrieve character set information. */ + +@@ -581,7 +581,7 @@ + /* Call mysql_change_user() with the same username, password, database. */ + + rc= mysql_change_user(mysql, username, password, (schema) ? schema : "test"); +- mysql_set_character_set(mysql, "latin1"); ++ mysql_set_character_set(mysql, "latin1", 0); + check_mysql_rc(rc, mysql); + + /* Retrieve character set information. */ +@@ -647,7 +647,7 @@ + /* ignore ucs2 */ + if (strcmp(row[0], "ucs2") && strcmp(row[0], "utf16le") && strcmp(row[0], "utf8mb4") && + strcmp(row[0], "utf16") && strcmp(row[0], "utf32")) { +- rc= mysql_set_character_set(mysql, row[0]); ++ rc= mysql_set_character_set(mysql, row[0], 0); + check_mysql_rc(rc, mysql); + } + } +@@ -748,7 +748,7 @@ + + if (strcmp(osname, "utf8")) + { +- rc= mysql_set_character_set(mysql, "utf8"); ++ rc= mysql_set_character_set(mysql, "utf8", 0); + check_mysql_rc(rc, mysql); + + csname2= mysql_character_set_name(mysql); +@@ -756,7 +756,7 @@ + + FAIL_IF(!strcmp(csname2, csname1), "Wrong charset: expected utf8"); + +- rc= mysql_set_character_set(mysql, "auto"); ++ rc= mysql_set_character_set(mysql, "auto", 0); + check_mysql_rc(rc, mysql); + + csname2= mysql_character_set_name(mysql); From 6bcc49fe4f68394a607951b0ed3f84b325daf753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 28 Dec 2017 15:05:55 +0100 Subject: [PATCH 03/40] Update Makefile for cleanall --- deps/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deps/Makefile b/deps/Makefile index c1b4e9895..148ef4b8d 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -126,6 +126,7 @@ pcre: pcre/pcre/.libs/libpcre.a cleanpart: cd mariadb-client-library && rm -rf mariadb-connector-c-2.3.1 + cd mariadb-client-library && rm -rf mariadb-connector-c-3.0.2-src cd jemalloc && rm -rf jemalloc-4.2.1 cd sqlite3/sqlite3 && rm -rf * .PHONY: cleanpart @@ -134,6 +135,7 @@ cleanall: cd libdaemon && rm -rf libdaemon-0.14 cd jemalloc && rm -rf jemalloc-4.3.1 cd mariadb-client-library && rm -rf mariadb-connector-c-2.3.1 + cd mariadb-client-library && rm -rf mariadb-connector-c-3.0.2-src cd libconfig && rm -rf libconfig-1.4.9 cd re2 && rm -rf re2 cd pcre && rm -rf pcre-8.39 From 2f1615939f20ec348fee099962624fae7ed0a4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 28 Dec 2017 15:15:41 +0100 Subject: [PATCH 04/40] Fix Makefile for MariaDB Connector C 3.0.2 --- deps/Makefile | 4 ++-- deps/mariadb-client-library/mariadb_lib.c.patch | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/deps/Makefile b/deps/Makefile index 148ef4b8d..cc2849e9b 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -68,7 +68,7 @@ jemalloc/jemalloc/lib/libjemalloc.a: jemalloc: jemalloc/jemalloc/lib/libjemalloc.a -mariadb-client-library/mariadb_client/include/my_config.h: +mariadb-client-library/mariadb_client/libmariadb/libmariadbclient.a: cd mariadb-client-library && rm -rf mariadb-connector-c-3.0.2-src cd mariadb-client-library && tar -zxf mariadb-connector-c-3.0.2-src.tar.gz cd mariadb-client-library/mariadb_client && cmake . @@ -86,7 +86,7 @@ mariadb-client-library/mariadb_client/include/my_config.h: cd mariadb-client-library/mariadb_client && CC=${CC} CXX=${CXX} ${MAKE} # cd mariadb-client-library/mariadb_client/include && make my_config.h -mariadb_client: mariadb-client-library/mariadb_client/include/my_config.h +mariadb_client: mariadb-client-library/mariadb_client/libmariadb/libmariadbclient.a sqlite3/sqlite3/sqlite3.o: diff --git a/deps/mariadb-client-library/mariadb_lib.c.patch b/deps/mariadb-client-library/mariadb_lib.c.patch index d5dbcc070..52ef8dd8a 100644 --- a/deps/mariadb-client-library/mariadb_lib.c.patch +++ b/deps/mariadb-client-library/mariadb_lib.c.patch @@ -1,3 +1,5 @@ +--- /tmp/mariadb_lib.c 2017-12-28 14:21:33.620559119 +0100 ++++ libmariadb/mariadb_lib.c 2017-12-28 15:12:33.117032010 +0100 @@ -1494,9 +1494,16 @@ mysql->client_flag= client_flag; @@ -20,7 +22,7 @@ mysql->db, mysql->port, mysql->unix_socket, mysql->client_flag | CLIENT_REMEMBER_OPTIONS) || - mysql_set_character_set(&tmp_mysql, mysql->charset->csname)) -+ mysql_set_character_set(&tmp_mysql, mysql->charset->csname, NULL)) ++ mysql_set_character_set(&tmp_mysql, mysql->charset->csname, 0)) { if (ctxt) my_context_install_suspend_resume_hook(ctxt, NULL, NULL); From fc2995de3aee2272762e59533642c3d47a97d4d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 28 Dec 2017 15:35:38 +0100 Subject: [PATCH 05/40] Compile ProxySQL with Connector-C 3.0.2 #1126 --- include/MySQL_Protocol.h | 2 +- include/proxysql.h | 4 ++-- lib/ClickHouse_Server.cpp | 2 +- lib/MySQL_HostGroups_Manager.cpp | 10 +++++----- lib/MySQL_Monitor.cpp | 2 +- lib/MySQL_Protocol.cpp | 4 ++-- lib/MySQL_Session.cpp | 8 ++++---- lib/MySQL_Thread.cpp | 16 ++++++++-------- lib/ProxySQL_Admin.cpp | 2 +- lib/ProxySQL_Cluster.cpp | 12 ++++++------ lib/mysql_connection.cpp | 8 ++++---- 11 files changed, 35 insertions(+), 35 deletions(-) diff --git a/include/MySQL_Protocol.h b/include/MySQL_Protocol.h index d11bbfe79..10d5950f1 100644 --- a/include/MySQL_Protocol.h +++ b/include/MySQL_Protocol.h @@ -71,7 +71,7 @@ class MySQL_Protocol { // - a pointer to unsigned int, used to return the size of the packet if not NULL // for now, they all return true bool generate_pkt_OK(bool send, void **ptr, unsigned int *len, uint8_t sequence_id, unsigned int affected_rows, uint64_t last_insert_id, uint16_t status, uint16_t warnings, char *msg); - bool generate_pkt_ERR(bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint16_t error_code, char *sql_state, char *sql_message); + bool generate_pkt_ERR(bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint16_t error_code, char *sql_state, const char *sql_message); bool generate_pkt_EOF(bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint16_t warnings, uint16_t status, MySQL_ResultSet *myrs=NULL); // bool generate_COM_INIT_DB(bool send, void **ptr, unsigned int *len, char *schema); //bool generate_COM_PING(bool send, void **ptr, unsigned int *len); diff --git a/include/proxysql.h b/include/proxysql.h index 114349515..7f00706ff 100644 --- a/include/proxysql.h +++ b/include/proxysql.h @@ -50,11 +50,11 @@ #if !defined(__FreeBSD__) && !defined(__APPLE__) #define HAVE_BOOL -#include "my_global.h" +#include "ma_global.h" //#include "my_pthread.h" #endif #include "mysql.h" -#include "mysql_com.h" +#include "mariadb_com.h" #include "proxysql_mem.h" diff --git a/lib/ClickHouse_Server.cpp b/lib/ClickHouse_Server.cpp index f959a56ec..8eaddfd2f 100644 --- a/lib/ClickHouse_Server.cpp +++ b/lib/ClickHouse_Server.cpp @@ -2799,7 +2799,7 @@ ProxySQL_Admin::~ProxySQL_Admin() { // it is mostly informative void ClickHouse_Server::dump_mysql_collations() { - const CHARSET_INFO * c = compiled_charsets; + const MARIADB_CHARSET_INFO * c = mariadb_compiled_charsets; char buf[1024]; char *query=(char *)"INSERT INTO mysql_collations VALUES (%d, \"%s\", \"%s\", \"\")"; SQLite_General_DB->execute("DELETE FROM mysql_collations"); diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 84ce70b65..8e8465e5d 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -76,7 +76,7 @@ static void * HGCU_thread_run() { for (i=0;i<(int)l;i++) { myconn->reset(); myconn=(MySQL_Connection *)conn_array->index(i); - if (myconn->mysql->net.vio && myconn->mysql->net.fd && myconn->mysql->net.buff) { + if (myconn->mysql->net.pvio && myconn->mysql->net.fd && myconn->mysql->net.buff) { MySQL_Connection_userinfo *userinfo = myconn->userinfo; char *auth_password = NULL; if (userinfo->password) { @@ -88,7 +88,7 @@ static void * HGCU_thread_run() { } //async_exit_status = mysql_change_user_start(&ret_bool,mysql,_ui->username, auth_password, _ui->schemaname); statuses[i]=mysql_change_user_start(&ret[i], myconn->mysql, myconn->userinfo->username, auth_password, myconn->userinfo->schemaname); - if (myconn->mysql->net.vio==NULL || myconn->mysql->net.fd==0 || myconn->mysql->net.buff==NULL) { + if (myconn->mysql->net.pvio==NULL || myconn->mysql->net.fd==0 || myconn->mysql->net.buff==NULL) { statuses[i]=0; ret[i]=1; } } else { @@ -115,12 +115,12 @@ static void * HGCU_thread_run() { usleep(50); for (i=0;i<(int)conn_array->len;i++) { myconn=(MySQL_Connection *)conn_array->index(i); - if (myconn->mysql->net.vio && myconn->mysql->net.fd && myconn->mysql->net.buff) { + if (myconn->mysql->net.pvio && myconn->mysql->net.fd && myconn->mysql->net.buff) { statuses[i]=wait_for_mysql(myconn->mysql, statuses[i]); - if (myconn->mysql->net.vio && myconn->mysql->net.fd && myconn->mysql->net.buff) { + if (myconn->mysql->net.pvio && myconn->mysql->net.fd && myconn->mysql->net.buff) { if ((statuses[i] & MYSQL_WAIT_TIMEOUT) == 0) { statuses[i]=mysql_change_user_cont(&ret[i], myconn->mysql, statuses[i]); - if (myconn->mysql->net.vio==NULL || myconn->mysql->net.fd==0 || myconn->mysql->net.buff==NULL ) { + if (myconn->mysql->net.pvio==NULL || myconn->mysql->net.fd==0 || myconn->mysql->net.buff==NULL ) { statuses[i]=0; ret[i]=1; } } diff --git a/lib/MySQL_Monitor.cpp b/lib/MySQL_Monitor.cpp index 912b97c10..14b981889 100644 --- a/lib/MySQL_Monitor.cpp +++ b/lib/MySQL_Monitor.cpp @@ -102,7 +102,7 @@ static int wait_for_mysql(MYSQL *mysql, int status) { } static void close_mysql(MYSQL *my) { - if (my->net.vio) { + if (my->net.pvio) { char buff[5]; mysql_hdr myhdr; myhdr.pkt_id=0; diff --git a/lib/MySQL_Protocol.cpp b/lib/MySQL_Protocol.cpp index 9a7646477..0bade1ae3 100644 --- a/lib/MySQL_Protocol.cpp +++ b/lib/MySQL_Protocol.cpp @@ -384,7 +384,7 @@ int MySQL_Protocol::parse_mysql_pkt(PtrSize_t *PS_entry, MySQL_Data_Stream *__my // } cmd=*payload; switch (cmd) { - case MYSQL_COM_QUERY: + case COM_QUERY: if (pkt_com_query(payload, hdr.pkt_length)==PKT_PARSED) { //*states=STATE_CLIENT_COM_QUERY; return PKT_PARSED; @@ -494,7 +494,7 @@ bool MySQL_Protocol::generate_pkt_EOF(bool send, void **ptr, unsigned int *len, return true; } -bool MySQL_Protocol::generate_pkt_ERR(bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint16_t error_code, char *sql_state, char *sql_message) { +bool MySQL_Protocol::generate_pkt_ERR(bool send, void **ptr, unsigned int *len, uint8_t sequence_id, uint16_t error_code, char *sql_state, const char *sql_message) { if ((*myds)->sess->mirror==true) { return true; } diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 60eb12f1a..cd987524e 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -15,8 +15,8 @@ #define EXPMARIA -extern const CHARSET_INFO * proxysql_find_charset_name(const char * const name); -extern CHARSET_INFO * proxysql_find_charset_collate_names(const char *csname, const char *collatename); +extern const MARIADB_CHARSET_INFO * proxysql_find_charset_name(const char * const name); +extern MARIADB_CHARSET_INFO * proxysql_find_charset_collate_names(const char *csname, const char *collatename); extern MySQL_Authentication *GloMyAuth; extern ProxySQL_Admin *GloAdmin; @@ -722,7 +722,7 @@ bool MySQL_Session::handler_special_queries(PtrSize_t *pkt) { char *csname=trim_spaces_and_quotes_in_place(unstripped); bool collation_specified = false; //unsigned int charsetnr = 0; - const CHARSET_INFO * c; + const MARIADB_CHARSET_INFO * c; char * collation_name = NULL; if (strcasestr(csname," COLLATE ")) { collation_specified = true; @@ -3711,7 +3711,7 @@ bool MySQL_Session::handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_C delete re; delete opt2; if (rc) { - const CHARSET_INFO * c; + const MARIADB_CHARSET_INFO * c; if (s3.length()) { c = proxysql_find_charset_collate_names(s2.c_str(), s3.c_str()); } else { diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 953e82f4a..aa35399b1 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -28,8 +28,8 @@ extern MySQL_Threads_Handler *GloMTH; extern MySQL_Monitor *GloMyMon; extern MySQL_Logger *GloMyLogger; -const CHARSET_INFO * proxysql_find_charset_nr(unsigned int nr) { - const CHARSET_INFO * c = compiled_charsets; +const MARIADB_CHARSET_INFO * proxysql_find_charset_nr(unsigned int nr) { + const MARIADB_CHARSET_INFO * c = mariadb_compiled_charsets; do { if (c->nr == nr) { return c; @@ -39,8 +39,8 @@ const CHARSET_INFO * proxysql_find_charset_nr(unsigned int nr) { return NULL; } -CHARSET_INFO * proxysql_find_charset_name(const char *name) { - CHARSET_INFO *c = (CHARSET_INFO *)compiled_charsets; +MARIADB_CHARSET_INFO * proxysql_find_charset_name(const char *name) { + MARIADB_CHARSET_INFO *c = (MARIADB_CHARSET_INFO *)mariadb_compiled_charsets; do { if (!strcasecmp(c->csname, name)) { return c; @@ -50,8 +50,8 @@ CHARSET_INFO * proxysql_find_charset_name(const char *name) { return NULL; } -CHARSET_INFO * proxysql_find_charset_collate_names(const char *csname, const char *collatename) { - CHARSET_INFO *c = (CHARSET_INFO *)compiled_charsets; +MARIADB_CHARSET_INFO * proxysql_find_charset_collate_names(const char *csname, const char *collatename) { + MARIADB_CHARSET_INFO *c = (MARIADB_CHARSET_INFO *)mariadb_compiled_charsets; do { if (!strcasecmp(c->csname, csname) && !strcasecmp(c->name, collatename)) { return c; @@ -818,7 +818,7 @@ char * MySQL_Threads_Handler::get_variable(char *name) { // this is the public f } } if (!strcasecmp(name,"default_charset")) { - const CHARSET_INFO *c = proxysql_find_charset_nr(variables.default_charset); + const MARIADB_CHARSET_INFO *c = proxysql_find_charset_nr(variables.default_charset); if (!c) { proxy_error("Not existing charset number %u\n", variables.default_charset); assert(c); @@ -1790,7 +1790,7 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t } if (!strcasecmp(name,"default_charset")) { if (vallen) { - CHARSET_INFO * c=proxysql_find_charset_name(value); + MARIADB_CHARSET_INFO * c=proxysql_find_charset_name(value); if (c) { variables.default_charset=c->nr; return true; diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 5dad4c3fc..a2b8ef906 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -3694,7 +3694,7 @@ ProxySQL_Admin::~ProxySQL_Admin() { // This function is used only used to export what collations are available // it is mostly informative void ProxySQL_Admin::dump_mysql_collations() { - const CHARSET_INFO * c = compiled_charsets; + const MARIADB_CHARSET_INFO * c = mariadb_compiled_charsets; char buf[1024]; char *query=(char *)"INSERT INTO mysql_collations VALUES (%d, \"%s\", \"%s\", \"\")"; admindb->execute("DELETE FROM mysql_collations"); diff --git a/lib/ProxySQL_Cluster.cpp b/lib/ProxySQL_Cluster.cpp index 5b3c0d95b..205d64aea 100644 --- a/lib/ProxySQL_Cluster.cpp +++ b/lib/ProxySQL_Cluster.cpp @@ -165,7 +165,7 @@ void * ProxySQL_Cluster_Monitor_thread(void *args) { if (glovars.shutdown == 0) { // we arent' shutting down, but the query failed } - if (conn->net.vio) { + if (conn->net.pvio) { mysql_close(conn); } } else { @@ -181,7 +181,7 @@ void * ProxySQL_Cluster_Monitor_thread(void *args) { } __exit_monitor_thread: //if (conn) { - if (conn->net.vio) { + if (conn->net.pvio) { mysql_close(conn); } proxy_info("Cluster: closing thread for peer %s:%d\n", node->hostname, node->port); @@ -635,7 +635,7 @@ void ProxySQL_Cluster::pull_mysql_query_rules_from_peer() { } __exit_pull_mysql_query_rules_from_peer: if (conn) { - if (conn->net.vio) { + if (conn->net.pvio) { mysql_close(conn); } } @@ -716,7 +716,7 @@ void ProxySQL_Cluster::pull_mysql_users_from_peer() { } __exit_pull_mysql_users_from_peer: if (conn) { - if (conn->net.vio) { + if (conn->net.pvio) { mysql_close(conn); } } @@ -861,7 +861,7 @@ void ProxySQL_Cluster::pull_mysql_servers_from_peer() { } __exit_pull_mysql_servers_from_peer: if (conn) { - if (conn->net.vio) { + if (conn->net.pvio) { mysql_close(conn); } } @@ -935,7 +935,7 @@ void ProxySQL_Cluster::pull_proxysql_servers_from_peer() { } __exit_pull_proxysql_servers_from_peer: if (conn) { - if (conn->net.vio) { + if (conn->net.pvio) { mysql_close(conn); } } diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 39c09f945..e864b97b5 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -3,7 +3,7 @@ #include "SpookyV2.h" #include -extern const CHARSET_INFO * proxysql_find_charset_nr(unsigned int nr); +extern const MARIADB_CHARSET_INFO * proxysql_find_charset_nr(unsigned int nr); #define PROXYSQL_USE_RESULT @@ -386,7 +386,7 @@ void MySQL_Connection::connect_start() { } unsigned int timeout= 1; mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT, (void *)&timeout); - const CHARSET_INFO * c = proxysql_find_charset_nr(mysql_thread___default_charset); + const MARIADB_CHARSET_INFO * c = proxysql_find_charset_nr(mysql_thread___default_charset); if (!c) { proxy_error("Not existing charset number %u\n", mysql_thread___default_charset); assert(0); @@ -476,7 +476,7 @@ void MySQL_Connection::set_autocommit_cont(short event) { void MySQL_Connection::set_names_start() { PROXY_TRACE(); - const CHARSET_INFO * c = proxysql_find_charset_nr(options.charset); + const MARIADB_CHARSET_INFO * c = proxysql_find_charset_nr(options.charset); if (!c) { proxy_error("Not existing charset number %u\n", options.charset); assert(0); @@ -1612,7 +1612,7 @@ void MySQL_Connection::optimize() { // if avoids that a QUIT command stops forever // FIXME: currently doesn't support encryption and compression void MySQL_Connection::close_mysql() { - if ((send_quit) && (mysql->net.vio)) { + if ((send_quit) && (mysql->net.pvio)) { char buff[5]; mysql_hdr myhdr; myhdr.pkt_id=0; From 6f05bc3bb24dc30916760ca2f8e78e6066abed83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 28 Dec 2017 23:37:20 +0100 Subject: [PATCH 06/40] First attempt to track GTID needed for #1208 Putting this on hold, due to https://jira.mariadb.org/browse/CONC-302 --- include/mysql_backend.h | 2 ++ include/mysql_connection.h | 2 ++ lib/MySQL_Session.cpp | 1 + lib/mysql_backend.cpp | 2 ++ lib/mysql_connection.cpp | 19 +++++++++++++++++++ 5 files changed, 26 insertions(+) diff --git a/include/mysql_backend.h b/include/mysql_backend.h index df80ecf74..b78d223ba 100644 --- a/include/mysql_backend.h +++ b/include/mysql_backend.h @@ -10,6 +10,8 @@ class MySQL_Backend void * operator new(size_t); void operator delete(void *); int hostgroup_id; + char gtid_uuid[48]; + uint64_t gtid_trxid; MySQL_Data_Stream *server_myds; // mysql_cp_entry_t *server_mycpe; bytes_stats_t server_bytes_at_cmd; diff --git a/include/mysql_connection.h b/include/mysql_connection.h index 71b6bd74c..9aa498820 100644 --- a/include/mysql_connection.h +++ b/include/mysql_connection.h @@ -178,5 +178,7 @@ class MySQL_Connection { void set_is_client(); // used for local_stmts void reset(); + + bool get_gtid(char *buff, uint64_t *trx_id); }; #endif /* __CLASS_MYSQL_CONNECTION_H */ diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index cd987524e..5b08da8d2 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -2621,6 +2621,7 @@ handler_again: (begint.tv_sec*1000000000+begint.tv_nsec); } if (rc==0) { + myconn->get_gtid(mybe->gtid_uuid,&mybe->gtid_trxid); // check if multiplexing needs to be disabled char *qdt=CurrentQuery.get_digest_text(); if (qdt) diff --git a/lib/mysql_backend.cpp b/lib/mysql_backend.cpp index 9b8d0b5c4..9f5cee46e 100644 --- a/lib/mysql_backend.cpp +++ b/lib/mysql_backend.cpp @@ -14,6 +14,8 @@ MySQL_Backend::MySQL_Backend() { server_myds=NULL; server_bytes_at_cmd.bytes_recv=0; server_bytes_at_cmd.bytes_sent=0; + memset(gtid_uuid,0,sizeof(gtid_uuid)); + gtid_trxid=0; } MySQL_Backend::~MySQL_Backend() { diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index e864b97b5..5a888c452 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -1706,3 +1706,22 @@ void MySQL_Connection::reset() { local_stmts=new MySQL_STMTs_local_v14(false); #endif } + +bool MySQL_Connection::get_gtid(char *buff, uint64_t *trx_id) { + // note: current implementation for for OWN GTID only! + bool ret = false; + if (buff==NULL || trx_id == NULL) { + return ret; + } + if (mysql) { + const char *data; + size_t length; + if (mysql_session_track_get_first(mysql, SESSION_TRACK_GTIDS, &data, &length) == 0) { + memcpy(buff,data,length); + buff[length]=0; + fprintf(stderr,"GTID=%s\n",buff); + ret = true; + } + } + return ret; +} From 4a3d6ce4907b0821d9114273efb0a313cb381d6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 29 Dec 2017 01:07:36 +0100 Subject: [PATCH 07/40] Added SESSION_TRACK_GTIDS in connector-C CONC-302 --- deps/mariadb-client-library/mariadb_lib.c.patch | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/deps/mariadb-client-library/mariadb_lib.c.patch b/deps/mariadb-client-library/mariadb_lib.c.patch index 52ef8dd8a..ad3512d53 100644 --- a/deps/mariadb-client-library/mariadb_lib.c.patch +++ b/deps/mariadb-client-library/mariadb_lib.c.patch @@ -1,5 +1,3 @@ ---- /tmp/mariadb_lib.c 2017-12-28 14:21:33.620559119 +0100 -+++ libmariadb/mariadb_lib.c 2017-12-28 15:12:33.117032010 +0100 @@ -1494,9 +1494,16 @@ mysql->client_flag= client_flag; @@ -76,7 +74,16 @@ /************************************************************************** ** Do a query. If query returned rows, free old rows. -@@ -3425,18 +3461,27 @@ +@@ -2028,6 +2064,8 @@ + old_pos= pos; + si_type= (enum enum_session_state_type)net_field_length(&pos); + switch(si_type) { ++ case SESSION_TRACK_GTIDS: ++ net_field_length(&pos); /* skip encoding */ + case SESSION_TRACK_SCHEMA: + case SESSION_TRACK_STATE_CHANGE: + case SESSION_TRACK_TRANSACTION_CHARACTERISTICS: +@@ -3425,18 +3463,27 @@ mariadb_get_charset_info(mysql, cs); } From 2d85f0603968093d00a035a39963454c8af9b16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 30 Dec 2017 15:35:37 +0100 Subject: [PATCH 08/40] Fix bug #1307 . Add lock when adding PS to cache --- lib/MySQL_Session.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 5b08da8d2..44b0e0226 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -2639,6 +2639,7 @@ handler_again: case PROCESSING_STMT_PREPARE: { thread->status_variables.backend_stmt_prepare++; + GloMyStmt->wrlock(); #ifndef PROXYSQL_STMT_V14 uint32_t stmid; #else @@ -2668,7 +2669,7 @@ handler_again: qpo->cache_ttl, qpo->timeout, qpo->delay, - true); + false); #endif if (CurrentQuery.QueryParserArgs.digest_text) { if (stmt_info->digest_text==NULL) { @@ -2686,6 +2687,7 @@ handler_again: if (previous_status.size() == 0) client_stmtid=client_myds->myconn->local_stmts->generate_new_client_stmt_id(global_stmtid); #endif + GloMyStmt->wrlock(); CurrentQuery.mysql_stmt=NULL; enum session_status st=status; size_t sts=previous_status.size(); From 6844d4869564a99817548f77eefaa74deefc9a22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 30 Dec 2017 16:42:09 +0100 Subject: [PATCH 09/40] Fix typo on previous commit --- lib/MySQL_Session.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 44b0e0226..4514096ab 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -2687,7 +2687,7 @@ handler_again: if (previous_status.size() == 0) client_stmtid=client_myds->myconn->local_stmts->generate_new_client_stmt_id(global_stmtid); #endif - GloMyStmt->wrlock(); + GloMyStmt->unlock(); CurrentQuery.mysql_stmt=NULL; enum session_status st=status; size_t sts=previous_status.size(); From f87c41188fd5438ab847602b8008f1225df339e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 30 Dec 2017 17:13:26 +0100 Subject: [PATCH 10/40] Purge PS metadata cache only when possible #1312 --- include/MySQL_PreparedStatement.h | 1 + lib/MySQL_PreparedStatement.cpp | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/include/MySQL_PreparedStatement.h b/include/MySQL_PreparedStatement.h index 00499d786..2a3f266bd 100644 --- a/include/MySQL_PreparedStatement.h +++ b/include/MySQL_PreparedStatement.h @@ -301,6 +301,7 @@ class MySQL_STMTs_local_v14 { class MySQL_STMT_Manager_v14 { private: uint64_t next_statement_id; + uint64_t num_stmt_with_ref_client_count_zero; pthread_rwlock_t rwlock_; std::map map_stmt_id_to_info; // map using statement id std::map map_stmt_hash_to_info; // map using hashes diff --git a/lib/MySQL_PreparedStatement.cpp b/lib/MySQL_PreparedStatement.cpp index b0119a913..00317e658 100644 --- a/lib/MySQL_PreparedStatement.cpp +++ b/lib/MySQL_PreparedStatement.cpp @@ -786,6 +786,7 @@ MySQL_STMT_Manager_v14::MySQL_STMT_Manager_v14() { next_statement_id = 1; // we initialize this as 1 because we 0 is not allowed + num_stmt_with_ref_client_count_zero = 0; } MySQL_STMT_Manager_v14::~MySQL_STMT_Manager_v14() { @@ -797,16 +798,27 @@ void MySQL_STMT_Manager_v14::ref_count_client(uint64_t _stmt_id ,int _v, bool lo auto s = map_stmt_id_to_info.find(_stmt_id); if (s != map_stmt_id_to_info.end()) { MySQL_STMT_Global_info *stmt_info = s->second; + if (stmt_info->ref_count_client == 0 && _v == 1) { + __sync_sub_and_fetch(&num_stmt_with_ref_client_count_zero,1); + } else { + if (stmt_info->ref_count_client == 1 && _v == -1) { + __sync_add_and_fetch(&num_stmt_with_ref_client_count_zero,1); + } + } stmt_info->ref_count_client += _v; - if (map_stmt_id_to_info.size() > (unsigned)mysql_thread___max_stmts_cache) { - int max_purge = map_stmt_id_to_info.size() / 20; // purge up to 5% + uint64_t num_count_zero = __sync_add_and_fetch(&num_stmt_with_ref_client_count_zero, 0); + size_t map_size = map_stmt_id_to_info.size(); + if (map_size > (unsigned)mysql_thread___max_stmts_cache && num_count_zero > map_size/10) { // purge only if there is at least 10% gain + int max_purge = map_size / 5; // purge up to 20% int i = -1; uint64_t *torem = (uint64_t *)malloc(max_purge * sizeof(uint64_t)); for (std::map::iterator it = map_stmt_id_to_info.begin(); it != map_stmt_id_to_info.end(); ++it) { - if (i == (max_purge - 1)) continue; + if ( (i == (max_purge - 1)) || (i == (num_count_zero - 1)) ) { + continue; // nothing left to clean up + } MySQL_STMT_Global_info *a = it->second; if (__sync_add_and_fetch(&a->ref_count_client, 0) == 0) { uint64_t hash = a->hash; @@ -814,6 +826,7 @@ void MySQL_STMT_Manager_v14::ref_count_client(uint64_t _stmt_id ,int _v, bool lo if (s2 != map_stmt_hash_to_info.end()) { map_stmt_hash_to_info.erase(s2); } + __sync_sub_and_fetch(&num_stmt_with_ref_client_count_zero,1); // m.erase(it); // delete a; i++; @@ -1046,6 +1059,7 @@ MySQL_STMT_Global_info *MySQL_STMT_Manager_v14::add_prepared_statement( // __sync_fetch_and_add(&ret->ref_count_client, // 1); // increase reference count // *is_new = true; + __sync_add_and_fetch(&num_stmt_with_ref_client_count_zero,1); } ret->ref_count_server++; // __sync_fetch_and_add(&add_prepared_statement_calls, 1); From 462cb996d35a9d1fff9400a3a8f926ba82e9bd78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 30 Dec 2017 17:18:00 +0100 Subject: [PATCH 11/40] Fix minor bugs --- lib/MySQL_HostGroups_Manager.cpp | 1 + lib/ProxySQL_Cluster.cpp | 3 ++- src/main.cpp | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 8e8465e5d..5fcf8fc95 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -337,6 +337,7 @@ MySQL_HostGroups_Manager::MySQL_HostGroups_Manager() { status.server_connections_connected=0; status.server_connections_aborted=0; status.server_connections_created=0; + status.server_connections_delayed=0; status.servers_table_version=0; pthread_mutex_init(&status.servers_table_version_lock, NULL); pthread_cond_init(&status.servers_table_version_cond, NULL); diff --git a/lib/ProxySQL_Cluster.cpp b/lib/ProxySQL_Cluster.cpp index 205d64aea..b53c897ee 100644 --- a/lib/ProxySQL_Cluster.cpp +++ b/lib/ProxySQL_Cluster.cpp @@ -167,6 +167,7 @@ void * ProxySQL_Cluster_Monitor_thread(void *args) { } if (conn->net.pvio) { mysql_close(conn); + conn = NULL; } } else { proxy_warning("Cluster: unable to connect to peer %s:%d . Error: %s\n", node->hostname, node->port, mysql_error(conn)); @@ -180,7 +181,7 @@ void * ProxySQL_Cluster_Monitor_thread(void *args) { } } __exit_monitor_thread: - //if (conn) { + if (conn) if (conn->net.pvio) { mysql_close(conn); } diff --git a/src/main.cpp b/src/main.cpp index 5938af4c7..052cc1cb9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -208,7 +208,7 @@ MySQL_STMT_Manager_v14 *GloMyStmt; #endif MySQL_Monitor *GloMyMon; -std::thread *MyMon_thread; +std::thread *MyMon_thread = NULL; MySQL_Logger *GloMyLogger; @@ -505,7 +505,7 @@ void ProxySQL_Main_join_all_threads() { } // join GloMyMon thread - if (GloMyMon) { + if (GloMyMon && MyMon_thread) { cpu_timer t; MyMon_thread->join(); #ifdef DEBUG From d04ee3d385bbd47a13066c8ffd62de952bb2ea98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 30 Dec 2017 17:29:46 +0100 Subject: [PATCH 12/40] Remove all references to PS handling before 1.4 Handling of prepared statements changed a lot in 1.4 , as a lot of code was rewritten. Old code was still present, and was possible to toggle it on and off based on PROXYSQL_STMT_V14 . Because only the new code is maintained, all references to old code are now removed, including PROXYSQL_STMT_V14 --- include/MySQL_PreparedStatement.h | 79 -------- include/MySQL_Session.h | 4 - include/mysql_connection.h | 4 - lib/MySQL_HostGroups_Manager.cpp | 4 - lib/MySQL_PreparedStatement.cpp | 302 ------------------------------ lib/MySQL_Session.cpp | 97 ---------- lib/ProxySQL_Admin.cpp | 30 --- lib/mysql_connection.cpp | 8 - src/main.cpp | 8 - 9 files changed, 536 deletions(-) diff --git a/include/MySQL_PreparedStatement.h b/include/MySQL_PreparedStatement.h index 2a3f266bd..ba481d3ce 100644 --- a/include/MySQL_PreparedStatement.h +++ b/include/MySQL_PreparedStatement.h @@ -38,8 +38,6 @@ To summarie the most important classes: // it is an internal representation of prepared statement // it include all metadata associated with it -#define PROXYSQL_STMT_V14 - class MySQL_STMT_Global_info { private: void compute_hash(); @@ -55,11 +53,7 @@ class MySQL_STMT_Global_info { unsigned int hostgroup_id; int ref_count_client; int ref_count_server; -#ifndef PROXYSQL_STMT_V14 - uint32_t statement_id; -#else uint64_t statement_id; -#endif uint16_t num_columns; uint16_t num_params; uint16_t warning_count; @@ -71,12 +65,8 @@ class MySQL_STMT_Global_info { } properties; bool is_select_NOT_for_update; MYSQL_BIND **params; // seems unused (?) -#ifndef PROXYSQL_STMT_V14 - MySQL_STMT_Global_info(uint32_t id, unsigned int h, char *u, char *s, char *q, unsigned int ql, MYSQL_STMT *stmt, uint64_t _h); -#else MySQL_STMT_Global_info(uint64_t id, unsigned int h, char *u, char *s, char *q, unsigned int ql, MYSQL_STMT *stmt, uint64_t _h); void update_metadata(MYSQL_STMT *stmt); -#endif ~MySQL_STMT_Global_info(); }; @@ -175,76 +165,8 @@ class MySQL_STMTs_meta { } }; -#ifndef PROXYSQL_STMT_V14 // class MySQL_STMTs_local associates a global statement ID with a local statement ID for a specific connection -class MySQL_STMTs_local { - private: - unsigned int num_entries; - bool is_client; - std::map client_stmt_to_global_id; - std::map m; - public: - MySQL_Session *sess; - MySQL_STMTs_local(bool _ic) { - sess=NULL; - is_client=_ic; - num_entries=0; - client_stmt_to_global_id = std::map(); - m = std::map(); - } - void set_is_client(MySQL_Session *_s) { - sess=_s; - is_client=true; - } - ~MySQL_STMTs_local(); - void insert(uint32_t global_statement_id, MYSQL_STMT *stmt); - - // we declare it here to be inline - MYSQL_STMT * find(uint32_t global_statement_id) { - auto s=m.find(global_statement_id); - if (s!=m.end()) { // found - return s->second; - } - return NULL; // not found - } - uint32_t generate_new_stmt_id(uint32_t global_statement_id); - uint32_t find_original_id(uint32_t client_stmt_id); - bool exists(uint32_t global_statement_id) { - auto s=m.find(global_statement_id); - if (s!=m.end()) { // found - return true; - } - return false; // not found - } - bool erase(uint32_t global_statement_id); - uint64_t compute_hash(unsigned int hostgroup, char *user, char *schema, char *query, unsigned int query_length); - unsigned int get_num_entries() { return num_entries; } -}; - -class MySQL_STMT_Manager { - private: - uint32_t next_statement_id; - rwlock_t rwlock; - std::map m; // map using statement id - std::map h; // map using hashes - std::stack free_stmt_ids; - public: - MySQL_STMT_Manager(); - ~MySQL_STMT_Manager(); - uint32_t generate_new_stmt_id() { - return __sync_add_and_fetch(&next_statement_id,1); - } - int ref_count(uint32_t statement_id, int cnt, bool lock, bool is_client); - MySQL_STMT_Global_info * add_prepared_statement(bool *is_new, unsigned int h, char *u, char *s, char *q, unsigned int ql, MYSQL_STMT *stmt, bool lock=true); - MySQL_STMT_Global_info * add_prepared_statement(bool *is_new, unsigned int h, char *u, char *s, char *q, unsigned int ql, MYSQL_STMT *stmt, int _cache_ttl, int _timeout, int _delay, bool lock=true); - MySQL_STMT_Global_info * find_prepared_statement_by_stmt_id(uint32_t id, bool lock=true); - MySQL_STMT_Global_info * find_prepared_statement_by_hash(uint64_t hash, bool lock=true); - uint32_t total_prepared_statements() { return next_statement_id-1; } - void active_prepared_statements(uint32_t *unique, uint32_t *total); -}; - -#else // PROXYSQL_STMT_V14 class MySQL_STMTs_local_v14 { private: bool is_client_; @@ -320,6 +242,5 @@ class MySQL_STMT_Manager_v14 { void get_metrics(uint64_t *c_unique, uint64_t *c_total, uint64_t *stmt_max_stmt_id, uint64_t *cached, uint64_t *s_unique, uint64_t *s_total); SQLite3_result * get_prepared_statements_global_infos(); }; -#endif // PROXYSQL_STMT_V14 #endif /* CLASS_MYSQL_PREPARED_STATEMENT_H */ diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index 83364e185..3d8f8a8b9 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -38,11 +38,7 @@ class Query_Info { MYSQL_STMT *mysql_stmt; stmt_execute_metadata_t *stmt_meta; -#ifndef PROXYSQL_STMT_V14 - uint32_t stmt_global_id; -#else uint64_t stmt_global_id; -#endif MySQL_STMT_Global_info *stmt_info; int QueryLength; diff --git a/include/mysql_connection.h b/include/mysql_connection.h index 9aa498820..1c977bb84 100644 --- a/include/mysql_connection.h +++ b/include/mysql_connection.h @@ -65,11 +65,7 @@ class MySQL_Connection { unsigned long long last_time_used; unsigned long long timeout; int fd; -#ifndef PROXYSQL_STMT_V14 - MySQL_STMTs_local *local_stmts; // local view of prepared statements -#else MySQL_STMTs_local_v14 *local_stmts; // local view of prepared statements -#endif MYSQL *mysql; MYSQL *ret_mysql; MYSQL_RES *mysql_result; diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 5fcf8fc95..4e48ca396 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -1225,11 +1225,7 @@ void MySQL_HostGroups_Manager::push_MyConn_to_pool(MySQL_Connection *c, bool _lo } if (mysrvc->status==MYSQL_SERVER_STATUS_ONLINE) { if (c->async_state_machine==ASYNC_IDLE) { -#ifndef PROXYSQL_STMT_V14 - if (c->local_stmts->get_num_entries() > (unsigned int)GloMTH->variables.max_stmts_per_connection) { -#else if (c->local_stmts->get_num_backend_stmts() > (unsigned int)GloMTH->variables.max_stmts_per_connection) { -#endif proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 7, "Destroying MySQL_Connection %p, server %s:%d with status %d because has too many prepared statements\n", c, mysrvc->address, mysrvc->port, mysrvc->status); // delete c; mysrvc->ConnectionsUsed->add(c); diff --git a/lib/MySQL_PreparedStatement.cpp b/lib/MySQL_PreparedStatement.cpp index 00317e658..3fcd2b97c 100644 --- a/lib/MySQL_PreparedStatement.cpp +++ b/lib/MySQL_PreparedStatement.cpp @@ -3,7 +3,6 @@ #include "SpookyV2.h" -//#ifndef PROXYSQL_STMT_V14 //extern MySQL_STMT_Manager *GloMyStmt; //static uint32_t add_prepared_statement_calls = 0; //static uint32_t find_prepared_statement_by_hash_calls = 0; @@ -133,11 +132,7 @@ void *StmtLongDataHandler::get(uint32_t _stmt_id, uint16_t _param_id, return NULL; } -//#ifndef PROXYSQL_STMT_V14 -//MySQL_STMT_Global_info::MySQL_STMT_Global_info(uint32_t id, unsigned int h, -//#else MySQL_STMT_Global_info::MySQL_STMT_Global_info(uint64_t id, unsigned int h, -//#endif char *u, char *s, char *q, unsigned int ql, MYSQL_STMT *stmt, uint64_t _h) { @@ -223,7 +218,6 @@ MySQL_STMT_Global_info::MySQL_STMT_Global_info(uint64_t id, unsigned int h, } } -#ifdef PROXYSQL_STMT_V14 void MySQL_STMT_Global_info::update_metadata(MYSQL_STMT *stmt) { int i; bool need_refresh = false; @@ -407,7 +401,6 @@ void MySQL_STMT_Global_info::update_metadata(MYSQL_STMT *stmt) { // till here is copied from constructor } } -#endif MySQL_STMT_Global_info::~MySQL_STMT_Global_info() { free(username); @@ -464,300 +457,7 @@ MySQL_STMT_Global_info::~MySQL_STMT_Global_info() { digest_text = NULL; } } -/* -#ifndef PROXYSQL_STMT_V14 -uint64_t MySQL_STMTs_local::compute_hash(unsigned int hostgroup, char *user, - char *schema, char *query, - unsigned int query_length) { - uint64_t hash; - hash = stmt_compute_hash(hostgroup, user, schema, query, query_length); - return hash; -} - -MySQL_STMTs_local::~MySQL_STMTs_local() { - // Note: we do not free the prepared statements because we assume that - // if we call this destructor the connection is being destroyed anyway - for (std::map::iterator it = m.begin(); - it != m.end(); ++it) { - uint32_t stmt_id = it->first; - MYSQL_STMT *stmt = it->second; - if (stmt) { // is a server - if (stmt->mysql) { - stmt->mysql->stmts = - list_delete(stmt->mysql->stmts, &stmt->list); - } - // we do a hack here: we pretend there is no server associate - // the connection will be dropped anyway immediately after - stmt->mysql = NULL; - mysql_stmt_close(stmt); - GloMyStmt->ref_count(stmt_id, -1, true, false); - } else { // is a client - GloMyStmt->ref_count(stmt_id, -1, true, true); - } - } - m.erase(m.begin(), m.end()); -} - -uint32_t MySQL_STMTs_local::generate_new_stmt_id(uint32_t global_statement_id) { - uint32_t new_id; - new_id = GloMyStmt->generate_new_stmt_id(); - client_stmt_to_global_id.insert(std::make_pair(global_statement_id, new_id)); - return new_id; -} - - -uint32_t MySQL_STMTs_local::find_original_id(uint32_t client_stmt_id) { - auto s = client_stmt_to_global_id.find(client_stmt_id); - if (s != client_stmt_to_global_id.end()) { - uint32_t ret=s->second; - return ret; - } - return 0; -} - -bool MySQL_STMTs_local::erase(uint32_t global_statement_id) { - auto s = m.find(global_statement_id); - if (s != m.end()) { // found - if (is_client) { - // we are removing it from a client, not backend - GloMyStmt->ref_count(global_statement_id, -1, true, true); - m.erase(s); - return true; - } - // the following seems deprecated for now. Asserting - assert(0); - if (num_entries > 1000) { - MYSQL_STMT *stmt = s->second; - mysql_stmt_close(stmt); - m.erase(s); - num_entries--; - return true; // we truly removed the prepared statement - } - } - return false; // we don't really remove the prepared statement -} - -void MySQL_STMTs_local::insert(uint32_t global_statement_id, MYSQL_STMT *stmt) { - std::pair::iterator, bool> ret; - ret = m.insert(std::make_pair(global_statement_id, stmt)); - if (ret.second == true) { - num_entries++; - } - if (stmt == NULL) { // only for clients - GloMyStmt->ref_count(global_statement_id, 1, true, true); - } -} - -MySQL_STMT_Manager::MySQL_STMT_Manager() { - spinlock_rwlock_init(&rwlock); - next_statement_id = - 33; // we initialize this as 33, leaving the first 32 reserved for special prepared statements (future use) -} - -MySQL_STMT_Manager::~MySQL_STMT_Manager() { - for (std::map::iterator it = m.begin(); - it != m.end(); ++it) { - MySQL_STMT_Global_info *a = it->second; - delete a; - } - m.erase(m.begin(), m.end()); - // we do not loop in h because all the MySQL_STMT_Global_info() were already - // deleted - h.erase(h.begin(), h.end()); -} - -void MySQL_STMT_Manager::active_prepared_statements(uint32_t *unique, - uint32_t *total) { - uint32_t u = 0; - uint32_t t = 0; - spin_wrlock(&rwlock); - // fprintf(stderr,"%u , %u , %u , %u\n", - // find_prepared_statement_by_hash_calls, add_prepared_statement_calls, - // m.size(), total_prepared_statements()); - for (std::map::iterator it = m.begin(); - it != m.end(); ++it) { - MySQL_STMT_Global_info *a = it->second; - if (a->ref_count_client) { - u++; - t += a->ref_count_client; -#ifdef DEBUG - fprintf(stderr, "stmt %d , client_ref_count %d\n", a->statement_id, - a->ref_count_client); -#endif - } - } - spin_wrunlock(&rwlock); - *unique = u; - *total = t; -} - -int MySQL_STMT_Manager::ref_count(uint32_t statement_id, int cnt, bool lock, - bool is_client) { - int ret = -1; - if (lock) { - spin_wrlock(&rwlock); - } - auto s = m.find(statement_id); - if (s != m.end()) { - MySQL_STMT_Global_info *a = s->second; - if (is_client) { - ret = __sync_add_and_fetch(&a->ref_count_client, cnt); - //__sync_fetch_and_add(&a->ref_count_client,cnt); - // ret=a->ref_count_client; - if (m.size() > (unsigned)mysql_thread___max_stmts_cache) { - int max_purge = m.size() / 20; // purge up to 5% - int i = -1; - uint32_t *torem = - (uint32_t *)malloc(max_purge * sizeof(uint32_t)); - for (std::map::iterator it = - m.begin(); - it != m.end(); ++it) { - if (i == (max_purge - 1)) continue; - MySQL_STMT_Global_info *a = it->second; - if (__sync_add_and_fetch(&a->ref_count_client, 0) == 0) { - uint64_t hash = a->hash; - auto s2 = h.find(hash); - if (s2 != h.end()) { - h.erase(s2); - } - // m.erase(it); - // delete a; - i++; - torem[i] = it->first; - } - } - while (i >= 0) { - uint32_t id = torem[i]; - auto s3 = m.find(id); - MySQL_STMT_Global_info *a = s3->second; - if (a->ref_count_server == 0) { - free_stmt_ids.push(id); - } - m.erase(s3); - delete a; - i--; - } - free(torem); - } - } else { - __sync_fetch_and_add(&a->ref_count_server, cnt); - ret = a->ref_count_server; - } - } - if (lock) { - spin_wrunlock(&rwlock); - } - return ret; -} - -MySQL_STMT_Global_info *MySQL_STMT_Manager::add_prepared_statement( - bool *is_new, unsigned int _h, char *u, char *s, char *q, unsigned int ql, - MYSQL_STMT *stmt, bool lock) { - return add_prepared_statement(is_new, _h, u, s, q, ql, stmt, -1, -1, -1, - lock); -} - -MySQL_STMT_Global_info *MySQL_STMT_Manager::add_prepared_statement( - bool *is_new, unsigned int _h, char *u, char *s, char *q, unsigned int ql, - MYSQL_STMT *stmt, int _cache_ttl, int _timeout, int _delay, bool lock) { - MySQL_STMT_Global_info *ret = NULL; - uint64_t hash = stmt_compute_hash( - _h, u, s, q, ql); // this identifies the prepared statement - if (lock) { - spin_wrlock(&rwlock); - } - // try to find the statement - auto f = h.find(hash); - if (f != h.end()) { - // found it! - // MySQL_STMT_Global_info *a=f->second; - // ret=a->statement_id; - ret = f->second; - *is_new = false; - } else { - // we need to create a new one - bool free_id_avail = false; - free_id_avail = free_stmt_ids.size(); - uint32_t next_id = 0; - if (free_id_avail) { - next_id = free_stmt_ids.top(); - free_stmt_ids.pop(); - } else { - // next_id = next_statement_id; - // next_statement_id++; - __sync_fetch_and_add(&next_statement_id, 1); - } - MySQL_STMT_Global_info *a = - new MySQL_STMT_Global_info(next_id, _h, u, s, q, ql, stmt, hash); - a->properties.cache_ttl = _cache_ttl; - a->properties.timeout = _timeout; - a->properties.delay = _delay; - // insert it in both maps - m.insert(std::make_pair(a->statement_id, a)); - h.insert(std::make_pair(a->hash, a)); - // ret=a->statement_id; - ret = a; - // next_statement_id++; // increment it - //__sync_fetch_and_add(&ret->ref_count_client,1); // increase reference - //count - __sync_fetch_and_add(&ret->ref_count_client, - 1); // increase reference count - *is_new = true; - } - __sync_fetch_and_add(&add_prepared_statement_calls, 1); - __sync_fetch_and_add(&ret->ref_count_server, - 1); // increase reference count - if (lock) { - spin_wrunlock(&rwlock); - } - return ret; -} - -MySQL_STMT_Global_info *MySQL_STMT_Manager::find_prepared_statement_by_stmt_id( - uint32_t id, bool lock) { - MySQL_STMT_Global_info *ret = NULL; // assume we do not find it - if (lock) { - spin_wrlock(&rwlock); - } - - auto s = m.find(id); - if (s != m.end()) { - ret = s->second; - //__sync_fetch_and_add(&ret->ref_count,1); // increase reference count - } - - if (lock) { - spin_wrunlock(&rwlock); - } - return ret; -} -MySQL_STMT_Global_info *MySQL_STMT_Manager::find_prepared_statement_by_hash( - uint64_t hash, bool lock) { - MySQL_STMT_Global_info *ret = NULL; // assume we do not find it - if (lock) { - spin_wrlock(&rwlock); - } - - auto s = h.find(hash); - if (s != h.end()) { - ret = s->second; - //__sync_fetch_and_add(&ret->ref_count_client,1); // increase reference - //count - __sync_fetch_and_add(&find_prepared_statement_by_hash_calls, 1); - __sync_fetch_and_add(&ret->ref_count_client, 1); - } - - if (lock) { - spin_wrunlock(&rwlock); - } - return ret; -} - - - -#else // PROXYSQL_STMT_V14 -*/ extern MySQL_STMT_Manager_v14 *GloMyStmt; void MySQL_STMTs_local_v14::backend_insert(uint64_t global_statement_id, MYSQL_STMT *stmt) { @@ -1106,8 +806,6 @@ void MySQL_STMT_Manager_v14::get_metrics(uint64_t *c_unique, uint64_t *c_total, *s_total = s_t; } -//#endif // PROXYSQL_STMT_V14 - class PS_global_stats { public: diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 4514096ab..f5dd58fe5 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -21,11 +21,7 @@ extern MARIADB_CHARSET_INFO * proxysql_find_charset_collate_names(const char *cs extern MySQL_Authentication *GloMyAuth; extern ProxySQL_Admin *GloAdmin; extern MySQL_Logger *GloMyLogger; -#ifndef PROXYSQL_STMT_V14 -extern MySQL_STMT_Manager *GloMyStmt; -#else extern MySQL_STMT_Manager_v14 *GloMyStmt; -#endif extern SQLite3_Server *GloSQLite3Server; @@ -1684,11 +1680,7 @@ bool MySQL_Session::handler_again___status_CHANGING_USER_SERVER(int *_rc) { } // we recreate local_stmts : see issue #752 delete myconn->local_stmts; -#ifndef PROXYSQL_STMT_V14 - myconn->local_stmts=new MySQL_STMTs_local(false); // false by default, it is a backend -#else myconn->local_stmts=new MySQL_STMTs_local_v14(false); // false by default, it is a backend -#endif int rc=myconn->async_change_user(myds->revents); if (rc==0) { __sync_fetch_and_add(&MyHGM->status.backend_change_user, 1); @@ -2115,21 +2107,12 @@ __get_pkts_from_client: break; case _MYSQL_COM_STMT_CLOSE: { -#ifndef PROXYSQL_STMT_V14 - uint32_t stmt_global_id=0; - memcpy(&stmt_global_id,(char *)pkt.ptr+5,sizeof(uint32_t)); - // FIXME: no input validation - SLDH->reset(stmt_global_id); - sess_STMTs_meta->erase(stmt_global_id); - client_myds->myconn->local_stmts->erase(stmt_global_id); -#else uint32_t client_global_id=0; memcpy(&client_global_id,(char *)pkt.ptr+5,sizeof(uint32_t)); // FIXME: no input validation SLDH->reset(client_global_id); sess_STMTs_meta->erase(client_global_id); client_myds->myconn->local_stmts->client_close(client_global_id); -#endif } l_free(pkt.size,pkt.ptr); // FIXME: this is not complete. Counters should be decreased @@ -2178,48 +2161,10 @@ __get_pkts_from_client: break; } if (client_myds->myconn->local_stmts==NULL) { -#ifndef PROXYSQL_STMT_V14 - client_myds->myconn->local_stmts=new MySQL_STMTs_local(true); -#else client_myds->myconn->local_stmts=new MySQL_STMTs_local_v14(true); -#endif } uint64_t hash=client_myds->myconn->local_stmts->compute_hash(current_hostgroup,(char *)client_myds->myconn->userinfo->username,(char *)client_myds->myconn->userinfo->schemaname,(char *)CurrentQuery.QueryPointer,CurrentQuery.QueryLength); MySQL_STMT_Global_info *stmt_info=NULL; -#ifndef PROXYSQL_STMT_V14 - stmt_info=GloMyStmt->find_prepared_statement_by_hash(hash); // find_prepared_statement_by_hash() always increase ref_count_client - if (stmt_info) { - // FIXME: there is a very interesting race condition here - // FIXME: it is possible that multiple statement have the same hash - // FIXME: we should check local_stmts to verify is this stmt_id was already sent - if (client_myds->myconn->local_stmts->exists(stmt_info->statement_id)) { - // the client is asking to prepare another identical prepared statements - __sync_fetch_and_sub(&stmt_info->ref_count_client,1); // since find_prepared_statement_by_hash() already increased red_count_client we decrease it here - stmt_info=NULL; - } - } - if (stmt_info) { - l_free(pkt.size,pkt.ptr); - client_myds->setDSS_STATE_QUERY_SENT_NET(); - client_myds->myprot.generate_STMT_PREPARE_RESPONSE(client_myds->pkt_sid+1,stmt_info); - client_myds->myconn->local_stmts->insert(stmt_info->statement_id,NULL); - __sync_fetch_and_sub(&stmt_info->ref_count_client,1); // since find_prepared_statement_by_hash() already increased red_count_client before insert(), we decrease it here - client_myds->DSS=STATE_SLEEP; - status=WAITING_CLIENT_DATA; - CurrentQuery.end_time=thread->curtime; - CurrentQuery.end(); - break; - } else { - mybe=find_or_create_backend(current_hostgroup); - status=PROCESSING_STMT_PREPARE; - mybe->server_myds->connect_retries_on_failure=mysql_thread___connect_retries_on_failure; - mybe->server_myds->wait_until=0; - pause_until=0; - mybe->server_myds->killed_at=0; - mybe->server_myds->mysql_real_query.init(&pkt); // fix memory leak for PREPARE in prepared statements #796 - client_myds->setDSS_STATE_QUERY_SENT_NET(); - } -#else // PROXYSQL_STMT_V14 // we first lock GloStmt GloMyStmt->wrlock(); stmt_info=GloMyStmt->find_prepared_statement_by_hash(hash,false); @@ -2247,7 +2192,6 @@ __get_pkts_from_client: } GloMyStmt->unlock(); break; // make sure to not break before unlocking GloMyStmt -#endif // PROXYSQL_STMT_V14 } break; case _MYSQL_COM_STMT_EXECUTE: @@ -2264,14 +2208,6 @@ __get_pkts_from_client: thread->status_variables.queries++; //bool rc_break=false; -#ifndef PROXYSQL_STMT_V14 - uint32_t stmt_global_id=0; - memcpy(&stmt_global_id,(char *)pkt.ptr+5,sizeof(uint32_t)); - CurrentQuery.stmt_global_id=stmt_global_id; - // now we get the statement information - MySQL_STMT_Global_info *stmt_info=NULL; - stmt_info=GloMyStmt->find_prepared_statement_by_stmt_id(stmt_global_id); -#else uint32_t client_stmt_id=0; uint64_t stmt_global_id=0; memcpy(&client_stmt_id,(char *)pkt.ptr+5,sizeof(uint32_t)); @@ -2284,7 +2220,6 @@ __get_pkts_from_client: // now we get the statement information MySQL_STMT_Global_info *stmt_info=NULL; stmt_info=GloMyStmt->find_prepared_statement_by_stmt_id(stmt_global_id); -#endif if (stmt_info==NULL) { // we couldn't find it l_free(pkt.size,pkt.ptr); @@ -2554,11 +2489,7 @@ handler_again: goto handler_again; } if (status==PROCESSING_STMT_EXECUTE) { -#ifndef PROXYSQL_STMT_V14 - CurrentQuery.mysql_stmt=myconn->local_stmts->find(CurrentQuery.stmt_global_id); -#else CurrentQuery.mysql_stmt=myconn->local_stmts->find_backend_stmt_by_global_id(CurrentQuery.stmt_global_id); -#endif if (CurrentQuery.mysql_stmt==NULL) { MySQL_STMT_Global_info *stmt_info=NULL; // the conection we too doesn't have the prepared statements prepared @@ -2640,26 +2571,10 @@ handler_again: { thread->status_variables.backend_stmt_prepare++; GloMyStmt->wrlock(); -#ifndef PROXYSQL_STMT_V14 - uint32_t stmid; -#else uint32_t client_stmtid; uint64_t global_stmtid; -#endif //bool is_new; MySQL_STMT_Global_info *stmt_info=NULL; -#ifndef PROXYSQL_STMT_V14 - stmt_info=GloMyStmt->add_prepared_statement(&is_new, current_hostgroup, - (char *)client_myds->myconn->userinfo->username, - (char *)client_myds->myconn->userinfo->schemaname, - (char *)CurrentQuery.QueryPointer, - CurrentQuery.QueryLength, - CurrentQuery.mysql_stmt, - qpo->cache_ttl, - qpo->timeout, - qpo->delay, - true); -#else stmt_info=GloMyStmt->add_prepared_statement(current_hostgroup, (char *)client_myds->myconn->userinfo->username, (char *)client_myds->myconn->userinfo->schemaname, @@ -2670,7 +2585,6 @@ handler_again: qpo->timeout, qpo->delay, false); -#endif if (CurrentQuery.QueryParserArgs.digest_text) { if (stmt_info->digest_text==NULL) { stmt_info->digest_text=strdup(CurrentQuery.QueryParserArgs.digest_text); @@ -2678,15 +2592,10 @@ handler_again: stmt_info->MyComQueryCmd=CurrentQuery.MyComQueryCmd; // copy MyComQueryCmd } } -#ifndef PROXYSQL_STMT_V14 - stmid=stmt_info->statement_id; - myds->myconn->local_stmts->insert(stmid,CurrentQuery.mysql_stmt); -#else global_stmtid=stmt_info->statement_id; myds->myconn->local_stmts->backend_insert(global_stmtid,CurrentQuery.mysql_stmt); if (previous_status.size() == 0) client_stmtid=client_myds->myconn->local_stmts->generate_new_client_stmt_id(global_stmtid); -#endif GloMyStmt->unlock(); CurrentQuery.mysql_stmt=NULL; enum session_status st=status; @@ -2698,13 +2607,7 @@ handler_again: previous_status.pop(); NEXT_IMMEDIATE(st); } else { -#ifndef PROXYSQL_STMT_V14 - client_myds->myprot.generate_STMT_PREPARE_RESPONSE(client_myds->pkt_sid+1,stmt_info); - client_myds->myconn->local_stmts->insert(stmt_info->statement_id,NULL); - if (is_new) __sync_fetch_and_sub(&stmt_info->ref_count_client,1); -#else client_myds->myprot.generate_STMT_PREPARE_RESPONSE(client_myds->pkt_sid+1,stmt_info,client_stmtid); -#endif } } break; diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index a2b8ef906..53c06e985 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -143,11 +143,7 @@ extern ProxySQL_Admin *GloAdmin; extern Query_Processor *GloQPro; extern MySQL_Threads_Handler *GloMTH; extern MySQL_Logger *GloMyLogger; -#ifndef PROXYSQL_STMT_V14 -extern MySQL_STMT_Manager *GloMyStmt; -#else extern MySQL_STMT_Manager_v14 *GloMyStmt; -#endif extern MySQL_Monitor *GloMyMon; extern ProxySQL_Cluster *GloProxyCluster; @@ -5035,31 +5031,6 @@ void ProxySQL_Admin::stats___mysql_global() { statsdb->execute(query); free(query); -#ifndef PROXYSQL_STMT_V14 - if (GloMyStmt) { - uint32_t stmt_active_unique=0; - uint32_t stmt_active_total=0; - GloMyStmt->active_prepared_statements(&stmt_active_unique,&stmt_active_total); - vn=(char *)"Stmt_Active_Total"; - sprintf(bu,"%u",stmt_active_total); - query=(char *)malloc(strlen(a)+strlen(vn)+strlen(bu)+16); - sprintf(query,a,vn,bu); - statsdb->execute(query); - free(query); - vn=(char *)"Stmt_Active_Unique"; - sprintf(bu,"%u",stmt_active_unique); - query=(char *)malloc(strlen(a)+strlen(vn)+strlen(bu)+16); - sprintf(query,a,vn,bu); - statsdb->execute(query); - free(query); - vn=(char *)"Stmt_Max_Stmt_id"; - sprintf(bu,"%u",GloMyStmt->total_prepared_statements()); - query=(char *)malloc(strlen(a)+strlen(vn)+strlen(bu)+16); - sprintf(query,a,vn,bu); - statsdb->execute(query); - free(query); - } -#else if (GloMyStmt) { uint64_t stmt_client_active_unique = 0; uint64_t stmt_client_active_total = 0; @@ -5105,7 +5076,6 @@ void ProxySQL_Admin::stats___mysql_global() { statsdb->execute(query); free(query); } -#endif resultset=GloQC->SQL3_getStats(); if (resultset) { diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index 5a888c452..edadbe044 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -191,11 +191,7 @@ MySQL_Connection::MySQL_Connection() { creation_time=0; processing_multi_statement=false; proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "Creating new MySQL_Connection %p\n", this); -#ifndef PROXYSQL_STMT_V14 - local_stmts=new MySQL_STMTs_local(false); // false by default, it is a backend -#else local_stmts=new MySQL_STMTs_local_v14(false); // false by default, it is a backend -#endif }; MySQL_Connection::~MySQL_Connection() { @@ -1700,11 +1696,7 @@ void MySQL_Connection::reset() { } } delete local_stmts; -#ifndef PROXYSQL_STMT_V14 - local_stmts=new MySQL_STMTs_local(false); -#else local_stmts=new MySQL_STMTs_local_v14(false); -#endif } bool MySQL_Connection::get_gtid(char *buff, uint64_t *trx_id) { diff --git a/src/main.cpp b/src/main.cpp index 052cc1cb9..09237ee46 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -201,11 +201,7 @@ Query_Processor *GloQPro; ProxySQL_Admin *GloAdmin; MySQL_Threads_Handler *GloMTH; -#ifndef PROXYSQL_STMT_V14 -MySQL_STMT_Manager *GloMyStmt; -#else MySQL_STMT_Manager_v14 *GloMyStmt; -#endif MySQL_Monitor *GloMyMon; std::thread *MyMon_thread = NULL; @@ -400,11 +396,7 @@ void ProxySQL_Main_init_main_modules() { MyHGM=new MySQL_HostGroups_Manager(); GloMTH=new MySQL_Threads_Handler(); GloMyLogger = new MySQL_Logger(); -#ifndef PROXYSQL_STMT_V14 - GloMyStmt=new MySQL_STMT_Manager(); -#else GloMyStmt=new MySQL_STMT_Manager_v14(); -#endif } From 0f3aa944d038c57a66cfcb11c9c147273396552c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 30 Dec 2017 18:07:34 +0100 Subject: [PATCH 13/40] Ignore LOCK/UNLOCK TABLE in ClickHouse #1314 --- lib/ClickHouse_Server.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/ClickHouse_Server.cpp b/lib/ClickHouse_Server.cpp index 8eaddfd2f..a4a658910 100644 --- a/lib/ClickHouse_Server.cpp +++ b/lib/ClickHouse_Server.cpp @@ -1970,6 +1970,15 @@ __end_show_commands: run_query=false; goto __run_query; } + if ( + (strncasecmp("LOCK TABLE",query_no_space,10)==0) + || + (strncasecmp("UNLOCK TABLE",query_no_space,12)==0) + ) { + GloClickHouseServer->send_MySQL_OK(&sess->client_myds->myprot, NULL); + run_query=false; + goto __run_query; + } } __run_query: From fe2f16d6df15252f0107a6a224dad7b1efdb13f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 8 Jan 2018 15:58:39 +0100 Subject: [PATCH 14/40] Added support for innodb_read_only and super_read_only #1195 --- include/MySQL_HostGroups_Manager.h | 2 +- include/MySQL_Monitor.hpp | 2 + lib/MySQL_HostGroups_Manager.cpp | 22 +++++----- lib/MySQL_Monitor.cpp | 22 +++++++++- lib/ProxySQL_Admin.cpp | 69 +++++++++++++++++++++--------- lib/ProxySQL_Cluster.cpp | 10 ++--- 6 files changed, 88 insertions(+), 39 deletions(-) diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 349158108..c01a41124 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -25,7 +25,7 @@ #define MYHGM_MYSQL_SERVERS "CREATE TABLE mysql_servers ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , weight INT NOT NULL DEFAULT 1 , status INT NOT NULL DEFAULT 0 , compression INT NOT NULL DEFAULT 0 , max_connections INT NOT NULL DEFAULT 1000 , max_replication_lag INT NOT NULL DEFAULT 0 , use_ssl INT NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , mem_pointer INT NOT NULL DEFAULT 0 , PRIMARY KEY (hostgroup_id, hostname, port) )" #define MYHGM_MYSQL_SERVERS_INCOMING "CREATE TABLE mysql_servers_incoming ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , weight INT NOT NULL DEFAULT 1 , status INT NOT NULL DEFAULT 0 , compression INT NOT NULL DEFAULT 0 , max_connections INT NOT NULL DEFAULT 1000 , max_replication_lag INT NOT NULL DEFAULT 0 , use_ssl INT NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port))" #endif /* DEBUG */ -#define MYHGM_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" +#define MYHGM_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0) , check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only')) NOT NULL DEFAULT 'read_only' , comment VARCHAR NOT NULL DEFAULT '' , UNIQUE (reader_hostgroup))" #define MYHGM_MYSQL_GROUP_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_group_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" diff --git a/include/MySQL_Monitor.hpp b/include/MySQL_Monitor.hpp index 2a4fe2470..8ef28a388 100644 --- a/include/MySQL_Monitor.hpp +++ b/include/MySQL_Monitor.hpp @@ -63,6 +63,8 @@ enum MySQL_Monitor_State_Data_Task_Type { MON_CONNECT, MON_PING, MON_READ_ONLY, + MON_INNODB_READ_ONLY, + MON_SUPER_READ_ONLY, MON_REPLICATION_LAG }; diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 4e48ca396..2f7f57b92 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -1017,22 +1017,22 @@ void MySQL_HostGroups_Manager::generate_mysql_replication_hostgroups_table() { SQLite3_row *r=*it; char *o=NULL; int comment_length=0; // #issue #643 - if (r->fields[2]) { // comment is not null - o=escape_string_single_quotes(r->fields[2],false); + //if (r->fields[3]) { // comment is not null + o=escape_string_single_quotes(r->fields[3],false); comment_length=strlen(o); - } + //} char *query=(char *)malloc(256+comment_length); - if (r->fields[2]) { // comment is not null - sprintf(query,"INSERT INTO mysql_replication_hostgroups VALUES(%s,%s,'%s')",r->fields[0], r->fields[1], o); - if (o!=r->fields[2]) { // there was a copy + //if (r->fields[3]) { // comment is not null + sprintf(query,"INSERT INTO mysql_replication_hostgroups VALUES(%s,%s,'%s','%s')",r->fields[0], r->fields[1], r->fields[2], o); + if (o!=r->fields[3]) { // there was a copy free(o); } - } else { - sprintf(query,"INSERT INTO mysql_replication_hostgroups VALUES(%s,%s,NULL)",r->fields[0],r->fields[1]); - } + //} else { + //sprintf(query,"INSERT INTO mysql_replication_hostgroups VALUES(%s,%s,NULL)",r->fields[0],r->fields[1]); + //} mydb->execute(query); if (GloMTH->variables.hostgroup_manager_verbose) { - fprintf(stderr,"writer_hostgroup: %s , reader_hostgroup: %s, %s\n", r->fields[0],r->fields[1], r->fields[2]); + fprintf(stderr,"writer_hostgroup: %s , reader_hostgroup: %s, check_type %s, comment: %s\n", r->fields[0],r->fields[1], r->fields[2], r->fields[3]); } free(query); } @@ -1161,7 +1161,7 @@ SQLite3_result * MySQL_HostGroups_Manager::dump_table_mysql_replication_hostgrou int cols=0; int affected_rows=0; SQLite3_result *resultset=NULL; - char *query=(char *)"SELECT writer_hostgroup, reader_hostgroup, comment FROM mysql_replication_hostgroups"; + char *query=(char *)"SELECT writer_hostgroup, reader_hostgroup, check_type, comment FROM mysql_replication_hostgroups"; proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "%s\n", query); mydb->execute_statement(query, &error , &cols , &affected_rows , &resultset); wrunlock(); diff --git a/lib/MySQL_Monitor.cpp b/lib/MySQL_Monitor.cpp index 14b981889..1f8797c57 100644 --- a/lib/MySQL_Monitor.cpp +++ b/lib/MySQL_Monitor.cpp @@ -589,7 +589,15 @@ void * monitor_read_only_thread(void *arg) { } mmsd->t1=monotonic_time(); - mmsd->async_exit_status=mysql_query_start(&mmsd->interr,mmsd->mysql,"SHOW GLOBAL VARIABLES LIKE 'read_only'"); + if (mmsd->task_id == MON_INNODB_READ_ONLY) { + mmsd->async_exit_status=mysql_query_start(&mmsd->interr,mmsd->mysql,"SHOW GLOBAL VARIABLES LIKE 'innodb_read_only'"); + } else { + if (mmsd->task_id == MON_SUPER_READ_ONLY) { + mmsd->async_exit_status=mysql_query_start(&mmsd->interr,mmsd->mysql,"SHOW GLOBAL VARIABLES LIKE 'super_read_only'"); + } else { + mmsd->async_exit_status=mysql_query_start(&mmsd->interr,mmsd->mysql,"SHOW GLOBAL VARIABLES LIKE 'read_only'"); + } + } while (mmsd->async_exit_status) { mmsd->async_exit_status=wait_for_mysql(mmsd->mysql, mmsd->async_exit_status); unsigned long long now=monotonic_time(); @@ -1477,7 +1485,7 @@ void * MySQL_Monitor::monitor_read_only() { char *error=NULL; SQLite3_result *resultset=NULL; // add support for SSL - char *query=(char *)"SELECT hostname, port, MAX(use_ssl) use_ssl FROM mysql_servers JOIN mysql_replication_hostgroups ON hostgroup_id=writer_hostgroup OR hostgroup_id=reader_hostgroup WHERE status NOT LIKE 'OFFLINE\%' GROUP BY hostname, port"; + char *query=(char *)"SELECT hostname, port, MAX(use_ssl) use_ssl, check_type FROM mysql_servers JOIN mysql_replication_hostgroups ON hostgroup_id=writer_hostgroup OR hostgroup_id=reader_hostgroup WHERE status NOT IN (2,3) GROUP BY hostname, port"; t1=monotonic_time(); if (!GloMTH) return NULL; // quick exit during shutdown/restart @@ -1509,6 +1517,16 @@ void * MySQL_Monitor::monitor_read_only() { for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { SQLite3_row *r=*it; MySQL_Monitor_State_Data *mmsd=new MySQL_Monitor_State_Data(r->fields[0],atoi(r->fields[1]), NULL, atoi(r->fields[2])); + mmsd->task_id = MON_READ_ONLY; // default + if (r->fields[3]) { + if (strcasecmp(r->fields[3],(char *)"innodb_read_only")==0) { + mmsd->task_id = MON_INNODB_READ_ONLY; + } else { + if (strcasecmp(r->fields[3],(char *)"super_read_only")==0) { + mmsd->task_id = MON_SUPER_READ_ONLY; + } + } + } mmsd->mondb=monitordb; WorkItem* item; item=new WorkItem(mmsd,monitor_read_only_thread); diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 53c06e985..d886a40bf 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -227,6 +227,15 @@ static int http_handler(void *cls, struct MHD_Connection *connection, const char // mysql_replication_hostgroups in v1.2.2 #define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_2_2 "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" +// mysql_replication_hostgroups in v1.4.5 +#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_4_5 "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR NOT NULL DEFAULT '', UNIQUE (reader_hostgroup))" + +// mysql_replication_hostgroups in v2.0.0 +#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V2_0_0 "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0) , check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only')) NOT NULL DEFAULT 'read_only' , comment VARCHAR NOT NULL DEFAULT '', UNIQUE (reader_hostgroup))" + +// mysql_replication_hostgroups current +#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V2_0_0 + #define ADMIN_SQLITE_TABLE_MYSQL_COLLATIONS "CREATE TABLE mysql_collations (Id INTEGER NOT NULL PRIMARY KEY , Collation VARCHAR NOT NULL , Charset VARCHAR NOT NULL , `Default` VARCHAR NOT NULL)" #define ADMIN_SQLITE_TABLE_SCHEDULER "CREATE TABLE scheduler (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '')" @@ -241,7 +250,7 @@ static int http_handler(void *cls, struct MHD_Connection *connection, const char #define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_SERVERS "CREATE TABLE runtime_mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE runtime_mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" +#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE runtime_mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0) , check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only')) NOT NULL DEFAULT 'read_only' , comment VARCHAR NOT NULL DEFAULT '' , UNIQUE (reader_hostgroup))" #define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_QUERY_RULES "CREATE TABLE runtime_mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , OK_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1,2)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" @@ -6645,30 +6654,22 @@ void ProxySQL_Admin::save_mysql_servers_runtime_to_database(bool _runtime) { for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { SQLite3_row *r=*it; int l=0; - if (r->fields[2]) l=strlen(r->fields[2]); + if (r->fields[3]) l=strlen(r->fields[3]); char *q=NULL; if (_runtime) { - if (r->fields[2]) { // comment is not null, #643 - q=(char *)"INSERT INTO runtime_mysql_replication_hostgroups VALUES(%s,%s,'%s')"; - } else { - q=(char *)"INSERT INTO runtime_mysql_replication_hostgroups VALUES(%s,%s,NULL)"; - } + q=(char *)"INSERT INTO runtime_mysql_replication_hostgroups VALUES(%s,%s,'%s','%s')"; } else { - if (r->fields[2]) { // comment is not null, #643 - q=(char *)"INSERT INTO mysql_replication_hostgroups VALUES(%s,%s,'%s')"; - } else { - q=(char *)"INSERT INTO mysql_replication_hostgroups VALUES(%s,%s,NULL)"; - } + q=(char *)"INSERT INTO mysql_replication_hostgroups VALUES(%s,%s,'%s','%s')"; } - char *query=(char *)malloc(strlen(q)+strlen(r->fields[0])+strlen(r->fields[1])+16+l); - if (r->fields[2]) { - char *o=escape_string_single_quotes(r->fields[2],false); - sprintf(query, q, r->fields[0], r->fields[1], o); - if (o!=r->fields[2]) { // there was a copy + char *query=(char *)malloc(strlen(q)+strlen(r->fields[0])+strlen(r->fields[1])+strlen(r->fields[2])+16+l); + if (r->fields[3]) { + char *o=escape_string_single_quotes(r->fields[3],false); + sprintf(query, q, r->fields[0], r->fields[1], r->fields[2], o); + if (o!=r->fields[3]) { // there was a copy free(o); } - } else { - sprintf(query, q, r->fields[0], r->fields[1]); + //} else { + //sprintf(query, q, r->fields[0], r->fields[1], r->fields[2], r->fields[3]); } proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "%s\n", query); admindb->execute(query); @@ -7723,10 +7724,38 @@ void ProxySQL_Admin::disk_upgrade_mysql_servers() { // rename current table to add suffix _v100 configdb->execute("ALTER TABLE mysql_replication_hostgroups RENAME TO mysql_replication_hostgroups_v100"); // create new table - configdb->build_table((char *)"mysql_replication_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_2_2,false); + configdb->build_table((char *)"mysql_replication_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS,false); // copy fields from old table configdb->execute("INSERT INTO mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) SELECT writer_hostgroup , reader_hostgroup FROM mysql_replication_hostgroups_v100"); } + rci=configdb->check_table_structure((char *)"mysql_replication_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_2_2); // issue #1304 + if (rci) { + // upgrade is required + proxy_warning("Detected version v1.2.2 (pre-1.4.5) of table mysql_replication_hostgroups\n"); + proxy_warning("ONLINE UPGRADE of table mysql_replication_hostgroups in progress\n"); + // drop any existing table with suffix _v122 + configdb->execute("DROP TABLE IF EXISTS mysql_replication_hostgroups_v122"); + // rename current table to add suffix _v122 + configdb->execute("ALTER TABLE mysql_replication_hostgroups RENAME TO mysql_replication_hostgroups_v122"); + // create new table + configdb->build_table((char *)"mysql_replication_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS,false); + // copy fields from old table + configdb->execute("INSERT INTO mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment) SELECT writer_hostgroup , reader_hostgroup , COALESCE(comment,'') FROM mysql_replication_hostgroups_v122"); + } + rci=configdb->check_table_structure((char *)"mysql_replication_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_4_5); // issue #1304 + if (rci) { + // upgrade is required + proxy_warning("Detected version v1.4.5 (pre-2.0.0) of table mysql_replication_hostgroups\n"); + proxy_warning("ONLINE UPGRADE of table mysql_replication_hostgroups in progress\n"); + // drop any existing table with suffix _v145 + configdb->execute("DROP TABLE IF EXISTS mysql_replication_hostgroups_v145"); + // rename current table to add suffix _v145 + configdb->execute("ALTER TABLE mysql_replication_hostgroups RENAME TO mysql_replication_hostgroups_v145"); + // create new table + configdb->build_table((char *)"mysql_replication_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS,false); + // copy fields from old table + configdb->execute("INSERT INTO mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment) SELECT writer_hostgroup , reader_hostgroup , comment FROM mysql_replication_hostgroups_v145"); + } configdb->execute("PRAGMA foreign_keys = ON"); } diff --git a/lib/ProxySQL_Cluster.cpp b/lib/ProxySQL_Cluster.cpp index b53c897ee..a0b101c02 100644 --- a/lib/ProxySQL_Cluster.cpp +++ b/lib/ProxySQL_Cluster.cpp @@ -809,17 +809,17 @@ void ProxySQL_Cluster::pull_mysql_servers_from_peer() { proxy_info("Cluster: Writing mysql_replication_hostgroups table\n"); GloAdmin->admindb->execute("DELETE FROM mysql_replication_hostgroups"); - q=(char *)"INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup, comment) VALUES (%s, %s, '%s')"; + q=(char *)"INSERT INTO mysql_replication_hostgroups (writer_hostgroup, reader_hostgroup, check_type, comment) VALUES (%s, %s, '%s', '%s')"; while ((row = mysql_fetch_row(result2))) { int i; int l=0; - for (i=0; i<2; i++) { + for (i=0; i<3; i++) { l+=strlen(row[i]); } - char *o=escape_string_single_quotes(row[2],false); + char *o=escape_string_single_quotes(row[3],false); char *query = (char *)malloc(strlen(q)+i+strlen(o)+64); - sprintf(query,q,row[0],row[1],o); - if (o!=row[2]) { // there was a copy + sprintf(query,q,row[0],row[1],row[2],o); + if (o!=row[3]) { // there was a copy free(o); } GloAdmin->admindb->execute(query); From fe39795907265851d1710afda87db16aa126f685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 8 Jan 2018 17:25:25 +0100 Subject: [PATCH 15/40] Code cleanup --- include/ClickHouse_Server.h | 158 -- include/SQLite3_Server.h | 175 --- lib/ClickHouse_Server.cpp | 1805 +---------------------- lib/SQLite3_Server.cpp | 2716 +---------------------------------- 4 files changed, 81 insertions(+), 4773 deletions(-) diff --git a/include/ClickHouse_Server.h b/include/ClickHouse_Server.h index b0287c04d..ad3fb4118 100644 --- a/include/ClickHouse_Server.h +++ b/include/ClickHouse_Server.h @@ -28,13 +28,6 @@ class ClickHouse_Server { private: volatile int main_shutdown; SQLite3DB *SQLite_General_DB; - /* - std::vector *tables_defs_admin; - std::vector *tables_defs_stats; - std::vector *tables_defs_config; - - pthread_t admin_thr; - */ int main_poll_nfds; struct pollfd *main_poll_fds; int *main_callback_func; @@ -43,15 +36,8 @@ class ClickHouse_Server { struct { - // char *admin_credentials; - // char *stats_credentials; - // int refresh_interval; char *mysql_ifaces; - // char *telnet_admin_ifaces; - // char *telnet_stats_ifaces; bool read_only; - // bool hash_passwords; -// char *version; #ifdef DEBUG bool debug; #endif // DEBUG @@ -60,160 +46,16 @@ class ClickHouse_Server { } variables; void dump_mysql_collations(); - /* - void insert_into_tables_defs(std::vector *, const char - *table_name, const char *table_def); - void drop_tables_defs(std::vector *tables_defs); - void check_and_build_standard_tables(SQLite3DB *db, - std::vector *tables_defs); - - #ifdef DEBUG - void flush_debug_levels_runtime_to_database(SQLite3DB *db, bool - replace); - int flush_debug_levels_database_to_runtime(SQLite3DB *db); - #endif // DEBUG - - void __insert_or_ignore_maintable_select_disktable(); - void __insert_or_replace_maintable_select_disktable(); - void __delete_disktable(); - void __insert_or_replace_disktable_select_maintable(); - void __attach_db(SQLite3DB *db1, SQLite3DB *db2, char *alias); - - void __add_active_users(enum cred_username_type usertype, char - *user=NULL); - void __delete_inactive_users(enum cred_username_type usertype); - void add_admin_users(); - void __refresh_users(); - - void flush_mysql_variables___runtime_to_database(SQLite3DB *db, bool - replace, bool del, bool onlyifempty, bool runtime=false); - void flush_mysql_variables___database_to_runtime(SQLite3DB *db, bool - replace); - - */ - /* - void flush_admin_variables___database_to_runtime(SQLite3DB *db, bool - replace); - void flush_admin_variables___runtime_to_database(SQLite3DB *db, bool - replace, bool del, bool onlyifempty, bool runtime=false); - void disk_upgrade_mysql_query_rules(); - void disk_upgrade_mysql_servers(); - void disk_upgrade_mysql_users(); - void disk_upgrade_scheduler(); - - #ifdef DEBUG - void add_credentials(char *type, char *credentials, int hostgroup_id); - void delete_credentials(char *type, char *credentials); - #else - void add_credentials(char *credentials, int hostgroup_id); - void delete_credentials(char *credentials); - #endif // DEBUG - */ public: ClickHouse_Server(); ~ClickHouse_Server(); - /* - struct { - void *opt; - void **re; - } match_regexes; - void public_add_active_users(enum cred_username_type usertype, char - *user=NULL) { - __add_active_users(usertype, user); - } - ProxySQL_Admin(); - ~ProxySQL_Admin(); - SQLite3DB *admindb; // in memory - SQLite3DB *statsdb; // in memory - SQLite3DB *configdb; // on disk - SQLite3DB *monitordb; // in memory - int pipefd[2]; - */ void print_version(); char **get_variables_list(); char *get_variable(char *name); bool set_variable(char *name, char *value); bool init(); - /* - bool get_read_only() { return variables.admin_read_only; } - bool set_read_only(bool ro) { variables.admin_read_only=ro; return - variables.admin_read_only; } -*/ bool has_variable(const char *name); -/* - void init_users(); - void init_mysql_servers(); - void init_mysql_query_rules(); - void save_mysql_users_runtime_to_database(bool _runtime); - void save_mysql_servers_runtime_to_database(bool); - void admin_shutdown(); - bool is_command(std::string); - */ void send_MySQL_OK(MySQL_Protocol *myprot, char *msg, int rows = 0); void send_MySQL_ERR(MySQL_Protocol *myprot, char *msg); - /* - #ifdef DEBUG - int load_debug_to_runtime() { return - flush_debug_levels_database_to_runtime(admindb); } - void save_debug_from_runtime() { return - flush_debug_levels_runtime_to_database(admindb, true); } - #endif // DEBUG - void flush_mysql_users__from_memory_to_disk(); - void flush_mysql_users__from_disk_to_memory(); - void flush_mysql_servers__from_memory_to_disk(); - void flush_mysql_servers__from_disk_to_memory(); - void flush_mysql_query_rules__from_memory_to_disk(); - void flush_mysql_query_rules__from_disk_to_memory(); - void load_mysql_servers_to_runtime(); - void save_mysql_servers_from_runtime(); - char * load_mysql_query_rules_to_runtime(); - void save_mysql_query_rules_from_runtime(bool); - - void load_scheduler_to_runtime(); - void save_scheduler_runtime_to_database(bool); - void flush_scheduler__from_memory_to_disk(); - void flush_scheduler__from_disk_to_memory(); - - void load_admin_variables_to_runtime() { - flush_admin_variables___database_to_runtime(admindb, true); } - void save_admin_variables_from_runtime() { - flush_admin_variables___runtime_to_database(admindb, true, true, false); } - - void load_mysql_variables_to_runtime() { - flush_mysql_variables___database_to_runtime(admindb, true); } - void save_mysql_variables_from_runtime() { - flush_mysql_variables___runtime_to_database(admindb, true, true, false); } - - void stats___mysql_query_rules(); - void stats___mysql_query_digests(bool reset); - //void stats___mysql_query_digests_reset(); - void stats___mysql_commands_counters(); - void stats___mysql_processlist(); - void stats___mysql_connection_pool(bool _reset); - void stats___mysql_global(); - void stats___mysql_users(); - - int Read_Global_Variables_from_configfile(const char *prefix); - int Read_MySQL_Users_from_configfile(); - int Read_MySQL_Query_Rules_from_configfile(); - int Read_MySQL_Servers_from_configfile(); - int Read_Scheduler_from_configfile(); - - void flush_error_log(); - void GenericRefreshStatistics(const char *query_no_space, unsigned int - query_no_space_length, bool admin); - SQLite3_result * generate_show_table_status(const char *, char **err); - SQLite3_result * generate_show_fields_from(const char *tablename, char - **err); - - void mysql_servers_wrlock(); - void mysql_servers_wrunlock(); - - // wrapper to call a private function - unsigned long long scheduler_run_once() { return scheduler->run_once(); - } - - void flush_configdb(); // 923 - */ }; #endif // CLASS_PROXYSQL_CLICKHOUSE_SERVER_H diff --git a/include/SQLite3_Server.h b/include/SQLite3_Server.h index d8f172068..a2ceb6ab4 100644 --- a/include/SQLite3_Server.h +++ b/include/SQLite3_Server.h @@ -6,43 +6,6 @@ #include "cpp.h" #include -/* -typedef struct { uint32_t hash; uint32_t key; } t_symstruct; - - -class Scheduler_Row { - public: - unsigned int id; - bool is_active; - unsigned int interval_ms; - unsigned long long last; - unsigned long long next; - char *filename; - char **args; - char *comment; - Scheduler_Row(unsigned int _id, bool _is_active, unsigned int _in, char *_f, char *a1, char *a2, char *a3, char *a4, char *a5, char *_comment); - ~Scheduler_Row(); -}; - -class ProxySQL_External_Scheduler { - private: - unsigned long long next_run; - public: - unsigned int last_version; - unsigned int version; -#ifdef PA_PTHREAD_MUTEX - pthread_rwlock_t rwlock; -#else - rwlock_t rwlock; -#endif - std::vector Scheduler_Rows; - ProxySQL_External_Scheduler(); - ~ProxySQL_External_Scheduler(); - unsigned long long run_once(); - void update_table(SQLite3_result *result); -}; -*/ - class SQLite3_Session { public: SQLite3DB *sessdb; @@ -54,23 +17,12 @@ class SQLite3_Server { private: volatile int main_shutdown; SQLite3DB *sessdb; -/* - std::vector *tables_defs_admin; - std::vector *tables_defs_stats; - std::vector *tables_defs_config; - - pthread_t admin_thr; -*/ int main_poll_nfds; struct pollfd *main_poll_fds; int *main_callback_func; pthread_rwlock_t rwlock; - - - - struct { char *admin_credentials; char *stats_credentials; @@ -85,70 +37,9 @@ class SQLite3_Server { bool debug; #endif // DEBUG } variables; -/* - - ProxySQL_External_Scheduler *scheduler; - - void dump_mysql_collations(); - void insert_into_tables_defs(std::vector *, const char *table_name, const char *table_def); - void drop_tables_defs(std::vector *tables_defs); - void check_and_build_standard_tables(SQLite3DB *db, std::vector *tables_defs); - -#ifdef DEBUG - void flush_debug_levels_runtime_to_database(SQLite3DB *db, bool replace); - int flush_debug_levels_database_to_runtime(SQLite3DB *db); -#endif // DEBUG - - void __insert_or_ignore_maintable_select_disktable(); - void __insert_or_replace_maintable_select_disktable(); - void __delete_disktable(); - void __insert_or_replace_disktable_select_maintable(); - void __attach_db(SQLite3DB *db1, SQLite3DB *db2, char *alias); - - void __add_active_users(enum cred_username_type usertype, char *user=NULL); - void __delete_inactive_users(enum cred_username_type usertype); - void add_admin_users(); - void __refresh_users(); - - void flush_mysql_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty, bool runtime=false); - void flush_mysql_variables___database_to_runtime(SQLite3DB *db, bool replace); - -*/ -/* - void flush_admin_variables___database_to_runtime(SQLite3DB *db, bool replace); - void flush_admin_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty, bool runtime=false); - void disk_upgrade_mysql_query_rules(); - void disk_upgrade_mysql_servers(); - void disk_upgrade_mysql_users(); - void disk_upgrade_scheduler(); - -#ifdef DEBUG - void add_credentials(char *type, char *credentials, int hostgroup_id); - void delete_credentials(char *type, char *credentials); -#else - void add_credentials(char *credentials, int hostgroup_id); - void delete_credentials(char *credentials); -#endif // DEBUG -*/ public: SQLite3_Server(); ~SQLite3_Server(); -/* - struct { - void *opt; - void **re; - } match_regexes; - void public_add_active_users(enum cred_username_type usertype, char *user=NULL) { - __add_active_users(usertype, user); - } - ProxySQL_Admin(); - ~ProxySQL_Admin(); - SQLite3DB *admindb; // in memory - SQLite3DB *statsdb; // in memory - SQLite3DB *configdb; // on disk - SQLite3DB *monitordb; // in memory - int pipefd[2]; -*/ char **get_variables_list(); char *get_variable(char *name); bool set_variable(char *name, char *value); @@ -157,73 +48,7 @@ class SQLite3_Server { bool init(); void wrlock(); void wrunlock(); -/* - bool get_read_only() { return variables.admin_read_only; } - bool set_read_only(bool ro) { variables.admin_read_only=ro; return variables.admin_read_only; } - void init_users(); - void init_mysql_servers(); - void init_mysql_query_rules(); - void save_mysql_users_runtime_to_database(bool _runtime); - void save_mysql_servers_runtime_to_database(bool); - void admin_shutdown(); - bool is_command(std::string); -*/ void send_MySQL_OK(MySQL_Protocol *myprot, char *msg, int rows=0); void send_MySQL_ERR(MySQL_Protocol *myprot, char *msg); -/* -#ifdef DEBUG - int load_debug_to_runtime() { return flush_debug_levels_database_to_runtime(admindb); } - void save_debug_from_runtime() { return flush_debug_levels_runtime_to_database(admindb, true); } -#endif // DEBUG - void flush_mysql_users__from_memory_to_disk(); - void flush_mysql_users__from_disk_to_memory(); - void flush_mysql_servers__from_memory_to_disk(); - void flush_mysql_servers__from_disk_to_memory(); - void flush_mysql_query_rules__from_memory_to_disk(); - void flush_mysql_query_rules__from_disk_to_memory(); - void load_mysql_servers_to_runtime(); - void save_mysql_servers_from_runtime(); - char * load_mysql_query_rules_to_runtime(); - void save_mysql_query_rules_from_runtime(bool); - - void load_scheduler_to_runtime(); - void save_scheduler_runtime_to_database(bool); - void flush_scheduler__from_memory_to_disk(); - void flush_scheduler__from_disk_to_memory(); - - void load_admin_variables_to_runtime() { flush_admin_variables___database_to_runtime(admindb, true); } - void save_admin_variables_from_runtime() { flush_admin_variables___runtime_to_database(admindb, true, true, false); } - - void load_mysql_variables_to_runtime() { flush_mysql_variables___database_to_runtime(admindb, true); } - void save_mysql_variables_from_runtime() { flush_mysql_variables___runtime_to_database(admindb, true, true, false); } - - void stats___mysql_query_rules(); - void stats___mysql_query_digests(bool reset); - //void stats___mysql_query_digests_reset(); - void stats___mysql_commands_counters(); - void stats___mysql_processlist(); - void stats___mysql_connection_pool(bool _reset); - void stats___mysql_global(); - void stats___mysql_users(); - - int Read_Global_Variables_from_configfile(const char *prefix); - int Read_MySQL_Users_from_configfile(); - int Read_MySQL_Query_Rules_from_configfile(); - int Read_MySQL_Servers_from_configfile(); - int Read_Scheduler_from_configfile(); - - void flush_error_log(); - void GenericRefreshStatistics(const char *query_no_space, unsigned int query_no_space_length, bool admin); - SQLite3_result * generate_show_table_status(const char *, char **err); - SQLite3_result * generate_show_fields_from(const char *tablename, char **err); - - void mysql_servers_wrlock(); - void mysql_servers_wrunlock(); - - // wrapper to call a private function - unsigned long long scheduler_run_once() { return scheduler->run_once(); } - - void flush_configdb(); // 923 -*/ }; #endif // CLASS_PROXYSQL_SQLITE3_SERVER_H diff --git a/lib/ClickHouse_Server.cpp b/lib/ClickHouse_Server.cpp index a4a658910..bc56ecb26 100644 --- a/lib/ClickHouse_Server.cpp +++ b/lib/ClickHouse_Server.cpp @@ -228,16 +228,6 @@ static char *s_strdup(char *s) { static char *sha1_pass_hex(char *sha1_pass) { // copied from MySQL_Protocol.cpp if (sha1_pass==NULL) return NULL; - // previous code is commented. Uncomment all to perform validation -// char *buff=(char *)malloc(SHA_DIGEST_LENGTH*2+2); -// buff[0]='*'; -// buff[SHA_DIGEST_LENGTH*2+1]='\0'; -// int i; -// uint8_t a; -// for (i=0;i= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" - -// mysql_servers in v1.1.0 -#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V1_1_0 "CREATE TABLE mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , PRIMARY KEY (hostgroup_id, hostname, port) )" - -// mysql_servers in v1.2.0e -#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V1_2_0e "CREATE TABLE mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , PRIMARY KEY (hostgroup_id, hostname, port) )" - -#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V1_2_2 "CREATE TABLE mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" - -#define ADMIN_SQLITE_TABLE_MYSQL_USERS_V1_3_0 "CREATE TABLE mysql_users (username VARCHAR NOT NULL , password VARCHAR , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0 , default_hostgroup INT NOT NULL DEFAULT 0 , default_schema VARCHAR , schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0 , transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 0 , fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0 , backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1 , frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000 , PRIMARY KEY (username, backend) , UNIQUE (username, frontend))" -#define ADMIN_SQLITE_TABLE_MYSQL_USERS_V1_4_0 "CREATE TABLE mysql_users (username VARCHAR NOT NULL , password VARCHAR , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0 , default_hostgroup INT NOT NULL DEFAULT 0 , default_schema VARCHAR , schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0 , transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1 , fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0 , backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1 , frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000 , PRIMARY KEY (username, backend) , UNIQUE (username, frontend))" -#define ADMIN_SQLITE_TABLE_MYSQL_USERS ADMIN_SQLITE_TABLE_MYSQL_USERS_V1_4_0 - - -#define ADMIN_SQLITE_RUNTIME_MYSQL_USERS "CREATE TABLE runtime_mysql_users (username VARCHAR NOT NULL , password VARCHAR , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0 , default_hostgroup INT NOT NULL DEFAULT 0 , default_schema VARCHAR , schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0 , transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1 , fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0 , backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1 , frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000 , PRIMARY KEY (username, backend) , UNIQUE (username, frontend))" - -// mysql_query_rules in v1.1.0 -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_1_0 "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , delay INT UNSIGNED , error_msg VARCHAR , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0)" - -// mysql_query_rules in v1.2.0a -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_2_0a "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , delay INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0)" - -// mysql_query_rules in v1.2.0g -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_2_0g "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0)" - -// mysql_query_rules in v1.2.2 -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_2_2 "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -// mysql_query_rules in v1.3.1 -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_3_1 "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -//mysql_query_rules in v1.4.0 + next_query_flagIN -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_0a "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR DEFAULT 'CASELESS' , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_0b "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR DEFAULT 'CASELESS' , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1,2)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_1 "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR DEFAULT 'CASELESS' , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , OK_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1,2)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_1 -//#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_0b - -#define ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES "CREATE TABLE global_variables (variable_name VARCHAR NOT NULL PRIMARY KEY , variable_value VARCHAR NOT NULL)" - -#define ADMIN_SQLITE_RUNTIME_GLOBAL_VARIABLES "CREATE TABLE runtime_global_variables (variable_name VARCHAR NOT NULL PRIMARY KEY , variable_value VARCHAR NOT NULL)" - -#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" - -// mysql_replication_hostgroups in v1.0 -#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_0 "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , UNIQUE (reader_hostgroup))" - -// mysql_replication_hostgroups in v1.2.2 -#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_2_2 "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" - -#define ADMIN_SQLITE_TABLE_MYSQL_COLLATIONS "CREATE TABLE mysql_collations (Id INTEGER NOT NULL PRIMARY KEY , Collation VARCHAR NOT NULL , Charset VARCHAR NOT NULL , `Default` VARCHAR NOT NULL)" - -#define ADMIN_SQLITE_TABLE_SCHEDULER "CREATE TABLE scheduler (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '')" - -#define ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_0 "CREATE TABLE scheduler (id INTEGER NOT NULL , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , PRIMARY KEY(id))" - -#define ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_2a "CREATE TABLE scheduler (id INTEGER NOT NULL , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY(id))" - -#define ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_2b "CREATE TABLE scheduler (id INTEGER NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY(id))" - -#define ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_2c "CREATE TABLE scheduler (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '')" - -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_SERVERS "CREATE TABLE runtime_mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" - -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE runtime_mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" - -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_QUERY_RULES "CREATE TABLE runtime_mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , OK_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -#define ADMIN_SQLITE_TABLE_RUNTIME_SCHEDULER "CREATE TABLE runtime_scheduler (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '')" - -#define STATS_SQLITE_TABLE_MYSQL_QUERY_RULES "CREATE TABLE stats_mysql_query_rules (rule_id INTEGER PRIMARY KEY , hits INT NOT NULL)" -#define STATS_SQLITE_TABLE_MYSQL_USERS "CREATE TABLE stats_mysql_users (username VARCHAR PRIMARY KEY , frontend_connections INT NOT NULL , frontend_max_connections INT NOT NULL)" -#define STATS_SQLITE_TABLE_MYSQL_COMMANDS_COUNTERS "CREATE TABLE stats_mysql_commands_counters (Command VARCHAR NOT NULL PRIMARY KEY , Total_Time_us INT NOT NULL , Total_cnt INT NOT NULL , cnt_100us INT NOT NULL , cnt_500us INT NOT NULL , cnt_1ms INT NOT NULL , cnt_5ms INT NOT NULL , cnt_10ms INT NOT NULL , cnt_50ms INT NOT NULL , cnt_100ms INT NOT NULL , cnt_500ms INT NOT NULL , cnt_1s INT NOT NULL , cnt_5s INT NOT NULL , cnt_10s INT NOT NULL , cnt_INFs)" -#define STATS_SQLITE_TABLE_MYSQL_PROCESSLIST "CREATE TABLE stats_mysql_processlist (ThreadID INT NOT NULL , SessionID INTEGER PRIMARY KEY , user VARCHAR , db VARCHAR , cli_host VARCHAR , cli_port VARCHAR , hostgroup VARCHAR , l_srv_host VARCHAR , l_srv_port VARCHAR , srv_host VARCHAR , srv_port VARCHAR , command VARCHAR , time_ms INT NOT NULL , info VARCHAR)" -#define STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL "CREATE TABLE stats_mysql_connection_pool (hostgroup VARCHAR , srv_host VARCHAR , srv_port VARCHAR , status VARCHAR , ConnUsed INT , ConnFree INT , ConnOK INT , ConnERR INT , Queries INT , Bytes_data_sent INT , Bytes_data_recv INT , Latency_us INT)" - -#define STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL_RESET "CREATE TABLE stats_mysql_connection_pool_reset (hostgroup VARCHAR , srv_host VARCHAR , srv_port VARCHAR , status VARCHAR , ConnUsed INT , ConnFree INT , ConnOK INT , ConnERR INT , Queries INT , Bytes_data_sent INT , Bytes_data_recv INT , Latency_us INT)" - -#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST "CREATE TABLE stats_mysql_query_digest (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(hostgroup, schemaname, username, digest))" - -#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET "CREATE TABLE stats_mysql_query_digest_reset (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(hostgroup, schemaname, username, digest))" - -#define STATS_SQLITE_TABLE_MYSQL_GLOBAL "CREATE TABLE stats_mysql_global (Variable_Name VARCHAR NOT NULL PRIMARY KEY , Variable_Value VARCHAR NOT NULL)" - -#ifdef DEBUG -#define ADMIN_SQLITE_TABLE_DEBUG_LEVELS "CREATE TABLE debug_levels (module VARCHAR NOT NULL PRIMARY KEY , verbosity INT NOT NULL DEFAULT 0)" -#endif // DEBUG - -#define ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_group_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" - -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_GROUP_REPLICATION_HOSTGROUPS "CREATE TABLE runtime_mysql_group_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" -*/ -/* -static char * admin_variables_names[]= { - (char *)"version", - (char *)"admin_credentials", - (char *)"stats_credentials", - (char *)"mysql_ifaces", - (char *)"telnet_admin_ifaces", - (char *)"telnet_stats_ifaces", - (char *)"refresh_interval", - (char *)"read_only", - (char *)"hash_passwords", - (char *)"version", -#ifdef DEBUG - (char *)"debug", -#endif // DEBUG - NULL -}; -*/ static char * ClickHouse_Server_variables_names[] = { (char *)"hostname", @@ -402,9 +262,6 @@ static char * ClickHouse_Server_variables_names[] = { NULL }; -/* -static ProxySQL_Admin *SPA=NULL; -*/ static void * (*child_func[1]) (void *arg); typedef struct _main_args { @@ -416,13 +273,7 @@ typedef struct _main_args { typedef struct _ifaces_desc_t { char **mysql_ifaces; -// char **telnet_admin_ifaces; -// char **telnet_stats_ifaces; } ifaces_desc_t; -/* -#define MAX_IFACES 8 -#define MAX_ADMIN_LISTENERS 16 -*/ #define MAX_IFACES 8 #define MAX_SQLITE3SERVER_LISTENERS 16 @@ -484,18 +335,12 @@ class sqlite3server_main_loop_listeners { pthread_rwlock_unlock(&rwlock); } ifaces_desc *ifaces_mysql; -// ifaces_desc *ifaces_telnet_admin; -// ifaces_desc *ifaces_telnet_stats; ifaces_desc_t descriptor_new; sqlite3server_main_loop_listeners() { pthread_rwlock_init(&rwlock, NULL); ifaces_mysql=new ifaces_desc(); -// ifaces_telnet_admin=new ifaces_desc(); -// ifaces_telnet_stats=new ifaces_desc(); version=0; descriptor_new.mysql_ifaces=NULL; -// descriptor_new.telnet_admin_ifaces=NULL; -// descriptor_new.telnet_stats_ifaces=NULL; } @@ -540,344 +385,6 @@ class sqlite3server_main_loop_listeners { static sqlite3server_main_loop_listeners S_amll; - - -/* -bool admin_handler_command_kill_connection(char *query_no_space, unsigned int query_no_space_length, MySQL_Session *sess, ProxySQL_Admin *pa) { - uint32_t id=atoi(query_no_space+16); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Trying to kill session %u\n", id); - bool rc=GloMTH->kill_session(id); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (rc) { - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - } else { - char buf[1024]; - sprintf(buf,"Unknown thread id: %u", id); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, buf); - } - return false; -} -*/ -/* - * returns false if the command is a valid one and is processed - * return true if the command is not a valid one and needs to be executed by SQLite (that will return an error) - */ -/* -bool admin_handler_command_proxysql(char *query_no_space, unsigned int query_no_space_length, MySQL_Session *sess, ProxySQL_Admin *pa) { - if (query_no_space_length==strlen("PROXYSQL READONLY") && !strncasecmp("PROXYSQL READONLY",query_no_space, query_no_space_length)) { - // this command enables admin_read_only , so the admin module is in read_only mode - proxy_info("Received PROXYSQL READONLY command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->set_read_only(true); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - if (query_no_space_length==strlen("PROXYSQL READWRITE") && !strncasecmp("PROXYSQL READWRITE",query_no_space, query_no_space_length)) { - // this command disables admin_read_only , so the admin module won't be in read_only mode - proxy_info("Received PROXYSQL WRITE command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->set_read_only(false); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - if (query_no_space_length==strlen("PROXYSQL START") && !strncasecmp("PROXYSQL START",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL START command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - bool rc=false; - if (nostart_) { - rc=__sync_bool_compare_and_swap(&GloVars.global.nostart,1,0); - } - if (rc) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Starting ProxySQL following PROXYSQL START command\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - } else { - proxy_warning("ProxySQL was already started when received PROXYSQL START command\n"); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"ProxySQL already started"); - } - return false; - } - - if (query_no_space_length==strlen("PROXYSQL RESTART") && !strncasecmp("PROXYSQL RESTART",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL RESTART command\n"); - __sync_bool_compare_and_swap(&glovars.shutdown,0,1); - glovars.reload=1; - return false; - } - - if (query_no_space_length==strlen("PROXYSQL STOP") && !strncasecmp("PROXYSQL STOP",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL STOP command\n"); - // to speed up this process we first change wait_timeout to 0 - // MySQL_thread will call poll() with a maximum timeout of 100ms - old_wait_timeout=GloMTH->get_variable_int((char *)"wait_timeout"); - GloMTH->set_variable((char *)"wait_timeout",(char *)"0"); - GloMTH->commit(); - GloMTH->signal_all_threads(0); - GloMTH->stop_listeners(); - char buf[32]; - sprintf(buf,"%d",old_wait_timeout); - GloMTH->set_variable((char *)"wait_timeout",buf); - GloMTH->commit(); - glovars.reload=2; - __sync_bool_compare_and_swap(&glovars.shutdown,0,1); - return false; - } - - if (query_no_space_length==strlen("PROXYSQL PAUSE") && !strncasecmp("PROXYSQL PAUSE",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL PAUSE command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (nostart_) { - if (__sync_fetch_and_add((uint8_t *)(&GloVars.global.nostart),0)) { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"ProxySQL MySQL module not running, impossible to pause"); - return false; - } - } - if (proxysql_mysql_paused==false) { - // to speed up this process we first change poll_timeout to 10 - // MySQL_thread will call poll() with a maximum timeout of 10ms - old_wait_timeout=GloMTH->get_variable_int((char *)"poll_timeout"); - GloMTH->set_variable((char *)"poll_timeout",(char *)"10"); - GloMTH->commit(); - GloMTH->signal_all_threads(0); - GloMTH->stop_listeners(); - proxysql_mysql_paused=true; - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - // we now rollback poll_timeout - char buf[32]; - sprintf(buf,"%d",old_wait_timeout); - GloMTH->set_variable((char *)"poll_timeout",buf); - GloMTH->commit(); - } else { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"ProxySQL MySQL module is already paused, impossible to pause"); - } - return false; - } - - if (query_no_space_length==strlen("PROXYSQL RESUME") && !strncasecmp("PROXYSQL RESUME",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL RESUME command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (nostart_) { - if (__sync_fetch_and_add((uint8_t *)(&GloVars.global.nostart),0)) { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"ProxySQL MySQL module not running, impossible to resume"); - return false; - } - } - if (proxysql_mysql_paused==true) { - // to speed up this process we first change poll_timeout to 10 - // MySQL_thread will call poll() with a maximum timeout of 10ms - old_wait_timeout=GloMTH->get_variable_int((char *)"poll_timeout"); - GloMTH->set_variable((char *)"poll_timeout",(char *)"10"); - GloMTH->commit(); - GloMTH->signal_all_threads(0); - GloMTH->start_listeners(); - //char buf[32]; - //sprintf(buf,"%d",old_wait_timeout); - //GloMTH->set_variable((char *)"poll_timeout",buf); - //GloMTH->commit(); - proxysql_mysql_paused=false; - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - // we now rollback poll_timeout - char buf[32]; - sprintf(buf,"%d",old_wait_timeout); - GloMTH->set_variable((char *)"poll_timeout",buf); - GloMTH->commit(); - } else { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"ProxySQL MySQL module is not paused, impossible to resume"); - } - return false; - } - - if (query_no_space_length==strlen("PROXYSQL SHUTDOWN") && !strncasecmp("PROXYSQL SHUTDOWN",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL SHUTDOWN command\n"); - __sync_bool_compare_and_swap(&glovars.shutdown,0,1); - glovars.reload=0; - return false; - } - - if (query_no_space_length==strlen("PROXYSQL FLUSH LOGS") && !strncasecmp("PROXYSQL FLUSH LOGS",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL FLUSH LOGS command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (GloMyLogger) { - GloMyLogger->flush_log(); - } - SPA->flush_error_log(); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("PROXYSQL FLUSH CONFIGDB") && !strncasecmp("PROXYSQL FLUSH CONFIGDB",query_no_space, query_no_space_length)) // see #923 - ) { - proxy_info("Received %s command\n", query_no_space); - proxy_warning("A misconfigured configdb will cause undefined behaviors\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->flush_configdb(); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - -#ifndef NOJEM - if (query_no_space_length==strlen("PROXYSQL MEMPROFILE START") && !strncasecmp("PROXYSQL MEMPROFILE START",query_no_space, query_no_space_length)) { - bool en=true; - mallctl("prof.active", NULL, NULL, &en, sizeof(bool)); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - if (query_no_space_length==strlen("PROXYSQL MEMPROFILE STOP") && !strncasecmp("PROXYSQL MEMPROFILE STOP",query_no_space, query_no_space_length)) { - bool en=false; - mallctl("prof.active", NULL, NULL, &en, sizeof(bool)); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } -#endif - - if (query_no_space_length==strlen("PROXYSQL KILL") && !strncasecmp("PROXYSQL KILL",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL KILL command\n"); - exit(EXIT_SUCCESS); - } - - return true; -} -*/ -/* -// Returns true if the given name is either a know mysql or admin global variable. -bool is_valid_global_variable(const char *var_name) { - if (strlen(var_name) > 6 && !strncmp(var_name, "mysql-", 6) && GloMTH->has_variable(var_name + 6)) { - return true; - } else if (strlen(var_name) > 6 && !strncmp(var_name, "admin-", 6) && SPA->has_variable(var_name + 6)) { - return true; - } else { - return false; - } -} - -// This method translates a 'SET variable=value' command into an equivalent UPDATE. It doesn't yes support setting -// multiple variables at once. -// -// It modifies the original query. -bool admin_handler_command_set(char *query_no_space, unsigned int query_no_space_length, MySQL_Session *sess, ProxySQL_Admin *pa, char **q, unsigned int *ql) { - if (!strstr(query_no_space,(char *)"password")) { // issue #599 - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received command %s\n", query_no_space); - if (strcmp(query_no_space,(char *)"set autocommit=0")) { - proxy_info("Received command %s\n", query_no_space); - } - } - // Get a pointer to the beginnig of var=value entry and split to get var name and value - char *set_entry = query_no_space + strlen("SET "); - char *untrimmed_var_name=NULL; - char *var_value=NULL; - c_split_2(set_entry, "=", &untrimmed_var_name, &var_value); - - // Trim spaces from var name to allow writing like 'var = value' - char *var_name = trim_spaces_in_place(untrimmed_var_name); - - - bool run_query = false; - // Check if the command tries to set a non-existing variable. - if (strcmp(var_name,"mysql-init_connect")==0) { - char *err_msg_fmt = (char *) "ERROR: Global variable '%s' is not configurable using SET command. You must run UPDATE global_variables"; - size_t buff_len = strlen(err_msg_fmt) + strlen(var_name) + 1; - char *buff = (char *) malloc(buff_len); - snprintf(buff, buff_len, err_msg_fmt, var_name); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, buff); - free(buff); - run_query = false; - } else { - if (!is_valid_global_variable(var_name)) { - char *err_msg_fmt = (char *) "ERROR: Unknown global variable: '%s'."; - size_t buff_len = strlen(err_msg_fmt) + strlen(var_name) + 1; - char *buff = (char *) malloc(buff_len); - snprintf(buff, buff_len, err_msg_fmt, var_name); - SPA->send_MySQL_OK(&sess->client_myds->myprot, buff); - free(buff); - run_query = false; - } else { - const char *update_format = (char *)"UPDATE global_variables SET variable_value=%s WHERE variable_name='%s'"; - // Computed length is more than needed since it also counts the format modifiers (%s). - size_t query_len = strlen(update_format) + strlen(var_name) + strlen(var_value) + 1; - char *query = (char *)l_alloc(query_len); - snprintf(query, query_len, update_format, var_value, var_name); - - run_query = true; - l_free(*ql,*q); - *q = query; - *ql = strlen(*q) + 1; - } - } - free(untrimmed_var_name); - free(var_value); - return run_query; -} -*/ - -/* -SQLite3_result * ProxySQL_Admin::generate_show_fields_from(const char *tablename, char **err) { - char *tn=NULL; // tablename - // note that tablename is passed with a trailing ' - tn=(char *)malloc(strlen(tablename)); - unsigned int i=0, j=0; - while (iexecute_statement(q2, &error , &cols , &affected_rows , &resultset); - if (error) { - proxy_error("Error on %s : %s\n", q2, error); - free(q2); - *err=strdup(error); - free(error); - if (resultset) delete resultset; - free(tn); - return NULL; - } - - if (resultset==NULL) { - free(tn); - return NULL; - } - - if (resultset->rows_count==0) { - free(tn); - delete resultset; - *err=strdup((char *)"Table does not exist"); - return NULL; - } - - SQLite3_result *result=new SQLite3_result(6); - result->add_column_definition(SQLITE_TEXT,"Field"); - result->add_column_definition(SQLITE_TEXT,"Type"); - result->add_column_definition(SQLITE_TEXT,"Null"); - result->add_column_definition(SQLITE_TEXT,"Key"); - result->add_column_definition(SQLITE_TEXT,"Default"); - result->add_column_definition(SQLITE_TEXT,"Extra"); - char *pta[6]; - pta[1]=(char *)"varchar(255)"; - pta[2]=(char *)"NO"; - pta[3]=(char *)""; - pta[4]=(char *)""; - pta[5]=(char *)""; - free(q2); - for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { - SQLite3_row *r=*it; - pta[0]=r->fields[0]; - result->add_row(pta); - } - delete resultset; - free(tn); - return result; -} -*/ - void ClickHouse_Server_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t *pkt) { ClickHouse_Server *s3s=(ClickHouse_Server *)_pa; @@ -900,7 +407,6 @@ void ClickHouse_Server_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t memcpy(query_no_space,query,query_length); unsigned int query_no_space_length=remove_spaces(query_no_space); - //fprintf(stderr,"%s----\n",query_no_space); // fix bug #925 while (query_no_space[query_no_space_length-1]==';' || query_no_space[query_no_space_length-1]==' ') { @@ -1281,148 +787,6 @@ void ClickHouse_Server_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t } } -/* - if (!strncasecmp("SHOW GLOBAL VARIABLES LIKE 'read_only'", query_no_space, strlen("SHOW GLOBAL VARIABLES LIKE 'read_only'"))) { - l_free(query_length,query); - char *q=(char *)"SELECT 'read_only' Variable_name, '%s' Value FROM global_variables WHERE Variable_name='admin-read_only'"; - query_length=strlen(q)+5; - query=(char *)l_alloc(query_length); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - bool ro=SPA->get_read_only(); - //sprintf(query,q,( ro ? "ON" : "OFF")); - PtrSize_t pkt_2; - if (ro) { - pkt_2.size=110; - pkt_2.ptr=l_alloc(pkt_2.size); - memcpy(pkt_2.ptr,READ_ONLY_ON,pkt_2.size); - } else { - pkt_2.size=111; - pkt_2.ptr=l_alloc(pkt_2.size); - memcpy(pkt_2.ptr,READ_ONLY_OFF,pkt_2.size); - } - sess->status=WAITING_CLIENT_DATA; - sess->client_myds->DSS=STATE_SLEEP; - sess->client_myds->PSarrayOUT->add(pkt_2.ptr,pkt_2.size); - run_query=false; - goto __run_query; - } - - if (sess->session_type == PROXYSQL_SESSION_ADMIN) { // no stats - if ((query_no_space_length>8) && (!strncasecmp("PROXYSQL ", query_no_space, 8))) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received PROXYSQL command\n"); - pthread_mutex_lock(&admin_mutex); - run_query=admin_handler_command_proxysql(query_no_space, query_no_space_length, sess, pa); - pthread_mutex_unlock(&admin_mutex); - goto __run_query; - } - if ((query_no_space_length>5) && ( (!strncasecmp("SAVE ", query_no_space, 5)) || (!strncasecmp("LOAD ", query_no_space, 5))) ) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received LOAD or SAVE command\n"); - run_query=admin_handler_command_load_or_save(query_no_space, query_no_space_length, sess, pa, &query, &query_length); - goto __run_query; - } - if ((query_no_space_length>16) && ( (!strncasecmp("KILL CONNECTION ", query_no_space, 16)) || (!strncasecmp("KILL CONNECTION ", query_no_space, 16))) ) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received KILL CONNECTION command\n"); - run_query=admin_handler_command_kill_connection(query_no_space, query_no_space_length, sess, pa); - goto __run_query; - } - - - // queries generated by mysqldump - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if ( -*/ -// !strncmp("/*!40014 SET ", query_no_space, 13) || -// !strncmp("/*!40101 SET ", query_no_space, 13) || -// !strncmp("/*!40103 SET ", query_no_space, 13) || -// !strncmp("/*!40111 SET ", query_no_space, 13) || -// !strncmp("/*!40000 ALTER TABLE", query_no_space, strlen("/*!40000 ALTER TABLE")) -// || -// !strncmp("/*!40100 SET @@SQL_MODE='' */", query_no_space, strlen("/*!40100 SET @@SQL_MODE='' */")) -// || -// !strncmp("/*!40103 SET TIME_ZONE=", query_no_space, strlen("/*!40103 SET TIME_ZONE=")) -// || -// !strncmp("LOCK TABLES", query_no_space, strlen("LOCK TABLES")) -// || -// !strncmp("UNLOCK TABLES", query_no_space, strlen("UNLOCK TABLES")) -// || -// !strncmp("SET SQL_QUOTE_SHOW_CREATE=1", query_no_space, strlen("SET SQL_QUOTE_SHOW_CREATE=1")) -// || -// !strncmp("SET SESSION character_set_results", query_no_space, strlen("SET SESSION character_set_results")) -// || -/* - !strncasecmp("USE ", query_no_space, strlen("USE ")) // this applies to all clients, not only mysqldump - ) { - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - run_query=false; - goto __run_query; - } - if (!strncmp("SHOW VARIABLES LIKE 'gtid\\_mode'", query_no_space, strlen("SHOW VARIABLES LIKE 'gtid\\_mode'"))) { - l_free(query_length,query); - query=l_strdup("SELECT variable_name Variable_name, Variable_value Value FROM global_variables WHERE Variable_name='gtid_mode'"); - query_length=strlen(query)+1; - goto __run_query; - } - if (!strncmp("select @@collation_database", query_no_space, strlen("select @@collation_database"))) { - l_free(query_length,query); - query=l_strdup("SELECT Collation '@@collation_database' FROM mysql_collations WHERE Collation='utf8_general_ci' LIMIT 1"); - query_length=strlen(query)+1; - goto __run_query; - } - if (!strncmp("SHOW VARIABLES LIKE 'ndbinfo\\_version'", query_no_space, strlen("SHOW VARIABLES LIKE 'ndbinfo\\_version'"))) { - l_free(query_length,query); - query=l_strdup("SELECT variable_name Variable_name, Variable_value Value FROM global_variables WHERE Variable_name='ndbinfo_version'"); - query_length=strlen(query)+1; - goto __run_query; - } - if (!strncmp("show table status like '", query_no_space, strlen("show table status like '"))) { - char *strA=query_no_space+24; - int strAl=strlen(strA); - if (strAl<2) { // error - goto __run_query; - } - char *err=NULL; - SQLite3_result *resultset=SPA->generate_show_table_status(strA, &err); - sess->SQLite3_to_MySQL(resultset, err, 0, &sess->client_myds->myprot); - if (resultset) delete resultset; - if (err) free(err); - run_query=false; - goto __run_query; - } - if (!strncmp("show fields from `", query_no_space, strlen("show fields from `"))) { - char *strA=query_no_space+18; - int strAl=strlen(strA); - if (strAl<2) { // error - goto __run_query; - } - char *err=NULL; - SQLite3_result *resultset=SPA->generate_show_fields_from(strA, &err); - sess->SQLite3_to_MySQL(resultset, err, 0, &sess->client_myds->myprot); - if (resultset) delete resultset; - if (err) free(err); - run_query=false; - goto __run_query; - } - } - - // FIXME: this should be removed, it is just a POC for issue #253 . What is important is the call to GloMTH->signal_all_threads(); - if (!strncasecmp("SIGNAL MYSQL THREADS", query_no_space, strlen("SIGNAL MYSQL THREADS"))) { - GloMTH->signal_all_threads(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->save_admin_variables_from_runtime(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Sent signal to all mysql threads\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - run_query=false; - goto __run_query; - } - - // fix bug #442 - if (!strncmp("SET SQL_SAFE_UPDATES=1", query_no_space, strlen("SET SQL_SAFE_UPDATES=1"))) { - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - run_query=false; - goto __run_query; - } -*/ if (query_no_space_length==SELECT_VERSION_COMMENT_LEN) { if (!strncasecmp(SELECT_VERSION_COMMENT, query_no_space, query_no_space_length)) { l_free(query_length,query); @@ -1449,380 +813,33 @@ void ClickHouse_Server_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t if (!strncasecmp(SELECT_CHARSET_VARIOUS, query_no_space, query_no_space_length)) { l_free(query_length,query); char *query1=(char *)"select 'utf8' as '@@character_set_client', 'utf8' as '@@character_set_connection', 'utf8' as '@@character_set_server', 'utf8' as '@@character_set_database' limit 1"; - query=l_strdup(query1); - query_length=strlen(query1)+1; - goto __run_query; - } - } - - if (!strncasecmp("SELECT @@version", query_no_space, strlen("SELECT @@version"))) { - l_free(query_length,query); - char *q=(char *)"SELECT '%s' AS '@@version'"; - query_length=strlen(q)+20; - query=(char *)l_alloc(query_length); - sprintf(query,q,PROXYSQL_VERSION); - goto __run_query; - } - - if (!strncasecmp("SELECT version()", query_no_space, strlen("SELECT version()"))) { - l_free(query_length,query); - char *q=(char *)"SELECT '%s' AS 'version()'"; - query_length=strlen(q)+20; - query=(char *)l_alloc(query_length); - sprintf(query,q,PROXYSQL_VERSION); - goto __run_query; - } -/* - if (!strncasecmp("SHOW VARIABLES WHERE Variable_name in ('max_allowed_packet','system_time_zone','time_zone','sql_mode')", query_no_space, strlen("SHOW VARIABLES WHERE Variable_name in ('max_allowed_packet','system_time_zone','time_zone','sql_mode')"))) { - l_free(query_length,query); - char *q=(char *)"SELECT 'max_allowed_packet' Variable_name,'4194304' Value UNION ALL SELECT 'sql_mode', 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' UNION ALL SELECT 'system_time_zone', 'UTC' UNION ALL SELECT 'time_zone','SYSTEM'"; - query_length=strlen(q)+20; - query=(char *)l_alloc(query_length); - sprintf(query,q,PROXYSQL_VERSION); - goto __run_query; - } - - { - bool rc; - rc=RE2::PartialMatch(query_no_space,*(RE2 *)(pa->match_regexes.re[0])); - if (rc) { - string *new_query=new std::string(query_no_space); - RE2::Replace(new_query,(char *)"^(\\w+)\\s+@@(\\w+)\\s*",(char *)"SELECT variable_value AS '@@max_allowed_packet' FROM global_variables WHERE variable_name='mysql-max_allowed_packet'"); - free(query); - query_length=new_query->length()+1; - query=(char *)malloc(query_length); - memcpy(query,new_query->c_str(),query_length-1); - query[query_length-1]='\0'; - goto __run_query; - } - } - { - bool rc; - rc=RE2::PartialMatch(query_no_space,*(RE2 *)(pa->match_regexes.re[1])); - if (rc) { - string *new_query=new std::string(query_no_space); - RE2::Replace(new_query,(char *)"^(\\w+) *@@([0-9A-Za-z_-]+) *",(char *)"SELECT variable_value AS '@@\\2' FROM global_variables WHERE variable_name='\\2'"); - free(query); - query_length=new_query->length()+1; - query=(char *)malloc(query_length); - memcpy(query,new_query->c_str(),query_length-1); - query[query_length-1]='\0'; - goto __run_query; - } - } - { - bool rc; - rc=RE2::PartialMatch(query_no_space,*(RE2 *)(pa->match_regexes.re[2])); - if (rc) { - string *new_query=new std::string(query_no_space); - RE2::Replace(new_query,(char *)"([Ss][Hh][Oo][Ww]\\s+[Vv][Aa][Rr][Ii][Aa][Bb][Ll][Ee][Ss]\\s+[Ww][Hh][Ee][Rr][Ee])",(char *)"SELECT variable_name AS Variable_name, variable_value AS Value FROM global_variables WHERE"); - free(query); - query_length=new_query->length()+1; - query=(char *)malloc(query_length); - memcpy(query,new_query->c_str(),query_length-1); - query[query_length-1]='\0'; - goto __run_query; - } - } - { - bool rc; - rc=RE2::PartialMatch(query_no_space,*(RE2 *)(pa->match_regexes.re[3])); - if (rc) { - string *new_query=new std::string(query_no_space); - RE2::Replace(new_query,(char *)"([Ss][Hh][Oo][Ww]\\s+[Vv][Aa][Rr][Ii][Aa][Bb][Ll][Ee][Ss]\\s+[Ll][Ii][Kk][Ee])",(char *)"SELECT variable_name AS Variable_name, variable_value AS Value FROM global_variables WHERE variable_name LIKE"); - free(query); - query_length=new_query->length()+1; - query=(char *)malloc(query_length); - memcpy(query,new_query->c_str(),query_length-1); - query[query_length-1]='\0'; - goto __run_query; - } - } - - if (!strncasecmp("SET ", query_no_space, 4)) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received SET\n"); - run_query = admin_handler_command_set(query_no_space, query_no_space_length, sess, pa, &query, &query_length); - goto __run_query; - } - - if(!strncasecmp("CHECKSUM ", query_no_space, 9)){ - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received CHECKSUM command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SQLite3_result *resultset=NULL; - char *tablename=NULL; - char *error=NULL; - int affected_rows=0; - int cols=0; - if (strlen(query_no_space)==strlen("CHECKSUM DISK MYSQL SERVERS") && !strncasecmp("CHECKSUM DISK MYSQL SERVERS", query_no_space, strlen(query_no_space))){ - char *q=(char *)"SELECT * FROM mysql_servers ORDER BY hostgroup_id, hostname, port"; - tablename=(char *)"MYSQL SERVERS"; - SPA->configdb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if (strlen(query_no_space)==strlen("CHECKSUM DISK MYSQL USERS") && !strncasecmp("CHECKSUM DISK MYSQL USERS", query_no_space, strlen(query_no_space))){ - char *q=(char *)"SELECT * FROM mysql_users ORDER BY username"; - tablename=(char *)"MYSQL USERS"; - SPA->configdb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if (strlen(query_no_space)==strlen("CHECKSUM DISK MYSQL QUERY RULES") && !strncasecmp("CHECKSUM DISK MYSQL QUERY RULES", query_no_space, strlen(query_no_space))){ - char *q=(char *)"SELECT * FROM mysql_query_rules ORDER BY rule_id"; - tablename=(char *)"MYSQL QUERY RULES"; - SPA->configdb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if (strlen(query_no_space)==strlen("CHECKSUM DISK MYSQL VARIABLES") && !strncasecmp("CHECKSUM DISK MYSQL VARIABLES", query_no_space, strlen(query_no_space))){ - char *q=(char *)"SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-%' ORDER BY variable_name"; - tablename=(char *)"MYSQL VARIABLES"; - SPA->configdb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if (strlen(query_no_space)==strlen("CHECKSUM DISK MYSQL REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM DISK MYSQL REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space))){ - char *q=(char *)"SELECT * FROM mysql_replication_hostgroups ORDER BY writer_hostgroup"; - tablename=(char *)"MYSQL REPLICATION HOSTGROUPS"; - SPA->configdb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL SERVERS") && !strncasecmp("CHECKSUM MEMORY MYSQL SERVERS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL SERVERS") && !strncasecmp("CHECKSUM MEM MYSQL SERVERS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL SERVERS") && !strncasecmp("CHECKSUM MYSQL SERVERS", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM mysql_servers ORDER BY hostgroup_id, hostname, port"; - tablename=(char *)"MYSQL SERVERS"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL USERS") && !strncasecmp("CHECKSUM MEMORY MYSQL USERS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL USERS") && !strncasecmp("CHECKSUM MEM MYSQL USERS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL USERS") && !strncasecmp("CHECKSUM MYSQL USERS", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM mysql_users ORDER BY username"; - tablename=(char *)"MYSQL USERS"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL QUERY RULES") && !strncasecmp("CHECKSUM MEMORY MYSQL QUERY RULES", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL QUERY RULES") && !strncasecmp("CHECKSUM MEM MYSQL QUERY RULES", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL QUERY RULES") && !strncasecmp("CHECKSUM MYSQL QUERY RULES", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM mysql_query_rules ORDER BY rule_id"; - tablename=(char *)"MYSQL QUERY RULES"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL VARIABLES") && !strncasecmp("CHECKSUM MEMORY MYSQL VARIABLES", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL VARIABLES") && !strncasecmp("CHECKSUM MEM MYSQL VARIABLES", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL VARIABLES") && !strncasecmp("CHECKSUM MYSQL VARIABLES", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-%' ORDER BY variable_name"; - tablename=(char *)"MYSQL VARIABLES"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MEMORY MYSQL REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MEM MYSQL REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MYSQL REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM mysql_replication_hostgroups ORDER BY writer_hostgroup"; - tablename=(char *)"MYSQL REPLICATION HOSTGROUPS"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL GROUP REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MEMORY GROUP MYSQL REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL GROUP REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MEM MYSQL GROUP REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL GROUP REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MYSQL GROUP REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM mysql_group_replication_hostgroups ORDER BY writer_hostgroup"; - tablename=(char *)"MYSQL GROUP REPLICATION HOSTGROUPS"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if (error) { - proxy_error("Error: %s\n", error); - char buf[1024]; - sprintf(buf,"%s", error); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, buf); - run_query=false; - } else if (resultset) { - char *q=(char *)"SELECT '%s' AS 'table', '%s' AS 'checksum'"; - char *checksum=(char *)resultset->checksum(); - query=(char *)malloc(strlen(q)+strlen(tablename)+strlen(checksum)+1); - sprintf(query,q,tablename,checksum); - free(checksum); - } - goto __run_query; - } -*/ - if (strncasecmp("SHOW ", query_no_space, 5)) { - goto __end_show_commands; // in the next block there are only SHOW commands - } - -/* - if (!strncasecmp("SHOW GLOBAL VARIABLES LIKE 'version'", query_no_space, strlen("SHOW GLOBAL VARIABLES LIKE 'version'"))) { - l_free(query_length,query); - char *q=(char *)"SELECT 'version' Variable_name, '%s' Value FROM global_variables WHERE Variable_name='admin-version'"; - query_length=strlen(q)+20; - query=(char *)l_alloc(query_length); - sprintf(query,q,PROXYSQL_VERSION); - goto __run_query; - } -*/ -/* - if (query_no_space_length==strlen("SHOW TABLES") && !strncasecmp("SHOW TABLES",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT name AS tables FROM sqlite_master WHERE type='table' AND name NOT IN ('sqlite_sequence') ORDER BY name"); - query_length=strlen(query)+1; - goto __run_query; - } -*/ -/* - if (query_no_space_length==strlen("SHOW CHARSET") && !strncasecmp("SHOW CHARSET",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT Charset, Collation AS 'Default collation' FROM mysql_collations WHERE `Default`='Yes'"); - query_length=strlen(query)+1; - goto __run_query; - } - - if (query_no_space_length==strlen("SHOW COLLATION") && !strncasecmp("SHOW COLLATION",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT * FROM mysql_collations"); - query_length=strlen(query)+1; - goto __run_query; - } -*/ -/* - if ((query_no_space_length>17) && (!strncasecmp("SHOW TABLES FROM ", query_no_space, 17))) { - strA=query_no_space+17; - strAl=strlen(strA); - strB=(char *)"SELECT name AS tables FROM %s.sqlite_master WHERE type='table' AND name NOT IN ('sqlite_sequence') ORDER BY name"; - strBl=strlen(strB); - int l=strBl+strAl-2; - char *b=(char *)l_alloc(l+1); - snprintf(b,l+1,strB,strA); - b[l]=0; - l_free(query_length,query); - query=b; - query_length=l+1; - goto __run_query; - } - - if ((query_no_space_length>17) && (!strncasecmp("SHOW TABLES LIKE ", query_no_space, 17))) { - strA=query_no_space+17; - strAl=strlen(strA); - strB=(char *)"SELECT name AS tables FROM sqlite_master WHERE type='table' AND name LIKE '%s'"; - strBl=strlen(strB); - char *tn=NULL; // tablename - tn=(char *)malloc(strlen(strA)); - unsigned int i=0, j=0; - while (istats___mysql_global(); + char *q=(char *)"SELECT '%s' AS 'version()'"; + query_length=strlen(q)+20; + query=(char *)l_alloc(query_length); + sprintf(query,q,PROXYSQL_VERSION); goto __run_query; } -*/ -/* - strA=(char *)"SHOW CREATE TABLE "; - strB=(char *)"SELECT name AS 'table' , REPLACE(REPLACE(sql,' , ', X'2C0A20202020'),'CREATE TABLE %s (','CREATE TABLE %s ('||X'0A20202020') AS 'Create Table' FROM %s.sqlite_master WHERE type='table' AND name='%s'"; - strAl=strlen(strA); - if (strncasecmp("SHOW CREATE TABLE ", query_no_space, strAl)==0) { - strBl=strlen(strB); - char *dbh=NULL; - char *tbh=NULL; - c_split_2(query_no_space+strAl,".",&dbh,&tbh); - - if (strlen(tbh)==0) { - free(tbh); - tbh=dbh; - dbh=strdup("main"); - } - if (strlen(tbh)>=3 && tbh[0]=='`' && tbh[strlen(tbh)-1]=='`') { // tablename is quoted - char *tbh_tmp=(char *)malloc(strlen(tbh)-1); - strncpy(tbh_tmp,tbh+1,strlen(tbh)-2); - tbh_tmp[strlen(tbh)-2]=0; - free(tbh); - tbh=tbh_tmp; - } - int l=strBl+strlen(tbh)*3+strlen(dbh)-8; - char *buff=(char *)l_alloc(l+1); - snprintf(buff,l+1,strB,tbh,tbh,dbh,tbh); - buff[l]=0; - free(tbh); - free(dbh); - l_free(query_length,query); - query=buff; - query_length=l+1; - goto __run_query; + if (strncasecmp("SHOW ", query_no_space, 5)) { + goto __end_show_commands; // in the next block there are only SHOW commands } -*/ + if ( (query_no_space_length==strlen("SHOW DATABASES") && !strncasecmp("SHOW DATABASES",query_no_space, query_no_space_length)) || @@ -1853,21 +870,6 @@ void ClickHouse_Server_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t goto __run_query; } -/* - if (query_no_space_length==strlen("SHOW FULL PROCESSLIST") && !strncasecmp("SHOW FULL PROCESSLIST",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT * FROM stats_mysql_processlist"); - query_length=strlen(query)+1; - goto __run_query; - } - - if (query_no_space_length==strlen("SHOW PROCESSLIST") && !strncasecmp("SHOW PROCESSLIST",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT SessionID, user, db, hostgroup, command, time_ms, SUBSTR(info,0,100) info FROM stats_mysql_processlist"); - query_length=strlen(query)+1; - goto __run_query; - } -*/ __end_show_commands: if ((query_no_space_length>50) && (!strncasecmp("SELECT TABLE_NAME ", query_no_space, 18))) { @@ -1887,13 +889,6 @@ __end_show_commands: if (query_no_space_length==strlen("SELECT DATABASE()") && !strncasecmp("SELECT DATABASE()",query_no_space, query_no_space_length)) { l_free(query_length,query); query=l_strdup("SELECT 'main' AS DATABASE"); -/* - if (sess->session_type == PROXYSQL_SESSION_ADMIN) { // no stats - query=l_strdup("SELECT \"admin\" AS 'DATABASE()'"); - } else { - query=l_strdup("SELECT \"stats\" AS 'DATABASE()'"); - } -*/ query_length=strlen(query)+1; goto __run_query; } @@ -1902,13 +897,6 @@ __end_show_commands: if (query_no_space_length==strlen("SELECT DATABASE() AS name") && !strncasecmp("SELECT DATABASE() AS name",query_no_space, query_no_space_length)) { l_free(query_length,query); query=l_strdup("SELECT \"main\" AS 'DATABASE()'"); -/* - if (sess->session_type == PROXYSQL_SESSION_ADMIN) { // no stats - query=l_strdup("SELECT \"admin\" AS 'name'"); - } else { - query=l_strdup("SELECT \"stats\" AS 'name'"); - } -*/ query_length=strlen(query)+1; goto __run_query; } @@ -1932,10 +920,6 @@ __end_show_commands: || (strncasecmp("SHOW VARIABLES",query_no_space,14)==0) ) { -// l_free(query_length,query); -// query=l_strdup("SELECT name AS Variable_Name FROM system.tables WHERE 1=0"); -// query_length=strlen(query)+1; -// goto __run_query; l_free(query_length,query); char *q=(char *)malloc(query_length+256); sprintf(q,"SELECT variable_name Variable_name, Variable_value Value FROM global_variables"); @@ -1982,34 +966,6 @@ __end_show_commands: } __run_query: -/* - if (run_query) { - ClickHouse_Session *sqlite_sess = (ClickHouse_Session *)sess->thread->gen_args; - sqlite_sess->sessdb->execute_statement(query, &error , &cols , &affected_rows , &resultset); -*/ -/* - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (sess->session_type == PROXYSQL_SESSION_ADMIN) { // no stats - if (SPA->get_read_only()) { // disable writes if the admin interface is in read_only mode - SPA->admindb->execute("PRAGMA query_only = ON"); - SPA->admindb->execute_statement(query, &error , &cols , &affected_rows , &resultset); - SPA->admindb->execute("PRAGMA query_only = OFF"); - } else { - SPA->admindb->execute_statement(query, &error , &cols , &affected_rows , &resultset); - } - } else { - SPA->statsdb->execute("PRAGMA query_only = ON"); - SPA->statsdb->execute_statement(query, &error , &cols , &affected_rows , &resultset); - SPA->statsdb->execute("PRAGMA query_only = OFF"); - } -*/ -/* - sess->SQLite3_to_MySQL(resultset, error, affected_rows, &sess->client_myds->myprot); - delete resultset; - } - l_free(pkt->size-sizeof(mysql_hdr),query_no_space); // it is always freed here - l_free(query_length,query); -*/ if (run_query) { ClickHouse_Session *clickhouse_sess = (ClickHouse_Session *)sess->thread->gen_args; bool supported_command = false; @@ -2058,21 +1014,6 @@ __run_query: } } -/* - if (strncasecmp("CREATE",query_no_space,6)) { - if (strncasecmp("DROP",query_no_space,4)) { - if (strncasecmp("SHOW",query_no_space,4)) { - MySQL_Protocol *myprot=NULL; - myprot=&sess->client_myds->myprot; - assert(myprot); - MySQL_Data_Stream *myds=myprot->get_myds(); - myds->DSS=STATE_QUERY_SENT_DS; - myprot->generate_pkt_ERR(true,NULL,NULL,1,1148,(char *)"42000",(char *)"Command not supported"); - myds->DSS=STATE_SLEEP; - } - } - } -*/ if (supported_command == false) { MySQL_Protocol *myprot=NULL; myprot=&sess->client_myds->myprot; @@ -2085,13 +1026,6 @@ __run_query: try { clickhouse_thread___mysql_sess = sess; - //clickhouse_thread___started=false; -// clickhouse::ClientOptions co; -// co.SetHost("localhost"); -// co.SetCompressionMethod(CompressionMethod::None); - //clickhouse::Client client(ClientOptions().SetHost("localhost")); -// clickhouse::Client client(co); - //Block block; if (clickhouse_sess->connected == true) { if (expected_resultset) { clickhouse_sess->client->Select(query, [](const Block& block) { ClickHouse_to_MySQL(block); } ); @@ -2099,7 +1033,6 @@ __run_query: MySQL_Protocol *myprot=NULL; myprot=&sess->client_myds->myprot; assert(myprot); MySQL_Data_Stream *myds=myprot->get_myds(); - //myds->DSS=STATE_QUERY_SENT_DS; if (clickhouse_sess->transfer_started) { myprot->generate_pkt_EOF(true,NULL,NULL,clickhouse_sess->sid,0, 2); clickhouse_sess->sid++; @@ -2111,7 +1044,6 @@ __run_query: } else { clickhouse::Query myq(query); clickhouse_sess->client->Execute(myq); - //clickhouse_sess->client->SendQuery(query); MySQL_Protocol *myprot=NULL; myprot=&sess->client_myds->myprot; assert(myprot); MySQL_Data_Stream *myds=myprot->get_myds(); @@ -2140,7 +1072,6 @@ __run_query: myds->DSS=STATE_SLEEP; std::cerr << "Exception in query for ClickHouse: " << e.what() << std::endl; sess->set_unhealthy(); - //clickhouse_thread___refresh_interval=0; } } l_free(pkt->size-sizeof(mysql_hdr),query_no_space); // it is always freed here @@ -2240,9 +1171,6 @@ static void *child_mysql(void *arg) { free(arg); sess->client_myds->myprot.generate_pkt_initial_handshake(true,NULL,NULL, &sess->thread_session_id); -// if (connected == false) { -// //goto __exit_child_mysql; -// } while (__sync_fetch_and_add(&glovars.shutdown,0)==0) { if (myds->available_data_out()) { fds[0].events=POLLIN|POLLOUT; @@ -2274,56 +1202,6 @@ __exit_child_mysql: } -/* -void* child_telnet(void* arg) -{ - int bytes_read; - char line[LINESIZE+1]; - int client = *(int *)arg; - free(arg); - pthread_mutex_unlock(&sock_mutex); - memset(line,0,LINESIZE+1); - while ((strncmp(line, "quit", 4) != 0) && glovars.shutdown==0) { - bytes_read = recv(client, line, LINESIZE, 0); - if (bytes_read==-1) { - break; - } - char *eow = strchr(line, '\n'); - if (eow) *eow=0; - //SPA->is_command(line); - if (strncmp(line,"shutdown",8)==0) glovars.shutdown=1; - if (send(client, line, strlen(line), MSG_NOSIGNAL)==-1) break; - if (send(client, "\nOK\n", 4, MSG_NOSIGNAL)==-1) break; - } - shutdown(client,SHUT_RDWR); - close(client); - return arg; -} - -void* child_telnet_also(void* arg) -{ - int bytes_read; - char line[LINESIZE+1]; - int client = *(int *)arg; - free(arg); - pthread_mutex_unlock(&sock_mutex); - memset(line,0,LINESIZE+1); - while ((strncmp(line, "quit", 4) != 0) && glovars.shutdown==0) { - bytes_read = recv(client, line, LINESIZE, 0); - if (bytes_read==-1) { - break; - } - char *eow = strchr(line, '\n'); - if (eow) *eow=0; - if (strncmp(line,"shutdown",8)==0) glovars.shutdown=1; - if (send(client, line, strlen(line), MSG_NOSIGNAL)==-1) break; - if (send(client, "\nNOT OK\n", 8, MSG_NOSIGNAL)==-1) break; - } - shutdown(client,SHUT_RDWR); - close(client); - return arg; -} -*/ static void * sqlite3server_main_loop(void *arg) { int i; @@ -2336,16 +1214,8 @@ static void * sqlite3server_main_loop(void *arg) char *socket_names[MAX_SQLITE3SERVER_LISTENERS]; for (i=0;iset_case_sensitive(false); - match_regexes.re=(void **)malloc(sizeof(void *)*10); - match_regexes.re[0]=(RE2 *)new RE2("^SELECT\\s+@@max_allowed_packet\\s*", *opt2); - match_regexes.re[1]=(RE2 *)new RE2("^SELECT\\s+@@[0-9A-Za-z_-]+\\s*", *opt2); - match_regexes.re[2]=(RE2 *)new RE2("SHOW\\s+VARIABLES\\s+WHERE", *opt2); - match_regexes.re[3]=(RE2 *)new RE2("SHOW\\s+VARIABLES\\s+LIKE", *opt2); -*/ }; void ClickHouse_Server::wrlock() { @@ -2543,181 +1377,16 @@ bool ClickHouse_Server::init() { cpu_timer cpt; child_func[0]=child_mysql; -// child_func[1]=child_telnet; -// child_func[2]=child_telnet_also; main_shutdown=0; main_poll_nfds=0; main_poll_fds=NULL; main_callback_func=NULL; -/* - { - int rc=pipe(pipefd); - if (rc) { - perror("Call to pipe() failed"); - exit(EXIT_FAILURE); - } - } -*/ main_callback_func=(int *)malloc(sizeof(int)*MAX_SQLITE3SERVER_LISTENERS); main_poll_fds=(struct pollfd *)malloc(sizeof(struct pollfd)*MAX_SQLITE3SERVER_LISTENERS); main_poll_nfds=0; -/* - pthread_attr_t attr; - pthread_attr_init(&attr); - //pthread_attr_setstacksize (&attr, mystacksize); - - admindb=new SQLite3DB(); - admindb->open((char *)"file:mem_admindb?mode=memory&cache=shared", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX); - statsdb=new SQLite3DB(); - statsdb->open((char *)"file:mem_statsdb?mode=memory&cache=shared", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX); - - // check if file exists , see #617 - bool admindb_file_exists=Proxy_file_exists(GloVars.admindb); - - configdb=new SQLite3DB(); - configdb->open((char *)GloVars.admindb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX); - // Fully synchronous is not required. See to #1055 - // https://sqlite.org/pragma.html#pragma_synchronous - configdb->execute("PRAGMA synchronous=0"); - - monitordb = new SQLite3DB(); - monitordb->open((char *)"file:mem_monitordb?mode=memory&cache=shared", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX); - - tables_defs_admin=new std::vector; - tables_defs_stats=new std::vector; - tables_defs_config=new std::vector; - - insert_into_tables_defs(tables_defs_admin,"mysql_servers", ADMIN_SQLITE_TABLE_MYSQL_SERVERS); - insert_into_tables_defs(tables_defs_admin,"runtime_mysql_servers", ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_SERVERS); - insert_into_tables_defs(tables_defs_admin,"mysql_users", ADMIN_SQLITE_TABLE_MYSQL_USERS); - insert_into_tables_defs(tables_defs_admin,"runtime_mysql_users", ADMIN_SQLITE_RUNTIME_MYSQL_USERS); - insert_into_tables_defs(tables_defs_admin,"runtime_mysql_replication_hostgroups", ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_admin,"mysql_replication_hostgroups", ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_admin,"mysql_group_replication_hostgroups", ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_admin,"runtime_mysql_group_replication_hostgroups", ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_GROUP_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_admin,"mysql_query_rules", ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES); - insert_into_tables_defs(tables_defs_admin,"runtime_mysql_query_rules", ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_QUERY_RULES); - insert_into_tables_defs(tables_defs_admin,"global_variables", ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES); - insert_into_tables_defs(tables_defs_admin,"runtime_global_variables", ADMIN_SQLITE_RUNTIME_GLOBAL_VARIABLES); - insert_into_tables_defs(tables_defs_admin,"mysql_collations", ADMIN_SQLITE_TABLE_MYSQL_COLLATIONS); - insert_into_tables_defs(tables_defs_admin,"scheduler", ADMIN_SQLITE_TABLE_SCHEDULER); - insert_into_tables_defs(tables_defs_admin,"runtime_scheduler", ADMIN_SQLITE_TABLE_RUNTIME_SCHEDULER); -#ifdef DEBUG - insert_into_tables_defs(tables_defs_admin,"debug_levels", ADMIN_SQLITE_TABLE_DEBUG_LEVELS); -#endif // DEBUG - - insert_into_tables_defs(tables_defs_config,"mysql_servers", ADMIN_SQLITE_TABLE_MYSQL_SERVERS); - insert_into_tables_defs(tables_defs_config,"mysql_users", ADMIN_SQLITE_TABLE_MYSQL_USERS); - insert_into_tables_defs(tables_defs_config,"mysql_replication_hostgroups", ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_config,"mysql_group_replication_hostgroups", ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_config,"mysql_query_rules", ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES); - insert_into_tables_defs(tables_defs_config,"global_variables", ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES); - // the table is not required to be present on disk. Removing it due to #1055 - insert_into_tables_defs(tables_defs_config,"mysql_collations", ADMIN_SQLITE_TABLE_MYSQL_COLLATIONS); - insert_into_tables_defs(tables_defs_config,"scheduler", ADMIN_SQLITE_TABLE_SCHEDULER); -#ifdef DEBUG - insert_into_tables_defs(tables_defs_config,"debug_levels", ADMIN_SQLITE_TABLE_DEBUG_LEVELS); -#endif // DEBUG - - - insert_into_tables_defs(tables_defs_stats,"stats_mysql_query_rules", STATS_SQLITE_TABLE_MYSQL_QUERY_RULES); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_commands_counters", STATS_SQLITE_TABLE_MYSQL_COMMANDS_COUNTERS); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_processlist", STATS_SQLITE_TABLE_MYSQL_PROCESSLIST); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_connection_pool", STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_connection_pool_reset", STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL_RESET); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_query_digest", STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_query_digest_reset", STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_global", STATS_SQLITE_TABLE_MYSQL_GLOBAL); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_users", STATS_SQLITE_TABLE_MYSQL_USERS); - insert_into_tables_defs(tables_defs_stats,"global_variables", ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES); // workaround for issue #708 - - // upgrade mysql_servers if needed (upgrade from previous version) - disk_upgrade_mysql_servers(); - - // upgrade mysql_users if needed (upgrade from previous version) - disk_upgrade_mysql_users(); - - // upgrade mysql_query_rules if needed (upgrade from previous version) - disk_upgrade_mysql_query_rules(); - - // upgrade scheduler if needed (upgrade from previous version) - disk_upgrade_scheduler(); - - check_and_build_standard_tables(admindb, tables_defs_admin); - check_and_build_standard_tables(configdb, tables_defs_config); - check_and_build_standard_tables(statsdb, tables_defs_stats); - - __attach_db(admindb, configdb, (char *)"disk"); - __attach_db(admindb, statsdb, (char *)"stats"); - __attach_db(admindb, monitordb, (char *)"monitor"); - __attach_db(statsdb, monitordb, (char *)"monitor"); - - dump_mysql_collations(); - -#ifdef DEBUG - admindb->execute("ATTACH DATABASE 'file:mem_mydb?mode=memory&cache=shared' AS myhgm"); -#endif // DEBUG - -#ifdef DEBUG - flush_debug_levels_runtime_to_database(configdb, false); - flush_debug_levels_runtime_to_database(admindb, true); -#endif // DEBUG - - flush_mysql_variables___runtime_to_database(configdb, false, false, false); - flush_mysql_variables___runtime_to_database(admindb, false, true, false); - - flush_admin_variables___runtime_to_database(configdb, false, false, false); - flush_admin_variables___runtime_to_database(admindb, false, true, false); - - __insert_or_replace_maintable_select_disktable(); - - flush_admin_variables___database_to_runtime(admindb,true); - - // workaround for issue #708 - statsdb->execute("INSERT OR IGNORE INTO global_variables VALUES('mysql-max_allowed_packet',4194304)"); - -#ifdef DEBUG - if (GloVars.global.gdbg==false && GloVars.__cmd_proxysql_gdbg) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Enabling GloVars.global.gdbg because GloVars.__cmd_proxysql_gdbg==%d\n", GloVars.__cmd_proxysql_gdbg); - GloVars.global.gdbg=true; - } -#endif // DEBUG - - if (GloVars.__cmd_proxysql_reload || GloVars.__cmd_proxysql_initial || admindb_file_exists==false) { // see #617 - if (GloVars.configfile_open) { - if (GloVars.confFile->cfg) { - Read_MySQL_Servers_from_configfile(); - Read_Global_Variables_from_configfile("admin"); - Read_Global_Variables_from_configfile("mysql"); - Read_MySQL_Users_from_configfile(); - Read_MySQL_Query_Rules_from_configfile(); - Read_Scheduler_from_configfile(); - __insert_or_replace_disktable_select_maintable(); - } else { - if (GloVars.confFile->OpenFile(GloVars.config_file)==true) { - Read_MySQL_Servers_from_configfile(); - Read_MySQL_Users_from_configfile(); - Read_MySQL_Query_Rules_from_configfile(); - Read_Global_Variables_from_configfile("admin"); - Read_Global_Variables_from_configfile("mysql"); - Read_Scheduler_from_configfile(); - __insert_or_replace_disktable_select_maintable(); - } - } - } - } - flush_admin_variables___database_to_runtime(admindb,true); - flush_mysql_variables___database_to_runtime(admindb,true); - - if (GloVars.__cmd_proxysql_admin_socket) { - set_variable((char *)"mysql_ifaces",GloVars.__cmd_proxysql_admin_socket); - } -*/ S_amll.update_ifaces(variables.mysql_ifaces, &S_amll.ifaces_mysql); -// S_amll.update_ifaces(variables.telnet_admin_ifaces, &S_amll.ifaces_telnet_admin); -// S_amll.update_ifaces(variables.telnet_stats_ifaces, &S_amll.ifaces_telnet_stats); @@ -2731,79 +1400,12 @@ bool ClickHouse_Server::init() { perror("Thread creation"); exit(EXIT_FAILURE); } -// do { usleep(50); } while (__sync_fetch_and_sub(&load_main_,0)==0); -// load_main_=0; #ifdef DEBUG std::cerr << "SQLite3 Server initialized in "; #endif return true; }; -/* -void ProxySQL_Admin::admin_shutdown() { - int i; -// do { usleep(50); } while (main_shutdown==0); - pthread_join(admin_thr, NULL); - delete admindb; - delete statsdb; - delete configdb; - delete monitordb; - sqlite3_shutdown(); - if (main_poll_fds) { - for (i=0;iexecute("INSERT OR REPLACE INTO mysql_collations SELECT Id, Collation, Charset, 'Yes' FROM mysql_collations JOIN (SELECT MIN(Id) minid FROM mysql_collations GROUP BY Charset) t ON t.minid=mysql_collations.Id"); } -/* -void ProxySQL_Admin::check_and_build_standard_tables(SQLite3DB *db, std::vector *tables_defs) { -// int i; - table_def_t *td; - db->execute("PRAGMA foreign_keys = OFF"); - for (std::vector::iterator it=tables_defs->begin(); it!=tables_defs->end(); ++it) { - td=*it; - db->check_and_build_table(td->table_name, td->table_def); - } - db->execute("PRAGMA foreign_keys = ON"); -}; - - - -void ProxySQL_Admin::insert_into_tables_defs(std::vector *tables_defs, const char *table_name, const char *table_def) { - table_def_t *td = new table_def_t; - td->table_name=strdup(table_name); - td->table_def=strdup(table_def); - tables_defs->push_back(td); -}; - -void ProxySQL_Admin::drop_tables_defs(std::vector *tables_defs) { - table_def_t *td; - while (!tables_defs->empty()) { - td=tables_defs->back(); - free(td->table_name); - td->table_name=NULL; - free(td->table_def); - td->table_def=NULL; - tables_defs->pop_back(); - delete td; - } -}; - - -void ProxySQL_Admin::flush_admin_variables___database_to_runtime(SQLite3DB *db, bool replace) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Flushing ADMIN variables. Replace:%d\n", replace); - char *error=NULL; - int cols=0; - int affected_rows=0; - SQLite3_result *resultset=NULL; - char *q=(char *)"SELECT substr(variable_name,7) vn, variable_value FROM global_variables WHERE variable_name LIKE 'admin-%'"; - admindb->execute_statement(q, &error , &cols , &affected_rows , &resultset); - if (error) { - proxy_error("Error on %s : %s\n", q, error); - return; - } else { - wrlock(); - for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { - SQLite3_row *r=*it; - bool rc=set_variable(r->fields[0],r->fields[1]); - if (rc==false) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Impossible to set variable %s with value \"%s\"\n", r->fields[0],r->fields[1]); - if (replace) { - char *val=get_variable(r->fields[0]); - char q[1000]; - if (val) { - if (strcmp(r->fields[0],(char *)"version")) { - proxy_warning("Impossible to set variable %s with value \"%s\". Resetting to current \"%s\".\n", r->fields[0],r->fields[1], val); - } - sprintf(q,"INSERT OR REPLACE INTO global_variables VALUES(\"admin-%s\",\"%s\")",r->fields[0],val); - db->execute(q); - free(val); - } else { - if (strcmp(r->fields[0],(char *)"debug")==0) { - sprintf(q,"DELETE FROM disk.global_variables WHERE variable_name=\"admin-%s\"",r->fields[0]); - db->execute(q); - } else { - proxy_warning("Impossible to set not existing variable %s with value \"%s\". Deleting. If the variable name is correct, this version doesn't support it\n", r->fields[0],r->fields[1]); - } - sprintf(q,"DELETE FROM global_variables WHERE variable_name=\"admin-%s\"",r->fields[0]); - db->execute(q); - } - } - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Set variable %s with value \"%s\"\n", r->fields[0],r->fields[1]); - } - } - //commit(); NOT IMPLEMENTED - wrunlock(); - } - if (resultset) delete resultset; -} - -void ProxySQL_Admin::flush_mysql_variables___database_to_runtime(SQLite3DB *db, bool replace) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Flushing MySQL variables. Replace:%d\n", replace); - char *error=NULL; - int cols=0; - int affected_rows=0; - SQLite3_result *resultset=NULL; - char *q=(char *)"SELECT substr(variable_name,7) vn, variable_value FROM global_variables WHERE variable_name LIKE 'mysql-%'"; - admindb->execute_statement(q, &error , &cols , &affected_rows , &resultset); - if (error) { - proxy_error("Error on %s : %s\n", q, error); - return; - } else { - GloMTH->wrlock(); - for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { - SQLite3_row *r=*it; - bool rc=GloMTH->set_variable(r->fields[0],r->fields[1]); - if (rc==false) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Impossible to set variable %s with value \"%s\"\n", r->fields[0],r->fields[1]); - if (replace) { - char *val=GloMTH->get_variable(r->fields[0]); - char q[1000]; - if (val) { - if (strcmp(val,r->fields[1])) { - proxy_warning("Impossible to set variable %s with value \"%s\". Resetting to current \"%s\".\n", r->fields[0],r->fields[1], val); - sprintf(q,"INSERT OR REPLACE INTO global_variables VALUES(\"mysql-%s\",\"%s\")",r->fields[0],val); - db->execute(q); - } - free(val); - } else { - if (strcmp(r->fields[0],(char *)"session_debug")==0) { - sprintf(q,"DELETE FROM disk.global_variables WHERE variable_name=\"mysql-%s\"",r->fields[0]); - db->execute(q); - } else { - proxy_warning("Impossible to set not existing variable %s with value \"%s\". Deleting. If the variable name is correct, this version doesn't support it\n", r->fields[0],r->fields[1]); - } - sprintf(q,"DELETE FROM global_variables WHERE variable_name=\"mysql-%s\"",r->fields[0]); - db->execute(q); - } - } - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Set variable %s with value \"%s\"\n", r->fields[0],r->fields[1]); - } - } - GloMTH->commit(); - GloMTH->wrunlock(); - } - if (resultset) delete resultset; -} - -void ProxySQL_Admin::flush_mysql_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty, bool runtime) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Flushing MySQL variables. Replace:%d, Delete:%d, Only_If_Empty:%d\n", replace, del, onlyifempty); - if (onlyifempty) { - char *error=NULL; - int cols=0; - int affected_rows=0; - SQLite3_result *resultset=NULL; - char *q=(char *)"SELECT COUNT(*) FROM global_variables WHERE variable_name LIKE 'mysql-%'"; - db->execute_statement(q, &error , &cols , &affected_rows , &resultset); - int matching_rows=0; - if (error) { - proxy_error("Error on %s : %s\n", q, error); - return; - } else { - for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { - SQLite3_row *r=*it; - matching_rows+=atoi(r->fields[0]); - } - } - if (resultset) delete resultset; - if (matching_rows) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Table global_variables has MySQL variables - skipping\n"); - return; - } - } - if (del) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Deleting MySQL variables from global_variables\n"); - db->execute("DELETE FROM global_variables WHERE variable_name LIKE 'mysql-%'"); - } - if (runtime) { - db->execute("DELETE FROM runtime_global_variables WHERE variable_name LIKE 'mysql-%'"); - } - char *a; - char *b=(char *)"INSERT INTO runtime_global_variables(variable_name, variable_value) VALUES(\"mysql-%s\",\"%s\")"; - if (replace) { - a=(char *)"REPLACE INTO global_variables(variable_name, variable_value) VALUES(\"mysql-%s\",\"%s\")"; - } else { - a=(char *)"INSERT OR IGNORE INTO global_variables(variable_name, variable_value) VALUES(\"mysql-%s\",\"%s\")"; - } - int l=strlen(a)+200; - GloMTH->wrlock(); - char **varnames=GloMTH->get_variables_list(); - for (int i=0; varnames[i]; i++) { - char *val=GloMTH->get_variable(varnames[i]); - l+=( varnames[i] ? strlen(varnames[i]) : 6); - l+=( val ? strlen(val) : 6); - char *query=(char *)malloc(l); - sprintf(query, a, varnames[i], val); - if (runtime) { - db->execute(query); - sprintf(query, b, varnames[i], val); - } - db->execute(query); - if (val) - free(val); - free(query); - } - GloMTH->wrunlock(); - for (int i=0; varnames[i]; i++) { - free(varnames[i]); - } - free(varnames); -} -*/ char **ClickHouse_Server::get_variables_list() { size_t l=sizeof(ClickHouse_Server_variables_names)/sizeof(char *); unsigned int i; @@ -3043,17 +1448,8 @@ bool ClickHouse_Server::has_variable(const char *name) { char * ClickHouse_Server::get_variable(char *name) { #define INTBUFSIZE 4096 char intbuf[INTBUFSIZE]; -/* - if (!strcasecmp(name,"version")) return s_strdup(variables.admin_version); - if (!strcasecmp(name,"admin_credentials")) return s_strdup(variables.admin_credentials); - if (!strcasecmp(name,"stats_credentials")) return s_strdup(variables.stats_credentials); -*/ if (!strcasecmp(name,"hostname")) return s_strdup(variables.hostname); if (!strcasecmp(name,"mysql_ifaces")) return s_strdup(variables.mysql_ifaces); -/* - if (!strcasecmp(name,"telnet_admin_ifaces")) return s_strdup(variables.telnet_admin_ifaces); - if (!strcasecmp(name,"telnet_stats_ifaces")) return s_strdup(variables.telnet_stats_ifaces); -*/ if (!strcasecmp(name,"port")) { sprintf(intbuf,"%d",variables.port); return strdup(intbuf); @@ -3061,65 +1457,9 @@ char * ClickHouse_Server::get_variable(char *name) { if (!strcasecmp(name,"read_only")) { return strdup((variables.read_only ? "true" : "false")); } -/* - if (!strcasecmp(name,"hash_passwords")) { - return strdup((variables.hash_passwords ? "true" : "false")); - } -#ifdef DEBUG - if (!strcasecmp(name,"debug")) { - return strdup((variables.debug ? "true" : "false")); - } -#endif // DEBUG -*/ return NULL; } -/* -#ifdef DEBUG -void ProxySQL_Admin::add_credentials(char *type, char *credentials, int hostgroup_id) { -#else -void ProxySQL_Admin::add_credentials(char *credentials, int hostgroup_id) { -#endif // DEBUG - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Adding %s credentials: %s\n", type, credentials); - tokenizer_t tok = tokenizer( credentials, ";", TOKENIZER_NO_EMPTIES ); - const char* token; - for (token = tokenize( &tok ); token; token = tokenize( &tok )) { - char *user=NULL; - char *pass=NULL; - c_split_2(token, ":", &user, &pass); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Adding %s credential: \"%s\", user:%s, pass:%s\n", type, token, user, pass); - if (GloMyAuth) { // this check if required if GloMyAuth doesn't exist yet - GloMyAuth->add(user,pass,USERNAME_FRONTEND,0,hostgroup_id,(char *)"main",0,0,0,1000); - } - free(user); - free(pass); - } - free_tokenizer( &tok ); -} - -#ifdef DEBUG -void ProxySQL_Admin::delete_credentials(char *type, char *credentials) { -#else -void ProxySQL_Admin::delete_credentials(char *credentials) { -#endif // DEBUG - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Removing old %s credentials: %s\n", type, credentials); - tokenizer_t tok = tokenizer( credentials, ";", TOKENIZER_NO_EMPTIES ); - const char* token; - for (token = tokenize( &tok ); token; token = tokenize( &tok )) { - char *user=NULL; - char *pass=NULL; - c_split_2(token, ":", &user, &pass); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Removing %s credential: \"%s\", user:%s, pass:%s\n", type, token, user, pass); - if (GloMyAuth) { // this check if required if GloMyAuth doesn't exist yet - GloMyAuth->del(user,USERNAME_FRONTEND); - } - free(user); - free(pass); - } - free_tokenizer( &tok ); -} - -*/ bool ClickHouse_Server::set_variable(char *name, char *value) { // this is the public function, accessible from admin size_t vallen=strlen(value); @@ -3171,103 +1511,6 @@ bool ClickHouse_Server::set_variable(char *name, char *value) { // this is the return false; } -/* -void ProxySQL_Admin::flush_admin_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty, bool runtime) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Flushing ADMIN variables. Replace:%d, Delete:%d, Only_If_Empty:%d\n", replace, del, onlyifempty); - if (onlyifempty) { - char *error=NULL; - int cols=0; - int affected_rows=0; - SQLite3_result *resultset=NULL; - char *q=(char *)"SELECT COUNT(*) FROM global_variables WHERE variable_name LIKE 'admin-%'"; - db->execute_statement(q, &error , &cols , &affected_rows , &resultset); - int matching_rows=0; - if (error) { - proxy_error("Error on %s : %s\n", q, error); - return; - } else { - for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { - SQLite3_row *r=*it; - matching_rows+=atoi(r->fields[0]); - } - } - if (resultset) delete resultset; - if (matching_rows) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Table global_variables has ADMIN variables - skipping\n"); - return; - } - } - if (del) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Deleting ADMIN variables from global_variables\n"); - db->execute("DELETE FROM global_variables WHERE variable_name LIKE 'admin-%'"); - } - if (runtime) { - db->execute("DELETE FROM runtime_global_variables WHERE variable_name LIKE 'admin-%'"); - } - char *a; - char *b=(char *)"INSERT INTO runtime_global_variables(variable_name, variable_value) VALUES(\"admin-%s\",\"%s\")"; - if (replace) { - a=(char *)"REPLACE INTO global_variables(variable_name, variable_value) VALUES(\"admin-%s\",\"%s\")"; - } else { - a=(char *)"INSERT OR IGNORE INTO global_variables(variable_name, variable_value) VALUES(\"admin-%s\",\"%s\")"; - } - int l=strlen(a)+200; - - char **varnames=get_variables_list(); - for (int i=0; varnames[i]; i++) { - char *val=get_variable(varnames[i]); - l+=( varnames[i] ? strlen(varnames[i]) : 6); - l+=( val ? strlen(val) : 6); - char *query=(char *)malloc(l); - sprintf(query, a, varnames[i], val); - db->execute(query); - if (runtime) { - sprintf(query, b, varnames[i], val); - db->execute(query); - } - if (val) - free(val); - free(query); - } - for (int i=0; varnames[i]; i++) { - free(varnames[i]); - } - free(varnames); - -} - -#ifdef DEBUG -void ProxySQL_Admin::flush_debug_levels_runtime_to_database(SQLite3DB *db, bool replace) { - int i; - char *a=NULL; - db->execute("DELETE FROM debug_levels WHERE verbosity=0"); - if (replace) { - a=(char *)"REPLACE INTO debug_levels(module,verbosity) VALUES(\"%s\",%d)"; - } else { - a=(char *)"INSERT OR IGNORE INTO debug_levels(module,verbosity) VALUES(\"%s\",%d)"; - } - int l=strlen(a)+100; - for (i=0;iexecute(query); - free(query); - } -} -#endif // DEBUG -*/ - -/* -void ProxySQL_Admin::__attach_db(SQLite3DB *db1, SQLite3DB *db2, char *alias) { - const char *a="ATTACH DATABASE '%s' AS %s"; - int l=strlen(a)+strlen(db2->get_url())+strlen(alias)+5; - char *cmd=(char *)malloc(l); - sprintf(cmd,a,db2->get_url(), alias); - db1->execute(cmd); - free(cmd); -} -*/ - void ClickHouse_Server::send_MySQL_OK(MySQL_Protocol *myprot, char *msg, int rows) { assert(myprot); @@ -3285,14 +1528,4 @@ void ClickHouse_Server::send_MySQL_ERR(MySQL_Protocol *myprot, char *msg) { myds->DSS=STATE_SLEEP; } -/* -// this fuction will be called a s a deatached thread -void * waitpid_thread(void *arg) { - pid_t *cpid_ptr=(pid_t *)arg; - int status; - waitpid(*cpid_ptr, &status, 0); - free(cpid_ptr); - return NULL; -} -*/ #endif /* PROXYSQLCLICKHOUSE */ diff --git a/lib/SQLite3_Server.cpp b/lib/SQLite3_Server.cpp index 693706d4b..e7e958515 100644 --- a/lib/SQLite3_Server.cpp +++ b/lib/SQLite3_Server.cpp @@ -50,29 +50,6 @@ } while (rc!=SQLITE_DONE);\ } while (0) -/* -static void StringToHex(unsigned char *string, unsigned char *hexstring, size_t l) { - unsigned char ch; - size_t i, j; - - for (i=0, j=0; i> 4; - if (ch <= 9) { - hexstring[j]= '0' + ch; - } else { - hexstring[j]= 'A' + ch - 10; - } - ch = string[i]; - ch = ch & 0x0F; - if (ch <= 9) { - hexstring[j+1]= '0' + ch; - } else { - hexstring[j+1]= 'A' + ch - 10; - } - } -} -*/ struct cpu_timer { @@ -97,37 +74,9 @@ static char *s_strdup(char *s) { } return ret; } -/* -static char *sha1_pass_hex(char *sha1_pass) { // copied from MySQL_Protocol.cpp - if (sha1_pass==NULL) return NULL; - // previous code is commented. Uncomment all to perform validation -// char *buff=(char *)malloc(SHA_DIGEST_LENGTH*2+2); -// buff[0]='*'; -// buff[SHA_DIGEST_LENGTH*2+1]='\0'; -// int i; -// uint8_t a; -// for (i=0;i= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" - -// mysql_servers in v1.1.0 -#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V1_1_0 "CREATE TABLE mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , PRIMARY KEY (hostgroup_id, hostname, port) )" - -// mysql_servers in v1.2.0e -#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V1_2_0e "CREATE TABLE mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , PRIMARY KEY (hostgroup_id, hostname, port) )" - -#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V1_2_2 "CREATE TABLE mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" - -#define ADMIN_SQLITE_TABLE_MYSQL_USERS_V1_3_0 "CREATE TABLE mysql_users (username VARCHAR NOT NULL , password VARCHAR , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0 , default_hostgroup INT NOT NULL DEFAULT 0 , default_schema VARCHAR , schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0 , transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 0 , fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0 , backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1 , frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000 , PRIMARY KEY (username, backend) , UNIQUE (username, frontend))" -#define ADMIN_SQLITE_TABLE_MYSQL_USERS_V1_4_0 "CREATE TABLE mysql_users (username VARCHAR NOT NULL , password VARCHAR , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0 , default_hostgroup INT NOT NULL DEFAULT 0 , default_schema VARCHAR , schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0 , transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1 , fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0 , backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1 , frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000 , PRIMARY KEY (username, backend) , UNIQUE (username, frontend))" -#define ADMIN_SQLITE_TABLE_MYSQL_USERS ADMIN_SQLITE_TABLE_MYSQL_USERS_V1_4_0 - - -#define ADMIN_SQLITE_RUNTIME_MYSQL_USERS "CREATE TABLE runtime_mysql_users (username VARCHAR NOT NULL , password VARCHAR , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0 , default_hostgroup INT NOT NULL DEFAULT 0 , default_schema VARCHAR , schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0 , transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1 , fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0 , backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1 , frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000 , PRIMARY KEY (username, backend) , UNIQUE (username, frontend))" - -// mysql_query_rules in v1.1.0 -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_1_0 "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , delay INT UNSIGNED , error_msg VARCHAR , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0)" - -// mysql_query_rules in v1.2.0a -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_2_0a "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , delay INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0)" - -// mysql_query_rules in v1.2.0g -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_2_0g "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0)" - -// mysql_query_rules in v1.2.2 -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_2_2 "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -// mysql_query_rules in v1.3.1 -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_3_1 "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -//mysql_query_rules in v1.4.0 + next_query_flagIN -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_0a "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR DEFAULT 'CASELESS' , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_0b "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR DEFAULT 'CASELESS' , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1,2)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_1 "CREATE TABLE mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR DEFAULT 'CASELESS' , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , OK_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1,2)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_1 -//#define ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES_V1_4_0b - -#define ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES "CREATE TABLE global_variables (variable_name VARCHAR NOT NULL PRIMARY KEY , variable_value VARCHAR NOT NULL)" - -#define ADMIN_SQLITE_RUNTIME_GLOBAL_VARIABLES "CREATE TABLE runtime_global_variables (variable_name VARCHAR NOT NULL PRIMARY KEY , variable_value VARCHAR NOT NULL)" - -#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" - -// mysql_replication_hostgroups in v1.0 -#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_0 "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , UNIQUE (reader_hostgroup))" - -// mysql_replication_hostgroups in v1.2.2 -#define ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_2_2 "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" - -#define ADMIN_SQLITE_TABLE_MYSQL_COLLATIONS "CREATE TABLE mysql_collations (Id INTEGER NOT NULL PRIMARY KEY , Collation VARCHAR NOT NULL , Charset VARCHAR NOT NULL , `Default` VARCHAR NOT NULL)" - -#define ADMIN_SQLITE_TABLE_SCHEDULER "CREATE TABLE scheduler (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '')" - -#define ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_0 "CREATE TABLE scheduler (id INTEGER NOT NULL , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , PRIMARY KEY(id))" - -#define ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_2a "CREATE TABLE scheduler (id INTEGER NOT NULL , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY(id))" - -#define ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_2b "CREATE TABLE scheduler (id INTEGER NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY(id))" - -#define ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_2c "CREATE TABLE scheduler (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '')" - -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_SERVERS "CREATE TABLE runtime_mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" - -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE runtime_mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0) , comment VARCHAR , UNIQUE (reader_hostgroup))" - -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_QUERY_RULES "CREATE TABLE runtime_mysql_query_rules (rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0 , username VARCHAR , schemaname VARCHAR , flagIN INT NOT NULL DEFAULT 0 , client_addr VARCHAR , proxy_addr VARCHAR , proxy_port INT , digest VARCHAR , match_digest VARCHAR , match_pattern VARCHAR , negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0 , re_modifiers VARCHAR , flagOUT INT , replace_pattern VARCHAR , destination_hostgroup INT DEFAULT NULL , cache_ttl INT CHECK(cache_ttl > 0) , reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL , timeout INT UNSIGNED , retries INT CHECK (retries>=0 AND retries <=1000) , delay INT UNSIGNED , next_query_flagIN INT UNSIGNED , mirror_flagOUT INT UNSIGNED , mirror_hostgroup INT UNSIGNED , error_msg VARCHAR , OK_msg VARCHAR , sticky_conn INT CHECK (sticky_conn IN (0,1)) , multiplex INT CHECK (multiplex IN (0,1)) , log INT CHECK (log IN (0,1)) , apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0 , comment VARCHAR)" - -#define ADMIN_SQLITE_TABLE_RUNTIME_SCHEDULER "CREATE TABLE runtime_scheduler (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '')" - -#define STATS_SQLITE_TABLE_MYSQL_QUERY_RULES "CREATE TABLE stats_mysql_query_rules (rule_id INTEGER PRIMARY KEY , hits INT NOT NULL)" -#define STATS_SQLITE_TABLE_MYSQL_USERS "CREATE TABLE stats_mysql_users (username VARCHAR PRIMARY KEY , frontend_connections INT NOT NULL , frontend_max_connections INT NOT NULL)" -#define STATS_SQLITE_TABLE_MYSQL_COMMANDS_COUNTERS "CREATE TABLE stats_mysql_commands_counters (Command VARCHAR NOT NULL PRIMARY KEY , Total_Time_us INT NOT NULL , Total_cnt INT NOT NULL , cnt_100us INT NOT NULL , cnt_500us INT NOT NULL , cnt_1ms INT NOT NULL , cnt_5ms INT NOT NULL , cnt_10ms INT NOT NULL , cnt_50ms INT NOT NULL , cnt_100ms INT NOT NULL , cnt_500ms INT NOT NULL , cnt_1s INT NOT NULL , cnt_5s INT NOT NULL , cnt_10s INT NOT NULL , cnt_INFs)" -#define STATS_SQLITE_TABLE_MYSQL_PROCESSLIST "CREATE TABLE stats_mysql_processlist (ThreadID INT NOT NULL , SessionID INTEGER PRIMARY KEY , user VARCHAR , db VARCHAR , cli_host VARCHAR , cli_port VARCHAR , hostgroup VARCHAR , l_srv_host VARCHAR , l_srv_port VARCHAR , srv_host VARCHAR , srv_port VARCHAR , command VARCHAR , time_ms INT NOT NULL , info VARCHAR)" -#define STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL "CREATE TABLE stats_mysql_connection_pool (hostgroup VARCHAR , srv_host VARCHAR , srv_port VARCHAR , status VARCHAR , ConnUsed INT , ConnFree INT , ConnOK INT , ConnERR INT , Queries INT , Bytes_data_sent INT , Bytes_data_recv INT , Latency_us INT)" - -#define STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL_RESET "CREATE TABLE stats_mysql_connection_pool_reset (hostgroup VARCHAR , srv_host VARCHAR , srv_port VARCHAR , status VARCHAR , ConnUsed INT , ConnFree INT , ConnOK INT , ConnERR INT , Queries INT , Bytes_data_sent INT , Bytes_data_recv INT , Latency_us INT)" - -#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST "CREATE TABLE stats_mysql_query_digest (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(hostgroup, schemaname, username, digest))" - -#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET "CREATE TABLE stats_mysql_query_digest_reset (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(hostgroup, schemaname, username, digest))" - -#define STATS_SQLITE_TABLE_MYSQL_GLOBAL "CREATE TABLE stats_mysql_global (Variable_Name VARCHAR NOT NULL PRIMARY KEY , Variable_Value VARCHAR NOT NULL)" - -#ifdef DEBUG -#define ADMIN_SQLITE_TABLE_DEBUG_LEVELS "CREATE TABLE debug_levels (module VARCHAR NOT NULL PRIMARY KEY , verbosity INT NOT NULL DEFAULT 0)" -#endif // DEBUG - -#define ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_group_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" - -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_GROUP_REPLICATION_HOSTGROUPS "CREATE TABLE runtime_mysql_group_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" -*/ -/* -static char * admin_variables_names[]= { - (char *)"version", - (char *)"admin_credentials", - (char *)"stats_credentials", - (char *)"mysql_ifaces", - (char *)"telnet_admin_ifaces", - (char *)"telnet_stats_ifaces", - (char *)"refresh_interval", - (char *)"read_only", - (char *)"hash_passwords", - (char *)"version", -#ifdef DEBUG - (char *)"debug", -#endif // DEBUG - NULL -}; -*/ - static char * SQLite3_Server_variables_names[] = { (char *)"mysql_ifaces", (char *)"read_only", NULL }; -/* -static ProxySQL_Admin *SPA=NULL; -*/ static void * (*child_func[1]) (void *arg); typedef struct _main_args { @@ -286,13 +108,7 @@ typedef struct _main_args { typedef struct _ifaces_desc_t { char **mysql_ifaces; -// char **telnet_admin_ifaces; -// char **telnet_stats_ifaces; } ifaces_desc_t; -/* -#define MAX_IFACES 8 -#define MAX_ADMIN_LISTENERS 16 -*/ #define MAX_IFACES 8 #define MAX_SQLITE3SERVER_LISTENERS 16 @@ -354,18 +170,12 @@ class sqlite3server_main_loop_listeners { pthread_rwlock_unlock(&rwlock); } ifaces_desc *ifaces_mysql; -// ifaces_desc *ifaces_telnet_admin; -// ifaces_desc *ifaces_telnet_stats; ifaces_desc_t descriptor_new; sqlite3server_main_loop_listeners() { pthread_rwlock_init(&rwlock, NULL); ifaces_mysql=new ifaces_desc(); -// ifaces_telnet_admin=new ifaces_desc(); -// ifaces_telnet_stats=new ifaces_desc(); version=0; descriptor_new.mysql_ifaces=NULL; -// descriptor_new.telnet_admin_ifaces=NULL; -// descriptor_new.telnet_stats_ifaces=NULL; } @@ -412,1685 +222,93 @@ static sqlite3server_main_loop_listeners S_amll; -/* -bool admin_handler_command_kill_connection(char *query_no_space, unsigned int query_no_space_length, MySQL_Session *sess, ProxySQL_Admin *pa) { - uint32_t id=atoi(query_no_space+16); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Trying to kill session %u\n", id); - bool rc=GloMTH->kill_session(id); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (rc) { - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - } else { - char buf[1024]; - sprintf(buf,"Unknown thread id: %u", id); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, buf); - } - return false; -} -*/ -/* - * returns false if the command is a valid one and is processed - * return true if the command is not a valid one and needs to be executed by SQLite (that will return an error) - */ -/* -bool admin_handler_command_proxysql(char *query_no_space, unsigned int query_no_space_length, MySQL_Session *sess, ProxySQL_Admin *pa) { - if (query_no_space_length==strlen("PROXYSQL READONLY") && !strncasecmp("PROXYSQL READONLY",query_no_space, query_no_space_length)) { - // this command enables admin_read_only , so the admin module is in read_only mode - proxy_info("Received PROXYSQL READONLY command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->set_read_only(true); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - if (query_no_space_length==strlen("PROXYSQL READWRITE") && !strncasecmp("PROXYSQL READWRITE",query_no_space, query_no_space_length)) { - // this command disables admin_read_only , so the admin module won't be in read_only mode - proxy_info("Received PROXYSQL WRITE command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->set_read_only(false); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - if (query_no_space_length==strlen("PROXYSQL START") && !strncasecmp("PROXYSQL START",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL START command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - bool rc=false; - if (nostart_) { - rc=__sync_bool_compare_and_swap(&GloVars.global.nostart,1,0); - } - if (rc) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Starting ProxySQL following PROXYSQL START command\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - } else { - proxy_warning("ProxySQL was already started when received PROXYSQL START command\n"); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"ProxySQL already started"); - } - return false; - } - - if (query_no_space_length==strlen("PROXYSQL RESTART") && !strncasecmp("PROXYSQL RESTART",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL RESTART command\n"); - __sync_bool_compare_and_swap(&glovars.shutdown,0,1); - glovars.reload=1; - return false; - } - - if (query_no_space_length==strlen("PROXYSQL STOP") && !strncasecmp("PROXYSQL STOP",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL STOP command\n"); - // to speed up this process we first change wait_timeout to 0 - // MySQL_thread will call poll() with a maximum timeout of 100ms - old_wait_timeout=GloMTH->get_variable_int((char *)"wait_timeout"); - GloMTH->set_variable((char *)"wait_timeout",(char *)"0"); - GloMTH->commit(); - GloMTH->signal_all_threads(0); - GloMTH->stop_listeners(); - char buf[32]; - sprintf(buf,"%d",old_wait_timeout); - GloMTH->set_variable((char *)"wait_timeout",buf); - GloMTH->commit(); - glovars.reload=2; - __sync_bool_compare_and_swap(&glovars.shutdown,0,1); - return false; - } - - if (query_no_space_length==strlen("PROXYSQL PAUSE") && !strncasecmp("PROXYSQL PAUSE",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL PAUSE command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (nostart_) { - if (__sync_fetch_and_add((uint8_t *)(&GloVars.global.nostart),0)) { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"ProxySQL MySQL module not running, impossible to pause"); - return false; - } - } - if (proxysql_mysql_paused==false) { - // to speed up this process we first change poll_timeout to 10 - // MySQL_thread will call poll() with a maximum timeout of 10ms - old_wait_timeout=GloMTH->get_variable_int((char *)"poll_timeout"); - GloMTH->set_variable((char *)"poll_timeout",(char *)"10"); - GloMTH->commit(); - GloMTH->signal_all_threads(0); - GloMTH->stop_listeners(); - proxysql_mysql_paused=true; - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - // we now rollback poll_timeout - char buf[32]; - sprintf(buf,"%d",old_wait_timeout); - GloMTH->set_variable((char *)"poll_timeout",buf); - GloMTH->commit(); - } else { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"ProxySQL MySQL module is already paused, impossible to pause"); - } - return false; - } - - if (query_no_space_length==strlen("PROXYSQL RESUME") && !strncasecmp("PROXYSQL RESUME",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL RESUME command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (nostart_) { - if (__sync_fetch_and_add((uint8_t *)(&GloVars.global.nostart),0)) { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"ProxySQL MySQL module not running, impossible to resume"); - return false; - } - } - if (proxysql_mysql_paused==true) { - // to speed up this process we first change poll_timeout to 10 - // MySQL_thread will call poll() with a maximum timeout of 10ms - old_wait_timeout=GloMTH->get_variable_int((char *)"poll_timeout"); - GloMTH->set_variable((char *)"poll_timeout",(char *)"10"); - GloMTH->commit(); - GloMTH->signal_all_threads(0); - GloMTH->start_listeners(); - //char buf[32]; - //sprintf(buf,"%d",old_wait_timeout); - //GloMTH->set_variable((char *)"poll_timeout",buf); - //GloMTH->commit(); - proxysql_mysql_paused=false; - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - // we now rollback poll_timeout - char buf[32]; - sprintf(buf,"%d",old_wait_timeout); - GloMTH->set_variable((char *)"poll_timeout",buf); - GloMTH->commit(); - } else { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"ProxySQL MySQL module is not paused, impossible to resume"); - } - return false; - } - - if (query_no_space_length==strlen("PROXYSQL SHUTDOWN") && !strncasecmp("PROXYSQL SHUTDOWN",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL SHUTDOWN command\n"); - __sync_bool_compare_and_swap(&glovars.shutdown,0,1); - glovars.reload=0; - return false; - } - - if (query_no_space_length==strlen("PROXYSQL FLUSH LOGS") && !strncasecmp("PROXYSQL FLUSH LOGS",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL FLUSH LOGS command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (GloMyLogger) { - GloMyLogger->flush_log(); - } - SPA->flush_error_log(); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("PROXYSQL FLUSH CONFIGDB") && !strncasecmp("PROXYSQL FLUSH CONFIGDB",query_no_space, query_no_space_length)) // see #923 - ) { - proxy_info("Received %s command\n", query_no_space); - proxy_warning("A misconfigured configdb will cause undefined behaviors\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->flush_configdb(); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - -#ifndef NOJEM - if (query_no_space_length==strlen("PROXYSQL MEMPROFILE START") && !strncasecmp("PROXYSQL MEMPROFILE START",query_no_space, query_no_space_length)) { - bool en=true; - mallctl("prof.active", NULL, NULL, &en, sizeof(bool)); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - if (query_no_space_length==strlen("PROXYSQL MEMPROFILE STOP") && !strncasecmp("PROXYSQL MEMPROFILE STOP",query_no_space, query_no_space_length)) { - bool en=false; - mallctl("prof.active", NULL, NULL, &en, sizeof(bool)); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } -#endif - - if (query_no_space_length==strlen("PROXYSQL KILL") && !strncasecmp("PROXYSQL KILL",query_no_space, query_no_space_length)) { - proxy_info("Received PROXYSQL KILL command\n"); - exit(EXIT_SUCCESS); - } - - return true; -} -*/ -/* -// Returns true if the given name is either a know mysql or admin global variable. -bool is_valid_global_variable(const char *var_name) { - if (strlen(var_name) > 6 && !strncmp(var_name, "mysql-", 6) && GloMTH->has_variable(var_name + 6)) { - return true; - } else if (strlen(var_name) > 6 && !strncmp(var_name, "admin-", 6) && SPA->has_variable(var_name + 6)) { - return true; - } else { - return false; - } -} - -// This method translates a 'SET variable=value' command into an equivalent UPDATE. It doesn't yes support setting -// multiple variables at once. -// -// It modifies the original query. -bool admin_handler_command_set(char *query_no_space, unsigned int query_no_space_length, MySQL_Session *sess, ProxySQL_Admin *pa, char **q, unsigned int *ql) { - if (!strstr(query_no_space,(char *)"password")) { // issue #599 - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received command %s\n", query_no_space); - if (strcmp(query_no_space,(char *)"set autocommit=0")) { - proxy_info("Received command %s\n", query_no_space); - } - } - // Get a pointer to the beginnig of var=value entry and split to get var name and value - char *set_entry = query_no_space + strlen("SET "); - char *untrimmed_var_name=NULL; - char *var_value=NULL; - c_split_2(set_entry, "=", &untrimmed_var_name, &var_value); - - // Trim spaces from var name to allow writing like 'var = value' - char *var_name = trim_spaces_in_place(untrimmed_var_name); - - - bool run_query = false; - // Check if the command tries to set a non-existing variable. - if (strcmp(var_name,"mysql-init_connect")==0) { - char *err_msg_fmt = (char *) "ERROR: Global variable '%s' is not configurable using SET command. You must run UPDATE global_variables"; - size_t buff_len = strlen(err_msg_fmt) + strlen(var_name) + 1; - char *buff = (char *) malloc(buff_len); - snprintf(buff, buff_len, err_msg_fmt, var_name); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, buff); - free(buff); - run_query = false; - } else { - if (!is_valid_global_variable(var_name)) { - char *err_msg_fmt = (char *) "ERROR: Unknown global variable: '%s'."; - size_t buff_len = strlen(err_msg_fmt) + strlen(var_name) + 1; - char *buff = (char *) malloc(buff_len); - snprintf(buff, buff_len, err_msg_fmt, var_name); - SPA->send_MySQL_OK(&sess->client_myds->myprot, buff); - free(buff); - run_query = false; - } else { - const char *update_format = (char *)"UPDATE global_variables SET variable_value=%s WHERE variable_name='%s'"; - // Computed length is more than needed since it also counts the format modifiers (%s). - size_t query_len = strlen(update_format) + strlen(var_name) + strlen(var_value) + 1; - char *query = (char *)l_alloc(query_len); - snprintf(query, query_len, update_format, var_value, var_name); - - run_query = true; - l_free(*ql,*q); - *q = query; - *ql = strlen(*q) + 1; - } - } - free(untrimmed_var_name); - free(var_value); - return run_query; -} -*/ -/* Note: - * This function can modify the original query - */ -/* -bool admin_handler_command_load_or_save(char *query_no_space, unsigned int query_no_space_length, MySQL_Session *sess, ProxySQL_Admin *pa, char **q, unsigned int *ql) { - proxy_debug(PROXY_DEBUG_ADMIN, 5, "Received command %s\n", query_no_space); - -#ifdef DEBUG - if ((query_no_space_length>11) && ( (!strncasecmp("SAVE DEBUG ", query_no_space, 11)) || (!strncasecmp("LOAD DEBUG ", query_no_space, 11))) ) { - if ( - (query_no_space_length==strlen("LOAD DEBUG TO MEMORY") && !strncasecmp("LOAD DEBUG TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD DEBUG TO MEM") && !strncasecmp("LOAD DEBUG TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD DEBUG FROM DISK") && !strncasecmp("LOAD DEBUG FROM DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - l_free(*ql,*q); - *q=l_strdup("INSERT OR REPLACE INTO main.debug_levels SELECT * FROM disk.debug_levels"); - *ql=strlen(*q)+1; - return true; - } - - if ( - (query_no_space_length==strlen("SAVE DEBUG FROM MEMORY") && !strncasecmp("SAVE DEBUG FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE DEBUG FROM MEM") && !strncasecmp("SAVE DEBUG FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE DEBUG TO DISK") && !strncasecmp("SAVE DEBUG TO DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - l_free(*ql,*q); - *q=l_strdup("INSERT OR REPLACE INTO disk.debug_levels SELECT * FROM main.debug_levels"); - *ql=strlen(*q)+1; - return true; - } - - if ( - (query_no_space_length==strlen("LOAD DEBUG FROM MEMORY") && !strncasecmp("LOAD DEBUG FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD DEBUG FROM MEM") && !strncasecmp("LOAD DEBUG FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD DEBUG TO RUNTIME") && !strncasecmp("LOAD DEBUG TO RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD DEBUG TO RUN") && !strncasecmp("LOAD DEBUG TO RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - int rc=SPA->load_debug_to_runtime(); - if (rc) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded debug levels to RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 1, "Error while loading debug levels to RUNTIME\n"); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"Error while loading debug levels to RUNTIME"); - } - return false; - } - - if ( - (query_no_space_length==strlen("SAVE DEBUG TO MEMORY") && !strncasecmp("SAVE DEBUG TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE DEBUG TO MEM") && !strncasecmp("SAVE DEBUG TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE DEBUG FROM RUNTIME") && !strncasecmp("SAVE DEBUG FROM RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE DEBUG FROM RUN") && !strncasecmp("SAVE DEBUG FROM RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->save_debug_from_runtime(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saved debug levels from RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - } -#endif // DEBUG - - if ((query_no_space_length>15) && ( (!strncasecmp("SAVE SCHEDULER ", query_no_space, 15)) || (!strncasecmp("LOAD SCHEDULER ", query_no_space, 15))) ) { - - if ( - (query_no_space_length==strlen("LOAD SCHEDULER TO MEMORY") && !strncasecmp("LOAD SCHEDULER TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD SCHEDULER TO MEM") && !strncasecmp("LOAD SCHEDULER TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD SCHEDULER FROM DISK") && !strncasecmp("LOAD SCHEDULER FROM DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->flush_scheduler__from_disk_to_memory(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loading scheduler to to MEMORY\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("SAVE SCHEDULER FROM MEMORY") && !strncasecmp("SAVE SCHEDULER FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE SCHEDULER FROM MEM") && !strncasecmp("SAVE SCHEDULER FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE SCHEDULER TO DISK") && !strncasecmp("SAVE SCHEDULER TO DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->flush_scheduler__from_memory_to_disk(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saving scheduler to DISK\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("LOAD SCHEDULER FROM MEMORY") && !strncasecmp("LOAD SCHEDULER FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD SCHEDULER FROM MEM") && !strncasecmp("LOAD SCHEDULER FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD SCHEDULER TO RUNTIME") && !strncasecmp("LOAD SCHEDULER TO RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD SCHEDULER TO RUN") && !strncasecmp("LOAD SCHEDULER TO RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->load_scheduler_to_runtime(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded scheduler to RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("LOAD SCHEDULER FROM CONFIG") && !strncasecmp("LOAD SCHEDULER FROM CONFIG",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - if (GloVars.configfile_open) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loading from file %s\n", GloVars.config_file); - if (GloVars.confFile->OpenFile(NULL)==true) { - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - int rows=0; - rows=SPA->Read_Scheduler_from_configfile(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded scheduler from CONFIG\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL, rows); - GloVars.confFile->CloseFile(); - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Unable to open or parse config file %s\n", GloVars.config_file); - char *s=(char *)"Unable to open or parse config file %s"; - char *m=(char *)malloc(strlen(s)+strlen(GloVars.config_file)+1); - sprintf(m,s,GloVars.config_file); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, m); - free(m); - } - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Unknown config file\n"); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"Config file unknown"); - } - return false; - } - - if ( - (query_no_space_length==strlen("SAVE SCHEDULER TO MEMORY") && !strncasecmp("SAVE SCHEDULER TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE SCHEDULER TO MEM") && !strncasecmp("SAVE SCHEDULER TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE SCHEDULER FROM RUNTIME") && !strncasecmp("SAVE SCHEDULER FROM RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE SCHEDULER FROM RUN") && !strncasecmp("SAVE SCHEDULER FROM RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->save_scheduler_runtime_to_database(false); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saved scheduler from RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - } - if ((query_no_space_length>16) && (!strncasecmp("LOAD MYSQL USER ", query_no_space, 16)) ) { - if (query_no_space_length>27) { - if (!strncasecmp(" TO RUNTIME", query_no_space+query_no_space_length-11, 11)) { - char *name=(char *)malloc(query_no_space_length-27+1); - strncpy(name,query_no_space+16,query_no_space_length-27); - name[query_no_space_length-27]=0; - int i=0; - int s=strlen(name); - bool legitname=true; - for (i=0; i= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || - ( (c == '-') || (c == '+') || (c == '_')) - ) { - v=true; - } - if (v==false) { - legitname=false; - } - } - if (legitname) { - proxy_info("Loading user %s\n", name); - pthread_mutex_lock(&users_mutex); - SPA->public_add_active_users(USERNAME_BACKEND, name); - SPA->public_add_active_users(USERNAME_FRONTEND, name); - pthread_mutex_unlock(&users_mutex); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - } else { - proxy_info("Tried to load invalid user %s\n", name); - char *s=(char *)"Invalid name %s"; - char *m=(char *)malloc(strlen(s)+strlen(name)+1); - sprintf(m,s,name); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, m); - } - free(name); - return false; - } - } - } - if ((query_no_space_length>17) && ( (!strncasecmp("SAVE MYSQL USERS ", query_no_space, 17)) || (!strncasecmp("LOAD MYSQL USERS ", query_no_space, 17))) ) { - - if ( - (query_no_space_length==strlen("LOAD MYSQL USERS TO MEMORY") && !strncasecmp("LOAD MYSQL USERS TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL USERS TO MEM") && !strncasecmp("LOAD MYSQL USERS TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL USERS FROM DISK") && !strncasecmp("LOAD MYSQL USERS FROM DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->flush_mysql_users__from_disk_to_memory(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loading mysql users to MEMORY\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("SAVE MYSQL USERS FROM MEMORY") && !strncasecmp("SAVE MYSQL USERS FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL USERS FROM MEM") && !strncasecmp("SAVE MYSQL USERS FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL USERS TO DISK") && !strncasecmp("SAVE MYSQL USERS TO DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->flush_mysql_users__from_memory_to_disk(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saving mysql users to DISK\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } +void SQLite3_Server_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t *pkt) { - if ( - (query_no_space_length==strlen("LOAD MYSQL USERS FROM MEMORY") && !strncasecmp("LOAD MYSQL USERS FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL USERS FROM MEM") && !strncasecmp("LOAD MYSQL USERS FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL USERS TO RUNTIME") && !strncasecmp("LOAD MYSQL USERS TO RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL USERS TO RUN") && !strncasecmp("LOAD MYSQL USERS TO RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->init_users(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded mysql users to RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } + char *error=NULL; + int cols; + int affected_rows; + bool run_query=true; + SQLite3_result *resultset=NULL; + char *strA=NULL; + char *strB=NULL; + int strAl, strBl; + char *query=NULL; + unsigned int query_length=pkt->size-sizeof(mysql_hdr); + query=(char *)l_alloc(query_length); + memcpy(query,(char *)pkt->ptr+sizeof(mysql_hdr)+1,query_length-1); + query[query_length-1]=0; - if ( - (query_no_space_length==strlen("LOAD MYSQL USERS FROM CONFIG") && !strncasecmp("LOAD MYSQL USERS FROM CONFIG",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - if (GloVars.configfile_open) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loading from file %s\n", GloVars.config_file); - if (GloVars.confFile->OpenFile(NULL)==true) { - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - int rows=0; - rows=SPA->Read_MySQL_Users_from_configfile(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded mysql users from CONFIG\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL, rows); - GloVars.confFile->CloseFile(); - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Unable to open or parse config file %s\n", GloVars.config_file); - char *s=(char *)"Unable to open or parse config file %s"; - char *m=(char *)malloc(strlen(s)+strlen(GloVars.config_file)+1); - sprintf(m,s,GloVars.config_file); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, m); - free(m); - } - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Unknown config file\n"); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"Config file unknown"); - } - return false; - } + char *query_no_space=(char *)l_alloc(query_length); + memcpy(query_no_space,query,query_length); - if ( - (query_no_space_length==strlen("SAVE MYSQL USERS TO MEMORY") && !strncasecmp("SAVE MYSQL USERS TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL USERS TO MEM") && !strncasecmp("SAVE MYSQL USERS TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL USERS FROM RUNTIME") && !strncasecmp("SAVE MYSQL USERS FROM RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL USERS FROM RUN") && !strncasecmp("SAVE MYSQL USERS FROM RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->save_mysql_users_runtime_to_database(false); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saved mysql users from RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - } - if ((query_no_space_length>21) && ( (!strncasecmp("SAVE MYSQL VARIABLES ", query_no_space, 21)) || (!strncasecmp("LOAD MYSQL VARIABLES ", query_no_space, 21))) ) { - - if ( - (query_no_space_length==strlen("LOAD MYSQL VARIABLES TO MEMORY") && !strncasecmp("LOAD MYSQL VARIABLES TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL VARIABLES TO MEM") && !strncasecmp("LOAD MYSQL VARIABLES TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL VARIABLES FROM DISK") && !strncasecmp("LOAD MYSQL VARIABLES FROM DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - l_free(*ql,*q); - *q=l_strdup("INSERT OR REPLACE INTO main.global_variables SELECT * FROM disk.global_variables WHERE variable_name LIKE 'mysql-%'"); - *ql=strlen(*q)+1; - return true; - } - - if ( - (query_no_space_length==strlen("SAVE MYSQL VARIABLES FROM MEMORY") && !strncasecmp("SAVE MYSQL VARIABLES FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL VARIABLES FROM MEM") && !strncasecmp("SAVE MYSQL VARIABLES FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL VARIABLES TO DISK") && !strncasecmp("SAVE MYSQL VARIABLES TO DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - l_free(*ql,*q); - *q=l_strdup("INSERT OR REPLACE INTO disk.global_variables SELECT * FROM main.global_variables WHERE variable_name LIKE 'mysql-%'"); - *ql=strlen(*q)+1; - return true; - } - - if ( - (query_no_space_length==strlen("LOAD MYSQL VARIABLES FROM MEMORY") && !strncasecmp("LOAD MYSQL VARIABLES FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL VARIABLES FROM MEM") && !strncasecmp("LOAD MYSQL VARIABLES FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL VARIABLES TO RUNTIME") && !strncasecmp("LOAD MYSQL VARIABLES TO RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL VARIABLES TO RUN") && !strncasecmp("LOAD MYSQL VARIABLES TO RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->load_mysql_variables_to_runtime(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded mysql variables to RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("LOAD MYSQL VARIABLES FROM CONFIG") && !strncasecmp("LOAD MYSQL VARIABLES FROM CONFIG",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - if (GloVars.configfile_open) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loading from file %s\n", GloVars.config_file); - if (GloVars.confFile->OpenFile(NULL)==true) { - int rows=0; - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - rows=SPA->Read_Global_Variables_from_configfile("mysql"); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded mysql variables from CONFIG\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL, rows); - GloVars.confFile->CloseFile(); - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Unable to open or parse config file %s\n", GloVars.config_file); - char *s=(char *)"Unable to open or parse config file %s"; - char *m=(char *)malloc(strlen(s)+strlen(GloVars.config_file)+1); - sprintf(m,s,GloVars.config_file); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, m); - free(m); - } - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Unknown config file\n"); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"Config file unknown"); - } - return false; - } - - if ( - (query_no_space_length==strlen("SAVE MYSQL VARIABLES TO MEMORY") && !strncasecmp("SAVE MYSQL VARIABLES TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL VARIABLES TO MEM") && !strncasecmp("SAVE MYSQL VARIABLES TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL VARIABLES FROM RUNTIME") && !strncasecmp("SAVE MYSQL VARIABLES FROM RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL VARIABLES FROM RUN") && !strncasecmp("SAVE MYSQL VARIABLES FROM RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->save_mysql_variables_from_runtime(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saved mysql variables from RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - } - - if ((query_no_space_length>19) && ( (!strncasecmp("SAVE MYSQL SERVERS ", query_no_space, 19)) || (!strncasecmp("LOAD MYSQL SERVERS ", query_no_space, 19))) ) { - - if ( - (query_no_space_length==strlen("LOAD MYSQL SERVERS TO MEMORY") && !strncasecmp("LOAD MYSQL SERVERS TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL SERVERS TO MEM") && !strncasecmp("LOAD MYSQL SERVERS TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL SERVERS FROM DISK") && !strncasecmp("LOAD MYSQL SERVERS FROM DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->flush_mysql_servers__from_disk_to_memory(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded mysql servers to MEMORY\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("SAVE MYSQL SERVERS FROM MEMORY") && !strncasecmp("SAVE MYSQL SERVERS FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL SERVERS FROM MEM") && !strncasecmp("SAVE MYSQL SERVERS FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL SERVERS TO DISK") && !strncasecmp("SAVE MYSQL SERVERS TO DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->flush_mysql_servers__from_memory_to_disk(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saved mysql servers to DISK\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("LOAD MYSQL SERVERS FROM MEMORY") && !strncasecmp("LOAD MYSQL SERVERS FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL SERVERS FROM MEM") && !strncasecmp("LOAD MYSQL SERVERS FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL SERVERS TO RUNTIME") && !strncasecmp("LOAD MYSQL SERVERS TO RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL SERVERS TO RUN") && !strncasecmp("LOAD MYSQL SERVERS TO RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->mysql_servers_wrlock(); - SPA->load_mysql_servers_to_runtime(); - SPA->mysql_servers_wrunlock(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded mysql servers to RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("LOAD MYSQL SERVERS FROM CONFIG") && !strncasecmp("LOAD MYSQL SERVERS FROM CONFIG",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - if (GloVars.configfile_open) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loading from file %s\n", GloVars.config_file); - if (GloVars.confFile->OpenFile(NULL)==true) { - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - int rows=0; - rows=SPA->Read_MySQL_Servers_from_configfile(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded mysql servers from CONFIG\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL, rows); - GloVars.confFile->CloseFile(); - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Unable to open or parse config file %s\n", GloVars.config_file); - char *s=(char *)"Unable to open or parse config file %s"; - char *m=(char *)malloc(strlen(s)+strlen(GloVars.config_file)+1); - sprintf(m,s,GloVars.config_file); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, m); - free(m); - } - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Unknown config file\n"); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"Config file unknown"); - } - return false; - } - - if ( - (query_no_space_length==strlen("SAVE MYSQL SERVERS TO MEMORY") && !strncasecmp("SAVE MYSQL SERVERS TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL SERVERS TO MEM") && !strncasecmp("SAVE MYSQL SERVERS TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL SERVERS FROM RUNTIME") && !strncasecmp("SAVE MYSQL SERVERS FROM RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL SERVERS FROM RUN") && !strncasecmp("SAVE MYSQL SERVERS FROM RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->mysql_servers_wrlock(); - SPA->save_mysql_servers_runtime_to_database(false); - SPA->mysql_servers_wrunlock(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saved mysql servers from RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - } - - if ((query_no_space_length>23) && ( (!strncasecmp("SAVE MYSQL QUERY RULES ", query_no_space, 23)) || (!strncasecmp("LOAD MYSQL QUERY RULES ", query_no_space, 23))) ) { - - if ( - (query_no_space_length==strlen("LOAD MYSQL QUERY RULES TO MEMORY") && !strncasecmp("LOAD MYSQL QUERY RULES TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL QUERY RULES TO MEM") && !strncasecmp("LOAD MYSQL QUERY RULES TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL QUERY RULES FROM DISK") && !strncasecmp("LOAD MYSQL QUERY RULES FROM DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->flush_mysql_query_rules__from_disk_to_memory(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded mysql query rules to MEMORY\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("LOAD MYSQL QUERY RULES FROM CONFIG") && !strncasecmp("LOAD MYSQL QUERY RULES FROM CONFIG",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - if (GloVars.configfile_open) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loading from file %s\n", GloVars.config_file); - if (GloVars.confFile->OpenFile(NULL)==true) { - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - int rows=0; - rows=SPA->Read_MySQL_Query_Rules_from_configfile(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded mysql query rules from CONFIG\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL, rows); - GloVars.confFile->CloseFile(); - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Unable to open or parse config file %s\n", GloVars.config_file); - char *s=(char *)"Unable to open or parse config file %s"; - char *m=(char *)malloc(strlen(s)+strlen(GloVars.config_file)+1); - sprintf(m,s,GloVars.config_file); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, m); - free(m); - } - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Unknown config file\n"); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, (char *)"Config file unknown"); - } - return false; - } - - if ( - (query_no_space_length==strlen("SAVE MYSQL QUERY RULES FROM MEMORY") && !strncasecmp("SAVE MYSQL QUERY RULES FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL QUERY RULES FROM MEM") && !strncasecmp("SAVE MYSQL QUERY RULES FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL QUERY RULES TO DISK") && !strncasecmp("SAVE MYSQL QUERY RULES TO DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->flush_mysql_query_rules__from_memory_to_disk(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saved mysql query rules to DISK\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("LOAD MYSQL QUERY RULES FROM MEMORY") && !strncasecmp("LOAD MYSQL QUERY RULES FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL QUERY RULES FROM MEM") && !strncasecmp("LOAD MYSQL QUERY RULES FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL QUERY RULES TO RUNTIME") && !strncasecmp("LOAD MYSQL QUERY RULES TO RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD MYSQL QUERY RULES TO RUN") && !strncasecmp("LOAD MYSQL QUERY RULES TO RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - char *err=SPA->load_mysql_query_rules_to_runtime(); - if (err==NULL) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded mysql query rules to RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - } else { - SPA->send_MySQL_ERR(&sess->client_myds->myprot, err); - } - return false; - } - - if ( - (query_no_space_length==strlen("SAVE MYSQL QUERY RULES TO MEMORY") && !strncasecmp("SAVE MYSQL QUERY RULES TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL QUERY RULES TO MEM") && !strncasecmp("SAVE MYSQL QUERY RULES TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL QUERY RULES FROM RUNTIME") && !strncasecmp("SAVE MYSQL QUERY RULES FROM RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE MYSQL QUERY RULES FROM RUN") && !strncasecmp("SAVE MYSQL QUERY RULES FROM RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->save_mysql_query_rules_from_runtime(false); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saved mysql query rules from RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - } - - if ((query_no_space_length>21) && ( (!strncasecmp("SAVE ADMIN VARIABLES ", query_no_space, 21)) || (!strncasecmp("LOAD ADMIN VARIABLES ", query_no_space, 21))) ) { - - if ( - (query_no_space_length==strlen("LOAD ADMIN VARIABLES TO MEMORY") && !strncasecmp("LOAD ADMIN VARIABLES TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD ADMIN VARIABLES TO MEM") && !strncasecmp("LOAD ADMIN VARIABLES TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD ADMIN VARIABLES FROM DISK") && !strncasecmp("LOAD ADMIN VARIABLES FROM DISK",query_no_space, query_no_space_length)) - ) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received %s command\n", query_no_space); - l_free(*ql,*q); - *q=l_strdup("INSERT OR REPLACE INTO main.global_variables SELECT * FROM disk.global_variables WHERE variable_name LIKE 'admin-%'"); - *ql=strlen(*q)+1; - return true; - } - - if ( - (query_no_space_length==strlen("SAVE ADMIN VARIABLES FROM MEMORY") && !strncasecmp("SAVE ADMIN VARIABLES FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE ADMIN VARIABLES FROM MEM") && !strncasecmp("SAVE ADMIN VARIABLES FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE ADMIN VARIABLES TO DISK") && !strncasecmp("SAVE ADMIN VARIABLES TO DISK",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - l_free(*ql,*q); - *q=l_strdup("INSERT OR REPLACE INTO disk.global_variables SELECT * FROM main.global_variables WHERE variable_name LIKE 'admin-%'"); - *ql=strlen(*q)+1; - return true; - } - - if ( - (query_no_space_length==strlen("LOAD ADMIN VARIABLES FROM MEMORY") && !strncasecmp("LOAD ADMIN VARIABLES FROM MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD ADMIN VARIABLES FROM MEM") && !strncasecmp("LOAD ADMIN VARIABLES FROM MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD ADMIN VARIABLES TO RUNTIME") && !strncasecmp("LOAD ADMIN VARIABLES TO RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("LOAD ADMIN VARIABLES TO RUN") && !strncasecmp("LOAD ADMIN VARIABLES TO RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->load_admin_variables_to_runtime(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Loaded admin variables to RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - if ( - (query_no_space_length==strlen("SAVE ADMIN VARIABLES TO MEMORY") && !strncasecmp("SAVE ADMIN VARIABLES TO MEMORY",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE ADMIN VARIABLES TO MEM") && !strncasecmp("SAVE ADMIN VARIABLES TO MEM",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE ADMIN VARIABLES FROM RUNTIME") && !strncasecmp("SAVE ADMIN VARIABLES FROM RUNTIME",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SAVE ADMIN VARIABLES FROM RUN") && !strncasecmp("SAVE ADMIN VARIABLES FROM RUN",query_no_space, query_no_space_length)) - ) { - proxy_info("Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->save_admin_variables_from_runtime(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Saved admin variables from RUNTIME\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - return false; - } - - } - - return true; -} -*/ -/* -void ProxySQL_Admin::flush_configdb() { // see #923 - wrlock(); - admindb->execute((char *)"DETACH DATABASE disk"); - delete configdb; - configdb=new SQLite3DB(); - configdb->open((char *)GloVars.admindb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX); - __attach_db(admindb, configdb, (char *)"disk"); - // Fully synchronous is not required. See to #1055 - // https://sqlite.org/pragma.html#pragma_synchronous - configdb->execute("PRAGMA disk.synchronous=0"); - wrunlock(); -} - -void ProxySQL_Admin::GenericRefreshStatistics(const char *query_no_space, unsigned int query_no_space_length, bool admin) { - bool refresh=false; - bool stats_mysql_processlist=false; - bool stats_mysql_connection_pool=false; - bool stats_mysql_connection_pool_reset=false; - bool stats_mysql_query_digest=false; - bool stats_mysql_query_digest_reset=false; - bool stats_mysql_global=false; - bool stats_mysql_commands_counters=false; - bool stats_mysql_query_rules=false; - bool stats_mysql_users=false; - bool dump_global_variables=false; - - bool runtime_scheduler=false; - bool runtime_mysql_users=false; - bool runtime_mysql_servers=false; - bool runtime_mysql_query_rules=false; - - bool monitor_mysql_server_group_replication_log=false; - - if (strcasestr(query_no_space,"processlist")) - // This will match the following usecases: - // SHOW PROCESSLIST - // SHOW FULL PROCESSLIST - // SELECT * FROM stats_mysql_processlist - { stats_mysql_processlist=true; refresh=true; } - if (strstr(query_no_space,"stats_mysql_query_digest")) - { stats_mysql_query_digest=true; refresh=true; } - if (strstr(query_no_space,"stats_mysql_query_digest_reset")) - { stats_mysql_query_digest_reset=true; refresh=true; } - if (strstr(query_no_space,"stats_mysql_global")) - { stats_mysql_global=true; refresh=true; } - if (strstr(query_no_space,"stats_mysql_connection_pool_reset")) - { - stats_mysql_connection_pool_reset=true; refresh=true; - } else { - if (strstr(query_no_space,"stats_mysql_connection_pool")) - { stats_mysql_connection_pool=true; refresh=true; } - } - if (strstr(query_no_space,"stats_mysql_commands_counters")) - { stats_mysql_commands_counters=true; refresh=true; } - if (strstr(query_no_space,"stats_mysql_query_rules")) - { stats_mysql_query_rules=true; refresh=true; } - if (strstr(query_no_space,"stats_mysql_users")) - { stats_mysql_users=true; refresh=true; } - if (admin) { - if (strstr(query_no_space,"global_variables")) - { dump_global_variables=true; refresh=true; } - if (strstr(query_no_space,"runtime_")) { - if ( - strstr(query_no_space,"runtime_mysql_servers") - || - strstr(query_no_space,"runtime_mysql_replication_hostgroups") - || - strstr(query_no_space,"runtime_mysql_group_replication_hostgroups") - ) { - runtime_mysql_servers=true; refresh=true; - } - if (strstr(query_no_space,"runtime_mysql_users")) { - runtime_mysql_users=true; refresh=true; - } - if (strstr(query_no_space,"runtime_mysql_query_rules")) { - runtime_mysql_query_rules=true; refresh=true; - } - if (strstr(query_no_space,"runtime_scheduler")) { - runtime_scheduler=true; refresh=true; - } - } - } - if (strstr(query_no_space,"mysql_server_group_replication_log")) { - monitor_mysql_server_group_replication_log=true; refresh=true; - } -// if (stats_mysql_processlist || stats_mysql_connection_pool || stats_mysql_query_digest || stats_mysql_query_digest_reset) { - if (refresh==true) { - pthread_mutex_lock(&admin_mutex); - //ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (stats_mysql_processlist) - stats___mysql_processlist(); - if (stats_mysql_query_digest) - stats___mysql_query_digests(false); - if (stats_mysql_query_digest_reset) - stats___mysql_query_digests(true); - if (stats_mysql_connection_pool_reset) { - stats___mysql_connection_pool(true); - } else { - if (stats_mysql_connection_pool) - stats___mysql_connection_pool(false); - } - if (stats_mysql_global) - stats___mysql_global(); - if (stats_mysql_query_rules) - stats___mysql_query_rules(); - if (stats_mysql_commands_counters) - stats___mysql_commands_counters(); - if (stats_mysql_users) - stats___mysql_users(); - if (admin) { - if (dump_global_variables) { - admindb->execute("DELETE FROM runtime_global_variables"); // extra - flush_admin_variables___runtime_to_database(admindb, false, false, false, true); - flush_mysql_variables___runtime_to_database(admindb, false, false, false, true); - } - if (runtime_mysql_servers) { - mysql_servers_wrlock(); - save_mysql_servers_runtime_to_database(true); - mysql_servers_wrunlock(); - } - if (runtime_mysql_users) { - save_mysql_users_runtime_to_database(true); - } - if (runtime_mysql_query_rules) { - save_mysql_query_rules_from_runtime(true); - } - if (runtime_scheduler) { - save_scheduler_runtime_to_database(true); - } - } - if (monitor_mysql_server_group_replication_log) { - if (GloMyMon) { - GloMyMon->populate_monitor_mysql_server_group_replication_log(); - } - } - pthread_mutex_unlock(&admin_mutex); - } -} -*/ - -/* -SQLite3_result * ProxySQL_Admin::generate_show_fields_from(const char *tablename, char **err) { - char *tn=NULL; // tablename - // note that tablename is passed with a trailing ' - tn=(char *)malloc(strlen(tablename)); - unsigned int i=0, j=0; - while (iexecute_statement(q2, &error , &cols , &affected_rows , &resultset); - if (error) { - proxy_error("Error on %s : %s\n", q2, error); - free(q2); - *err=strdup(error); - free(error); - if (resultset) delete resultset; - free(tn); - return NULL; - } - - if (resultset==NULL) { - free(tn); - return NULL; - } - - if (resultset->rows_count==0) { - free(tn); - delete resultset; - *err=strdup((char *)"Table does not exist"); - return NULL; - } - - SQLite3_result *result=new SQLite3_result(6); - result->add_column_definition(SQLITE_TEXT,"Field"); - result->add_column_definition(SQLITE_TEXT,"Type"); - result->add_column_definition(SQLITE_TEXT,"Null"); - result->add_column_definition(SQLITE_TEXT,"Key"); - result->add_column_definition(SQLITE_TEXT,"Default"); - result->add_column_definition(SQLITE_TEXT,"Extra"); - char *pta[6]; - pta[1]=(char *)"varchar(255)"; - pta[2]=(char *)"NO"; - pta[3]=(char *)""; - pta[4]=(char *)""; - pta[5]=(char *)""; - free(q2); - for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { - SQLite3_row *r=*it; - pta[0]=r->fields[0]; - result->add_row(pta); - } - delete resultset; - free(tn); - return result; -} - -SQLite3_result * ProxySQL_Admin::generate_show_table_status(const char *tablename, char **err) { - char *pta[18]; - pta[0]=NULL; - char *tn=NULL; // tablename - // note that tablename is passed with a trailing ' - tn=(char *)malloc(strlen(tablename)); - unsigned int i=0, j=0; - while (iexecute_statement(q2, &error , &cols , &affected_rows , &resultset); - if (error) { - proxy_error("Error on %s : %s\n", q2, error); - free(q2); - *err=strdup(error); - free(error); - if (resultset) delete resultset; - free(tn); - return NULL; - } - - if (resultset==NULL) { - free(tn); - return NULL; - } - - if (resultset->rows_count==0) { - free(tn); - delete resultset; - *err=strdup((char *)"Table does not exist"); - return NULL; - } - SQLite3_result *result=new SQLite3_result(18); - result->add_column_definition(SQLITE_TEXT,"Name"); - result->add_column_definition(SQLITE_TEXT,"Engine"); - result->add_column_definition(SQLITE_TEXT,"Version"); - result->add_column_definition(SQLITE_TEXT,"Row_format"); - result->add_column_definition(SQLITE_TEXT,"Rows"); - result->add_column_definition(SQLITE_TEXT,"Avg_row_length"); - result->add_column_definition(SQLITE_TEXT,"Data_length"); - result->add_column_definition(SQLITE_TEXT,"Max_data_length"); - result->add_column_definition(SQLITE_TEXT,"Index_length"); - result->add_column_definition(SQLITE_TEXT,"Data_free"); - result->add_column_definition(SQLITE_TEXT,"Auto_increment"); - result->add_column_definition(SQLITE_TEXT,"Create_time"); - result->add_column_definition(SQLITE_TEXT,"Update_time"); - result->add_column_definition(SQLITE_TEXT,"Check_time"); - result->add_column_definition(SQLITE_TEXT,"Collation"); - result->add_column_definition(SQLITE_TEXT,"Checksum"); - result->add_column_definition(SQLITE_TEXT,"Create_options"); - result->add_column_definition(SQLITE_TEXT,"Comment"); - pta[0]=tn; - pta[1]=(char *)"SQLite"; - pta[2]=(char *)"10"; - pta[3]=(char *)"Dynamic"; - pta[4]=(char *)"10"; - pta[5]=(char *)"0"; - pta[6]=(char *)"0"; - pta[7]=(char *)"0"; - pta[8]=(char *)"0"; - pta[9]=(char *)"0"; - pta[10]=(char *)"NULL"; - pta[11]=(char *)"0000-00-00 00:00:00"; - pta[12]=(char *)"0000-00-00 00:00:00"; - pta[13]=(char *)"0000-00-00 00:00:00"; - pta[14]=(char *)"utf8_bin"; - pta[15]=(char *)"NULL"; - pta[16]=(char *)""; - pta[17]=(char *)""; - result->add_row(pta); - free(tn); - return result; -} - -*/ -void SQLite3_Server_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t *pkt) { - - //SQLite3_Server *s3s=(SQLite3_Server *)_pa; - char *error=NULL; - int cols; - int affected_rows; - bool run_query=true; - SQLite3_result *resultset=NULL; - char *strA=NULL; - char *strB=NULL; - int strAl, strBl; - char *query=NULL; - unsigned int query_length=pkt->size-sizeof(mysql_hdr); - query=(char *)l_alloc(query_length); - memcpy(query,(char *)pkt->ptr+sizeof(mysql_hdr)+1,query_length-1); - query[query_length-1]=0; - - char *query_no_space=(char *)l_alloc(query_length); - memcpy(query_no_space,query,query_length); - - unsigned int query_no_space_length=remove_spaces(query_no_space); - //fprintf(stderr,"%s----\n",query_no_space); - - // fix bug #925 - while (query_no_space[query_no_space_length-1]==';' || query_no_space[query_no_space_length-1]==' ') { - query_no_space_length--; - query_no_space[query_no_space_length]=0; - } - -/* - if (!strncasecmp("SHOW GLOBAL VARIABLES LIKE 'read_only'", query_no_space, strlen("SHOW GLOBAL VARIABLES LIKE 'read_only'"))) { - l_free(query_length,query); - char *q=(char *)"SELECT 'read_only' Variable_name, '%s' Value FROM global_variables WHERE Variable_name='admin-read_only'"; - query_length=strlen(q)+5; - query=(char *)l_alloc(query_length); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - bool ro=SPA->get_read_only(); - //sprintf(query,q,( ro ? "ON" : "OFF")); - PtrSize_t pkt_2; - if (ro) { - pkt_2.size=110; - pkt_2.ptr=l_alloc(pkt_2.size); - memcpy(pkt_2.ptr,READ_ONLY_ON,pkt_2.size); - } else { - pkt_2.size=111; - pkt_2.ptr=l_alloc(pkt_2.size); - memcpy(pkt_2.ptr,READ_ONLY_OFF,pkt_2.size); - } - sess->status=WAITING_CLIENT_DATA; - sess->client_myds->DSS=STATE_SLEEP; - sess->client_myds->PSarrayOUT->add(pkt_2.ptr,pkt_2.size); - run_query=false; - goto __run_query; - } - - if (sess->session_type == PROXYSQL_SESSION_ADMIN) { // no stats - if ((query_no_space_length>8) && (!strncasecmp("PROXYSQL ", query_no_space, 8))) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received PROXYSQL command\n"); - pthread_mutex_lock(&admin_mutex); - run_query=admin_handler_command_proxysql(query_no_space, query_no_space_length, sess, pa); - pthread_mutex_unlock(&admin_mutex); - goto __run_query; - } - if ((query_no_space_length>5) && ( (!strncasecmp("SAVE ", query_no_space, 5)) || (!strncasecmp("LOAD ", query_no_space, 5))) ) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received LOAD or SAVE command\n"); - run_query=admin_handler_command_load_or_save(query_no_space, query_no_space_length, sess, pa, &query, &query_length); - goto __run_query; - } - if ((query_no_space_length>16) && ( (!strncasecmp("KILL CONNECTION ", query_no_space, 16)) || (!strncasecmp("KILL CONNECTION ", query_no_space, 16))) ) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received KILL CONNECTION command\n"); - run_query=admin_handler_command_kill_connection(query_no_space, query_no_space_length, sess, pa); - goto __run_query; - } - - - // queries generated by mysqldump - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if ( -*/ -// !strncmp("/*!40014 SET ", query_no_space, 13) || -// !strncmp("/*!40101 SET ", query_no_space, 13) || -// !strncmp("/*!40103 SET ", query_no_space, 13) || -// !strncmp("/*!40111 SET ", query_no_space, 13) || -// !strncmp("/*!40000 ALTER TABLE", query_no_space, strlen("/*!40000 ALTER TABLE")) -// || -// !strncmp("/*!40100 SET @@SQL_MODE='' */", query_no_space, strlen("/*!40100 SET @@SQL_MODE='' */")) -// || -// !strncmp("/*!40103 SET TIME_ZONE=", query_no_space, strlen("/*!40103 SET TIME_ZONE=")) -// || -// !strncmp("LOCK TABLES", query_no_space, strlen("LOCK TABLES")) -// || -// !strncmp("UNLOCK TABLES", query_no_space, strlen("UNLOCK TABLES")) -// || -// !strncmp("SET SQL_QUOTE_SHOW_CREATE=1", query_no_space, strlen("SET SQL_QUOTE_SHOW_CREATE=1")) -// || -// !strncmp("SET SESSION character_set_results", query_no_space, strlen("SET SESSION character_set_results")) -// || -/* - !strncasecmp("USE ", query_no_space, strlen("USE ")) // this applies to all clients, not only mysqldump - ) { - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - run_query=false; - goto __run_query; - } - if (!strncmp("SHOW VARIABLES LIKE 'gtid\\_mode'", query_no_space, strlen("SHOW VARIABLES LIKE 'gtid\\_mode'"))) { - l_free(query_length,query); - query=l_strdup("SELECT variable_name Variable_name, Variable_value Value FROM global_variables WHERE Variable_name='gtid_mode'"); - query_length=strlen(query)+1; - goto __run_query; - } - if (!strncmp("select @@collation_database", query_no_space, strlen("select @@collation_database"))) { - l_free(query_length,query); - query=l_strdup("SELECT Collation '@@collation_database' FROM mysql_collations WHERE Collation='utf8_general_ci' LIMIT 1"); - query_length=strlen(query)+1; - goto __run_query; - } - if (!strncmp("SHOW VARIABLES LIKE 'ndbinfo\\_version'", query_no_space, strlen("SHOW VARIABLES LIKE 'ndbinfo\\_version'"))) { - l_free(query_length,query); - query=l_strdup("SELECT variable_name Variable_name, Variable_value Value FROM global_variables WHERE Variable_name='ndbinfo_version'"); - query_length=strlen(query)+1; - goto __run_query; - } - if (!strncmp("show table status like '", query_no_space, strlen("show table status like '"))) { - char *strA=query_no_space+24; - int strAl=strlen(strA); - if (strAl<2) { // error - goto __run_query; - } - char *err=NULL; - SQLite3_result *resultset=SPA->generate_show_table_status(strA, &err); - sess->SQLite3_to_MySQL(resultset, err, 0, &sess->client_myds->myprot); - if (resultset) delete resultset; - if (err) free(err); - run_query=false; - goto __run_query; - } - if (!strncmp("show fields from `", query_no_space, strlen("show fields from `"))) { - char *strA=query_no_space+18; - int strAl=strlen(strA); - if (strAl<2) { // error - goto __run_query; - } - char *err=NULL; - SQLite3_result *resultset=SPA->generate_show_fields_from(strA, &err); - sess->SQLite3_to_MySQL(resultset, err, 0, &sess->client_myds->myprot); - if (resultset) delete resultset; - if (err) free(err); - run_query=false; - goto __run_query; - } - } - - // FIXME: this should be removed, it is just a POC for issue #253 . What is important is the call to GloMTH->signal_all_threads(); - if (!strncasecmp("SIGNAL MYSQL THREADS", query_no_space, strlen("SIGNAL MYSQL THREADS"))) { - GloMTH->signal_all_threads(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received %s command\n", query_no_space); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SPA->save_admin_variables_from_runtime(); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Sent signal to all mysql threads\n"); - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - run_query=false; - goto __run_query; - } - - // fix bug #442 - if (!strncmp("SET SQL_SAFE_UPDATES=1", query_no_space, strlen("SET SQL_SAFE_UPDATES=1"))) { - SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); - run_query=false; - goto __run_query; - } -*/ - if (query_no_space_length==SELECT_VERSION_COMMENT_LEN) { - if (!strncasecmp(SELECT_VERSION_COMMENT, query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT '(ProxySQL Admin Module)'"); - query_length=strlen(query)+1; - goto __run_query; - } - } - - if (query_no_space_length==SELECT_DB_USER_LEN) { - if (!strncasecmp(SELECT_DB_USER, query_no_space, query_no_space_length)) { - l_free(query_length,query); - char *query1=(char *)"SELECT \"admin\" AS 'DATABASE()', \"%s\" AS 'USER()'"; - char *query2=(char *)malloc(strlen(query1)+strlen(sess->client_myds->myconn->userinfo->username)+10); - sprintf(query2,query1,sess->client_myds->myconn->userinfo->username); - query=l_strdup(query2); - query_length=strlen(query2)+1; - free(query2); - goto __run_query; - } - } - - if (query_no_space_length==SELECT_CHARSET_VARIOUS_LEN) { - if (!strncasecmp(SELECT_CHARSET_VARIOUS, query_no_space, query_no_space_length)) { - l_free(query_length,query); - char *query1=(char *)"select 'utf8' as '@@character_set_client', 'utf8' as '@@character_set_connection', 'utf8' as '@@character_set_server', 'utf8' as '@@character_set_database' limit 1"; - query=l_strdup(query1); - query_length=strlen(query1)+1; - goto __run_query; - } - } - - if (!strncasecmp("SELECT @@version", query_no_space, strlen("SELECT @@version"))) { - l_free(query_length,query); - char *q=(char *)"SELECT '%s' AS '@@version'"; - query_length=strlen(q)+20; - query=(char *)l_alloc(query_length); - sprintf(query,q,PROXYSQL_VERSION); - goto __run_query; - } - - if (!strncasecmp("SELECT version()", query_no_space, strlen("SELECT version()"))) { - l_free(query_length,query); - char *q=(char *)"SELECT '%s' AS 'version()'"; - query_length=strlen(q)+20; - query=(char *)l_alloc(query_length); - sprintf(query,q,PROXYSQL_VERSION); - goto __run_query; - } -/* - if (!strncasecmp("SHOW VARIABLES WHERE Variable_name in ('max_allowed_packet','system_time_zone','time_zone','sql_mode')", query_no_space, strlen("SHOW VARIABLES WHERE Variable_name in ('max_allowed_packet','system_time_zone','time_zone','sql_mode')"))) { - l_free(query_length,query); - char *q=(char *)"SELECT 'max_allowed_packet' Variable_name,'4194304' Value UNION ALL SELECT 'sql_mode', 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION' UNION ALL SELECT 'system_time_zone', 'UTC' UNION ALL SELECT 'time_zone','SYSTEM'"; - query_length=strlen(q)+20; - query=(char *)l_alloc(query_length); - sprintf(query,q,PROXYSQL_VERSION); - goto __run_query; - } - - { - bool rc; - rc=RE2::PartialMatch(query_no_space,*(RE2 *)(pa->match_regexes.re[0])); - if (rc) { - string *new_query=new std::string(query_no_space); - RE2::Replace(new_query,(char *)"^(\\w+)\\s+@@(\\w+)\\s*",(char *)"SELECT variable_value AS '@@max_allowed_packet' FROM global_variables WHERE variable_name='mysql-max_allowed_packet'"); - free(query); - query_length=new_query->length()+1; - query=(char *)malloc(query_length); - memcpy(query,new_query->c_str(),query_length-1); - query[query_length-1]='\0'; - goto __run_query; - } - } - { - bool rc; - rc=RE2::PartialMatch(query_no_space,*(RE2 *)(pa->match_regexes.re[1])); - if (rc) { - string *new_query=new std::string(query_no_space); - RE2::Replace(new_query,(char *)"^(\\w+) *@@([0-9A-Za-z_-]+) *",(char *)"SELECT variable_value AS '@@\\2' FROM global_variables WHERE variable_name='\\2'"); - free(query); - query_length=new_query->length()+1; - query=(char *)malloc(query_length); - memcpy(query,new_query->c_str(),query_length-1); - query[query_length-1]='\0'; - goto __run_query; - } - } - { - bool rc; - rc=RE2::PartialMatch(query_no_space,*(RE2 *)(pa->match_regexes.re[2])); - if (rc) { - string *new_query=new std::string(query_no_space); - RE2::Replace(new_query,(char *)"([Ss][Hh][Oo][Ww]\\s+[Vv][Aa][Rr][Ii][Aa][Bb][Ll][Ee][Ss]\\s+[Ww][Hh][Ee][Rr][Ee])",(char *)"SELECT variable_name AS Variable_name, variable_value AS Value FROM global_variables WHERE"); - free(query); - query_length=new_query->length()+1; - query=(char *)malloc(query_length); - memcpy(query,new_query->c_str(),query_length-1); - query[query_length-1]='\0'; - goto __run_query; - } - } - { - bool rc; - rc=RE2::PartialMatch(query_no_space,*(RE2 *)(pa->match_regexes.re[3])); - if (rc) { - string *new_query=new std::string(query_no_space); - RE2::Replace(new_query,(char *)"([Ss][Hh][Oo][Ww]\\s+[Vv][Aa][Rr][Ii][Aa][Bb][Ll][Ee][Ss]\\s+[Ll][Ii][Kk][Ee])",(char *)"SELECT variable_name AS Variable_name, variable_value AS Value FROM global_variables WHERE variable_name LIKE"); - free(query); - query_length=new_query->length()+1; - query=(char *)malloc(query_length); - memcpy(query,new_query->c_str(),query_length-1); - query[query_length-1]='\0'; - goto __run_query; - } - } - - if (!strncasecmp("SET ", query_no_space, 4)) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received SET\n"); - run_query = admin_handler_command_set(query_no_space, query_no_space_length, sess, pa, &query, &query_length); - goto __run_query; - } - - if(!strncasecmp("CHECKSUM ", query_no_space, 9)){ - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received CHECKSUM command\n"); - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - SQLite3_result *resultset=NULL; - char *tablename=NULL; - char *error=NULL; - int affected_rows=0; - int cols=0; - if (strlen(query_no_space)==strlen("CHECKSUM DISK MYSQL SERVERS") && !strncasecmp("CHECKSUM DISK MYSQL SERVERS", query_no_space, strlen(query_no_space))){ - char *q=(char *)"SELECT * FROM mysql_servers ORDER BY hostgroup_id, hostname, port"; - tablename=(char *)"MYSQL SERVERS"; - SPA->configdb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if (strlen(query_no_space)==strlen("CHECKSUM DISK MYSQL USERS") && !strncasecmp("CHECKSUM DISK MYSQL USERS", query_no_space, strlen(query_no_space))){ - char *q=(char *)"SELECT * FROM mysql_users ORDER BY username"; - tablename=(char *)"MYSQL USERS"; - SPA->configdb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if (strlen(query_no_space)==strlen("CHECKSUM DISK MYSQL QUERY RULES") && !strncasecmp("CHECKSUM DISK MYSQL QUERY RULES", query_no_space, strlen(query_no_space))){ - char *q=(char *)"SELECT * FROM mysql_query_rules ORDER BY rule_id"; - tablename=(char *)"MYSQL QUERY RULES"; - SPA->configdb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if (strlen(query_no_space)==strlen("CHECKSUM DISK MYSQL VARIABLES") && !strncasecmp("CHECKSUM DISK MYSQL VARIABLES", query_no_space, strlen(query_no_space))){ - char *q=(char *)"SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-%' ORDER BY variable_name"; - tablename=(char *)"MYSQL VARIABLES"; - SPA->configdb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if (strlen(query_no_space)==strlen("CHECKSUM DISK MYSQL REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM DISK MYSQL REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space))){ - char *q=(char *)"SELECT * FROM mysql_replication_hostgroups ORDER BY writer_hostgroup"; - tablename=(char *)"MYSQL REPLICATION HOSTGROUPS"; - SPA->configdb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL SERVERS") && !strncasecmp("CHECKSUM MEMORY MYSQL SERVERS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL SERVERS") && !strncasecmp("CHECKSUM MEM MYSQL SERVERS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL SERVERS") && !strncasecmp("CHECKSUM MYSQL SERVERS", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM mysql_servers ORDER BY hostgroup_id, hostname, port"; - tablename=(char *)"MYSQL SERVERS"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL USERS") && !strncasecmp("CHECKSUM MEMORY MYSQL USERS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL USERS") && !strncasecmp("CHECKSUM MEM MYSQL USERS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL USERS") && !strncasecmp("CHECKSUM MYSQL USERS", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM mysql_users ORDER BY username"; - tablename=(char *)"MYSQL USERS"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } - - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL QUERY RULES") && !strncasecmp("CHECKSUM MEMORY MYSQL QUERY RULES", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL QUERY RULES") && !strncasecmp("CHECKSUM MEM MYSQL QUERY RULES", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL QUERY RULES") && !strncasecmp("CHECKSUM MYSQL QUERY RULES", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM mysql_query_rules ORDER BY rule_id"; - tablename=(char *)"MYSQL QUERY RULES"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } + unsigned int query_no_space_length=remove_spaces(query_no_space); - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL VARIABLES") && !strncasecmp("CHECKSUM MEMORY MYSQL VARIABLES", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL VARIABLES") && !strncasecmp("CHECKSUM MEM MYSQL VARIABLES", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL VARIABLES") && !strncasecmp("CHECKSUM MYSQL VARIABLES", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-%' ORDER BY variable_name"; - tablename=(char *)"MYSQL VARIABLES"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); - } + // fix bug #925 + while (query_no_space[query_no_space_length-1]==';' || query_no_space[query_no_space_length-1]==' ') { + query_no_space_length--; + query_no_space[query_no_space_length]=0; + } - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MEMORY MYSQL REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MEM MYSQL REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MYSQL REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM mysql_replication_hostgroups ORDER BY writer_hostgroup"; - tablename=(char *)"MYSQL REPLICATION HOSTGROUPS"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); + if (query_no_space_length==SELECT_VERSION_COMMENT_LEN) { + if (!strncasecmp(SELECT_VERSION_COMMENT, query_no_space, query_no_space_length)) { + l_free(query_length,query); + query=l_strdup("SELECT '(ProxySQL Admin Module)'"); + query_length=strlen(query)+1; + goto __run_query; } + } - if ((strlen(query_no_space)==strlen("CHECKSUM MEMORY MYSQL GROUP REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MEMORY GROUP MYSQL REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MEM MYSQL GROUP REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MEM MYSQL GROUP REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space))) - || - (strlen(query_no_space)==strlen("CHECKSUM MYSQL GROUP REPLICATION HOSTGROUPS") && !strncasecmp("CHECKSUM MYSQL GROUP REPLICATION HOSTGROUPS", query_no_space, strlen(query_no_space)))){ - char *q=(char *)"SELECT * FROM mysql_group_replication_hostgroups ORDER BY writer_hostgroup"; - tablename=(char *)"MYSQL GROUP REPLICATION HOSTGROUPS"; - SPA->admindb->execute_statement(q, &error, &cols, &affected_rows, &resultset); + if (query_no_space_length==SELECT_DB_USER_LEN) { + if (!strncasecmp(SELECT_DB_USER, query_no_space, query_no_space_length)) { + l_free(query_length,query); + char *query1=(char *)"SELECT \"admin\" AS 'DATABASE()', \"%s\" AS 'USER()'"; + char *query2=(char *)malloc(strlen(query1)+strlen(sess->client_myds->myconn->userinfo->username)+10); + sprintf(query2,query1,sess->client_myds->myconn->userinfo->username); + query=l_strdup(query2); + query_length=strlen(query2)+1; + free(query2); + goto __run_query; } + } - if (error) { - proxy_error("Error: %s\n", error); - char buf[1024]; - sprintf(buf,"%s", error); - SPA->send_MySQL_ERR(&sess->client_myds->myprot, buf); - run_query=false; - } else if (resultset) { - char *q=(char *)"SELECT '%s' AS 'table', '%s' AS 'checksum'"; - char *checksum=(char *)resultset->checksum(); - query=(char *)malloc(strlen(q)+strlen(tablename)+strlen(checksum)+1); - sprintf(query,q,tablename,checksum); - free(checksum); + if (query_no_space_length==SELECT_CHARSET_VARIOUS_LEN) { + if (!strncasecmp(SELECT_CHARSET_VARIOUS, query_no_space, query_no_space_length)) { + l_free(query_length,query); + char *query1=(char *)"select 'utf8' as '@@character_set_client', 'utf8' as '@@character_set_connection', 'utf8' as '@@character_set_server', 'utf8' as '@@character_set_database' limit 1"; + query=l_strdup(query1); + query_length=strlen(query1)+1; + goto __run_query; } - goto __run_query; - } -*/ - if (strncasecmp("SHOW ", query_no_space, 5)) { - goto __end_show_commands; // in the next block there are only SHOW commands } -/* - if (!strncasecmp("SHOW GLOBAL VARIABLES LIKE 'version'", query_no_space, strlen("SHOW GLOBAL VARIABLES LIKE 'version'"))) { + if (!strncasecmp("SELECT @@version", query_no_space, strlen("SELECT @@version"))) { l_free(query_length,query); - char *q=(char *)"SELECT 'version' Variable_name, '%s' Value FROM global_variables WHERE Variable_name='admin-version'"; + char *q=(char *)"SELECT '%s' AS '@@version'"; query_length=strlen(q)+20; query=(char *)l_alloc(query_length); sprintf(query,q,PROXYSQL_VERSION); goto __run_query; } -*/ - if (query_no_space_length==strlen("SHOW TABLES") && !strncasecmp("SHOW TABLES",query_no_space, query_no_space_length)) { + if (!strncasecmp("SELECT version()", query_no_space, strlen("SELECT version()"))) { l_free(query_length,query); - query=l_strdup("SELECT name AS tables FROM sqlite_master WHERE type='table' AND name NOT IN ('sqlite_sequence') ORDER BY name"); - query_length=strlen(query)+1; + char *q=(char *)"SELECT '%s' AS 'version()'"; + query_length=strlen(q)+20; + query=(char *)l_alloc(query_length); + sprintf(query,q,PROXYSQL_VERSION); goto __run_query; } -/* - if (query_no_space_length==strlen("SHOW CHARSET") && !strncasecmp("SHOW CHARSET",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT Charset, Collation AS 'Default collation' FROM mysql_collations WHERE `Default`='Yes'"); - query_length=strlen(query)+1; - goto __run_query; + if (strncasecmp("SHOW ", query_no_space, 5)) { + goto __end_show_commands; // in the next block there are only SHOW commands } - if (query_no_space_length==strlen("SHOW COLLATION") && !strncasecmp("SHOW COLLATION",query_no_space, query_no_space_length)) { + if (query_no_space_length==strlen("SHOW TABLES") && !strncasecmp("SHOW TABLES",query_no_space, query_no_space_length)) { l_free(query_length,query); - query=l_strdup("SELECT * FROM mysql_collations"); + query=l_strdup("SELECT name AS tables FROM sqlite_master WHERE type='table' AND name NOT IN ('sqlite_sequence') ORDER BY name"); query_length=strlen(query)+1; goto __run_query; } -*/ if ((query_no_space_length>17) && (!strncasecmp("SHOW TABLES FROM ", query_no_space, 17))) { strA=query_no_space+17; @@ -2133,56 +351,6 @@ void SQLite3_Server_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t *p query_length=l+1; goto __run_query; } -/* - if (query_no_space_length==strlen("SHOW MYSQL USERS") && !strncasecmp("SHOW MYSQL USERS",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT * FROM mysql_users ORDER BY username, active DESC, username ASC"); - query_length=strlen(query)+1; - goto __run_query; - } - - if (query_no_space_length==strlen("SHOW MYSQL SERVERS") && !strncasecmp("SHOW MYSQL SERVERS",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT * FROM mysql_servers ORDER BY hostgroup_id, hostname, port"); - query_length=strlen(query)+1; - goto __run_query; - } - - if ( - (query_no_space_length==strlen("SHOW GLOBAL VARIABLES") && !strncasecmp("SHOW GLOBAL VARIABLES",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SHOW ALL VARIABLES") && !strncasecmp("SHOW ALL VARIABLES",query_no_space, query_no_space_length)) - || - (query_no_space_length==strlen("SHOW VARIABLES") && !strncasecmp("SHOW VARIABLES",query_no_space, query_no_space_length)) - ) { - l_free(query_length,query); - query=l_strdup("SELECT variable_name AS Variable_name, variable_value AS Value FROM global_variables ORDER BY variable_name"); - query_length=strlen(query)+1; - goto __run_query; - } - - if (query_no_space_length==strlen("SHOW ADMIN VARIABLES") && !strncasecmp("SHOW ADMIN VARIABLES",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT variable_name AS Variable_name, variable_value AS Value FROM global_variables WHERE variable_name LIKE 'admin-\%' ORDER BY variable_name"); - query_length=strlen(query)+1; - goto __run_query; - } - - if (query_no_space_length==strlen("SHOW MYSQL VARIABLES") && !strncasecmp("SHOW MYSQL VARIABLES",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT variable_name AS Variable_name, variable_value AS Value FROM global_variables WHERE variable_name LIKE 'mysql-\%' ORDER BY variable_name"); - query_length=strlen(query)+1; - goto __run_query; - } - - if (query_no_space_length==strlen("SHOW MYSQL STATUS") && !strncasecmp("SHOW MYSQL STATUS",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT Variable_Name AS Variable_name, Variable_Value AS Value FROM stats_mysql_global ORDER BY variable_name"); - query_length=strlen(query)+1; - GloAdmin->stats___mysql_global(); - goto __run_query; - } -*/ strA=(char *)"SHOW CREATE TABLE "; strB=(char *)"SELECT name AS 'table' , REPLACE(REPLACE(sql,' , ', X'2C0A20202020'),'CREATE TABLE %s (','CREATE TABLE %s ('||X'0A20202020') AS 'Create Table' FROM %s.sqlite_master WHERE type='table' AND name='%s'"; @@ -2228,33 +396,11 @@ void SQLite3_Server_session_handler(MySQL_Session *sess, void *_pa, PtrSize_t *p goto __run_query; } -/* - if (query_no_space_length==strlen("SHOW FULL PROCESSLIST") && !strncasecmp("SHOW FULL PROCESSLIST",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT * FROM stats_mysql_processlist"); - query_length=strlen(query)+1; - goto __run_query; - } - - if (query_no_space_length==strlen("SHOW PROCESSLIST") && !strncasecmp("SHOW PROCESSLIST",query_no_space, query_no_space_length)) { - l_free(query_length,query); - query=l_strdup("SELECT SessionID, user, db, hostgroup, command, time_ms, SUBSTR(info,0,100) info FROM stats_mysql_processlist"); - query_length=strlen(query)+1; - goto __run_query; - } -*/ __end_show_commands: if (query_no_space_length==strlen("SELECT DATABASE()") && !strncasecmp("SELECT DATABASE()",query_no_space, query_no_space_length)) { l_free(query_length,query); query=l_strdup("SELECT \"main\" AS 'DATABASE()'"); -/* - if (sess->session_type == PROXYSQL_SESSION_ADMIN) { // no stats - query=l_strdup("SELECT \"admin\" AS 'DATABASE()'"); - } else { - query=l_strdup("SELECT \"stats\" AS 'DATABASE()'"); - } -*/ query_length=strlen(query)+1; goto __run_query; } @@ -2263,13 +409,6 @@ __end_show_commands: if (query_no_space_length==strlen("SELECT DATABASE() AS name") && !strncasecmp("SELECT DATABASE() AS name",query_no_space, query_no_space_length)) { l_free(query_length,query); query=l_strdup("SELECT \"main\" AS 'DATABASE()'"); -/* - if (sess->session_type == PROXYSQL_SESSION_ADMIN) { // no stats - query=l_strdup("SELECT \"admin\" AS 'name'"); - } else { - query=l_strdup("SELECT \"stats\" AS 'name'"); - } -*/ query_length=strlen(query)+1; goto __run_query; } @@ -2291,22 +430,6 @@ __run_query: if (run_query) { SQLite3_Session *sqlite_sess = (SQLite3_Session *)sess->thread->gen_args; sqlite_sess->sessdb->execute_statement(query, &error , &cols , &affected_rows , &resultset); -/* - ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; - if (sess->session_type == PROXYSQL_SESSION_ADMIN) { // no stats - if (SPA->get_read_only()) { // disable writes if the admin interface is in read_only mode - SPA->admindb->execute("PRAGMA query_only = ON"); - SPA->admindb->execute_statement(query, &error , &cols , &affected_rows , &resultset); - SPA->admindb->execute("PRAGMA query_only = OFF"); - } else { - SPA->admindb->execute_statement(query, &error , &cols , &affected_rows , &resultset); - } - } else { - SPA->statsdb->execute("PRAGMA query_only = ON"); - SPA->statsdb->execute_statement(query, &error , &cols , &affected_rows , &resultset); - SPA->statsdb->execute("PRAGMA query_only = OFF"); - } -*/ sess->SQLite3_to_MySQL(resultset, error, affected_rows, &sess->client_myds->myprot); delete resultset; } @@ -2392,56 +515,6 @@ __exit_child_mysql: } -/* -void* child_telnet(void* arg) -{ - int bytes_read; - char line[LINESIZE+1]; - int client = *(int *)arg; - free(arg); - pthread_mutex_unlock(&sock_mutex); - memset(line,0,LINESIZE+1); - while ((strncmp(line, "quit", 4) != 0) && glovars.shutdown==0) { - bytes_read = recv(client, line, LINESIZE, 0); - if (bytes_read==-1) { - break; - } - char *eow = strchr(line, '\n'); - if (eow) *eow=0; - //SPA->is_command(line); - if (strncmp(line,"shutdown",8)==0) glovars.shutdown=1; - if (send(client, line, strlen(line), MSG_NOSIGNAL)==-1) break; - if (send(client, "\nOK\n", 4, MSG_NOSIGNAL)==-1) break; - } - shutdown(client,SHUT_RDWR); - close(client); - return arg; -} - -void* child_telnet_also(void* arg) -{ - int bytes_read; - char line[LINESIZE+1]; - int client = *(int *)arg; - free(arg); - pthread_mutex_unlock(&sock_mutex); - memset(line,0,LINESIZE+1); - while ((strncmp(line, "quit", 4) != 0) && glovars.shutdown==0) { - bytes_read = recv(client, line, LINESIZE, 0); - if (bytes_read==-1) { - break; - } - char *eow = strchr(line, '\n'); - if (eow) *eow=0; - if (strncmp(line,"shutdown",8)==0) glovars.shutdown=1; - if (send(client, line, strlen(line), MSG_NOSIGNAL)==-1) break; - if (send(client, "\nNOT OK\n", 8, MSG_NOSIGNAL)==-1) break; - } - shutdown(client,SHUT_RDWR); - close(client); - return arg; -} -*/ static void * sqlite3server_main_loop(void *arg) { int i; @@ -2454,16 +527,8 @@ static void * sqlite3server_main_loop(void *arg) char *socket_names[MAX_SQLITE3SERVER_LISTENERS]; for (i=0;iset_case_sensitive(false); - match_regexes.re=(void **)malloc(sizeof(void *)*10); - match_regexes.re[0]=(RE2 *)new RE2("^SELECT\\s+@@max_allowed_packet\\s*", *opt2); - match_regexes.re[1]=(RE2 *)new RE2("^SELECT\\s+@@[0-9A-Za-z_-]+\\s*", *opt2); - match_regexes.re[2]=(RE2 *)new RE2("SHOW\\s+VARIABLES\\s+WHERE", *opt2); - match_regexes.re[3]=(RE2 *)new RE2("SHOW\\s+VARIABLES\\s+LIKE", *opt2); -*/ }; void SQLite3_Server::wrlock() { @@ -2648,183 +677,16 @@ bool SQLite3_Server::init() { cpu_timer cpt; child_func[0]=child_mysql; -// child_func[1]=child_telnet; -// child_func[2]=child_telnet_also; main_shutdown=0; main_poll_nfds=0; main_poll_fds=NULL; main_callback_func=NULL; -/* - { - int rc=pipe(pipefd); - if (rc) { - perror("Call to pipe() failed"); - exit(EXIT_FAILURE); - } - } -*/ main_callback_func=(int *)malloc(sizeof(int)*MAX_SQLITE3SERVER_LISTENERS); main_poll_fds=(struct pollfd *)malloc(sizeof(struct pollfd)*MAX_SQLITE3SERVER_LISTENERS); main_poll_nfds=0; -/* - pthread_attr_t attr; - pthread_attr_init(&attr); - //pthread_attr_setstacksize (&attr, mystacksize); - - admindb=new SQLite3DB(); - admindb->open((char *)"file:mem_admindb?mode=memory&cache=shared", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX); - statsdb=new SQLite3DB(); - statsdb->open((char *)"file:mem_statsdb?mode=memory&cache=shared", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX); - - // check if file exists , see #617 - bool admindb_file_exists=Proxy_file_exists(GloVars.admindb); - - configdb=new SQLite3DB(); - configdb->open((char *)GloVars.admindb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX); - // Fully synchronous is not required. See to #1055 - // https://sqlite.org/pragma.html#pragma_synchronous - configdb->execute("PRAGMA synchronous=0"); - - monitordb = new SQLite3DB(); - monitordb->open((char *)"file:mem_monitordb?mode=memory&cache=shared", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX); - - tables_defs_admin=new std::vector; - tables_defs_stats=new std::vector; - tables_defs_config=new std::vector; - - insert_into_tables_defs(tables_defs_admin,"mysql_servers", ADMIN_SQLITE_TABLE_MYSQL_SERVERS); - insert_into_tables_defs(tables_defs_admin,"runtime_mysql_servers", ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_SERVERS); - insert_into_tables_defs(tables_defs_admin,"mysql_users", ADMIN_SQLITE_TABLE_MYSQL_USERS); - insert_into_tables_defs(tables_defs_admin,"runtime_mysql_users", ADMIN_SQLITE_RUNTIME_MYSQL_USERS); - insert_into_tables_defs(tables_defs_admin,"runtime_mysql_replication_hostgroups", ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_admin,"mysql_replication_hostgroups", ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_admin,"mysql_group_replication_hostgroups", ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_admin,"runtime_mysql_group_replication_hostgroups", ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_GROUP_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_admin,"mysql_query_rules", ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES); - insert_into_tables_defs(tables_defs_admin,"runtime_mysql_query_rules", ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_QUERY_RULES); - insert_into_tables_defs(tables_defs_admin,"global_variables", ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES); - insert_into_tables_defs(tables_defs_admin,"runtime_global_variables", ADMIN_SQLITE_RUNTIME_GLOBAL_VARIABLES); - insert_into_tables_defs(tables_defs_admin,"mysql_collations", ADMIN_SQLITE_TABLE_MYSQL_COLLATIONS); - insert_into_tables_defs(tables_defs_admin,"scheduler", ADMIN_SQLITE_TABLE_SCHEDULER); - insert_into_tables_defs(tables_defs_admin,"runtime_scheduler", ADMIN_SQLITE_TABLE_RUNTIME_SCHEDULER); -#ifdef DEBUG - insert_into_tables_defs(tables_defs_admin,"debug_levels", ADMIN_SQLITE_TABLE_DEBUG_LEVELS); -#endif // DEBUG - - insert_into_tables_defs(tables_defs_config,"mysql_servers", ADMIN_SQLITE_TABLE_MYSQL_SERVERS); - insert_into_tables_defs(tables_defs_config,"mysql_users", ADMIN_SQLITE_TABLE_MYSQL_USERS); - insert_into_tables_defs(tables_defs_config,"mysql_replication_hostgroups", ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_config,"mysql_group_replication_hostgroups", ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS); - insert_into_tables_defs(tables_defs_config,"mysql_query_rules", ADMIN_SQLITE_TABLE_MYSQL_QUERY_RULES); - insert_into_tables_defs(tables_defs_config,"global_variables", ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES); - // the table is not required to be present on disk. Removing it due to #1055 - insert_into_tables_defs(tables_defs_config,"mysql_collations", ADMIN_SQLITE_TABLE_MYSQL_COLLATIONS); - insert_into_tables_defs(tables_defs_config,"scheduler", ADMIN_SQLITE_TABLE_SCHEDULER); -#ifdef DEBUG - insert_into_tables_defs(tables_defs_config,"debug_levels", ADMIN_SQLITE_TABLE_DEBUG_LEVELS); -#endif // DEBUG - - - insert_into_tables_defs(tables_defs_stats,"stats_mysql_query_rules", STATS_SQLITE_TABLE_MYSQL_QUERY_RULES); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_commands_counters", STATS_SQLITE_TABLE_MYSQL_COMMANDS_COUNTERS); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_processlist", STATS_SQLITE_TABLE_MYSQL_PROCESSLIST); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_connection_pool", STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_connection_pool_reset", STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL_RESET); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_query_digest", STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_query_digest_reset", STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_global", STATS_SQLITE_TABLE_MYSQL_GLOBAL); - insert_into_tables_defs(tables_defs_stats,"stats_mysql_users", STATS_SQLITE_TABLE_MYSQL_USERS); - insert_into_tables_defs(tables_defs_stats,"global_variables", ADMIN_SQLITE_TABLE_GLOBAL_VARIABLES); // workaround for issue #708 - - // upgrade mysql_servers if needed (upgrade from previous version) - disk_upgrade_mysql_servers(); - - // upgrade mysql_users if needed (upgrade from previous version) - disk_upgrade_mysql_users(); - - // upgrade mysql_query_rules if needed (upgrade from previous version) - disk_upgrade_mysql_query_rules(); - - // upgrade scheduler if needed (upgrade from previous version) - disk_upgrade_scheduler(); - - check_and_build_standard_tables(admindb, tables_defs_admin); - check_and_build_standard_tables(configdb, tables_defs_config); - check_and_build_standard_tables(statsdb, tables_defs_stats); - - __attach_db(admindb, configdb, (char *)"disk"); - __attach_db(admindb, statsdb, (char *)"stats"); - __attach_db(admindb, monitordb, (char *)"monitor"); - __attach_db(statsdb, monitordb, (char *)"monitor"); - - dump_mysql_collations(); - -#ifdef DEBUG - admindb->execute("ATTACH DATABASE 'file:mem_mydb?mode=memory&cache=shared' AS myhgm"); -#endif // DEBUG - -#ifdef DEBUG - flush_debug_levels_runtime_to_database(configdb, false); - flush_debug_levels_runtime_to_database(admindb, true); -#endif // DEBUG - - flush_mysql_variables___runtime_to_database(configdb, false, false, false); - flush_mysql_variables___runtime_to_database(admindb, false, true, false); - - flush_admin_variables___runtime_to_database(configdb, false, false, false); - flush_admin_variables___runtime_to_database(admindb, false, true, false); - - __insert_or_replace_maintable_select_disktable(); - - flush_admin_variables___database_to_runtime(admindb,true); - - // workaround for issue #708 - statsdb->execute("INSERT OR IGNORE INTO global_variables VALUES('mysql-max_allowed_packet',4194304)"); - -#ifdef DEBUG - if (GloVars.global.gdbg==false && GloVars.__cmd_proxysql_gdbg) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Enabling GloVars.global.gdbg because GloVars.__cmd_proxysql_gdbg==%d\n", GloVars.__cmd_proxysql_gdbg); - GloVars.global.gdbg=true; - } -#endif // DEBUG - - if (GloVars.__cmd_proxysql_reload || GloVars.__cmd_proxysql_initial || admindb_file_exists==false) { // see #617 - if (GloVars.configfile_open) { - if (GloVars.confFile->cfg) { - Read_MySQL_Servers_from_configfile(); - Read_Global_Variables_from_configfile("admin"); - Read_Global_Variables_from_configfile("mysql"); - Read_MySQL_Users_from_configfile(); - Read_MySQL_Query_Rules_from_configfile(); - Read_Scheduler_from_configfile(); - __insert_or_replace_disktable_select_maintable(); - } else { - if (GloVars.confFile->OpenFile(GloVars.config_file)==true) { - Read_MySQL_Servers_from_configfile(); - Read_MySQL_Users_from_configfile(); - Read_MySQL_Query_Rules_from_configfile(); - Read_Global_Variables_from_configfile("admin"); - Read_Global_Variables_from_configfile("mysql"); - Read_Scheduler_from_configfile(); - __insert_or_replace_disktable_select_maintable(); - } - } - } - } - flush_admin_variables___database_to_runtime(admindb,true); - flush_mysql_variables___database_to_runtime(admindb,true); - - if (GloVars.__cmd_proxysql_admin_socket) { - set_variable((char *)"mysql_ifaces",GloVars.__cmd_proxysql_admin_socket); - } -*/ S_amll.update_ifaces(variables.mysql_ifaces, &S_amll.ifaces_mysql); -// S_amll.update_ifaces(variables.telnet_admin_ifaces, &S_amll.ifaces_telnet_admin); -// S_amll.update_ifaces(variables.telnet_stats_ifaces, &S_amll.ifaces_telnet_stats); - - pthread_t SQLite3_Server_thr; struct _main_args *arg=(struct _main_args *)malloc(sizeof(struct _main_args)); @@ -2836,292 +698,12 @@ bool SQLite3_Server::init() { perror("Thread creation"); exit(EXIT_FAILURE); } -// do { usleep(50); } while (__sync_fetch_and_sub(&load_main_,0)==0); -// load_main_=0; #ifdef DEBUG std::cerr << "SQLite3 Server initialized in "; #endif return true; }; -/* -void ProxySQL_Admin::admin_shutdown() { - int i; -// do { usleep(50); } while (main_shutdown==0); - pthread_join(admin_thr, NULL); - delete admindb; - delete statsdb; - delete configdb; - delete monitordb; - sqlite3_shutdown(); - if (main_poll_fds) { - for (i=0;iexecute("DELETE FROM mysql_collations"); - do { - sprintf(buf,query,c->nr, c->name, c->csname); - admindb->execute(buf); - ++c; - } while (c[0].nr != 0); - admindb->execute("INSERT OR REPLACE INTO mysql_collations SELECT Id, Collation, Charset, 'Yes' FROM mysql_collations JOIN (SELECT MIN(Id) minid FROM mysql_collations GROUP BY Charset) t ON t.minid=mysql_collations.Id"); - // the table is not required to be present on disk. Removing it due to #1055 -// admindb->execute("DELETE FROM disk.mysql_collations"); -// admindb->execute("INSERT INTO disk.mysql_collations SELECT * FROM main.mysql_collations"); -} - -void ProxySQL_Admin::check_and_build_standard_tables(SQLite3DB *db, std::vector *tables_defs) { -// int i; - table_def_t *td; - db->execute("PRAGMA foreign_keys = OFF"); - for (std::vector::iterator it=tables_defs->begin(); it!=tables_defs->end(); ++it) { - td=*it; - db->check_and_build_table(td->table_name, td->table_def); - } - db->execute("PRAGMA foreign_keys = ON"); -}; - - - -void ProxySQL_Admin::insert_into_tables_defs(std::vector *tables_defs, const char *table_name, const char *table_def) { - table_def_t *td = new table_def_t; - td->table_name=strdup(table_name); - td->table_def=strdup(table_def); - tables_defs->push_back(td); -}; - -void ProxySQL_Admin::drop_tables_defs(std::vector *tables_defs) { - table_def_t *td; - while (!tables_defs->empty()) { - td=tables_defs->back(); - free(td->table_name); - td->table_name=NULL; - free(td->table_def); - td->table_def=NULL; - tables_defs->pop_back(); - delete td; - } -}; - - -void ProxySQL_Admin::flush_admin_variables___database_to_runtime(SQLite3DB *db, bool replace) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Flushing ADMIN variables. Replace:%d\n", replace); - char *error=NULL; - int cols=0; - int affected_rows=0; - SQLite3_result *resultset=NULL; - char *q=(char *)"SELECT substr(variable_name,7) vn, variable_value FROM global_variables WHERE variable_name LIKE 'admin-%'"; - admindb->execute_statement(q, &error , &cols , &affected_rows , &resultset); - if (error) { - proxy_error("Error on %s : %s\n", q, error); - return; - } else { - wrlock(); - for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { - SQLite3_row *r=*it; - bool rc=set_variable(r->fields[0],r->fields[1]); - if (rc==false) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Impossible to set variable %s with value \"%s\"\n", r->fields[0],r->fields[1]); - if (replace) { - char *val=get_variable(r->fields[0]); - char q[1000]; - if (val) { - if (strcmp(r->fields[0],(char *)"version")) { - proxy_warning("Impossible to set variable %s with value \"%s\". Resetting to current \"%s\".\n", r->fields[0],r->fields[1], val); - } - sprintf(q,"INSERT OR REPLACE INTO global_variables VALUES(\"admin-%s\",\"%s\")",r->fields[0],val); - db->execute(q); - free(val); - } else { - if (strcmp(r->fields[0],(char *)"debug")==0) { - sprintf(q,"DELETE FROM disk.global_variables WHERE variable_name=\"admin-%s\"",r->fields[0]); - db->execute(q); - } else { - proxy_warning("Impossible to set not existing variable %s with value \"%s\". Deleting. If the variable name is correct, this version doesn't support it\n", r->fields[0],r->fields[1]); - } - sprintf(q,"DELETE FROM global_variables WHERE variable_name=\"admin-%s\"",r->fields[0]); - db->execute(q); - } - } - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Set variable %s with value \"%s\"\n", r->fields[0],r->fields[1]); - } - } - //commit(); NOT IMPLEMENTED - wrunlock(); - } - if (resultset) delete resultset; -} - -void ProxySQL_Admin::flush_mysql_variables___database_to_runtime(SQLite3DB *db, bool replace) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Flushing MySQL variables. Replace:%d\n", replace); - char *error=NULL; - int cols=0; - int affected_rows=0; - SQLite3_result *resultset=NULL; - char *q=(char *)"SELECT substr(variable_name,7) vn, variable_value FROM global_variables WHERE variable_name LIKE 'mysql-%'"; - admindb->execute_statement(q, &error , &cols , &affected_rows , &resultset); - if (error) { - proxy_error("Error on %s : %s\n", q, error); - return; - } else { - GloMTH->wrlock(); - for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { - SQLite3_row *r=*it; - bool rc=GloMTH->set_variable(r->fields[0],r->fields[1]); - if (rc==false) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Impossible to set variable %s with value \"%s\"\n", r->fields[0],r->fields[1]); - if (replace) { - char *val=GloMTH->get_variable(r->fields[0]); - char q[1000]; - if (val) { - if (strcmp(val,r->fields[1])) { - proxy_warning("Impossible to set variable %s with value \"%s\". Resetting to current \"%s\".\n", r->fields[0],r->fields[1], val); - sprintf(q,"INSERT OR REPLACE INTO global_variables VALUES(\"mysql-%s\",\"%s\")",r->fields[0],val); - db->execute(q); - } - free(val); - } else { - if (strcmp(r->fields[0],(char *)"session_debug")==0) { - sprintf(q,"DELETE FROM disk.global_variables WHERE variable_name=\"mysql-%s\"",r->fields[0]); - db->execute(q); - } else { - proxy_warning("Impossible to set not existing variable %s with value \"%s\". Deleting. If the variable name is correct, this version doesn't support it\n", r->fields[0],r->fields[1]); - } - sprintf(q,"DELETE FROM global_variables WHERE variable_name=\"mysql-%s\"",r->fields[0]); - db->execute(q); - } - } - } else { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Set variable %s with value \"%s\"\n", r->fields[0],r->fields[1]); - } - } - GloMTH->commit(); - GloMTH->wrunlock(); - } - if (resultset) delete resultset; -} - -void ProxySQL_Admin::flush_mysql_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty, bool runtime) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Flushing MySQL variables. Replace:%d, Delete:%d, Only_If_Empty:%d\n", replace, del, onlyifempty); - if (onlyifempty) { - char *error=NULL; - int cols=0; - int affected_rows=0; - SQLite3_result *resultset=NULL; - char *q=(char *)"SELECT COUNT(*) FROM global_variables WHERE variable_name LIKE 'mysql-%'"; - db->execute_statement(q, &error , &cols , &affected_rows , &resultset); - int matching_rows=0; - if (error) { - proxy_error("Error on %s : %s\n", q, error); - return; - } else { - for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { - SQLite3_row *r=*it; - matching_rows+=atoi(r->fields[0]); - } - } - if (resultset) delete resultset; - if (matching_rows) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Table global_variables has MySQL variables - skipping\n"); - return; - } - } - if (del) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Deleting MySQL variables from global_variables\n"); - db->execute("DELETE FROM global_variables WHERE variable_name LIKE 'mysql-%'"); - } - if (runtime) { - db->execute("DELETE FROM runtime_global_variables WHERE variable_name LIKE 'mysql-%'"); - } - char *a; - char *b=(char *)"INSERT INTO runtime_global_variables(variable_name, variable_value) VALUES(\"mysql-%s\",\"%s\")"; - if (replace) { - a=(char *)"REPLACE INTO global_variables(variable_name, variable_value) VALUES(\"mysql-%s\",\"%s\")"; - } else { - a=(char *)"INSERT OR IGNORE INTO global_variables(variable_name, variable_value) VALUES(\"mysql-%s\",\"%s\")"; - } - int l=strlen(a)+200; - GloMTH->wrlock(); - char **varnames=GloMTH->get_variables_list(); - for (int i=0; varnames[i]; i++) { - char *val=GloMTH->get_variable(varnames[i]); - l+=( varnames[i] ? strlen(varnames[i]) : 6); - l+=( val ? strlen(val) : 6); - char *query=(char *)malloc(l); - sprintf(query, a, varnames[i], val); - if (runtime) { - db->execute(query); - sprintf(query, b, varnames[i], val); - } - db->execute(query); - if (val) - free(val); - free(query); - } - GloMTH->wrunlock(); - for (int i=0; varnames[i]; i++) { - free(varnames[i]); - } - free(varnames); -} -*/ char **SQLite3_Server::get_variables_list() { size_t l=sizeof(SQLite3_Server_variables_names)/sizeof(char *); unsigned int i; @@ -3146,78 +728,13 @@ bool SQLite3_Server::has_variable(const char *name) { } char * SQLite3_Server::get_variable(char *name) { -//#define INTBUFSIZE 4096 -// char intbuf[INTBUFSIZE]; -// if (!strcasecmp(name,"version")) return s_strdup(variables.admin_version); -// if (!strcasecmp(name,"admin_credentials")) return s_strdup(variables.admin_credentials); -// if (!strcasecmp(name,"stats_credentials")) return s_strdup(variables.stats_credentials); if (!strcasecmp(name,"mysql_ifaces")) return s_strdup(variables.mysql_ifaces); -// if (!strcasecmp(name,"telnet_admin_ifaces")) return s_strdup(variables.telnet_admin_ifaces); -// if (!strcasecmp(name,"telnet_stats_ifaces")) return s_strdup(variables.telnet_stats_ifaces); -// if (!strcasecmp(name,"refresh_interval")) { -// sprintf(intbuf,"%d",variables.refresh_interval); -// return strdup(intbuf); -// } if (!strcasecmp(name,"read_only")) { return strdup((variables.read_only ? "true" : "false")); } -// if (!strcasecmp(name,"hash_passwords")) { -// return strdup((variables.hash_passwords ? "true" : "false")); -// } -//#ifdef DEBUG -// if (!strcasecmp(name,"debug")) { -// return strdup((variables.debug ? "true" : "false")); -// } -//#endif // DEBUG return NULL; } -/* -#ifdef DEBUG -void ProxySQL_Admin::add_credentials(char *type, char *credentials, int hostgroup_id) { -#else -void ProxySQL_Admin::add_credentials(char *credentials, int hostgroup_id) { -#endif // DEBUG - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Adding %s credentials: %s\n", type, credentials); - tokenizer_t tok = tokenizer( credentials, ";", TOKENIZER_NO_EMPTIES ); - const char* token; - for (token = tokenize( &tok ); token; token = tokenize( &tok )) { - char *user=NULL; - char *pass=NULL; - c_split_2(token, ":", &user, &pass); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Adding %s credential: \"%s\", user:%s, pass:%s\n", type, token, user, pass); - if (GloMyAuth) { // this check if required if GloMyAuth doesn't exist yet - GloMyAuth->add(user,pass,USERNAME_FRONTEND,0,hostgroup_id,(char *)"main",0,0,0,1000); - } - free(user); - free(pass); - } - free_tokenizer( &tok ); -} - -#ifdef DEBUG -void ProxySQL_Admin::delete_credentials(char *type, char *credentials) { -#else -void ProxySQL_Admin::delete_credentials(char *credentials) { -#endif // DEBUG - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Removing old %s credentials: %s\n", type, credentials); - tokenizer_t tok = tokenizer( credentials, ";", TOKENIZER_NO_EMPTIES ); - const char* token; - for (token = tokenize( &tok ); token; token = tokenize( &tok )) { - char *user=NULL; - char *pass=NULL; - c_split_2(token, ":", &user, &pass); - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Removing %s credential: \"%s\", user:%s, pass:%s\n", type, token, user, pass); - if (GloMyAuth) { // this check if required if GloMyAuth doesn't exist yet - GloMyAuth->del(user,USERNAME_FRONTEND); - } - free(user); - free(pass); - } - free_tokenizer( &tok ); -} - -*/ bool SQLite3_Server::set_variable(char *name, char *value) { // this is the public function, accessible from admin size_t vallen=strlen(value); @@ -3250,104 +767,6 @@ bool SQLite3_Server::set_variable(char *name, char *value) { // this is the pub return false; } -/* -void ProxySQL_Admin::flush_admin_variables___runtime_to_database(SQLite3DB *db, bool replace, bool del, bool onlyifempty, bool runtime) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Flushing ADMIN variables. Replace:%d, Delete:%d, Only_If_Empty:%d\n", replace, del, onlyifempty); - if (onlyifempty) { - char *error=NULL; - int cols=0; - int affected_rows=0; - SQLite3_result *resultset=NULL; - char *q=(char *)"SELECT COUNT(*) FROM global_variables WHERE variable_name LIKE 'admin-%'"; - db->execute_statement(q, &error , &cols , &affected_rows , &resultset); - int matching_rows=0; - if (error) { - proxy_error("Error on %s : %s\n", q, error); - return; - } else { - for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { - SQLite3_row *r=*it; - matching_rows+=atoi(r->fields[0]); - } - } - if (resultset) delete resultset; - if (matching_rows) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Table global_variables has ADMIN variables - skipping\n"); - return; - } - } - if (del) { - proxy_debug(PROXY_DEBUG_ADMIN, 4, "Deleting ADMIN variables from global_variables\n"); - db->execute("DELETE FROM global_variables WHERE variable_name LIKE 'admin-%'"); - } - if (runtime) { - db->execute("DELETE FROM runtime_global_variables WHERE variable_name LIKE 'admin-%'"); - } - char *a; - char *b=(char *)"INSERT INTO runtime_global_variables(variable_name, variable_value) VALUES(\"admin-%s\",\"%s\")"; - if (replace) { - a=(char *)"REPLACE INTO global_variables(variable_name, variable_value) VALUES(\"admin-%s\",\"%s\")"; - } else { - a=(char *)"INSERT OR IGNORE INTO global_variables(variable_name, variable_value) VALUES(\"admin-%s\",\"%s\")"; - } - int l=strlen(a)+200; - - char **varnames=get_variables_list(); - for (int i=0; varnames[i]; i++) { - char *val=get_variable(varnames[i]); - l+=( varnames[i] ? strlen(varnames[i]) : 6); - l+=( val ? strlen(val) : 6); - char *query=(char *)malloc(l); - sprintf(query, a, varnames[i], val); - db->execute(query); - if (runtime) { - sprintf(query, b, varnames[i], val); - db->execute(query); - } - if (val) - free(val); - free(query); - } - for (int i=0; varnames[i]; i++) { - free(varnames[i]); - } - free(varnames); - -} - -#ifdef DEBUG -void ProxySQL_Admin::flush_debug_levels_runtime_to_database(SQLite3DB *db, bool replace) { - int i; - char *a=NULL; - db->execute("DELETE FROM debug_levels WHERE verbosity=0"); - if (replace) { - a=(char *)"REPLACE INTO debug_levels(module,verbosity) VALUES(\"%s\",%d)"; - } else { - a=(char *)"INSERT OR IGNORE INTO debug_levels(module,verbosity) VALUES(\"%s\",%d)"; - } - int l=strlen(a)+100; - for (i=0;iexecute(query); - free(query); - } -} -#endif // DEBUG -*/ - -/* -void ProxySQL_Admin::__attach_db(SQLite3DB *db1, SQLite3DB *db2, char *alias) { - const char *a="ATTACH DATABASE '%s' AS %s"; - int l=strlen(a)+strlen(db2->get_url())+strlen(alias)+5; - char *cmd=(char *)malloc(l); - sprintf(cmd,a,db2->get_url(), alias); - db1->execute(cmd); - free(cmd); -} -*/ - - void SQLite3_Server::send_MySQL_OK(MySQL_Protocol *myprot, char *msg, int rows) { assert(myprot); MySQL_Data_Stream *myds=myprot->get_myds(); @@ -3363,14 +782,3 @@ void SQLite3_Server::send_MySQL_ERR(MySQL_Protocol *myprot, char *msg) { myprot->generate_pkt_ERR(true,NULL,NULL,1,1045,(char *)"28000",msg); myds->DSS=STATE_SLEEP; } - -/* -// this fuction will be called a s a deatached thread -void * waitpid_thread(void *arg) { - pid_t *cpid_ptr=(pid_t *)arg; - int status; - waitpid(*cpid_ptr, &status, 0); - free(cpid_ptr); - return NULL; -} -*/ From 04cfa1c733038b2244b7c229410db52e86540d49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 8 Jan 2018 21:22:27 +0100 Subject: [PATCH 16/40] Add gtid_port to mysql_servers --- include/MySQL_HostGroups_Manager.h | 13 +- include/ProxySQL_Cluster.hpp | 2 +- lib/MySQL_HostGroups_Manager.cpp | 197 +++++++++++++++-------------- lib/ProxySQL_Admin.cpp | 69 ++++++---- lib/ProxySQL_Cluster.cpp | 10 +- 5 files changed, 162 insertions(+), 129 deletions(-) diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index c01a41124..234bba643 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -19,11 +19,11 @@ // we have 2 versions of the same tables: with (debug) and without (no debug) checks #ifdef DEBUG -#define MYHGM_MYSQL_SERVERS "CREATE TABLE mysql_servers ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , status INT CHECK (status IN (0, 1, 2, 3, 4)) NOT NULL DEFAULT 0 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , mem_pointer INT NOT NULL DEFAULT 0 , PRIMARY KEY (hostgroup_id, hostname, port) )" -#define MYHGM_MYSQL_SERVERS_INCOMING "CREATE TABLE mysql_servers_incoming ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , status INT CHECK (status IN (0, 1, 2, 3, 4)) NOT NULL DEFAULT 0 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port))" +#define MYHGM_MYSQL_SERVERS "CREATE TABLE mysql_servers ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_port INT NOT NULL DEFAULT 0 , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , status INT CHECK (status IN (0, 1, 2, 3, 4)) NOT NULL DEFAULT 0 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , mem_pointer INT NOT NULL DEFAULT 0 , PRIMARY KEY (hostgroup_id, hostname, port) )" +#define MYHGM_MYSQL_SERVERS_INCOMING "CREATE TABLE mysql_servers_incoming ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_port INT NOT NULL DEFAULT 0 , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , status INT CHECK (status IN (0, 1, 2, 3, 4)) NOT NULL DEFAULT 0 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port))" #else -#define MYHGM_MYSQL_SERVERS "CREATE TABLE mysql_servers ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , weight INT NOT NULL DEFAULT 1 , status INT NOT NULL DEFAULT 0 , compression INT NOT NULL DEFAULT 0 , max_connections INT NOT NULL DEFAULT 1000 , max_replication_lag INT NOT NULL DEFAULT 0 , use_ssl INT NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , mem_pointer INT NOT NULL DEFAULT 0 , PRIMARY KEY (hostgroup_id, hostname, port) )" -#define MYHGM_MYSQL_SERVERS_INCOMING "CREATE TABLE mysql_servers_incoming ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , weight INT NOT NULL DEFAULT 1 , status INT NOT NULL DEFAULT 0 , compression INT NOT NULL DEFAULT 0 , max_connections INT NOT NULL DEFAULT 1000 , max_replication_lag INT NOT NULL DEFAULT 0 , use_ssl INT NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port))" +#define MYHGM_MYSQL_SERVERS "CREATE TABLE mysql_servers ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_port INT NOT NULL DEFAULT 0 , weight INT NOT NULL DEFAULT 1 , status INT NOT NULL DEFAULT 0 , compression INT NOT NULL DEFAULT 0 , max_connections INT NOT NULL DEFAULT 1000 , max_replication_lag INT NOT NULL DEFAULT 0 , use_ssl INT NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , mem_pointer INT NOT NULL DEFAULT 0 , PRIMARY KEY (hostgroup_id, hostname, port) )" +#define MYHGM_MYSQL_SERVERS_INCOMING "CREATE TABLE mysql_servers_incoming ( hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_port INT NOT NULL DEFAULT 0 , weight INT NOT NULL DEFAULT 1 , status INT NOT NULL DEFAULT 0 , compression INT NOT NULL DEFAULT 0 , max_connections INT NOT NULL DEFAULT 1000 , max_replication_lag INT NOT NULL DEFAULT 0 , use_ssl INT NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port))" #endif /* DEBUG */ #define MYHGM_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0) , check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only')) NOT NULL DEFAULT 'read_only' , comment VARCHAR NOT NULL DEFAULT '' , UNIQUE (reader_hostgroup))" @@ -79,6 +79,7 @@ class MySrvC { // MySQL Server Container MyHGC *myhgc; char *address; uint16_t port; + uint16_t gtid_port; uint16_t flags; unsigned int weight; enum MySerStatus status; @@ -101,7 +102,7 @@ class MySrvC { // MySQL Server Container char *comment; MySrvConnList *ConnectionsUsed; MySrvConnList *ConnectionsFree; - MySrvC(char *, uint16_t, unsigned int, enum MySerStatus, unsigned int, unsigned int _max_connections, unsigned int _max_replication_lag, unsigned int _use_ssl, unsigned int _max_latency_ms, char *_comment); + MySrvC(char *, uint16_t, uint16_t, unsigned int, enum MySerStatus, unsigned int, unsigned int _max_connections, unsigned int _max_replication_lag, unsigned int _use_ssl, unsigned int _max_latency_ms, char *_comment); ~MySrvC(); void connect_error(int); void shun_and_killall(); @@ -217,7 +218,7 @@ class MySQL_HostGroups_Manager { ~MySQL_HostGroups_Manager(); void wrlock(); void wrunlock(); - bool server_add(unsigned int hid, char *add, uint16_t p=3306, unsigned int _weight=1, enum MySerStatus status=MYSQL_SERVER_STATUS_ONLINE, unsigned int _comp=0, unsigned int _max_connections=100, unsigned int _max_replication_lag=0, unsigned int _use_ssl=0, unsigned int _max_latency_ms=0, char *comment=NULL); + bool server_add(unsigned int hid, char *add, uint16_t p=3306, uint16_t gp=0, unsigned int _weight=1, enum MySerStatus status=MYSQL_SERVER_STATUS_ONLINE, unsigned int _comp=0, unsigned int _max_connections=100, unsigned int _max_replication_lag=0, unsigned int _use_ssl=0, unsigned int _max_latency_ms=0, char *comment=NULL); int servers_add(SQLite3_result *resultset); // faster version of server_add bool commit(); diff --git a/include/ProxySQL_Cluster.hpp b/include/ProxySQL_Cluster.hpp index b3f94a8b4..1e018ed92 100644 --- a/include/ProxySQL_Cluster.hpp +++ b/include/ProxySQL_Cluster.hpp @@ -8,7 +8,7 @@ #define PROXYSQL_NODE_METRICS_LEN 5 -#define CLUSTER_QUERY_MYSQL_SERVERS "SELECT hostgroup_id, hostname, port, status, weight, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM runtime_mysql_servers WHERE status<>'OFFLINE_HARD'" +#define CLUSTER_QUERY_MYSQL_SERVERS "SELECT hostgroup_id, hostname, port, gtid_port, status, weight, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM runtime_mysql_servers WHERE status<>'OFFLINE_HARD'" #define CLSUTER_QUERY_MYSQL_REPLICATION_HOSTGROUPS "SELECT writer_hostgroup, reader_hostgroup, comment FROM runtime_mysql_replication_hostgroups" class ProxySQL_Checksum_Value_2: public ProxySQL_Checksum_Value { diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 2f7f57b92..161bba560 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -227,9 +227,10 @@ void MySrvConnList::drop_all_connections() { } -MySrvC::MySrvC(char *add, uint16_t p, unsigned int _weight, enum MySerStatus _status, unsigned int _compression /*, uint8_t _charset */, unsigned int _max_connections, unsigned int _max_replication_lag, unsigned int _use_ssl, unsigned int _max_latency_ms, char *_comment) { +MySrvC::MySrvC(char *add, uint16_t p, uint16_t gp, unsigned int _weight, enum MySerStatus _status, unsigned int _compression /*, uint8_t _charset */, unsigned int _max_connections, unsigned int _max_replication_lag, unsigned int _use_ssl, unsigned int _max_latency_ms, char *_comment) { address=strdup(add); port=p; + gtid_port=gp; weight=_weight; status=_status; compression=_compression; @@ -438,26 +439,27 @@ unsigned int MySQL_HostGroups_Manager::get_servers_table_version() { // add a new row in mysql_servers_incoming // we always assume that the calling thread has acquired a rdlock() -bool MySQL_HostGroups_Manager::server_add(unsigned int hid, char *add, uint16_t p, unsigned int _weight, enum MySerStatus status, unsigned int _comp /*, uint8_t _charset */, unsigned int _max_connections, unsigned int _max_replication_lag, unsigned int _use_ssl, unsigned int _max_latency_ms , char *comment) { +bool MySQL_HostGroups_Manager::server_add(unsigned int hid, char *add, uint16_t p, uint16_t gp, unsigned int _weight, enum MySerStatus status, unsigned int _comp /*, uint8_t _charset */, unsigned int _max_connections, unsigned int _max_replication_lag, unsigned int _use_ssl, unsigned int _max_latency_ms , char *comment) { bool ret=true; proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 7, "Adding in mysql_servers_incoming server %s:%d in hostgroup %u with weight %u , status %u, %s compression, max_connections %d, max_replication_lag %u, use_ssl=%u, max_latency_ms=%u\n", add,p,hid,_weight,status, (_comp ? "with" : "without") /*, _charset */ , _max_connections, _max_replication_lag, _use_ssl, _max_latency_ms); int rc; sqlite3_stmt *statement=NULL; sqlite3 *mydb3=mydb->get_db(); - char *query=(char *)"INSERT INTO mysql_servers_incoming VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)"; + char *query=(char *)"INSERT INTO mysql_servers_incoming VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)"; rc=sqlite3_prepare_v2(mydb3, query, -1, &statement, 0); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement, 1, hid); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement, 2, add, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement, 3, p); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement, 4, _weight); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement, 5, status); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement, 6, _comp); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement, 7, _max_connections); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement, 8, _max_replication_lag); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement, 9, _use_ssl); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement, 10, _max_latency_ms); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement, 11, comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement, 4, gp); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement, 5, _weight); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement, 6, status); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement, 7, _comp); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement, 8, _max_connections); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement, 9, _max_replication_lag); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement, 10, _use_ssl); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement, 11, _max_latency_ms); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement, 12, comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); SAFE_SQLITE3_STEP(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); @@ -475,8 +477,8 @@ int MySQL_HostGroups_Manager::servers_add(SQLite3_result *resultset) { sqlite3_stmt *statement1=NULL; sqlite3_stmt *statement32=NULL; sqlite3 *mydb3=mydb->get_db(); - char *query1=(char *)"INSERT INTO mysql_servers_incoming VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)"; - char *query32=(char *)"INSERT INTO mysql_servers_incoming VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11), (?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22), (?23, ?24, ?25, ?26, ?27, ?28, ?29, ?30, ?31, ?32, ?33), (?34, ?35, ?36, ?37, ?38, ?39, ?40, ?41, ?42, ?43, ?44), (?45, ?46, ?47, ?48, ?49, ?50, ?51, ?52, ?53, ?54, ?55),(?56, ?57, ?58, ?59, ?60, ?61, ?62, ?63, ?64, ?65, ?66),(?67, ?68, ?69, ?70, ?71, ?72, ?73, ?74, ?75, ?76, ?77),(?78, ?79, ?80, ?81, ?82, ?83, ?84, ?85, ?86, ?87, ?88),(?89, ?90, ?91, ?92, ?93, ?94, ?95, ?96, ?97, ?98, ?99), (?100, ?101, ?102, ?103, ?104, ?105, ?106, ?107, ?108, ?109, ?110), (?111, ?112, ?113, ?114, ?115, ?116, ?117, ?118, ?119, ?120, ?121), (?122, ?123, ?124, ?125, ?126, ?127, ?128, ?129, ?130, ?131, ?132), (?133, ?134, ?135, ?136, ?137, ?138, ?139, ?140, ?141, ?142, ?143), (?144, ?145, ?146, ?147, ?148, ?149, ?150, ?151, ?152, ?153, ?154), (?155, ?156, ?157, ?158, ?159, ?160, ?161, ?162, ?163, ?164, ?165), (?166, ?167, ?168, ?169, ?170, ?171, ?172, ?173, ?174, ?175, ?176), (?177, ?178, ?179, ?180, ?181, ?182, ?183, ?184, ?185, ?186, ?187), (?188, ?189, ?190, ?191, ?192, ?193, ?194, ?195, ?196, ?197, ?198), (?199, ?200, ?201, ?202, ?203, ?204, ?205, ?206, ?207, ?208, ?209), (?210, ?211, ?212, ?213, ?214, ?215, ?216, ?217, ?218, ?219, ?220), (?221, ?222, ?223, ?224, ?225, ?226, ?227, ?228, ?229, ?230, ?231), (?232, ?233, ?234, ?235, ?236, ?237, ?238, ?239, ?240, ?241, ?242), (?243, ?244, ?245, ?246, ?247, ?248, ?249, ?250, ?251, ?252, ?253), (?254, ?255, ?256, ?257, ?258, ?259, ?260, ?261, ?262, ?263, ?264), (?265, ?266, ?267, ?268, ?269, ?270, ?271, ?272, ?273, ?274, ?275), (?276, ?277, ?278, ?279, ?280, ?281, ?282, ?283, ?284, ?285, ?286), (?287, ?288, ?289, ?290, ?291, ?292, ?293, ?294, ?295, ?296, ?297), (?298, ?299, ?300, ?301, ?302, ?303, ?304, ?305, ?306, ?307, ?308), (?309, ?310, ?311, ?312, ?313, ?314, ?315, ?316, ?317, ?318, ?319), (?320, ?321, ?322, ?323, ?324, ?325, ?326, ?327, ?328, ?329, ?330), (?331, ?332, ?333, ?334, ?335, ?336, ?337, ?338, ?339, ?340, ?341), (?342, ?343, ?344, ?345, ?346, ?347, ?348, ?349, ?350, ?351, ?352)"; + char *query1=(char *)"INSERT INTO mysql_servers_incoming VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)"; + char *query32=(char *)"INSERT INTO mysql_servers_incoming VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12), (?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24), (?25, ?26, ?27, ?28, ?29, ?30, ?31, ?32, ?33, ?34, ?35, ?36), (?37, ?38, ?39, ?40, ?41, ?42, ?43, ?44, ?45, ?46, ?47, ?48), (?49, ?50, ?51, ?52, ?53, ?54, ?55, ?56, ?57, ?58, ?59, ?60), (?61, ?62, ?63, ?64, ?65, ?66, ?67, ?68, ?69, ?70, ?71, ?72), (?73, ?74, ?75, ?76, ?77, ?78, ?79, ?80, ?81, ?82, ?83, ?84), (?85, ?86, ?87, ?88, ?89, ?90, ?91, ?92, ?93, ?94, ?95, ?96), (?97, ?98, ?99, ?100, ?101, ?102, ?103, ?104, ?105, ?106, ?107, ?108), (?109, ?110, ?111, ?112, ?113, ?114, ?115, ?116, ?117, ?118, ?119, ?120), (?121, ?122, ?123, ?124, ?125, ?126, ?127, ?128, ?129, ?130, ?131, ?132), (?133, ?134, ?135, ?136, ?137, ?138, ?139, ?140, ?141, ?142, ?143, ?144), (?145, ?146, ?147, ?148, ?149, ?150, ?151, ?152, ?153, ?154, ?155, ?156), (?157, ?158, ?159, ?160, ?161, ?162, ?163, ?164, ?165, ?166, ?167, ?168), (?169, ?170, ?171, ?172, ?173, ?174, ?175, ?176, ?177, ?178, ?179, ?180), (?181, ?182, ?183, ?184, ?185, ?186, ?187, ?188, ?189, ?190, ?191, ?192), (?193, ?194, ?195, ?196, ?197, ?198, ?199, ?200, ?201, ?202, ?203, ?204), (?205, ?206, ?207, ?208, ?209, ?210, ?211, ?212, ?213, ?214, ?215, ?216), (?217, ?218, ?219, ?220, ?221, ?222, ?223, ?224, ?225, ?226, ?227, ?228), (?229, ?230, ?231, ?232, ?233, ?234, ?235, ?236, ?237, ?238, ?239, ?240), (?241, ?242, ?243, ?244, ?245, ?246, ?247, ?248, ?249, ?250, ?251, ?252), (?253, ?254, ?255, ?256, ?257, ?258, ?259, ?260, ?261, ?262, ?263, ?264), (?265, ?266, ?267, ?268, ?269, ?270, ?271, ?272, ?273, ?274, ?275, ?276), (?277, ?278, ?279, ?280, ?281, ?282, ?283, ?284, ?285, ?286, ?287, ?288), (?289, ?290, ?291, ?292, ?293, ?294, ?295, ?296, ?297, ?298, ?299, ?300), (?301, ?302, ?303, ?304, ?305, ?306, ?307, ?308, ?309, ?310, ?311, ?312), (?313, ?314, ?315, ?316, ?317, ?318, ?319, ?320, ?321, ?322, ?323, ?324), (?325, ?326, ?327, ?328, ?329, ?330, ?331, ?332, ?333, ?334, ?335, ?336), (?337, ?338, ?339, ?340, ?341, ?342, ?343, ?344, ?345, ?346, ?347, ?348), (?349, ?350, ?351, ?352, ?353, ?354, ?355, ?356, ?357, ?358, ?359, ?360), (?361, ?362, ?363, ?364, ?365, ?366, ?367, ?368, ?369, ?370, ?371, ?372), (?373, ?374, ?375, ?376, ?377, ?378, ?379, ?380, ?381, ?382, ?383, ?384)"; rc=sqlite3_prepare_v2(mydb3, query1, -1, &statement1, 0); assert(rc==SQLITE_OK); rc=sqlite3_prepare_v2(mydb3, query32, -1, &statement32, 0); @@ -488,14 +490,14 @@ int MySQL_HostGroups_Manager::servers_add(SQLite3_result *resultset) { for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { SQLite3_row *r1=*it; status1=MYSQL_SERVER_STATUS_ONLINE; - if (strcasecmp(r1->fields[3],"ONLINE")) { - if (!strcasecmp(r1->fields[3],"SHUNNED")) { + if (strcasecmp(r1->fields[4],"ONLINE")) { + if (!strcasecmp(r1->fields[4],"SHUNNED")) { status1=MYSQL_SERVER_STATUS_SHUNNED; } else { - if (!strcasecmp(r1->fields[3],"OFFLINE_SOFT")) { + if (!strcasecmp(r1->fields[4],"OFFLINE_SOFT")) { status1=MYSQL_SERVER_STATUS_OFFLINE_SOFT; } else { - if (!strcasecmp(r1->fields[3],"OFFLINE_HARD")) { + if (!strcasecmp(r1->fields[4],"OFFLINE_HARD")) { status1=MYSQL_SERVER_STATUS_OFFLINE_HARD; } } @@ -503,17 +505,18 @@ int MySQL_HostGroups_Manager::servers_add(SQLite3_result *resultset) { } int idx=row_idx%32; if (row_idxfields[0])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement32, (idx*11)+2, r1->fields[1], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+3, atoi(r1->fields[2])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+4, atoi(r1->fields[4])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+5, status1); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+6, atoi(r1->fields[5])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+7, atoi(r1->fields[6])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+8, atoi(r1->fields[7])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+9, atoi(r1->fields[8])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement32, (idx*11)+11, r1->fields[10], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+1, atoi(r1->fields[0])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement32, (idx*12)+2, r1->fields[1], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+3, atoi(r1->fields[2])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+4, atoi(r1->fields[3])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+5, atoi(r1->fields[5])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+6, status1); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+7, atoi(r1->fields[6])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+8, atoi(r1->fields[7])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+9, atoi(r1->fields[8])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+11, atoi(r1->fields[10])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement32, (idx*12)+12, r1->fields[11], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); if (idx==31) { SAFE_SQLITE3_STEP(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); @@ -523,14 +526,15 @@ int MySQL_HostGroups_Manager::servers_add(SQLite3_result *resultset) { rc=sqlite3_bind_int64(statement1, 1, atoi(r1->fields[0])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 2, r1->fields[1], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 3, atoi(r1->fields[2])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 4, atoi(r1->fields[4])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 5, status1); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 6, atoi(r1->fields[5])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 4, atoi(r1->fields[3])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 5, atoi(r1->fields[5])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 6, status1); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 7, atoi(r1->fields[6])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 8, atoi(r1->fields[7])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 9, atoi(r1->fields[8])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement1, 11, r1->fields[10], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 11, atoi(r1->fields[10])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement1, 12, r1->fields[11], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); SAFE_SQLITE3_STEP(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); @@ -606,11 +610,11 @@ bool MySQL_HostGroups_Manager::commit() { // INSERT OR IGNORE INTO mysql_servers SELECT ... FROM mysql_servers_incoming // proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "INSERT OR IGNORE INTO mysql_servers(hostgroup_id, hostname, port, weight, status, compression, max_connections) SELECT hostgroup_id, hostname, port, weight, status, compression, max_connections FROM mysql_servers_incoming\n"); - mydb->execute("INSERT OR IGNORE INTO mysql_servers(hostgroup_id, hostname, port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment) SELECT hostgroup_id, hostname, port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers_incoming"); + mydb->execute("INSERT OR IGNORE INTO mysql_servers(hostgroup_id, hostname, port, gtid_port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment) SELECT hostgroup_id, hostname, port, gtid_port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers_incoming"); // SELECT FROM mysql_servers whatever is not identical in mysql_servers_incoming, or where mem_pointer=0 (where there is no pointer yet) - query=(char *)"SELECT t1.*, t2.weight, t2.status, t2.compression, t2.max_connections, t2.max_replication_lag, t2.use_ssl, t2.max_latency_ms, t2.comment FROM mysql_servers t1 JOIN mysql_servers_incoming t2 ON (t1.hostgroup_id=t2.hostgroup_id AND t1.hostname=t2.hostname AND t1.port=t2.port) WHERE mem_pointer=0 OR t1.weight<>t2.weight OR t1.status<>t2.status OR t1.compression<>t2.compression OR t1.max_connections<>t2.max_connections OR t1.max_replication_lag<>t2.max_replication_lag OR t1.use_ssl<>t2.use_ssl OR t1.max_latency_ms<>t2.max_latency_ms or t1.comment<>t2.comment"; + query=(char *)"SELECT t1.*, t2.gtid_port, t2.weight, t2.status, t2.compression, t2.max_connections, t2.max_replication_lag, t2.use_ssl, t2.max_latency_ms, t2.comment FROM mysql_servers t1 JOIN mysql_servers_incoming t2 ON (t1.hostgroup_id=t2.hostgroup_id AND t1.hostname=t2.hostname AND t1.port=t2.port) WHERE mem_pointer=0 OR t1.weight<>t2.weight OR t1.status<>t2.status OR t1.compression<>t2.compression OR t1.max_connections<>t2.max_connections OR t1.max_replication_lag<>t2.max_replication_lag OR t1.use_ssl<>t2.use_ssl OR t1.max_latency_ms<>t2.max_latency_ms or t1.comment<>t2.comment"; proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "%s\n", query); mydb->execute_statement(query, &error , &cols , &affected_rows , &resultset); if (error) { @@ -625,18 +629,18 @@ bool MySQL_HostGroups_Manager::commit() { char *query1=(char *)"UPDATE mysql_servers SET mem_pointer = ?1 WHERE hostgroup_id = ?2 AND hostname = ?3 AND port = ?4"; rc=sqlite3_prepare_v2(mydb3, query1, -1, &statement1, 0); assert(rc==SQLITE_OK); - char *query2=(char *)"UPDATE mysql_servers SET weight = ?1 , status = ?2 , compression = ?3 , max_connections = ?4 , max_replication_lag = ?5 , use_ssl = ?6 , max_latency_ms = ?7 , comment = ?8 WHERE hostgroup_id = ?9 AND hostname = ?10 AND port = ?11"; + char *query2=(char *)"UPDATE mysql_servers SET weight = ?1 , status = ?2 , compression = ?3 , max_connections = ?4 , max_replication_lag = ?5 , use_ssl = ?6 , max_latency_ms = ?7 , comment = ?8 , gtid_port = ?9 WHERE hostgroup_id = ?10 AND hostname = ?11 AND port = ?12"; rc=sqlite3_prepare_v2(mydb3, query2, -1, &statement2, 0); assert(rc==SQLITE_OK); for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { SQLite3_row *r=*it; - long long ptr=atoll(r->fields[11]); // increase this index every time a new column is added + long long ptr=atoll(r->fields[12]); // increase this index every time a new column is added proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Server %s:%d , weight=%d, status=%d, mem_pointer=%llu, hostgroup=%d, compression=%d\n", r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]), (MySerStatus) atoi(r->fields[4]), ptr, atoi(r->fields[0]), atoi(r->fields[5])); //fprintf(stderr,"%lld\n", ptr); if (ptr==0) { proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Creating new server %s:%d , weight=%d, status=%d, compression=%d\n", r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]), (MySerStatus) atoi(r->fields[4]), atoi(r->fields[5]) ); - MySrvC *mysrvc=new MySrvC(r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]), (MySerStatus) atoi(r->fields[4]), atoi(r->fields[5]), atoi(r->fields[6]), atoi(r->fields[7]), atoi(r->fields[8]), atoi(r->fields[9]), r->fields[10]); // add new fields here if adding more columns in mysql_servers + MySrvC *mysrvc=new MySrvC(r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]), atoi(r->fields[4]), (MySerStatus) atoi(r->fields[5]), atoi(r->fields[6]), atoi(r->fields[7]), atoi(r->fields[8]), atoi(r->fields[9]), atoi(r->fields[10]), r->fields[11]); // add new fields here if adding more columns in mysql_servers proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Adding new server %s:%d , weight=%d, status=%d, mem_ptr=%p into hostgroup=%d\n", r->fields[1], atoi(r->fields[2]), atoi(r->fields[3]), (MySerStatus) atoi(r->fields[4]), mysrvc, atoi(r->fields[0])); add(mysrvc,atoi(r->fields[0])); ptr=(uintptr_t)mysrvc; @@ -651,41 +655,46 @@ bool MySQL_HostGroups_Manager::commit() { bool run_update=false; MySrvC *mysrvc=(MySrvC *)ptr; // carefully increase the 2nd index by 1 for every new column added - if (atoi(r->fields[3])!=atoi(r->fields[12])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing weight for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[3] , mysrvc->weight , atoi(r->fields[12])); + if (atoi(r->fields[4])!=atoi(r->fields[12])) { + proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing gtid_port for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[4] , mysrvc->gtid_port , atoi(r->fields[12])); mysrvc->weight=atoi(r->fields[12]); } - if (atoi(r->fields[4])!=atoi(r->fields[13])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing status for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[4] , mysrvc->status , atoi(r->fields[13])); - mysrvc->status=(MySerStatus)atoi(r->fields[13]); + + if (atoi(r->fields[5])!=atoi(r->fields[13])) { + proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing weight for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[5] , mysrvc->weight , atoi(r->fields[13])); + mysrvc->weight=atoi(r->fields[13]); + } + if (atoi(r->fields[6])!=atoi(r->fields[14])) { + proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing status for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[6] , mysrvc->status , atoi(r->fields[14])); + mysrvc->status=(MySerStatus)atoi(r->fields[14]); if (mysrvc->status==MYSQL_SERVER_STATUS_SHUNNED) { mysrvc->shunned_automatic=false; } } - if (atoi(r->fields[5])!=atoi(r->fields[14])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing compression for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[5] , mysrvc->compression , atoi(r->fields[14])); - mysrvc->compression=atoi(r->fields[14]); + if (atoi(r->fields[7])!=atoi(r->fields[15])) { + proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing compression for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[7] , mysrvc->compression , atoi(r->fields[15])); + mysrvc->compression=atoi(r->fields[15]); } - if (atoi(r->fields[6])!=atoi(r->fields[15])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing max_connections for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[6] , mysrvc->max_connections , atoi(r->fields[15])); - mysrvc->max_connections=atoi(r->fields[15]); + if (atoi(r->fields[8])!=atoi(r->fields[16])) { + proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing max_connections for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[8] , mysrvc->max_connections , atoi(r->fields[16])); + mysrvc->max_connections=atoi(r->fields[16]); } - if (atoi(r->fields[7])!=atoi(r->fields[16])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing max_replication_lag for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[7] , mysrvc->max_replication_lag , atoi(r->fields[16])); - mysrvc->max_replication_lag=atoi(r->fields[16]); + if (atoi(r->fields[9])!=atoi(r->fields[17])) { + proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing max_replication_lag for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[9] , mysrvc->max_replication_lag , atoi(r->fields[17])); + mysrvc->max_replication_lag=atoi(r->fields[17]); } - if (atoi(r->fields[8])!=atoi(r->fields[17])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing use_ssl for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[8] , mysrvc->use_ssl , atoi(r->fields[17])); - mysrvc->use_ssl=atoi(r->fields[17]); + if (atoi(r->fields[10])!=atoi(r->fields[18])) { + proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing use_ssl for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[10] , mysrvc->use_ssl , atoi(r->fields[18])); + mysrvc->use_ssl=atoi(r->fields[18]); } - if (atoi(r->fields[9])!=atoi(r->fields[18])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing max_latency_ms for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[9] , mysrvc->max_latency_us , atoi(r->fields[18])); - mysrvc->max_latency_us=1000*atoi(r->fields[18]); + if (atoi(r->fields[11])!=atoi(r->fields[18])) { + proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing max_latency_ms for server %s:%d (%s:%d) from %d (%d) to %d\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[11] , mysrvc->max_latency_us , atoi(r->fields[19])); + mysrvc->max_latency_us=1000*atoi(r->fields[19]); } - if (strcmp(r->fields[10],r->fields[19])) { - proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing comment for server %s:%d (%s:%d) from '%s' to '%s'\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[10], r->fields[19]); + if (strcmp(r->fields[12],r->fields[20])) { + proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 5, "Changing comment for server %s:%d (%s:%d) from '%s' to '%s'\n" , mysrvc->address, mysrvc->port, r->fields[1], atoi(r->fields[2]), r->fields[12], r->fields[20]); free(mysrvc->comment); - mysrvc->comment=strdup(r->fields[19]); + mysrvc->comment=strdup(r->fields[20]); } if (run_update) { rc=sqlite3_bind_int64(statement2, 1, mysrvc->weight); assert(rc==SQLITE_OK); @@ -695,11 +704,11 @@ bool MySQL_HostGroups_Manager::commit() { rc=sqlite3_bind_int64(statement2, 5, mysrvc->max_replication_lag); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement2, 6, mysrvc->use_ssl); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement2, 7, mysrvc->max_latency_us/1000); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement2, 8, mysrvc->comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement2, 9, mysrvc->myhgc->hid); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement2, 10, mysrvc->address, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement2, 11, mysrvc->port); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement2, 9, mysrvc->gtid_port); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement2, 10, mysrvc->myhgc->hid); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement2, 11, mysrvc->address, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement2, 12, mysrvc->port); assert(rc==SQLITE_OK); SAFE_SQLITE3_STEP(statement2); rc=sqlite3_clear_bindings(statement2); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement2); assert(rc==SQLITE_OK); @@ -786,7 +795,7 @@ bool MySQL_HostGroups_Manager::commit() { int cols=0; int affected_rows=0; SQLite3_result *resultset=NULL; - char *query=(char *)"SELECT hostgroup_id, hostname, port, CASE status WHEN 0 OR 1 OR 4 THEN 0 ELSE status END status, weight, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers WHERE status<>3 ORDER BY hostgroup_id, hostname, port"; + char *query=(char *)"SELECT hostgroup_id, hostname, port, gtid_port, CASE status WHEN 0 OR 1 OR 4 THEN 0 ELSE status END status, weight, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers WHERE status<>3 ORDER BY hostgroup_id, hostname, port"; mydb->execute_statement(query, &error , &cols , &affected_rows , &resultset); if (resultset) { if (resultset->rows_count) { @@ -939,7 +948,7 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table(int *_onlyhg) { st=(char *)"SHUNNED"; break; } - fprintf(stderr,"HID: %d , address: %s , port: %d , weight: %d , status: %s , max_connections: %u , max_replication_lag: %u , use_ssl: %u , max_latency_ms: %u , comment: %s\n", mysrvc->myhgc->hid, mysrvc->address, mysrvc->port, mysrvc->weight, st, mysrvc->max_connections, mysrvc->max_replication_lag, mysrvc->use_ssl, mysrvc->max_latency_us*1000, mysrvc->comment); + fprintf(stderr,"HID: %d , address: %s , port: %d , gtid_port: %d , weight: %d , status: %s , max_connections: %u , max_replication_lag: %u , use_ssl: %u , max_latency_ms: %u , comment: %s\n", mysrvc->myhgc->hid, mysrvc->address, mysrvc->port, mysrvc->gtid_port, mysrvc->weight, st, mysrvc->max_connections, mysrvc->max_replication_lag, mysrvc->use_ssl, mysrvc->max_latency_us*1000, mysrvc->comment); } lst->add(mysrvc); if (lst->len==32) { @@ -948,18 +957,19 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table(int *_onlyhg) { i--; MySrvC *mysrvc=(MySrvC *)lst->remove_index_fast(0); uintptr_t ptr=(uintptr_t)mysrvc; - rc=sqlite3_bind_int64(statement32, (i*12)+1, mysrvc->myhgc->hid); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement32, (i*12)+2, mysrvc->address, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (i*12)+3, mysrvc->port); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (i*12)+4, mysrvc->weight); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (i*12)+5, mysrvc->status); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (i*12)+6, mysrvc->compression); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (i*12)+7, mysrvc->max_connections); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (i*12)+8, mysrvc->max_replication_lag); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (i*12)+9, mysrvc->use_ssl); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (i*12)+10, mysrvc->max_latency_us/1000); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement32, (i*12)+11, mysrvc->comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (i*12)+12, ptr); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+1, mysrvc->myhgc->hid); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement32, (i*13)+2, mysrvc->address, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+3, mysrvc->port); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+4, mysrvc->gtid_port); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+5, mysrvc->weight); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+6, mysrvc->status); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+7, mysrvc->compression); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+8, mysrvc->max_connections); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+9, mysrvc->max_replication_lag); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+10, mysrvc->use_ssl); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+11, mysrvc->max_latency_us/1000); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement32, (i*13)+12, mysrvc->comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (i*13)+13, ptr); assert(rc==SQLITE_OK); } SAFE_SQLITE3_STEP(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); @@ -973,15 +983,16 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table(int *_onlyhg) { rc=sqlite3_bind_int64(statement1, 1, mysrvc->myhgc->hid); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 2, mysrvc->address, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 3, mysrvc->port); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 4, mysrvc->weight); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 5, mysrvc->status); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 6, mysrvc->compression); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 7, mysrvc->max_connections); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 8, mysrvc->max_replication_lag); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 9, mysrvc->use_ssl); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 10, mysrvc->max_latency_us/1000); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement1, 11, mysrvc->comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 12, ptr); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 4, mysrvc->gtid_port); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 5, mysrvc->weight); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 6, mysrvc->status); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 7, mysrvc->compression); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 8, mysrvc->max_connections); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 9, mysrvc->max_replication_lag); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 10, mysrvc->use_ssl); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 11, mysrvc->max_latency_us/1000); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement1, 12, mysrvc->comment, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 13, ptr); assert(rc==SQLITE_OK); SAFE_SQLITE3_STEP(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); @@ -1148,7 +1159,7 @@ SQLite3_result * MySQL_HostGroups_Manager::dump_table_mysql_servers() { int cols=0; int affected_rows=0; SQLite3_result *resultset=NULL; - char *query=(char *)"SELECT hostgroup_id, hostname, port, weight, CASE status WHEN 0 THEN \"ONLINE\" WHEN 1 THEN \"SHUNNED\" WHEN 2 THEN \"OFFLINE_SOFT\" WHEN 3 THEN \"OFFLINE_HARD\" WHEN 4 THEN \"SHUNNED\" END, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers"; + char *query=(char *)"SELECT hostgroup_id, hostname, port, gtid_port, weight, CASE status WHEN 0 THEN \"ONLINE\" WHEN 1 THEN \"SHUNNED\" WHEN 2 THEN \"OFFLINE_SOFT\" WHEN 3 THEN \"OFFLINE_HARD\" WHEN 4 THEN \"SHUNNED\" END, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers"; proxy_debug(PROXY_DEBUG_MYSQL_CONNPOOL, 4, "%s\n", query); mydb->execute_statement(query, &error , &cols , &affected_rows , &resultset); wrunlock(); @@ -1743,7 +1754,7 @@ void MySQL_HostGroups_Manager::read_only_action(char *hostname, int port, int re const char *Q1B=(char *)"SELECT hostgroup_id,status FROM ( SELECT DISTINCT writer_hostgroup FROM mysql_replication_hostgroups JOIN mysql_servers WHERE (hostgroup_id=writer_hostgroup OR reader_hostgroup=hostgroup_id) AND hostname='%s' AND port=%d ) LEFT JOIN mysql_servers ON hostgroup_id=writer_hostgroup AND hostname='%s' AND port=%d"; const char *Q2A=(char *)"DELETE FROM mysql_servers WHERE hostname='%s' AND port=%d AND hostgroup_id IN (SELECT writer_hostgroup FROM mysql_replication_hostgroups WHERE writer_hostgroup=mysql_servers.hostgroup_id) AND status='OFFLINE_HARD'"; const char *Q2B=(char *)"UPDATE OR IGNORE mysql_servers SET hostgroup_id=(SELECT writer_hostgroup FROM mysql_replication_hostgroups WHERE reader_hostgroup=mysql_servers.hostgroup_id) WHERE hostname='%s' AND port=%d AND hostgroup_id IN (SELECT reader_hostgroup FROM mysql_replication_hostgroups WHERE reader_hostgroup=mysql_servers.hostgroup_id)"; - const char *Q3A=(char *)"INSERT OR IGNORE INTO mysql_servers(hostgroup_id, hostname, port, status, weight, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment) SELECT reader_hostgroup, hostname, port, status, weight, max_connections, max_replication_lag, use_ssl, max_latency_ms, mysql_servers.comment FROM mysql_servers JOIN mysql_replication_hostgroups ON mysql_servers.hostgroup_id=mysql_replication_hostgroups.writer_hostgroup WHERE hostname='%s' AND port=%d"; + const char *Q3A=(char *)"INSERT OR IGNORE INTO mysql_servers(hostgroup_id, hostname, port, gtid_port, status, weight, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment) SELECT reader_hostgroup, hostname, port, gtid_port, status, weight, max_connections, max_replication_lag, use_ssl, max_latency_ms, mysql_servers.comment FROM mysql_servers JOIN mysql_replication_hostgroups ON mysql_servers.hostgroup_id=mysql_replication_hostgroups.writer_hostgroup WHERE hostname='%s' AND port=%d"; const char *Q3B=(char *)"DELETE FROM mysql_servers WHERE hostname='%s' AND port=%d AND hostgroup_id IN (SELECT reader_hostgroup FROM mysql_replication_hostgroups WHERE reader_hostgroup=mysql_servers.hostgroup_id)"; const char *Q4=(char *)"UPDATE OR IGNORE mysql_servers SET hostgroup_id=(SELECT reader_hostgroup FROM mysql_replication_hostgroups WHERE writer_hostgroup=mysql_servers.hostgroup_id) WHERE hostname='%s' AND port=%d AND hostgroup_id IN (SELECT writer_hostgroup FROM mysql_replication_hostgroups WHERE writer_hostgroup=mysql_servers.hostgroup_id)"; const char *Q5=(char *)"DELETE FROM mysql_servers WHERE hostname='%s' AND port=%d AND hostgroup_id IN (SELECT writer_hostgroup FROM mysql_replication_hostgroups WHERE writer_hostgroup=mysql_servers.hostgroup_id)"; @@ -2240,7 +2251,7 @@ void MySQL_HostGroups_Manager::update_group_replication_set_offline(char *_hostn proxy_warning("Group Replication: setting host %s:%d offline because: %s\n", _hostname, _port, _error); GloAdmin->mysql_servers_wrlock(); mydb->execute("DELETE FROM mysql_servers_incoming"); - mydb->execute("INSERT INTO mysql_servers_incoming SELECT hostgroup_id, hostname, port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers"); + mydb->execute("INSERT INTO mysql_servers_incoming SELECT hostgroup_id, hostname, port, gtid_port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers"); q=(char *)"UPDATE OR IGNORE mysql_servers_incoming SET hostgroup_id=(SELECT offline_hostgroup FROM mysql_group_replication_hostgroups WHERE writer_hostgroup=%d) WHERE hostname='%s' AND port=%d AND hostgroup_id<>(SELECT offline_hostgroup FROM mysql_group_replication_hostgroups WHERE writer_hostgroup=%d)"; query=(char *)malloc(strlen(q)+strlen(_hostname)+64); sprintf(query,q,_writer_hostgroup,_hostname,_port,_writer_hostgroup); @@ -2316,7 +2327,7 @@ void MySQL_HostGroups_Manager::update_group_replication_set_read_only(char *_hos proxy_warning("Group Replication: setting host %s:%d (part of cluster with writer_hostgroup=%d) in read_only because: %s\n", _hostname, _port, _writer_hostgroup, _error); GloAdmin->mysql_servers_wrlock(); mydb->execute("DELETE FROM mysql_servers_incoming"); - mydb->execute("INSERT INTO mysql_servers_incoming SELECT hostgroup_id, hostname, port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers"); + mydb->execute("INSERT INTO mysql_servers_incoming SELECT hostgroup_id, hostname, port, gtid_port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers"); q=(char *)"UPDATE OR IGNORE mysql_servers_incoming SET hostgroup_id=(SELECT reader_hostgroup FROM mysql_group_replication_hostgroups WHERE writer_hostgroup=%d) WHERE hostname='%s' AND port=%d AND hostgroup_id<>(SELECT reader_hostgroup FROM mysql_group_replication_hostgroups WHERE writer_hostgroup=%d)"; query=(char *)malloc(strlen(q)+strlen(_hostname)+64); sprintf(query,q,_writer_hostgroup,_hostname,_port,_writer_hostgroup); @@ -2439,7 +2450,7 @@ void MySQL_HostGroups_Manager::update_group_replication_set_writer(char *_hostna GloAdmin->mysql_servers_wrlock(); mydb->execute("DELETE FROM mysql_servers_incoming"); - mydb->execute("INSERT INTO mysql_servers_incoming SELECT hostgroup_id, hostname, port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers"); + mydb->execute("INSERT INTO mysql_servers_incoming SELECT hostgroup_id, hostname, port, gtid_port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers"); q=(char *)"UPDATE OR IGNORE mysql_servers_incoming SET hostgroup_id=%d WHERE hostname='%s' AND port=%d AND hostgroup_id<>%d"; query=(char *)malloc(strlen(q)+strlen(_hostname)+256); sprintf(query,q,_writer_hostgroup,_hostname,_port,_writer_hostgroup); @@ -2456,7 +2467,7 @@ void MySQL_HostGroups_Manager::update_group_replication_set_writer(char *_hostna mydb->execute(query); //free(query); if (writer_is_also_reader && read_HG>=0) { - q=(char *)"INSERT OR IGNORE INTO mysql_servers_incoming (hostgroup_id,hostname,port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment) SELECT %d,hostname,port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment FROM mysql_servers_incoming WHERE hostgroup_id=%d AND hostname='%s' AND port=%d"; + q=(char *)"INSERT OR IGNORE INTO mysql_servers_incoming (hostgroup_id,hostname,port,gtid_port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment) SELECT %d,hostname,port,gtid_port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment FROM mysql_servers_incoming WHERE hostgroup_id=%d AND hostname='%s' AND port=%d"; sprintf(query,q,read_HG,_writer_hostgroup,_hostname,_port); mydb->execute(query); } diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index d886a40bf..15760d139 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -180,7 +180,11 @@ static int http_handler(void *cls, struct MHD_Connection *connection, const char // mysql_servers in v1.4.4 #define ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V1_4_4 "CREATE TABLE mysql_servers (hostgroup_id INT CHECK (hostgroup_id>=0) NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" -#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V1_4_4 + +// mysql_servers in v2.0.0 +#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V2_0_0 "CREATE TABLE mysql_servers (hostgroup_id INT CHECK (hostgroup_id>=0) NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_port INT NOT NULL DEFAULT 0 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" + +#define ADMIN_SQLITE_TABLE_MYSQL_SERVERS ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V2_0_0 #define ADMIN_SQLITE_TABLE_MYSQL_USERS_V1_3_0 "CREATE TABLE mysql_users (username VARCHAR NOT NULL , password VARCHAR , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0 , default_hostgroup INT NOT NULL DEFAULT 0 , default_schema VARCHAR , schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0 , transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 0 , fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0 , backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1 , frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000 , PRIMARY KEY (username, backend) , UNIQUE (username, frontend))" #define ADMIN_SQLITE_TABLE_MYSQL_USERS_V1_4_0 "CREATE TABLE mysql_users (username VARCHAR NOT NULL , password VARCHAR , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0 , default_hostgroup INT NOT NULL DEFAULT 0 , default_schema VARCHAR , schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0 , transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 1 , fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0 , backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1 , frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000 , PRIMARY KEY (username, backend) , UNIQUE (username, frontend))" @@ -248,7 +252,7 @@ static int http_handler(void *cls, struct MHD_Connection *connection, const char #define ADMIN_SQLITE_TABLE_SCHEDULER_V1_2_2c "CREATE TABLE scheduler (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL , filename VARCHAR NOT NULL , arg1 VARCHAR , arg2 VARCHAR , arg3 VARCHAR , arg4 VARCHAR , arg5 VARCHAR , comment VARCHAR NOT NULL DEFAULT '')" -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_SERVERS "CREATE TABLE runtime_mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" +#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_SERVERS "CREATE TABLE runtime_mysql_servers (hostgroup_id INT NOT NULL DEFAULT 0 , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT 3306 , gtid_port INT NOT NULL DEFAULT 0 , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1 , compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0 , max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000 , max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0 , use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0 , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0 , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )" #define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_REPLICATION_HOSTGROUPS "CREATE TABLE runtime_mysql_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0) , check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only')) NOT NULL DEFAULT 'read_only' , comment VARCHAR NOT NULL DEFAULT '' , UNIQUE (reader_hostgroup))" @@ -6481,7 +6485,6 @@ void ProxySQL_Admin::stats___mysql_users() { void ProxySQL_Admin::save_scheduler_runtime_to_database(bool _runtime) { char *query=NULL; - // dump mysql_servers if (_runtime) { query=(char *)"DELETE FROM main.runtime_scheduler"; } else { @@ -6584,11 +6587,11 @@ void ProxySQL_Admin::save_mysql_servers_runtime_to_database(bool _runtime) { char *query1=NULL; char *query32=NULL; if (_runtime) { - query1=(char *)"INSERT INTO runtime_mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)"; - query32=(char *)"INSERT INTO runtime_mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11), (?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22), (?23, ?24, ?25, ?26, ?27, ?28, ?29, ?30, ?31, ?32, ?33), (?34, ?35, ?36, ?37, ?38, ?39, ?40, ?41, ?42, ?43, ?44), (?45, ?46, ?47, ?48, ?49, ?50, ?51, ?52, ?53, ?54, ?55),(?56, ?57, ?58, ?59, ?60, ?61, ?62, ?63, ?64, ?65, ?66),(?67, ?68, ?69, ?70, ?71, ?72, ?73, ?74, ?75, ?76, ?77),(?78, ?79, ?80, ?81, ?82, ?83, ?84, ?85, ?86, ?87, ?88),(?89, ?90, ?91, ?92, ?93, ?94, ?95, ?96, ?97, ?98, ?99), (?100, ?101, ?102, ?103, ?104, ?105, ?106, ?107, ?108, ?109, ?110), (?111, ?112, ?113, ?114, ?115, ?116, ?117, ?118, ?119, ?120, ?121), (?122, ?123, ?124, ?125, ?126, ?127, ?128, ?129, ?130, ?131, ?132), (?133, ?134, ?135, ?136, ?137, ?138, ?139, ?140, ?141, ?142, ?143), (?144, ?145, ?146, ?147, ?148, ?149, ?150, ?151, ?152, ?153, ?154), (?155, ?156, ?157, ?158, ?159, ?160, ?161, ?162, ?163, ?164, ?165), (?166, ?167, ?168, ?169, ?170, ?171, ?172, ?173, ?174, ?175, ?176), (?177, ?178, ?179, ?180, ?181, ?182, ?183, ?184, ?185, ?186, ?187), (?188, ?189, ?190, ?191, ?192, ?193, ?194, ?195, ?196, ?197, ?198), (?199, ?200, ?201, ?202, ?203, ?204, ?205, ?206, ?207, ?208, ?209), (?210, ?211, ?212, ?213, ?214, ?215, ?216, ?217, ?218, ?219, ?220), (?221, ?222, ?223, ?224, ?225, ?226, ?227, ?228, ?229, ?230, ?231), (?232, ?233, ?234, ?235, ?236, ?237, ?238, ?239, ?240, ?241, ?242), (?243, ?244, ?245, ?246, ?247, ?248, ?249, ?250, ?251, ?252, ?253), (?254, ?255, ?256, ?257, ?258, ?259, ?260, ?261, ?262, ?263, ?264), (?265, ?266, ?267, ?268, ?269, ?270, ?271, ?272, ?273, ?274, ?275), (?276, ?277, ?278, ?279, ?280, ?281, ?282, ?283, ?284, ?285, ?286), (?287, ?288, ?289, ?290, ?291, ?292, ?293, ?294, ?295, ?296, ?297), (?298, ?299, ?300, ?301, ?302, ?303, ?304, ?305, ?306, ?307, ?308), (?309, ?310, ?311, ?312, ?313, ?314, ?315, ?316, ?317, ?318, ?319), (?320, ?321, ?322, ?323, ?324, ?325, ?326, ?327, ?328, ?329, ?330), (?331, ?332, ?333, ?334, ?335, ?336, ?337, ?338, ?339, ?340, ?341), (?342, ?343, ?344, ?345, ?346, ?347, ?348, ?349, ?350, ?351, ?352)"; + query1=(char *)"INSERT INTO runtime_mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)"; + query32=(char *)"INSERT INTO runtime_mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12), (?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24), (?25, ?26, ?27, ?28, ?29, ?30, ?31, ?32, ?33, ?34, ?35, ?36), (?37, ?38, ?39, ?40, ?41, ?42, ?43, ?44, ?45, ?46, ?47, ?48), (?49, ?50, ?51, ?52, ?53, ?54, ?55, ?56, ?57, ?58, ?59, ?60), (?61, ?62, ?63, ?64, ?65, ?66, ?67, ?68, ?69, ?70, ?71, ?72), (?73, ?74, ?75, ?76, ?77, ?78, ?79, ?80, ?81, ?82, ?83, ?84), (?85, ?86, ?87, ?88, ?89, ?90, ?91, ?92, ?93, ?94, ?95, ?96), (?97, ?98, ?99, ?100, ?101, ?102, ?103, ?104, ?105, ?106, ?107, ?108), (?109, ?110, ?111, ?112, ?113, ?114, ?115, ?116, ?117, ?118, ?119, ?120), (?121, ?122, ?123, ?124, ?125, ?126, ?127, ?128, ?129, ?130, ?131, ?132), (?133, ?134, ?135, ?136, ?137, ?138, ?139, ?140, ?141, ?142, ?143, ?144), (?145, ?146, ?147, ?148, ?149, ?150, ?151, ?152, ?153, ?154, ?155, ?156), (?157, ?158, ?159, ?160, ?161, ?162, ?163, ?164, ?165, ?166, ?167, ?168), (?169, ?170, ?171, ?172, ?173, ?174, ?175, ?176, ?177, ?178, ?179, ?180), (?181, ?182, ?183, ?184, ?185, ?186, ?187, ?188, ?189, ?190, ?191, ?192), (?193, ?194, ?195, ?196, ?197, ?198, ?199, ?200, ?201, ?202, ?203, ?204), (?205, ?206, ?207, ?208, ?209, ?210, ?211, ?212, ?213, ?214, ?215, ?216), (?217, ?218, ?219, ?220, ?221, ?222, ?223, ?224, ?225, ?226, ?227, ?228), (?229, ?230, ?231, ?232, ?233, ?234, ?235, ?236, ?237, ?238, ?239, ?240), (?241, ?242, ?243, ?244, ?245, ?246, ?247, ?248, ?249, ?250, ?251, ?252), (?253, ?254, ?255, ?256, ?257, ?258, ?259, ?260, ?261, ?262, ?263, ?264), (?265, ?266, ?267, ?268, ?269, ?270, ?271, ?272, ?273, ?274, ?275, ?276), (?277, ?278, ?279, ?280, ?281, ?282, ?283, ?284, ?285, ?286, ?287, ?288), (?289, ?290, ?291, ?292, ?293, ?294, ?295, ?296, ?297, ?298, ?299, ?300), (?301, ?302, ?303, ?304, ?305, ?306, ?307, ?308, ?309, ?310, ?311, ?312), (?313, ?314, ?315, ?316, ?317, ?318, ?319, ?320, ?321, ?322, ?323, ?324), (?325, ?326, ?327, ?328, ?329, ?330, ?331, ?332, ?333, ?334, ?335, ?336), (?337, ?338, ?339, ?340, ?341, ?342, ?343, ?344, ?345, ?346, ?347, ?348), (?349, ?350, ?351, ?352, ?353, ?354, ?355, ?356, ?357, ?358, ?359, ?360), (?361, ?362, ?363, ?364, ?365, ?366, ?367, ?368, ?369, ?370, ?371, ?372), (?373, ?374, ?375, ?376, ?377, ?378, ?379, ?380, ?381, ?382, ?383, ?384)"; } else { - query1=(char *)"INSERT INTO mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)"; - query32=(char *)"INSERT INTO mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11), (?12, ?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22), (?23, ?24, ?25, ?26, ?27, ?28, ?29, ?30, ?31, ?32, ?33), (?34, ?35, ?36, ?37, ?38, ?39, ?40, ?41, ?42, ?43, ?44), (?45, ?46, ?47, ?48, ?49, ?50, ?51, ?52, ?53, ?54, ?55),(?56, ?57, ?58, ?59, ?60, ?61, ?62, ?63, ?64, ?65, ?66),(?67, ?68, ?69, ?70, ?71, ?72, ?73, ?74, ?75, ?76, ?77),(?78, ?79, ?80, ?81, ?82, ?83, ?84, ?85, ?86, ?87, ?88),(?89, ?90, ?91, ?92, ?93, ?94, ?95, ?96, ?97, ?98, ?99), (?100, ?101, ?102, ?103, ?104, ?105, ?106, ?107, ?108, ?109, ?110), (?111, ?112, ?113, ?114, ?115, ?116, ?117, ?118, ?119, ?120, ?121), (?122, ?123, ?124, ?125, ?126, ?127, ?128, ?129, ?130, ?131, ?132), (?133, ?134, ?135, ?136, ?137, ?138, ?139, ?140, ?141, ?142, ?143), (?144, ?145, ?146, ?147, ?148, ?149, ?150, ?151, ?152, ?153, ?154), (?155, ?156, ?157, ?158, ?159, ?160, ?161, ?162, ?163, ?164, ?165), (?166, ?167, ?168, ?169, ?170, ?171, ?172, ?173, ?174, ?175, ?176), (?177, ?178, ?179, ?180, ?181, ?182, ?183, ?184, ?185, ?186, ?187), (?188, ?189, ?190, ?191, ?192, ?193, ?194, ?195, ?196, ?197, ?198), (?199, ?200, ?201, ?202, ?203, ?204, ?205, ?206, ?207, ?208, ?209), (?210, ?211, ?212, ?213, ?214, ?215, ?216, ?217, ?218, ?219, ?220), (?221, ?222, ?223, ?224, ?225, ?226, ?227, ?228, ?229, ?230, ?231), (?232, ?233, ?234, ?235, ?236, ?237, ?238, ?239, ?240, ?241, ?242), (?243, ?244, ?245, ?246, ?247, ?248, ?249, ?250, ?251, ?252, ?253), (?254, ?255, ?256, ?257, ?258, ?259, ?260, ?261, ?262, ?263, ?264), (?265, ?266, ?267, ?268, ?269, ?270, ?271, ?272, ?273, ?274, ?275), (?276, ?277, ?278, ?279, ?280, ?281, ?282, ?283, ?284, ?285, ?286), (?287, ?288, ?289, ?290, ?291, ?292, ?293, ?294, ?295, ?296, ?297), (?298, ?299, ?300, ?301, ?302, ?303, ?304, ?305, ?306, ?307, ?308), (?309, ?310, ?311, ?312, ?313, ?314, ?315, ?316, ?317, ?318, ?319), (?320, ?321, ?322, ?323, ?324, ?325, ?326, ?327, ?328, ?329, ?330), (?331, ?332, ?333, ?334, ?335, ?336, ?337, ?338, ?339, ?340, ?341), (?342, ?343, ?344, ?345, ?346, ?347, ?348, ?349, ?350, ?351, ?352)"; + query1=(char *)"INSERT INTO mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)"; + query32=(char *)"INSERT INTO mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12), (?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24), (?25, ?26, ?27, ?28, ?29, ?30, ?31, ?32, ?33, ?34, ?35, ?36), (?37, ?38, ?39, ?40, ?41, ?42, ?43, ?44, ?45, ?46, ?47, ?48), (?49, ?50, ?51, ?52, ?53, ?54, ?55, ?56, ?57, ?58, ?59, ?60), (?61, ?62, ?63, ?64, ?65, ?66, ?67, ?68, ?69, ?70, ?71, ?72), (?73, ?74, ?75, ?76, ?77, ?78, ?79, ?80, ?81, ?82, ?83, ?84), (?85, ?86, ?87, ?88, ?89, ?90, ?91, ?92, ?93, ?94, ?95, ?96), (?97, ?98, ?99, ?100, ?101, ?102, ?103, ?104, ?105, ?106, ?107, ?108), (?109, ?110, ?111, ?112, ?113, ?114, ?115, ?116, ?117, ?118, ?119, ?120), (?121, ?122, ?123, ?124, ?125, ?126, ?127, ?128, ?129, ?130, ?131, ?132), (?133, ?134, ?135, ?136, ?137, ?138, ?139, ?140, ?141, ?142, ?143, ?144), (?145, ?146, ?147, ?148, ?149, ?150, ?151, ?152, ?153, ?154, ?155, ?156), (?157, ?158, ?159, ?160, ?161, ?162, ?163, ?164, ?165, ?166, ?167, ?168), (?169, ?170, ?171, ?172, ?173, ?174, ?175, ?176, ?177, ?178, ?179, ?180), (?181, ?182, ?183, ?184, ?185, ?186, ?187, ?188, ?189, ?190, ?191, ?192), (?193, ?194, ?195, ?196, ?197, ?198, ?199, ?200, ?201, ?202, ?203, ?204), (?205, ?206, ?207, ?208, ?209, ?210, ?211, ?212, ?213, ?214, ?215, ?216), (?217, ?218, ?219, ?220, ?221, ?222, ?223, ?224, ?225, ?226, ?227, ?228), (?229, ?230, ?231, ?232, ?233, ?234, ?235, ?236, ?237, ?238, ?239, ?240), (?241, ?242, ?243, ?244, ?245, ?246, ?247, ?248, ?249, ?250, ?251, ?252), (?253, ?254, ?255, ?256, ?257, ?258, ?259, ?260, ?261, ?262, ?263, ?264), (?265, ?266, ?267, ?268, ?269, ?270, ?271, ?272, ?273, ?274, ?275, ?276), (?277, ?278, ?279, ?280, ?281, ?282, ?283, ?284, ?285, ?286, ?287, ?288), (?289, ?290, ?291, ?292, ?293, ?294, ?295, ?296, ?297, ?298, ?299, ?300), (?301, ?302, ?303, ?304, ?305, ?306, ?307, ?308, ?309, ?310, ?311, ?312), (?313, ?314, ?315, ?316, ?317, ?318, ?319, ?320, ?321, ?322, ?323, ?324), (?325, ?326, ?327, ?328, ?329, ?330, ?331, ?332, ?333, ?334, ?335, ?336), (?337, ?338, ?339, ?340, ?341, ?342, ?343, ?344, ?345, ?346, ?347, ?348), (?349, ?350, ?351, ?352, ?353, ?354, ?355, ?356, ?357, ?358, ?359, ?360), (?361, ?362, ?363, ?364, ?365, ?366, ?367, ?368, ?369, ?370, ?371, ?372), (?373, ?374, ?375, ?376, ?377, ?378, ?379, ?380, ?381, ?382, ?383, ?384)"; } rc=sqlite3_prepare_v2(mydb3, query1, -1, &statement1, 0); assert(rc==SQLITE_OK); @@ -6601,17 +6604,18 @@ void ProxySQL_Admin::save_mysql_servers_runtime_to_database(bool _runtime) { SQLite3_row *r1=*it; int idx=row_idx%32; if (row_idxfields[0])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement32, (idx*11)+2, r1->fields[1], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+3, atoi(r1->fields[2])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement32, (idx*11)+4, ( _runtime ? r1->fields[4] : ( strcmp(r1->fields[4],"SHUNNED")==0 ? "ONLINE" : r1->fields[4] ) ), -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+5, atoi(r1->fields[3])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+6, atoi(r1->fields[5])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+7, atoi(r1->fields[6])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+8, atoi(r1->fields[7])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+9, atoi(r1->fields[8])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement32, (idx*11)+10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement32, (idx*11)+11, r1->fields[10], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+1, atoi(r1->fields[0])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement32, (idx*12)+2, r1->fields[1], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+3, atoi(r1->fields[2])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+4, atoi(r1->fields[3])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement32, (idx*12)+5, ( _runtime ? r1->fields[5] : ( strcmp(r1->fields[5],"SHUNNED")==0 ? "ONLINE" : r1->fields[5] ) ), -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+6, atoi(r1->fields[4])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+7, atoi(r1->fields[6])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+8, atoi(r1->fields[7])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+9, atoi(r1->fields[8])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement32, (idx*12)+11, atoi(r1->fields[10])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement32, (idx*12)+12, r1->fields[11], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); if (idx==31) { SAFE_SQLITE3_STEP(statement32); rc=sqlite3_clear_bindings(statement32); assert(rc==SQLITE_OK); @@ -6621,14 +6625,15 @@ void ProxySQL_Admin::save_mysql_servers_runtime_to_database(bool _runtime) { rc=sqlite3_bind_int64(statement1, 1, atoi(r1->fields[0])); assert(rc==SQLITE_OK); rc=sqlite3_bind_text(statement1, 2, r1->fields[1], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 3, atoi(r1->fields[2])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement1, 4, ( _runtime ? r1->fields[4] : ( strcmp(r1->fields[4],"SHUNNED")==0 ? "ONLINE" : r1->fields[4] ) ), -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 5, atoi(r1->fields[3])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_int64(statement1, 6, atoi(r1->fields[5])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 4, atoi(r1->fields[3])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement1, 5, ( _runtime ? r1->fields[5] : ( strcmp(r1->fields[5],"SHUNNED")==0 ? "ONLINE" : r1->fields[5] ) ), -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 6, atoi(r1->fields[4])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 7, atoi(r1->fields[6])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 8, atoi(r1->fields[7])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 9, atoi(r1->fields[8])); assert(rc==SQLITE_OK); rc=sqlite3_bind_int64(statement1, 10, atoi(r1->fields[9])); assert(rc==SQLITE_OK); - rc=sqlite3_bind_text(statement1, 11, r1->fields[10], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); + rc=sqlite3_bind_int64(statement1, 11, atoi(r1->fields[10])); assert(rc==SQLITE_OK); + rc=sqlite3_bind_text(statement1, 12, r1->fields[11], -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); SAFE_SQLITE3_STEP(statement1); rc=sqlite3_clear_bindings(statement1); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement1); assert(rc==SQLITE_OK); @@ -6748,7 +6753,7 @@ void ProxySQL_Admin::load_mysql_servers_to_runtime() { SQLite3_result *resultset=NULL; SQLite3_result *resultset_replication=NULL; SQLite3_result *resultset_group_replication=NULL; - char *query=(char *)"SELECT hostgroup_id,hostname,port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment FROM main.mysql_servers"; + char *query=(char *)"SELECT hostgroup_id,hostname,port,gtid_port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment FROM main.mysql_servers"; proxy_debug(PROXY_DEBUG_ADMIN, 4, "%s\n", query); admindb->execute_statement(query, &error , &cols , &affected_rows , &resultset); //MyHGH->wrlock(); @@ -7348,12 +7353,13 @@ int ProxySQL_Admin::Read_MySQL_Servers_from_configfile() { const Setting &mysql_servers = root["mysql_servers"]; int count = mysql_servers.getLength(); //fprintf(stderr, "Found %d servers\n",count); - char *q=(char *)"INSERT OR REPLACE INTO mysql_servers (hostname, port, hostgroup_id, compression, weight, status, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment) VALUES (\"%s\", %d, %d, %d, %d, \"%s\", %d, %d, %d, %d, '%s')"; + char *q=(char *)"INSERT OR REPLACE INTO mysql_servers (hostname, port, gtid_port, hostgroup_id, compression, weight, status, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment) VALUES (\"%s\", %d, %d, %d, %d, %d, \"%s\", %d, %d, %d, %d, '%s')"; for (i=0; i< count; i++) { const Setting &server = mysql_servers[i]; std::string address; std::string status="ONLINE"; int port=3306; + int gtid_port=0; int hostgroup; int weight=1; int compression=0; @@ -7368,6 +7374,7 @@ int ProxySQL_Admin::Read_MySQL_Servers_from_configfile() { } } server.lookupValue("port", port); + server.lookupValue("gtid_port", port); if (server.lookupValue("hostgroup", hostgroup)==false) continue; server.lookupValue("status", status); if ( @@ -7714,6 +7721,20 @@ void ProxySQL_Admin::disk_upgrade_mysql_servers() { // copy fields from old table configdb->execute("INSERT OR IGNORE INTO mysql_servers (hostgroup_id,hostname,port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment) SELECT hostgroup_id,hostname,port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment FROM mysql_servers_v122"); } + rci=configdb->check_table_structure((char *)"mysql_servers",(char *)ADMIN_SQLITE_TABLE_MYSQL_SERVERS_V1_4_4); // 1.4.4 has the same column of 1.2.2 + if (rci) { + // upgrade is required + proxy_warning("Detected version v1.4.4 (pre-2.0.0) of table mysql_servers\n"); + proxy_warning("ONLINE UPGRADE of table mysql_servers in progress\n"); + //drop any existing table with suffix _v144 + configdb->execute("DROP TABLE IF EXISTS mysql_servers_v144"); + // rename current table to add suffix _v144 + configdb->execute("ALTER TABLE mysql_servers RENAME TO mysql_servers_v44"); + // create new table + configdb->build_table((char *)"mysql_servers",(char *)ADMIN_SQLITE_TABLE_MYSQL_SERVERS,false); + // copy fields from old table + configdb->execute("INSERT OR IGNORE INTO mysql_servers (hostgroup_id,hostname,port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment) SELECT hostgroup_id,hostname,port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment FROM mysql_servers_v144"); + } rci=configdb->check_table_structure((char *)"mysql_replication_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_REPLICATION_HOSTGROUPS_V1_0); // issue #643 if (rci) { // upgrade is required diff --git a/lib/ProxySQL_Cluster.cpp b/lib/ProxySQL_Cluster.cpp index a0b101c02..c89119620 100644 --- a/lib/ProxySQL_Cluster.cpp +++ b/lib/ProxySQL_Cluster.cpp @@ -789,18 +789,18 @@ void ProxySQL_Cluster::pull_mysql_servers_from_peer() { proxy_info("Cluster: Writing mysql_servers table\n"); GloAdmin->admindb->execute("DELETE FROM mysql_servers"); MYSQL_ROW row; - char *q=(char *)"INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment) VALUES (%s, \"%s\", %s, %s, \"%s\", %s, %s, %s, %s, %s, '%s')"; + char *q=(char *)"INSERT INTO mysql_servers (hostgroup_id, hostname, port, gtid_port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment) VALUES (%s, \"%s\", %s, %s, %s, \"%s\", %s, %s, %s, %s, %s, '%s')"; while ((row = mysql_fetch_row(result1))) { int i; int l=0; - for (i=0; i<10; i++) { + for (i=0; i<11; i++) { l+=strlen(row[i]); } - char *o=escape_string_single_quotes(row[10],false); + char *o=escape_string_single_quotes(row[11],false); char *query = (char *)malloc(strlen(q)+i+strlen(o)+64); - sprintf(query,q,row[0],row[1],row[2],row[3], ( strcmp(row[4],"SHUNNED")==0 ? "ONLINE" : row[4] ), row[5],row[6],row[7],row[8],row[9],o); - if (o!=row[10]) { // there was a copy + sprintf(query,q,row[0],row[1],row[2],row[3], row[4], ( strcmp(row[5],"SHUNNED")==0 ? "ONLINE" : row[5] ), row[6],row[7],row[8],row[9],row[10],o); + if (o!=row[11]) { // there was a copy free(o); } GloAdmin->admindb->execute(query); From ff473b3a2a2b4aceeceaeaae1b95c65a6cde0062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 8 Jan 2018 23:57:11 +0100 Subject: [PATCH 17/40] Update mysql_servers in HostgroupsManager --- lib/MySQL_HostGroups_Manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 161bba560..de09198b9 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -903,10 +903,10 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table(int *_onlyhg) { PtrArray *lst=new PtrArray(); sqlite3 *mydb3=mydb->get_db(); - char *query1=(char *)"INSERT INTO mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)"; + char *query1=(char *)"INSERT INTO mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13)"; rc=sqlite3_prepare_v2(mydb3, query1, -1, &statement1, 0); assert(rc==SQLITE_OK); - char *query32=(char *)"INSERT INTO mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12), (?13, ?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24), (?25, ?26, ?27, ?28, ?29, ?30, ?31, ?32, ?33, ?34, ?35, ?36), (?37, ?38, ?39, ?40, ?41, ?42, ?43, ?44, ?45, ?46, ?47, ?48), (?49, ?50, ?51, ?52, ?53, ?54, ?55, ?56, ?57, ?58, ?59, ?60), (?61, ?62, ?63, ?64, ?65, ?66, ?67, ?68, ?69, ?70, ?71, ?72), (?73, ?74, ?75, ?76, ?77, ?78, ?79, ?80, ?81, ?82, ?83, ?84), (?85, ?86, ?87, ?88, ?89, ?90, ?91, ?92, ?93, ?94, ?95, ?96), (?97, ?98, ?99, ?100, ?101, ?102, ?103, ?104, ?105, ?106, ?107, ?108), (?109, ?110, ?111, ?112, ?113, ?114, ?115, ?116, ?117, ?118, ?119, ?120), (?121, ?122, ?123, ?124, ?125, ?126, ?127, ?128, ?129, ?130, ?131, ?132), (?133, ?134, ?135, ?136, ?137, ?138, ?139, ?140, ?141, ?142, ?143, ?144), (?145, ?146, ?147, ?148, ?149, ?150, ?151, ?152, ?153, ?154, ?155, ?156), (?157, ?158, ?159, ?160, ?161, ?162, ?163, ?164, ?165, ?166, ?167, ?168), (?169, ?170, ?171, ?172, ?173, ?174, ?175, ?176, ?177, ?178, ?179, ?180), (?181, ?182, ?183, ?184, ?185, ?186, ?187, ?188, ?189, ?190, ?191, ?192), (?193, ?194, ?195, ?196, ?197, ?198, ?199, ?200, ?201, ?202, ?203, ?204), (?205, ?206, ?207, ?208, ?209, ?210, ?211, ?212, ?213, ?214, ?215, ?216), (?217, ?218, ?219, ?220, ?221, ?222, ?223, ?224, ?225, ?226, ?227, ?228), (?229, ?230, ?231, ?232, ?233, ?234, ?235, ?236, ?237, ?238, ?239, ?240), (?241, ?242, ?243, ?244, ?245, ?246, ?247, ?248, ?249, ?250, ?251, ?252), (?253, ?254, ?255, ?256, ?257, ?258, ?259, ?260, ?261, ?262, ?263, ?264), (?265, ?266, ?267, ?268, ?269, ?270, ?271, ?272, ?273, ?274, ?275, ?276), (?277, ?278, ?279, ?280, ?281, ?282, ?283, ?284, ?285, ?286, ?287, ?288), (?289, ?290, ?291, ?292, ?293, ?294, ?295, ?296, ?297, ?298, ?299, ?300), (?301, ?302, ?303, ?304, ?305, ?306, ?307, ?308, ?309, ?310, ?311, ?312), (?313, ?314, ?315, ?316, ?317, ?318, ?319, ?320, ?321, ?322, ?323, ?324), (?325, ?326, ?327, ?328, ?329, ?330, ?331, ?332, ?333, ?334, ?335, ?336), (?337, ?338, ?339, ?340, ?341, ?342, ?343, ?344, ?345, ?346, ?347, ?348), (?349, ?350, ?351, ?352, ?353, ?354, ?355, ?356, ?357, ?358, ?359, ?360), (?361, ?362, ?363, ?364, ?365, ?366, ?367, ?368, ?369, ?370, ?371, ?372), (?373, ?374, ?375, ?376, ?377, ?378, ?379, ?380, ?381, ?382, ?383, ?384)"; + char *query32=(char *)"INSERT INTO mysql_servers VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13), (?14, ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23, ?24, ?25, ?26), (?27, ?28, ?29, ?30, ?31, ?32, ?33, ?34, ?35, ?36, ?37, ?38, ?39), (?40, ?41, ?42, ?43, ?44, ?45, ?46, ?47, ?48, ?49, ?50, ?51, ?52), (?53, ?54, ?55, ?56, ?57, ?58, ?59, ?60, ?61, ?62, ?63, ?64, ?65), (?66, ?67, ?68, ?69, ?70, ?71, ?72, ?73, ?74, ?75, ?76, ?77, ?78), (?79, ?80, ?81, ?82, ?83, ?84, ?85, ?86, ?87, ?88, ?89, ?90, ?91), (?92, ?93, ?94, ?95, ?96, ?97, ?98, ?99, ?100, ?101, ?102, ?103, ?104), (?105, ?106, ?107, ?108, ?109, ?110, ?111, ?112, ?113, ?114, ?115, ?116, ?117), (?118, ?119, ?120, ?121, ?122, ?123, ?124, ?125, ?126, ?127, ?128, ?129, ?130), (?131, ?132, ?133, ?134, ?135, ?136, ?137, ?138, ?139, ?140, ?141, ?142, ?143), (?144, ?145, ?146, ?147, ?148, ?149, ?150, ?151, ?152, ?153, ?154, ?155, ?156), (?157, ?158, ?159, ?160, ?161, ?162, ?163, ?164, ?165, ?166, ?167, ?168, ?169), (?170, ?171, ?172, ?173, ?174, ?175, ?176, ?177, ?178, ?179, ?180, ?181, ?182), (?183, ?184, ?185, ?186, ?187, ?188, ?189, ?190, ?191, ?192, ?193, ?194, ?195), (?196, ?197, ?198, ?199, ?200, ?201, ?202, ?203, ?204, ?205, ?206, ?207, ?208), (?209, ?210, ?211, ?212, ?213, ?214, ?215, ?216, ?217, ?218, ?219, ?220, ?221), (?222, ?223, ?224, ?225, ?226, ?227, ?228, ?229, ?230, ?231, ?232, ?233, ?234), (?235, ?236, ?237, ?238, ?239, ?240, ?241, ?242, ?243, ?244, ?245, ?246, ?247), (?248, ?249, ?250, ?251, ?252, ?253, ?254, ?255, ?256, ?257, ?258, ?259, ?260), (?261, ?262, ?263, ?264, ?265, ?266, ?267, ?268, ?269, ?270, ?271, ?272, ?273), (?274, ?275, ?276, ?277, ?278, ?279, ?280, ?281, ?282, ?283, ?284, ?285, ?286), (?287, ?288, ?289, ?290, ?291, ?292, ?293, ?294, ?295, ?296, ?297, ?298, ?299), (?300, ?301, ?302, ?303, ?304, ?305, ?306, ?307, ?308, ?309, ?310, ?311, ?312), (?313, ?314, ?315, ?316, ?317, ?318, ?319, ?320, ?321, ?322, ?323, ?324, ?325), (?326, ?327, ?328, ?329, ?330, ?331, ?332, ?333, ?334, ?335, ?336, ?337, ?338), (?339, ?340, ?341, ?342, ?343, ?344, ?345, ?346, ?347, ?348, ?349, ?350, ?351), (?352, ?353, ?354, ?355, ?356, ?357, ?358, ?359, ?360, ?361, ?362, ?363, ?364), (?365, ?366, ?367, ?368, ?369, ?370, ?371, ?372, ?373, ?374, ?375, ?376, ?377), (?378, ?379, ?380, ?381, ?382, ?383, ?384, ?385, ?386, ?387, ?388, ?389, ?390), (?391, ?392, ?393, ?394, ?395, ?396, ?397, ?398, ?399, ?400, ?401, ?402, ?403), (?404, ?405, ?406, ?407, ?408, ?409, ?410, ?411, ?412, ?413, ?414, ?415, ?416)"; rc=sqlite3_prepare_v2(mydb3, query32, -1, &statement32, 0); assert(rc==SQLITE_OK); From c28e55528480fc67417fb44017db5efd92a9a018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Tue, 9 Jan 2018 00:36:55 +0100 Subject: [PATCH 18/40] Crash on mirroring #1305 --- lib/mysql_connection.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/mysql_connection.cpp b/lib/mysql_connection.cpp index edadbe044..8810e0152 100644 --- a/lib/mysql_connection.cpp +++ b/lib/mysql_connection.cpp @@ -914,12 +914,14 @@ handler_again: break; case ASYNC_USE_RESULT_CONT: { - unsigned int buffered_data=0; - buffered_data = myds->sess->client_myds->PSarrayOUT->len * RESULTSET_BUFLEN; - buffered_data += myds->sess->client_myds->resultset->len * RESULTSET_BUFLEN; - if (buffered_data > (unsigned int)mysql_thread___threshold_resultset_size*8) { - next_event(ASYNC_USE_RESULT_CONT); // we temporarily pause . See #1232 - break; + if (myds->sess && myds->sess->client_myds && myds->sess->mirror==false) { + unsigned int buffered_data=0; + buffered_data = myds->sess->client_myds->PSarrayOUT->len * RESULTSET_BUFLEN; + buffered_data += myds->sess->client_myds->resultset->len * RESULTSET_BUFLEN; + if (buffered_data > (unsigned int)mysql_thread___threshold_resultset_size*8) { + next_event(ASYNC_USE_RESULT_CONT); // we temporarily pause . See #1232 + break; + } } } if (async_fetch_row_start==false) { From 7c2d4e35d091509dd394acf7bc334e2c1048a0ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Tue, 9 Jan 2018 21:19:46 +0100 Subject: [PATCH 19/40] Bug fix for #1323 --- lib/ProxySQL_Cluster.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/ProxySQL_Cluster.cpp b/lib/ProxySQL_Cluster.cpp index c89119620..5be0b9e18 100644 --- a/lib/ProxySQL_Cluster.cpp +++ b/lib/ProxySQL_Cluster.cpp @@ -179,6 +179,7 @@ void * ProxySQL_Cluster_Monitor_thread(void *args) { } else { sleep(1); // do not monitor if the username is empty } + rc_bool = GloProxyCluster->Update_Node_Metrics(node->hostname, node->port, NULL, 0); // added extra check, see #1323 } __exit_monitor_thread: if (conn) @@ -1113,7 +1114,13 @@ bool ProxySQL_Cluster_Nodes::Update_Node_Metrics(char * _h, uint16_t _p, MYSQL_R std::unordered_map::iterator ite = umap_proxy_nodes.find(hash_); if (ite != umap_proxy_nodes.end()) { ProxySQL_Node_Entry * node = ite->second; - node->set_metrics(_r, _response_time); + if (_r) { + node->set_metrics(_r, _response_time); + } else { + // if _r is NULL, this function is being called only to verify if + // the node should still be checked or not + // see bug #1323 + } ret = true; } pthread_mutex_unlock(&mutex); From f0a2edce4a02feb6b3928f987372d7465b31e398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 14 Jan 2018 23:31:42 +0100 Subject: [PATCH 20/40] Drafting tracking of GTID --- include/MySQL_HostGroups_Manager.h | 4 ++++ include/proxysql_gtid.h | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 include/proxysql_gtid.h diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 234bba643..3e909da1d 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -2,6 +2,7 @@ #define __CLASS_MYSQL_HOSTGROUPS_MANAGER_H #include "proxysql.h" #include "cpp.h" +#include "proxysql_gtid.h" #include @@ -183,6 +184,9 @@ class MySQL_HostGroups_Manager { std::thread *HGCU_thread; + std::unordered_map gtid_map; + pthread_rwlock_t gtid_rwlock; + public: struct { unsigned int servers_table_version; diff --git a/include/proxysql_gtid.h b/include/proxysql_gtid.h new file mode 100644 index 000000000..bace8aaef --- /dev/null +++ b/include/proxysql_gtid.h @@ -0,0 +1,21 @@ +#ifndef PROXYSQL_GTID +#define PROXYSQL_GTID +// highly inspired by libslave +// https://github.com/vozbu/libslave/ +#include +#include +#include + +typedef std::pair gtid_t; +typedef std::pair gtid_interval_t; +typedef std::unordered_map> gtid_set_t; + +class Gtid_Server_Info { + gtid_set_t executed_gtid_set; + char *address; + uint16_t mysql_port; + uint16_t gtid_port; + bool active; +}; + +#endif /* PROXYSQL_GTID */ From 415a216e9afeff53e3693c2b23c11f23155b9a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 14 Jan 2018 23:38:43 +0100 Subject: [PATCH 21/40] Adding libev --- .gitignore | 3 +++ deps/Makefile | 12 ++++++++++-- deps/libev/LICENSE | 37 +++++++++++++++++++++++++++++++++++ deps/libev/libev | 1 + deps/libev/libev-4.24.tar.gz | Bin 0 -> 524264 bytes 5 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 deps/libev/LICENSE create mode 120000 deps/libev/libev create mode 100644 deps/libev/libev-4.24.tar.gz diff --git a/.gitignore b/.gitignore index b24cb90e2..61c01f85d 100644 --- a/.gitignore +++ b/.gitignore @@ -123,6 +123,9 @@ deps/clickhouse-cpp deps/cityhash/cityhash/ deps/lz4/lz4-1.7.5/ +#libev +deps/libev/libev-4.24/ + test/.vagrant .DS_Store proxysql-tests.ini diff --git a/deps/Makefile b/deps/Makefile index cc2849e9b..0cf7df996 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -11,12 +11,20 @@ endif PROXYSQLCLICKHOUSE := $(shell echo $(PROXYSQLCLICKHOUSE)) ifeq ($(PROXYSQLCLICKHOUSE),1) -default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre clickhouse-cpp lz4 cityhash microhttpd curl +default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre clickhouse-cpp lz4 cityhash microhttpd curl libev else -default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre microhttpd curl +default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre microhttpd curl libev endif .PHONY: default +libev/libev/.libs/libev.a: + cd libev && rm -rf libev-4.24 || true + cd libev && tar -zxf libev-4.24.tar.gz + cd libev/libev && ./configure + cd libev/libev && CC=${CC} CXX=${CXX} ${MAKE} +libev: libev/libev/.libs/libev.a + + curl/curl/lib/.libs/libcurl.a: cd curl && rm -rf curl-7.57.0 || true cd curl && tar -zxf curl-7.57.0.tar.gz diff --git a/deps/libev/LICENSE b/deps/libev/LICENSE new file mode 100644 index 000000000..2fdabd48a --- /dev/null +++ b/deps/libev/LICENSE @@ -0,0 +1,37 @@ +All files in libev are +Copyright (c)2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Alternatively, the contents of this package may be used under the terms +of the GNU General Public License ("GPL") version 2 or any later version, +in which case the provisions of the GPL are applicable instead of the +above. If you wish to allow the use of your version of this package only +under the terms of the GPL and not to allow others to use your version of +this file under the BSD license, indicate your decision by deleting the +provisions above and replace them with the notice and other provisions +required by the GPL in this and the other files of this package. If you do +not delete the provisions above, a recipient may use your version of this +file under either the BSD or the GPL. diff --git a/deps/libev/libev b/deps/libev/libev new file mode 120000 index 000000000..ba5a1373a --- /dev/null +++ b/deps/libev/libev @@ -0,0 +1 @@ +libev-4.24 \ No newline at end of file diff --git a/deps/libev/libev-4.24.tar.gz b/deps/libev/libev-4.24.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c5efba32fd6fa9939201c8c5d89df3499e26c589 GIT binary patch literal 524264 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%0A$ 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