From c1f930d23d8d1af55fd7883e159c69733bb305fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Fri, 10 Aug 2018 15:14:16 +0300 Subject: [PATCH] Fix query classifier initialization data race The initialization code does some modification to the global code (something about a page cache) and causes warnings with TSAN. --- query_classifier/qc_sqlite/qc_sqlite.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/query_classifier/qc_sqlite/qc_sqlite.cc b/query_classifier/qc_sqlite/qc_sqlite.cc index 0bf6dada7..0ef803a00 100644 --- a/query_classifier/qc_sqlite/qc_sqlite.cc +++ b/query_classifier/qc_sqlite/qc_sqlite.cc @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -143,6 +144,7 @@ static struct qc_sql_mode_t sql_mode; qc_parse_as_t parse_as; QC_NAME_MAPPING* pFunction_name_mappings; + std::mutex lock; } this_unit; /** @@ -4487,6 +4489,11 @@ static int32_t qc_sqlite_thread_init(void) ss_dassert(this_unit.initialized); ss_dassert(!this_thread.initialized); + // Thread initialization must be done behind a global lock. SQLite can perform + // global initialization which has a data race in the page cache code. + // TODO: Figure out why this happens + std::lock_guard guard(this_unit.lock); + // TODO: It may be sufficient to have a single in-memory database for all threads. int rc = sqlite3_open(":memory:", &this_thread.pDb); if (rc == SQLITE_OK) @@ -4546,6 +4553,7 @@ static void qc_sqlite_thread_end(void) ss_dassert(this_thread.initialized); ss_dassert(this_thread.pDb); + std::lock_guard guard(this_unit.lock); int rc = sqlite3_close(this_thread.pDb); if (rc != SQLITE_OK)