diff --git a/query_classifier/qc_sqlite/qc_sqlite.cc b/query_classifier/qc_sqlite/qc_sqlite.cc index 661aac4ab..ff0a2d4ca 100644 --- a/query_classifier/qc_sqlite/qc_sqlite.cc +++ b/query_classifier/qc_sqlite/qc_sqlite.cc @@ -4413,14 +4413,12 @@ static int32_t qc_sqlite_process_init(void) this_unit.initialized = true; - if (qc_sqlite_thread_init() == 0) + if (this_unit.log_level != QC_LOG_NOTHING) { - if (this_unit.log_level != QC_LOG_NOTHING) - { - const char* message = NULL; + const char* message = NULL; - switch (this_unit.log_level) - { + switch (this_unit.log_level) + { case QC_LOG_NON_PARSED: message = "Statements that cannot be parsed completely are logged."; break; @@ -4435,16 +4433,9 @@ static int32_t qc_sqlite_process_init(void) default: ss_dassert(!true); - } - - MXS_NOTICE("%s", message); } - } - else - { - this_unit.initialized = false; - sqlite3_shutdown(); + MXS_NOTICE("%s", message); } } else diff --git a/query_classifier/test/compare.cc b/query_classifier/test/compare.cc index bb19165ca..47fe617c8 100644 --- a/query_classifier/test/compare.cc +++ b/query_classifier/test/compare.cc @@ -176,8 +176,9 @@ QUERY_CLASSIFIER* get_classifier(const char* zName, qc_sql_mode_t sql_mode, cons if (pClassifier) { - if ((pClassifier->qc_setup(sql_mode, zArgs) != QC_RESULT_OK) || - ((pClassifier->qc_process_init() != QC_RESULT_OK))) + if (pClassifier->qc_setup(sql_mode, zArgs) != QC_RESULT_OK || + pClassifier->qc_process_init() != QC_RESULT_OK || + pClassifier->qc_thread_init() != QC_RESULT_OK) { cerr << "error: Could not setup or init classifier " << zName << "." << endl; qc_unload(pClassifier); diff --git a/server/core/worker.cc b/server/core/worker.cc index 93b443ab4..d01888a9d 100644 --- a/server/core/worker.cc +++ b/server/core/worker.cc @@ -857,11 +857,19 @@ void Worker::delete_zombies() void Worker::run() { - this_thread.current_worker_id = m_id; - poll_waitevents(); - this_thread.current_worker_id = WORKER_ABSENT_ID; + if (modules_thread_init()) + { + this_thread.current_worker_id = m_id; + poll_waitevents(); + this_thread.current_worker_id = WORKER_ABSENT_ID; - MXS_NOTICE("Worker %d has shut down.", m_id); + MXS_NOTICE("Worker %d has shut down.", m_id); + modules_thread_finish(); + } + else + { + MXS_ERROR("Could not perform thread initialization for all modules. Thread exits."); + } } bool Worker::start(size_t stack_size) @@ -1069,18 +1077,8 @@ void Worker::handle_message(MessageQueue& queue, const MessageQueue::Message& ms //static void Worker::thread_main(void* pArg) { - if (modules_thread_init()) - { - Worker* pWorker = static_cast(pArg); - - pWorker->run(); - - modules_thread_finish(); - } - else - { - MXS_ERROR("Could not perform thread initialization for all modules. Thread exits."); - } + Worker* pWorker = static_cast(pArg); + pWorker->run(); } /** diff --git a/server/modules/filter/dbfwfilter/dbfwfilter.cc b/server/modules/filter/dbfwfilter/dbfwfilter.cc index 9db364770..637e7542b 100644 --- a/server/modules/filter/dbfwfilter/dbfwfilter.cc +++ b/server/modules/filter/dbfwfilter/dbfwfilter.cc @@ -92,6 +92,9 @@ int dbfw_yyparse(void*); #endif MXS_END_DECLS +namespace +{ + /** The rules and users for each thread */ struct DbfwThread { @@ -107,6 +110,8 @@ struct DbfwThread thread_local DbfwThread* this_thread = NULL; +} + bool parse_at_times(const char** tok, char** saveptr, Rule* ruledef); bool parse_limit_queries(Dbfw* instance, Rule* ruledef, const char* rule, char** saveptr); static void rule_free_all(Rule* rule); @@ -450,6 +455,7 @@ bool dbfw_show_rules_json(const MODULECMD_ARG *argv, json_t** output) static int dbfw_thr_init() { + ss_dassert(this_thread == NULL); int rval = 0; if ((this_thread = new (std::nothrow) DbfwThread) == NULL)