Make query classifier self-contained.

Only the query classifier needs the functionality of the embedded
server, while the rest of MaxScale is content with the client
library or Connector/C.

This have now been rearranged so that query-classifier links with
the embedded static library and then explicitly exports its own
functions using the query_classifier.map linker script. That way
query classifier will use the embedded library, while the rest of
maxscale use the client library, and this without conflicts.

Currently, query_classifier is not linked to maxscale-common,
but executables must link to maxscale-common and query_classifier.
This commit is contained in:
Johan Wikman 2016-01-15 16:26:56 +02:00
parent 0b742977dd
commit 42b1722e49
11 changed files with 126 additions and 35 deletions

View File

@ -1,6 +1,9 @@
add_library(query_classifier SHARED query_classifier.cc)
target_link_libraries(query_classifier maxscale-common)
target_link_libraries(query_classifier ${EMBEDDED_LIB} aio crypt crypto dl m ${PCRE_LINK_FLAGS} ssl stdc++ z)
set_target_properties(query_classifier PROPERTIES VERSION "1.0.0")
set_target_properties(query_classifier PROPERTIES LINK_FLAGS -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/query_classifier.map)
#set_target_properties(query_classifier PROPERTIES LINK_FLAGS -Wl,-z,defs)
install(TARGETS query_classifier COMPONENT lib DESTINATION ${MAXSCALE_LIBDIR})
if(BUILD_TESTS)
add_subdirectory(test)

View File

@ -46,6 +46,11 @@
#include <sql_parse.h>
#include <errmsg.h>
#include <client_settings.h>
// In client_settings.h mysql_server_init and mysql_server_end are defined to
// mysql_client_plugin_init and mysql_client_plugin_deinit respectively.
// Those must be undefined, so that we here really call mysql_server_[init|end].
#undef mysql_server_init
#undef mysql_server_end
#include <set_var.h>
#include <strfunc.h>
#include <item_func.h>
@ -1478,14 +1483,13 @@ static parsing_info_t* parsing_info_init(void (*donefun)(void *))
/** Get server handle */
mysql = mysql_init(NULL);
ss_dassert(mysql != NULL);
if (mysql == NULL)
{
MXS_ERROR("Call to mysql_real_connect failed due %d, %s.",
mysql_errno(mysql),
mysql_error(mysql));
ss_dassert(mysql != NULL);
goto retblock;
}
@ -1770,3 +1774,42 @@ qc_query_op_t qc_get_operation(GWBUF* querybuf)
return operation;
}
bool qc_init(int argc, char** argv, char** groups)
{
int rc = mysql_library_init(argc, argv, groups);
if (rc != 0)
{
MXS_ERROR("mysql_library_init() failed. Error code: %d", rc);
}
else
{
MXS_NOTICE("Query classifier initialized.");
}
return rc == 0;
}
void qc_end()
{
mysql_library_end();
}
bool qc_thread_init()
{
bool inited = (mysql_thread_init() == 0);
if (!inited)
{
MXS_ERROR("mysql_thread_init() failed.");
}
return inited;
}
void qc_thread_end()
{
mysql_thread_end();
}

View File

@ -83,6 +83,12 @@ typedef enum
#define QUERY_IS_TYPE(mask,type) ((mask & type) == type)
bool qc_init(int argc, char** argv, char** groups);
void qc_end();
bool qc_thread_init();
void qc_thread_end();
/**
* Create THD and use it for creating parse tree. Examine parse tree and
* classify the query.

View File

@ -0,0 +1,20 @@
{
global:
qc_end;
qc_get_affected_fields;
qc_get_canonical;
qc_get_created_table_name;
qc_get_database_names;
qc_get_operation;
qc_get_qtype_str;
qc_get_table_names;
qc_get_type;
qc_init;
qc_is_drop_table_query;
qc_is_real_query;
qc_query_has_clause;
qc_thread_end;
qc_thread_init;
local:
*;
};

View File

@ -1,6 +1,6 @@
add_library(maxscale-common SHARED adminusers.c atomic.c buffer.c config.c dbusers.c dcb.c filter.c externcmd.c gwbitmask.c gwdirs.c gw_utils.c hashtable.c hint.c housekeeper.c load_utils.c maxscale_pcre2.c memlog.c modutil.c monitor.c poll.c random_jkiss.c resultset.c secrets.c server.c service.c session.c spinlock.c thread.c users.c utils.c ${CMAKE_SOURCE_DIR}/log_manager/log_manager.cc ${CMAKE_SOURCE_DIR}/utils/skygw_utils.cc)
target_link_libraries(maxscale-common ${EMBEDDED_LIB} ${LZMA_LINK_FLAGS} ${PCRE2_LIBRARIES} ${PCRE_LINK_FLAGS} ${CURL_LIBRARIES} ssl aio pthread crypt dl crypto inih z rt m stdc++)
target_link_libraries(maxscale-common ${MYSQLCLIENT_LIBRARIES} ${LZMA_LINK_FLAGS} ${PCRE2_LIBRARIES} ${CURL_LIBRARIES} ssl aio pthread crypt dl crypto inih z rt m stdc++)
if(WITH_JEMALLOC)
target_link_libraries(maxscale-common ${JEMALLOC_LIBRARIES})
@ -20,15 +20,15 @@ elseif(WITH_TCMALLOC)
target_link_libraries(maxscale ${TCMALLOC_LIBRARIES})
endif()
target_link_libraries(maxscale maxscale-common)
target_link_libraries(maxscale maxscale-common query_classifier)
install(TARGETS maxscale DESTINATION ${MAXSCALE_BINDIR})
add_executable(maxkeys maxkeys.c)
target_link_libraries(maxkeys maxscale-common)
target_link_libraries(maxkeys maxscale-common query_classifier)
install(TARGETS maxkeys DESTINATION ${MAXSCALE_BINDIR})
add_executable(maxpasswd maxpasswd.c)
target_link_libraries(maxpasswd maxscale-common)
target_link_libraries(maxpasswd maxscale-common query_classifier)
install(TARGETS maxpasswd DESTINATION ${MAXSCALE_BINDIR})
if(BUILD_TESTS)

View File

@ -79,8 +79,9 @@
#include <sys/stat.h>
#include <sys/types.h>
# include <skygw_utils.h>
# include <log_manager.h>
#include <skygw_utils.h>
#include <log_manager.h>
#include <query_classifier.h>
#include <execinfo.h>
@ -990,17 +991,26 @@ static void usage(void)
*/
void worker_thread_main(void* arg)
{
/** Init mysql thread context for use with a mysql handle and a parser */
if (mysql_thread_init() == 0)
if (qc_thread_init())
{
poll_waitevents(arg);
/** Init mysql thread context for use with a mysql handle and a parser */
if (mysql_thread_init() == 0)
{
poll_waitevents(arg);
/** Release mysql thread context */
mysql_thread_end();
/** Release mysql thread context */
mysql_thread_end();
}
else
{
MXS_ERROR("Could not perform thread initialization for MySQL. Exiting thread.");
}
qc_thread_end();
}
else
{
MXS_ERROR("Could not perform thread initialization for MySQL. Exiting thread.");
MXS_ERROR("Could not perform thread initialization for query classifier. Exiting thread.");
}
}
@ -1818,6 +1828,14 @@ int main(int argc, char **argv)
}
}
if (!qc_init(num_elements, server_options, server_groups))
{
char* logerr = "Failed to initialise query classifier library.";
print_log_n_stderr(true, true, logerr, logerr, eno);
rc = MAXSCALE_INTERNALERROR;
goto return_main;
}
if (mysql_library_init(num_elements, server_options, server_groups))
{
if (!daemon_mode)

View File

@ -36,6 +36,7 @@
#include <mysql.h>
#include <resultset.h>
#include <session.h>
#include <query_classifier.h>
#define PROFILE_POLL 0

View File

@ -15,22 +15,22 @@ add_executable(test_users testusers.c)
add_executable(testfeedback testfeedback.c)
add_executable(testmaxscalepcre2 testmaxscalepcre2.c)
add_executable(testmemlog testmemlog.c)
target_link_libraries(test_adminusers maxscale-common)
target_link_libraries(test_buffer maxscale-common)
target_link_libraries(test_dcb maxscale-common)
target_link_libraries(test_filter maxscale-common)
target_link_libraries(test_hash maxscale-common )
target_link_libraries(test_hint maxscale-common )
target_link_libraries(test_modutil maxscale-common)
target_link_libraries(test_mysql_users MySQLClient maxscale-common)
target_link_libraries(test_poll maxscale-common)
target_link_libraries(test_server maxscale-common)
target_link_libraries(test_service maxscale-common)
target_link_libraries(test_spinlock maxscale-common )
target_link_libraries(test_users maxscale-common)
target_link_libraries(testfeedback maxscale-common)
target_link_libraries(testmaxscalepcre2 maxscale-common )
target_link_libraries(testmemlog maxscale-common )
target_link_libraries(test_adminusers maxscale-common query_classifier)
target_link_libraries(test_buffer maxscale-common query_classifier)
target_link_libraries(test_dcb maxscale-common query_classifier)
target_link_libraries(test_filter maxscale-common query_classifier)
target_link_libraries(test_hash maxscale-common query_classifier)
target_link_libraries(test_hint maxscale-common query_classifier)
target_link_libraries(test_modutil maxscale-common query_classifier)
target_link_libraries(test_mysql_users MySQLClient maxscale-common query_classifier)
target_link_libraries(test_poll maxscale-common query_classifier)
target_link_libraries(test_server maxscale-common query_classifier)
target_link_libraries(test_service maxscale-common query_classifier)
target_link_libraries(test_spinlock maxscale-common query_classifier)
target_link_libraries(test_users maxscale-common query_classifier)
target_link_libraries(testfeedback maxscale-common query_classifier)
target_link_libraries(testmaxscalepcre2 maxscale-common query_classifier)
target_link_libraries(testmemlog maxscale-common query_classifier)
add_test(Internal-TestAdminUsers test_adminusers)
add_test(Internal-TestBuffer test_buffer)
add_test(Internal-TestDCB test_dcb)

View File

@ -1,8 +1,8 @@
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
add_executable(harness_ui harness_ui.c harness_common.c)
add_executable(harness harness_util.c harness_common.c)
target_link_libraries(harness_ui maxscale-common)
target_link_libraries(harness maxscale-common)
target_link_libraries(harness_ui maxscale-common query_classifier)
target_link_libraries(harness maxscale-common query_classifier)
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${ERRMSG} ${CMAKE_CURRENT_BINARY_DIR})
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/harness.cnf ${CMAKE_CURRENT_BINARY_DIR})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/testdriver.sh ${CMAKE_CURRENT_BINARY_DIR}/testdriver.sh @ONLY)

View File

@ -4,7 +4,7 @@ target_link_libraries(binlogrouter maxscale-common)
install(TARGETS binlogrouter DESTINATION ${MAXSCALE_LIBDIR})
add_executable(maxbinlogcheck maxbinlogcheck.c blr_file.c blr_cache.c blr_master.c blr_slave.c blr.c)
target_link_libraries(maxbinlogcheck maxscale-common)
target_link_libraries(maxbinlogcheck maxscale-common query_classifier)
install(TARGETS maxbinlogcheck DESTINATION bin)

View File

@ -1,5 +1,5 @@
if(BUILD_TESTS)
add_executable(testbinlogrouter testbinlog.c ../blr.c ../blr_slave.c ../blr_master.c ../blr_file.c ../blr_cache.c)
target_link_libraries(testbinlogrouter maxscale-common)
target_link_libraries(testbinlogrouter maxscale-common query_classifier)
add_test(TestBinlogRouter ${CMAKE_CURRENT_BINARY_DIR}/testbinlogrouter)
endif()