From 56eb2115d000837fe435b92ace86a456bd53abaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 14 Oct 2024 07:50:12 +0000 Subject: [PATCH] Added variable eventslog_buffer_max_query_length In MySQL_Event copy constructor, queries are copied up to eventslog_buffer_max_query_length bytes. --- include/MySQL_Thread.h | 1 + include/proxysql_structs.h | 2 ++ lib/MySQL_Logger.cpp | 13 ++++++++----- lib/MySQL_Thread.cpp | 6 +++++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/include/MySQL_Thread.h b/include/MySQL_Thread.h index eb4ad1a48..5885c99f2 100644 --- a/include/MySQL_Thread.h +++ b/include/MySQL_Thread.h @@ -535,6 +535,7 @@ class MySQL_Threads_Handler char *eventslog_filename; int eventslog_filesize; int eventslog_buffer_history_size; + int eventslog_buffer_max_query_length; int eventslog_default_log; int eventslog_format; char *auditlog_filename; diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index 980952729..57646d1a2 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -893,6 +893,7 @@ __thread char * mysql_thread___ssl_p2s_crlpath; __thread char * mysql_thread___eventslog_filename; __thread int mysql_thread___eventslog_filesize; __thread int mysql_thread___eventslog_buffer_history_size; +__thread int mysql_thread___eventslog_buffer_max_query_length; __thread int mysql_thread___eventslog_default_log; __thread int mysql_thread___eventslog_format; @@ -1066,6 +1067,7 @@ extern __thread char * mysql_thread___ssl_p2s_crlpath; extern __thread char * mysql_thread___eventslog_filename; extern __thread int mysql_thread___eventslog_filesize; extern __thread int mysql_thread___eventslog_buffer_history_size; +extern __thread int mysql_thread___eventslog_buffer_max_query_length; extern __thread int mysql_thread___eventslog_default_log; extern __thread int mysql_thread___eventslog_format; diff --git a/lib/MySQL_Logger.cpp b/lib/MySQL_Logger.cpp index b268b50eb..25ecce11b 100644 --- a/lib/MySQL_Logger.cpp +++ b/lib/MySQL_Logger.cpp @@ -80,9 +80,12 @@ MySQL_Event::MySQL_Event(const MySQL_Event &other) { } // query_ptr is NOT null terminated if (other.query_ptr != nullptr) { - query_ptr = (char *)malloc(query_len+1); - memcpy(query_ptr, other.query_ptr, query_len); - query_ptr[query_len] = '\0'; + size_t maxQueryLen = mysql_thread___eventslog_buffer_max_query_length; + size_t lenToCopy = std::min(other.query_len, maxQueryLen); + query_ptr = (char*)malloc(lenToCopy + 1); // +1 for null terminator + memcpy(query_ptr, other.query_ptr, lenToCopy); + query_ptr[lenToCopy] = '\0'; // Null-terminate the copied string + query_len = lenToCopy; } // server is NOT null terminated if (other.server != nullptr) { @@ -1217,7 +1220,7 @@ void MySQL_Logger::insertMysqlEventsIntoDb(SQLite3DB * db, const std::string& ta rc = (*proxy_sqlite3_bind_int64)(statement32, (idx*numcols)+5, event->end_time); ASSERT_SQLITE_OK(rc, db); sprintf(digest_hex_str, "0x%016llX", (long long unsigned int)event->query_digest); rc = (*proxy_sqlite3_bind_text)(statement32, (idx*numcols)+6, digest_hex_str, -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, db); - rc = (*proxy_sqlite3_bind_text)(statement32, (idx*numcols)+7, event->query_ptr, event->query_len, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, db); + rc = (*proxy_sqlite3_bind_text)(statement32, (idx*numcols)+7, event->query_ptr, -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, db); // MySQL_Events from circular-buffer are all null-terminated rc = (*proxy_sqlite3_bind_text)(statement32, (idx*numcols)+8, event->server, -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, db); rc = (*proxy_sqlite3_bind_text)(statement32, (idx*numcols)+9, event->client, -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, db); rc = (*proxy_sqlite3_bind_int)(statement32, (idx*numcols)+10, (int)event->et); ASSERT_SQLITE_OK(rc, db); // Assuming event_type is an enum mapped to integers @@ -1242,7 +1245,7 @@ void MySQL_Logger::insertMysqlEventsIntoDb(SQLite3DB * db, const std::string& ta rc = (*proxy_sqlite3_bind_int64)(statement1, 5, event->end_time); ASSERT_SQLITE_OK(rc, db); sprintf(digest_hex_str, "0x%016llX", (long long unsigned int)event->query_digest); rc = (*proxy_sqlite3_bind_text)(statement1, 6, digest_hex_str, -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, db); - rc = (*proxy_sqlite3_bind_text)(statement1, 7, event->query_ptr, event->query_len, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, db); + rc = (*proxy_sqlite3_bind_text)(statement1, 7, event->query_ptr, -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, db); // MySQL_Events from circular-buffer are all null-terminated rc = (*proxy_sqlite3_bind_text)(statement1, 8, event->server, -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, db); rc = (*proxy_sqlite3_bind_text)(statement1, 9, event->client, -1, SQLITE_TRANSIENT); ASSERT_SQLITE_OK(rc, db); rc = (*proxy_sqlite3_bind_int)(statement1, 10, (int)event->et); ASSERT_SQLITE_OK(rc, db); // Assuming event_type is an enum mapped to integers diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 767b02c04..70dc9a94d 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -350,6 +350,7 @@ static char * mysql_thread_variables_names[]= { (char *)"eventslog_filename", (char *)"eventslog_filesize", (char *)"eventslog_buffer_history_size", + (char *)"eventslog_buffer_max_query_length", (char *)"eventslog_default_log", (char *)"eventslog_format", (char *)"auditlog_filename", @@ -1071,6 +1072,7 @@ MySQL_Threads_Handler::MySQL_Threads_Handler() { variables.eventslog_filename=strdup((char *)""); // proxysql-mysql-eventslog is recommended variables.eventslog_filesize=100*1024*1024; variables.eventslog_buffer_history_size=0; + variables.eventslog_buffer_max_query_length = 32*1024; variables.eventslog_default_log=0; variables.eventslog_format=1; variables.auditlog_filename=strdup((char *)""); @@ -2242,7 +2244,8 @@ char ** MySQL_Threads_Handler::get_variables_list() { // logs VariablesPointers_int["auditlog_filesize"] = make_tuple(&variables.auditlog_filesize, 1024*1024, 1*1024*1024*1024, false); VariablesPointers_int["eventslog_filesize"] = make_tuple(&variables.eventslog_filesize, 1024*1024, 1*1024*1024*1024, false); - VariablesPointers_int["eventslog_buffer_history_size"] = make_tuple(&variables.eventslog_buffer_history_size, 0, 8*1024*1024, false); + VariablesPointers_int["eventslog_buffer_history_size"] = make_tuple(&variables.eventslog_buffer_history_size, 0, 8*1024*1024, false); + VariablesPointers_int["eventslog_buffer_max_query_length"] = make_tuple(&variables.eventslog_buffer_max_query_length, 128, 32*1024*1024, false); VariablesPointers_int["eventslog_default_log"] = make_tuple(&variables.eventslog_default_log, 0, 1, false); // various VariablesPointers_int["long_query_time"] = make_tuple(&variables.long_query_time, 0, 20*24*3600*1000, false); @@ -4378,6 +4381,7 @@ void MySQL_Thread::refresh_variables() { GloMyLogger->MyLogCB->setBufferSize(elmhs); } } + REFRESH_VARIABLE_INT(eventslog_buffer_max_query_length); REFRESH_VARIABLE_INT(eventslog_default_log); REFRESH_VARIABLE_INT(eventslog_format); REFRESH_VARIABLE_CHAR(eventslog_filename);