From d24964659575386d717c90e34401e5363ff51cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 22 Apr 2023 22:41:10 +0000 Subject: [PATCH 1/7] Adding again google coredumper Adding the improved version from Percona: https://github.com/Percona-Lab/coredumper At commit cb6cead . Adding commands: - PROXYSQL COREDUMP (for not compressed core dump) - PROXYSQL COMPRESSEDCOREDUMP (for compressed core dump) Both commands accept an optional argument as a filename. Commands are only available on x86_64 , and not on ARM . --- .gitignore | 2 +- deps/Makefile | 12 +++++- deps/coredumper/COPYING | 28 +++++++++++++ deps/coredumper/coredumper | 1 + deps/coredumper/coredumper-cb6cead.tar.gz | Bin 0 -> 82370 bytes lib/Makefile | 7 +++- lib/ProxySQL_Admin.cpp | 49 ++++++++++++++++++++++ src/Makefile | 12 ++++-- 8 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 deps/coredumper/COPYING create mode 120000 deps/coredumper/coredumper create mode 100644 deps/coredumper/coredumper-cb6cead.tar.gz diff --git a/.gitignore b/.gitignore index 0c6306fb8..de21ed59e 100644 --- a/.gitignore +++ b/.gitignore @@ -92,7 +92,7 @@ deps/pcre/pcre-*/ deps/prometheus-cpp/prometheus-cpp-*/ deps/re2/re2-*/ deps/sqlite3/sqlite-amalgamation-*/ - +deps/coredumper/coredumper-*/ test/.vagrant .DS_Store diff --git a/deps/Makefile b/deps/Makefile index aac8709cc..01f2be4c6 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -57,9 +57,9 @@ endif PROXYSQLCLICKHOUSE := $(shell echo $(PROXYSQLCLICKHOUSE)) ifeq ($(PROXYSQLCLICKHOUSE),1) -default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre clickhouse-cpp lz4 cityhash microhttpd curl ev libssl libhttpserver libinjection prometheus-cpp +default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre clickhouse-cpp lz4 cityhash microhttpd curl ev libssl libhttpserver libinjection prometheus-cpp coredumper else -default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre cityhash microhttpd curl ev libssl libhttpserver libinjection prometheus-cpp +default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre cityhash microhttpd curl ev libssl libhttpserver libinjection prometheus-cpp coredumper endif .PHONY: default @@ -137,6 +137,13 @@ libev/libev/.libs/libev.a: ev: libev/libev/.libs/libev.a +coredumper/coredumper/src/libcoredumper.a: + cd coredumper && rm -rf coredumper-*/ || true + cd coredumper && tar -zxf coredumper-*.tar.gz + cd coredumper/coredumper && cmake . -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Debug + cd coredumper/coredumper && CC=${CC} CXX=${CXX} ${MAKE} +coredumper: coredumper/coredumper/src/libcoredumper.a + curl/curl/lib/.libs/libcurl.a: libssl/openssl/libssl.a cd curl && rm -rf curl-*/ || true cd curl && tar -zxf curl-*.tar.gz @@ -364,5 +371,6 @@ cleanall: cd libconfig && rm -rf libconfig-*/ || true cd prometheus-cpp && rm -rf prometheus-cpp-*/ || true cd cityhash && rm -rf cityhash-*/ || true + cd coredumper && rm -rf coredumper-*/ || true .PHONY: cleanall diff --git a/deps/coredumper/COPYING b/deps/coredumper/COPYING new file mode 100644 index 000000000..75a127b63 --- /dev/null +++ b/deps/coredumper/COPYING @@ -0,0 +1,28 @@ +Copyright (c) 2005-2007, Google Inc. +All rights reserved. + +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. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +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. diff --git a/deps/coredumper/coredumper b/deps/coredumper/coredumper new file mode 120000 index 000000000..8430e6763 --- /dev/null +++ b/deps/coredumper/coredumper @@ -0,0 +1 @@ +coredumper-cb6cead \ No newline at end of file diff --git a/deps/coredumper/coredumper-cb6cead.tar.gz b/deps/coredumper/coredumper-cb6cead.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7ec6a619e237b748cd668c4586b7f394fb704fc1 GIT binary patch literal 82370 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 B&ME)^ literal 0 HcmV?d00001 diff --git a/lib/Makefile b/lib/Makefile index fa820d8a3..be35bcf9d 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -41,8 +41,11 @@ LIBHTTPSERVER_IDIR=-I$(LIBHTTPSERVER_DIR)/src MICROHTTPD_DIR=$(DEPS_PATH)/libmicrohttpd/libmicrohttpd MICROHTTPD_IDIR=-I$(MICROHTTPD_DIR) -I$(MICROHTTPD_DIR)/src/include +COREDUMPER_DIR=$(DEPS_PATH)/coredumper/coredumper +COREDUMPER_IDIR=$(COREDUMPER_DIR)/include + CURL_DIR=$(DEPS_PATH)/curl/curl -CURL_IDIR=-I$(CURL_DIR)/include +CURL_IDIR=$(CURL_DIR)/include SSL_DIR=$(DEPS_PATH)/libssl/openssl/ SSL_IDIR=$(SSL_DIR)/include @@ -57,7 +60,7 @@ PROMETHEUS_LDIR=$(PROMETHEUS_PATH)/lib 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) -I$(CLICKHOUSE_CPP_DIR)/contrib/ $(MICROHTTPD_IDIR) $(LIBHTTPSERVER_IDIR) $(LIBINJECTION_IDIR) $(CURL_IDIR) -I$(EV_DIR) -I$(SSL_IDIR) -I$(PROMETHEUS_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) -I$(CLICKHOUSE_CPP_DIR)/contrib/ $(MICROHTTPD_IDIR) $(LIBHTTPSERVER_IDIR) $(LIBINJECTION_IDIR) $(CURL_IDIR) -I$(COREDUMPER_IDIR) -I$(EV_DIR) -I$(SSL_IDIR) -I$(PROMETHEUS_IDIR) LDIRS=-L$(JEMALLOC_PATH)/lib -L$(RE2_PATH)/obj -L$(INJECTION_PATH) -L$(PROMETHEUS_LDIR) diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index c80b5247a..120b3cdf9 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -54,6 +54,8 @@ #include "platform.h" #include "microhttpd.h" +#include "coredumper/coredumper.h" + #include using std::string; @@ -1512,6 +1514,53 @@ bool admin_handler_command_kill_connection(char *query_no_space, unsigned int qu * 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 (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) || defined(__mips__)) && defined(__linux) + // currently only support x86-32, x86-64, ARM, and MIPS on Linux + if (!(strncasecmp("PROXYSQL COREDUMP", query_no_space, strlen("PROXYSQL COREDUMP")))) { + string filename = "core"; + if (query_no_space_length > strlen("PROXYSQL COREDUMP")) { + if (query_no_space[strlen("PROXYSQL COREDUMP")] == ' ') { + filename = string(query_no_space+strlen("PROXYSQL COREDUMP ")); + } else { + filename = ""; + } + } + if (filename == "") { + proxy_error("Received incorrect PROXYSQL COREDUMP command: %s\n", query_no_space); + } else { + proxy_info("Received PROXYSQL COREDUMP command: %s\n", query_no_space); + // generates a core dump + WriteCoreDump(filename.c_str()); + ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; + string msg = "Coredump: " + filename; + SPA->send_MySQL_OK(&sess->client_myds->myprot, (char *)msg.c_str()); + return false; + } + } + if (!(strncasecmp("PROXYSQL COMPRESSEDCOREDUMP", query_no_space, strlen("PROXYSQL COMPRESSEDCOREDUMP")))) { + string filename = "core"; + if (query_no_space_length > strlen("PROXYSQL COMPRESSEDCOREDUMP")) { + if (query_no_space[strlen("PROXYSQL COMPRESSEDCOREDUMP")] == ' ') { + filename = string(query_no_space+strlen("PROXYSQL COMPRESSEDCOREDUMP ")); + } else { + filename = ""; + } + } + if (filename == "") { + proxy_error("Received incorrect PROXYSQL COMPRESSEDCOREDUMP command: %s\n", query_no_space); + } else { + proxy_info("Received PROXYSQL COMPRESSEDCOREDUMP command: %s\n", query_no_space); + // generates a compressed core dump + WriteCompressedCoreDump(filename.c_str(), SIZE_MAX, COREDUMPER_COMPRESSED, NULL); + ProxySQL_Admin *SPA=(ProxySQL_Admin *)pa; + string msg = "Coredump: " + filename; + SPA->send_MySQL_OK(&sess->client_myds->myprot, (char *)msg.c_str()); + return false; + } + } +#endif + if (!(strncasecmp("PROXYSQL CLUSTER_NODE_UUID ", query_no_space, strlen("PROXYSQL CLUSTER_NODE_UUID ")))) { int l = strlen("PROXYSQL CLUSTER_NODE_UUID "); if (sess->client_myds->addr.port == 0) { diff --git a/src/Makefile b/src/Makefile index 6240a422c..49bd7878c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -63,6 +63,10 @@ MICROHTTPD_DIR=$(DEPS_PATH)/libmicrohttpd/libmicrohttpd/src MICROHTTPD_IDIR=$(MICROHTTPD_DIR)/include MICROHTTPD_LDIR=$(MICROHTTPD_DIR)/microhttpd/.libs +COREDUMPER_DIR=$(DEPS_PATH)/coredumper/coredumper +COREDUMPER_IDIR=$(COREDUMPER_DIR)/include +COREDUMPER_LDIR=$(COREDUMPER_DIR)/src + CURL_DIR=$(DEPS_PATH)/curl/curl CURL_IDIR=$(CURL_DIR)/include CURL_LDIR=$(CURL_DIR)/lib/.libs @@ -79,7 +83,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$(CLICKHOUSE_CPP_DIR)/contrib/ -I$(MICROHTTPD_IDIR) -I$(LIBHTTPSERVER_IDIR) -I$(LIBINJECTION_IDIR) -I$(CURL_IDIR) -I$(EV_IDIR) -I$(SSL_IDIR) -I$(RE2_IDIR) -I$(PROMETHEUS_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$(LIBHTTPSERVER_LDIR) -L$(LIBINJECTION_LDIR) -L$(CURL_LDIR) -L$(EV_LDIR) -L$(SSL_LDIR) -L$(PROMETHEUS_LDIR) +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$(LIBHTTPSERVER_LDIR) -L$(LIBINJECTION_LDIR) -L$(CURL_LDIR) -L$(COREDUMPER_LDIR) -L$(EV_LDIR) -L$(SSL_LDIR) -L$(PROMETHEUS_LDIR) UNAME_S := $(shell uname -s) @@ -153,9 +157,9 @@ endif NOJEMALLOC := $(shell echo $(NOJEMALLOC)) ifeq ($(NOJEMALLOC),1) -MYLIBS=-Wl,--export-dynamic -Wl,-Bstatic -lconfig -lproxysql -ldaemon -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lhttpserver -lmicrohttpd -linjection -lcurl -lssl -lcrypto -lev -Wl,-Bdynamic -lgnutls -lpthread -lm -lz -lrt -lprometheus-cpp-pull -lprometheus-cpp-core -luuid $(EXTRALINK) +MYLIBS=-Wl,--export-dynamic -Wl,-Bstatic -lconfig -lproxysql -ldaemon -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lhttpserver -lmicrohttpd -linjection -lcurl -lssl -lcrypto -lev -lcoredumper -Wl,-Bdynamic -lgnutls -lpthread -lm -lz -lrt -lprometheus-cpp-pull -lprometheus-cpp-core -luuid $(EXTRALINK) else -MYLIBS=-Wl,--export-dynamic -Wl,-Bstatic -lconfig -lproxysql -ldaemon -ljemalloc -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lhttpserver -lmicrohttpd -linjection -lcurl -lssl -lcrypto -lev -Wl,-Bdynamic -lgnutls -lpthread -lm -lz -lrt -lprometheus-cpp-pull -lprometheus-cpp-core -luuid $(EXTRALINK) +MYLIBS=-Wl,--export-dynamic -Wl,-Bstatic -lconfig -lproxysql -ldaemon -ljemalloc -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lhttpserver -lmicrohttpd -linjection -lcurl -lssl -lcrypto -lev -lcoredumper -Wl,-Bdynamic -lgnutls -lpthread -lm -lz -lrt -lprometheus-cpp-pull -lprometheus-cpp-core -luuid $(EXTRALINK) endif ifeq ($(UNAME_S),Darwin) @@ -177,7 +181,7 @@ endif LIBPROXYSQLAR=$(LDIR)/libproxysql.a ifeq ($(UNAME_S),Darwin) - LIBPROXYSQLAR=$(LDIR)/libproxysql.a ../deps/jemalloc/jemalloc/lib/libjemalloc.a ../deps/libmicrohttpd/libmicrohttpd/src/microhttpd/.libs/libmicrohttpd.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/pcre/pcre/.libs/libpcre.a ../deps/pcre/pcre/.libs/libpcrecpp.a ../deps/libdaemon/libdaemon/libdaemon/.libs/libdaemon.a ../deps/libconfig/libconfig/lib/.libs/libconfig++.a ../deps/libconfig/libconfig/lib/.libs/libconfig.a ../deps/curl/curl/lib/.libs/libcurl.a ../deps/sqlite3/sqlite3/sqlite3.o ../deps/libinjection/libinjection/src/libinjection.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/libev/libev-4.24/.libs/libev.a + LIBPROXYSQLAR=$(LDIR)/libproxysql.a ../deps/jemalloc/jemalloc/lib/libjemalloc.a ../deps/libmicrohttpd/libmicrohttpd/src/microhttpd/.libs/libmicrohttpd.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/pcre/pcre/.libs/libpcre.a ../deps/pcre/pcre/.libs/libpcrecpp.a ../deps/libdaemon/libdaemon/libdaemon/.libs/libdaemon.a ../deps/libconfig/libconfig/lib/.libs/libconfig++.a ../deps/libconfig/libconfig/lib/.libs/libconfig.a ../deps/curl/curl/lib/.libs/libcurl.a ../deps/sqlite3/sqlite3/sqlite3.o ../deps/libinjection/libinjection/src/libinjection.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/libev/libev-4.24/.libs/libev.a $(COREDUMPER_LDIR)/libcoredumper.a endif LIBPROXYSQLAR+= $(SSL_LDIR)/libssl.a $(SSL_LDIR)/libcrypto.a $(CITYHASH_DIR)/libcityhash.a From 3b00c7b6557e9206445d2490b7ede629098f75fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 23 Apr 2023 08:57:11 +0000 Subject: [PATCH 2/7] Various Makefile cleanup --- deps/Makefile | 9 ++++++--- lib/Makefile | 9 +++++---- lib/ProxySQL_Admin.cpp | 3 +++ src/Makefile | 16 ++++++++++++---- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/deps/Makefile b/deps/Makefile index 01f2be4c6..b3242c737 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -56,11 +56,14 @@ endif PROXYSQLCLICKHOUSE := $(shell echo $(PROXYSQLCLICKHOUSE)) +tmpdefault=libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre lz4 cityhash microhttpd curl ev libssl libhttpserver libinjection prometheus-cpp +ifeq ($(UNAME_S),Linux) + tmpdefault+= coredumper +endif ifeq ($(PROXYSQLCLICKHOUSE),1) -default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre clickhouse-cpp lz4 cityhash microhttpd curl ev libssl libhttpserver libinjection prometheus-cpp coredumper -else -default: libconfig libdaemon jemalloc mariadb_client re2 sqlite3 pcre cityhash microhttpd curl ev libssl libhttpserver libinjection prometheus-cpp coredumper + tmpdefault+= clickhouse-cpp endif +default: $(tmpdefault) .PHONY: default diff --git a/lib/Makefile b/lib/Makefile index be35bcf9d..c41dc05c1 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -10,6 +10,7 @@ endif DEPS_PATH=../deps +UNAME_S := $(shell uname -s) MARIADB_PATH=$(DEPS_PATH)/mariadb-client-library/mariadb_client MARIADB_IDIR=$(MARIADB_PATH)/include @@ -60,8 +61,10 @@ PROMETHEUS_LDIR=$(PROMETHEUS_PATH)/lib 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) -I$(CLICKHOUSE_CPP_DIR)/contrib/ $(MICROHTTPD_IDIR) $(LIBHTTPSERVER_IDIR) $(LIBINJECTION_IDIR) $(CURL_IDIR) -I$(COREDUMPER_IDIR) -I$(EV_DIR) -I$(SSL_IDIR) -I$(PROMETHEUS_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) -I$(CLICKHOUSE_CPP_DIR)/contrib/ $(MICROHTTPD_IDIR) $(LIBHTTPSERVER_IDIR) $(LIBINJECTION_IDIR) -I$(CURL_IDIR) -I$(EV_DIR) -I$(SSL_IDIR) -I$(PROMETHEUS_IDIR) +ifeq ($(UNAME_S),Linux) + IDIRS+= -I$(COREDUMPER_IDIR) +endif LDIRS=-L$(JEMALLOC_PATH)/lib -L$(RE2_PATH)/obj -L$(INJECTION_PATH) -L$(PROMETHEUS_LDIR) #LIBS=-rdynamic -Wl,-Bstatic -ljemalloc_pic -lre2 -Wl,-Bdynamic -ldl -lpthread -lm -lz -lrt $(EXTRALINK) @@ -98,8 +101,6 @@ else WGCOV= endif -UNAME_S := $(shell uname -s) - # determine good compiler version for stdc++17 IS_CXX17 := 0 diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 120b3cdf9..46a75d5dd 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -54,7 +54,10 @@ #include "platform.h" #include "microhttpd.h" +#if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) || defined(__mips__)) && defined(__linux) +// currently only support x86-32, x86-64, ARM, and MIPS on Linux #include "coredumper/coredumper.h" +#endif #include diff --git a/src/Makefile b/src/Makefile index 49bd7878c..f8ae9a6e0 100644 --- a/src/Makefile +++ b/src/Makefile @@ -83,10 +83,14 @@ 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$(CLICKHOUSE_CPP_DIR)/contrib/ -I$(MICROHTTPD_IDIR) -I$(LIBHTTPSERVER_IDIR) -I$(LIBINJECTION_IDIR) -I$(CURL_IDIR) -I$(EV_IDIR) -I$(SSL_IDIR) -I$(RE2_IDIR) -I$(PROMETHEUS_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$(LIBHTTPSERVER_LDIR) -L$(LIBINJECTION_LDIR) -L$(CURL_LDIR) -L$(COREDUMPER_LDIR) -L$(EV_LDIR) -L$(SSL_LDIR) -L$(PROMETHEUS_LDIR) +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$(LIBHTTPSERVER_LDIR) -L$(LIBINJECTION_LDIR) -L$(CURL_LDIR) -L$(EV_LDIR) -L$(SSL_LDIR) -L$(PROMETHEUS_LDIR) UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Linux) + LDIRS+= -L$(COREDUMPER_LDIR) +endif + ifeq ($(UNAME_S),Darwin) IDIRS+= -I/usr/local/include LDIRS+= -L/usr/local/lib -L/opt/homebrew/lib @@ -156,11 +160,15 @@ LDFLAGS+= -fsanitize=address endif NOJEMALLOC := $(shell echo $(NOJEMALLOC)) +STATICMYLIBS=-Wl,-Bstatic -lconfig -lproxysql -ldaemon -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lhttpserver -lmicrohttpd -linjection -lcurl -lssl -lcrypto -lev ifeq ($(NOJEMALLOC),1) -MYLIBS=-Wl,--export-dynamic -Wl,-Bstatic -lconfig -lproxysql -ldaemon -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lhttpserver -lmicrohttpd -linjection -lcurl -lssl -lcrypto -lev -lcoredumper -Wl,-Bdynamic -lgnutls -lpthread -lm -lz -lrt -lprometheus-cpp-pull -lprometheus-cpp-core -luuid $(EXTRALINK) else -MYLIBS=-Wl,--export-dynamic -Wl,-Bstatic -lconfig -lproxysql -ldaemon -ljemalloc -lconfig++ -lre2 -lpcrecpp -lpcre -lmariadbclient -lhttpserver -lmicrohttpd -linjection -lcurl -lssl -lcrypto -lev -lcoredumper -Wl,-Bdynamic -lgnutls -lpthread -lm -lz -lrt -lprometheus-cpp-pull -lprometheus-cpp-core -luuid $(EXTRALINK) + STATICMYLIBS+= -ljemalloc +endif +ifeq ($(UNAME_S),Linux) + STATICMYLIBS+= -lcoredumper endif +MYLIBS=-Wl,--export-dynamic $(STATICMYLIBS) -Wl,-Bdynamic -lgnutls -lpthread -lm -lz -lrt -lprometheus-cpp-pull -lprometheus-cpp-core -luuid $(EXTRALINK) ifeq ($(UNAME_S),Darwin) MYLIBS=-lre2 -lmariadbclient -lpthread -lm -lz -liconv -lgnutls -lprometheus-cpp-pull -lprometheus-cpp-core -luuid @@ -181,7 +189,7 @@ endif LIBPROXYSQLAR=$(LDIR)/libproxysql.a ifeq ($(UNAME_S),Darwin) - LIBPROXYSQLAR=$(LDIR)/libproxysql.a ../deps/jemalloc/jemalloc/lib/libjemalloc.a ../deps/libmicrohttpd/libmicrohttpd/src/microhttpd/.libs/libmicrohttpd.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/pcre/pcre/.libs/libpcre.a ../deps/pcre/pcre/.libs/libpcrecpp.a ../deps/libdaemon/libdaemon/libdaemon/.libs/libdaemon.a ../deps/libconfig/libconfig/lib/.libs/libconfig++.a ../deps/libconfig/libconfig/lib/.libs/libconfig.a ../deps/curl/curl/lib/.libs/libcurl.a ../deps/sqlite3/sqlite3/sqlite3.o ../deps/libinjection/libinjection/src/libinjection.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/libev/libev-4.24/.libs/libev.a $(COREDUMPER_LDIR)/libcoredumper.a + LIBPROXYSQLAR=$(LDIR)/libproxysql.a ../deps/jemalloc/jemalloc/lib/libjemalloc.a ../deps/libmicrohttpd/libmicrohttpd/src/microhttpd/.libs/libmicrohttpd.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/pcre/pcre/.libs/libpcre.a ../deps/pcre/pcre/.libs/libpcrecpp.a ../deps/libdaemon/libdaemon/libdaemon/.libs/libdaemon.a ../deps/libconfig/libconfig/lib/.libs/libconfig++.a ../deps/libconfig/libconfig/lib/.libs/libconfig.a ../deps/curl/curl/lib/.libs/libcurl.a ../deps/sqlite3/sqlite3/sqlite3.o ../deps/libinjection/libinjection/src/libinjection.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/libev/libev-4.24/.libs/libev.a endif LIBPROXYSQLAR+= $(SSL_LDIR)/libssl.a $(SSL_LDIR)/libcrypto.a $(CITYHASH_DIR)/libcityhash.a From 5821f2ef85c57606bf64164b0efbc86007329a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 23 Apr 2023 09:10:54 +0000 Subject: [PATCH 3/7] Revert commit 3d66b6f076729d7b1c1eba7f47159e97df848f20 Not more needed after latest upgrade of libmicrohttpd --- deps/Makefile | 3 --- deps/libmicrohttpd/mhd_sockets.c-issue-5977.patch | 8 -------- 2 files changed, 11 deletions(-) delete mode 100644 deps/libmicrohttpd/mhd_sockets.c-issue-5977.patch diff --git a/deps/Makefile b/deps/Makefile index b3242c737..29d06948d 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -168,9 +168,6 @@ else cd libmicrohttpd && ln -s libmicrohttpd-0.9.75 libmicrohttpd cd libmicrohttpd && tar -zxf libmicrohttpd-0.9.75.tar.gz # cd libmicrohttpd/libmicrohttpd && patch src/microhttpd/connection.c < ../connection.c-snprintf-overflow.patch -endif -ifeq ($(UNAME_S),Darwin) - cd libmicrohttpd/libmicrohttpd && patch src/microhttpd/mhd_sockets.c < ../mhd_sockets.c-issue-5977.patch endif cd libmicrohttpd/libmicrohttpd && ./configure --enable-https && CC=${CC} CXX=${CXX} ${MAKE} diff --git a/deps/libmicrohttpd/mhd_sockets.c-issue-5977.patch b/deps/libmicrohttpd/mhd_sockets.c-issue-5977.patch deleted file mode 100644 index f37083fee..000000000 --- a/deps/libmicrohttpd/mhd_sockets.c-issue-5977.patch +++ /dev/null @@ -1,8 +0,0 @@ -@@ -528,6 +528,7 @@ MHD_socket_cork_ (MHD_socket sock, - TCP_CORK always flushes socket buffer. */ - if (0 > send (sock, - &dummy, -+ 0, - 0)) - return 0; /* even force flush failed!? */ - return 1; /* success */ From c1a36bdd9b0547fd4e03cb809e312c72a0e9487a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 23 Apr 2023 09:38:52 +0000 Subject: [PATCH 4/7] compile curl on OSX --- deps/Makefile | 4 +++- deps/curl/configure.patch | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/deps/Makefile b/deps/Makefile index 29d06948d..9b96baef6 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -151,8 +151,10 @@ curl/curl/lib/.libs/libcurl.a: libssl/openssl/libssl.a cd curl && rm -rf curl-*/ || true cd curl && tar -zxf curl-*.tar.gz # cd curl/curl && ./configure --disable-debug --disable-ftp --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-manual --disable-ipv6 --disable-sspi --disable-crypto-auth --disable-ntlm-wb --disable-tls-srp --without-nghttp2 --without-libidn2 --without-libssh2 --without-brotli --with-ssl=$(shell pwd)/../../libssl/openssl/ && CC=${CC} CXX=${CXX} ${MAKE} -# cd curl/curl && patch configure < ../configure.patch cd curl/curl && autoreconf -fi +ifeq ($(UNAME_S),Darwin) + cd curl/curl && patch configure < ../configure.patch +endif cd curl/curl && CFLAGS=-fPIC ./configure --disable-debug --disable-ftp --disable-ldap --disable-ldaps --disable-rtsp --disable-proxy --disable-dict --disable-telnet --disable-tftp --disable-pop3 --disable-imap --disable-smb --disable-smtp --disable-gopher --disable-manual --disable-ipv6 --disable-sspi --disable-ntlm-wb --disable-tls-srp --without-nghttp2 --without-libidn2 --without-libssh2 --without-brotli --without-librtmp --without-libpsl --without-zstd --with-ssl=$(shell pwd)/libssl/openssl/ --enable-shared=no && CC=${CC} CXX=${CXX} ${MAKE} curl: curl/curl/lib/.libs/libcurl.a diff --git a/deps/curl/configure.patch b/deps/curl/configure.patch index 2b7664c39..1a60f5c55 100644 --- a/deps/curl/configure.patch +++ b/deps/curl/configure.patch @@ -1,4 +1,4 @@ -@@ -33462,7 +33462,7 @@ +@@ -34014,7 +34014,7 @@ else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 printf "%s\n" "failed" >&6; } @@ -7,7 +7,7 @@ fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ -@@ -33497,7 +33497,7 @@ +@@ -34049,7 +34049,7 @@ else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 printf "%s\n" "failed" >&6; } From 31c10cbfe0ebfb809654e91f651b4f0579078edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 23 Apr 2023 09:55:19 +0000 Subject: [PATCH 5/7] Fix compiler error --- lib/ProxySQL_Admin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 46a75d5dd..a5affe895 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -9644,7 +9644,7 @@ int ProxySQL_Admin::stats___save_mysql_query_digest_to_sqlite( int num_rows = resultset ? resultset->rows_count : digest_umap->size(); int max_bulk_row_idx = num_rows/32; max_bulk_row_idx=max_bulk_row_idx*32; - auto it = resultset ? (std::unordered_map::iterator)NULL : digest_umap->cbegin(); + auto it = resultset ? digest_umap->cend() : digest_umap->cbegin(); int i = 0; // If the function do not receives a resultset, it gets the values directly from the digest_umap while (resultset ? i != resultset->rows_count : it != digest_umap->end()) { From 0891a5b56c77e9e697490bd65d45cd6937e33d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 23 Apr 2023 09:56:25 +0000 Subject: [PATCH 6/7] Renaming thread_info_t to mon_thread_info_t Apparently thread_info_t is already defined in OSX , so it wasn't able to compile --- lib/MySQL_Monitor.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/MySQL_Monitor.cpp b/lib/MySQL_Monitor.cpp index e6d9e0943..d0d3bf57a 100644 --- a/lib/MySQL_Monitor.cpp +++ b/lib/MySQL_Monitor.cpp @@ -3795,7 +3795,7 @@ unique_ptr init_mysql_thread_struct() { return mysql_thr; } -struct thread_info_t { +struct mon_thread_info_t { pthread_t pthread; uint32_t writer_hg; }; @@ -3924,18 +3924,18 @@ void* monitor_GR_thread_HG(void *arg) { /** * @brief Creates a monitoring thread for each 'GroupReplication' cluster determined by writer hostgroups. * @param writer_hgs The writer hostgroups to use when creating the threads. - * @return A vector of 'thread_info_t' holding info of the created threads. + * @return A vector of 'mon_thread_info_t' holding info of the created threads. */ -vector create_group_replication_worker_threads(const set& writer_hgs) { +vector create_group_replication_worker_threads(const set& writer_hgs) { proxy_info("Activating Monitoring of %lu Group Replication clusters\n", writer_hgs.size()); - vector threads_info {}; + vector threads_info {}; for (const uint32_t writer_hg : writer_hgs) { threads_info.push_back({pthread_t {}, writer_hg}); } - for (thread_info_t& thread_info : threads_info) { + for (mon_thread_info_t& thread_info : threads_info) { proxy_info("Starting Monitor thread for Group Replication writer HG %u\n", thread_info.writer_hg); int err = pthread_create(&thread_info.pthread, NULL, monitor_GR_thread_HG, &thread_info.writer_hg); @@ -3963,7 +3963,7 @@ void* MySQL_Monitor::monitor_group_replication_2() { unique_ptr mysql_thr { init_mysql_thread_struct() }; // Info of the current GR monitoring threads: handle + writer_hg - vector threads_info {}; + vector threads_info {}; while (GloMyMon->shutdown == false && mysql_thread___monitor_enabled == true) { // Quick exit during shutdown/restart @@ -3988,7 +3988,7 @@ void* MySQL_Monitor::monitor_group_replication_2() { // Wait for the threads to terminate; Threads should exit on config change if (threads_info.empty() == false) { - for (const thread_info_t& thread_info : threads_info) { + for (const mon_thread_info_t& thread_info : threads_info) { pthread_join(thread_info.pthread, NULL); proxy_info("Stopped Monitor thread for Group Replication writer HG %u\n", thread_info.writer_hg); } From 46805fc445423b7822925e285d9dc7e1b94207c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sun, 23 Apr 2023 10:22:44 +0000 Subject: [PATCH 7/7] Fix path in libev --- src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index f8ae9a6e0..8e58b1c12 100644 --- a/src/Makefile +++ b/src/Makefile @@ -189,7 +189,7 @@ endif LIBPROXYSQLAR=$(LDIR)/libproxysql.a ifeq ($(UNAME_S),Darwin) - LIBPROXYSQLAR=$(LDIR)/libproxysql.a ../deps/jemalloc/jemalloc/lib/libjemalloc.a ../deps/libmicrohttpd/libmicrohttpd/src/microhttpd/.libs/libmicrohttpd.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/pcre/pcre/.libs/libpcre.a ../deps/pcre/pcre/.libs/libpcrecpp.a ../deps/libdaemon/libdaemon/libdaemon/.libs/libdaemon.a ../deps/libconfig/libconfig/lib/.libs/libconfig++.a ../deps/libconfig/libconfig/lib/.libs/libconfig.a ../deps/curl/curl/lib/.libs/libcurl.a ../deps/sqlite3/sqlite3/sqlite3.o ../deps/libinjection/libinjection/src/libinjection.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/libev/libev-4.24/.libs/libev.a + LIBPROXYSQLAR=$(LDIR)/libproxysql.a ../deps/jemalloc/jemalloc/lib/libjemalloc.a ../deps/libmicrohttpd/libmicrohttpd/src/microhttpd/.libs/libmicrohttpd.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/pcre/pcre/.libs/libpcre.a ../deps/pcre/pcre/.libs/libpcrecpp.a ../deps/libdaemon/libdaemon/libdaemon/.libs/libdaemon.a ../deps/libconfig/libconfig/lib/.libs/libconfig++.a ../deps/libconfig/libconfig/lib/.libs/libconfig.a ../deps/curl/curl/lib/.libs/libcurl.a ../deps/sqlite3/sqlite3/sqlite3.o ../deps/libinjection/libinjection/src/libinjection.a ../deps/libhttpserver/libhttpserver/build/src/.libs/libhttpserver.a ../deps/libev/libev/.libs/libev.a endif LIBPROXYSQLAR+= $(SSL_LDIR)/libssl.a $(SSL_LDIR)/libcrypto.a $(CITYHASH_DIR)/libcityhash.a