sysbench icon indicating copy to clipboard operation
sysbench copied to clipboard

memory leaking when killing queries is part of test case

Open grooverdan opened this issue 3 years ago • 0 comments

With minor changes to the oltp_read_write adding a KILL connection results in sysbench leaking memory (quickly).

sysbench files - https://gist.github.com/grooverdan/1c956eb324261adf1b093521f9d43542

sysbench-master-df89d34c410a2277e19f77e47e535d0890b2029b affected.

mariadb-connector-c 3.2.7-1.fc36 used (no outstanding memory leak faults).

The attempted patch of the following wasn't sufficient:

diff --git a/src/drivers/mysql/drv_mysql.c b/src/drivers/mysql/drv_mysql.c
index 58600b8..61985a1 100644
--- a/src/drivers/mysql/drv_mysql.c
+++ b/src/drivers/mysql/drv_mysql.c
@@ -595,6 +595,7 @@ int mysql_drv_prepare(db_stmt_t *stmt, const char *query, size_t len)
         log_text(LOG_INFO,
                  "Failed to prepare query \"%s\" (%d: %s), using emulation",
                  query, rc, mysql_error(con));
+        mysql_stmt_close(mystmt);
         goto emulate;
       }
       else
@@ -788,6 +789,9 @@ static db_error_t check_error(db_conn_t *sb_con, const char *func,
   db_mysql_conn_t *db_mysql_con = (db_mysql_conn_t *) sb_con->ptr;
   MYSQL          *con = db_mysql_con->mysql;
 
+  if (sb_con->state == DB_CONN_RESULT_SET)
+    mysql_drv_free_results(&sb_con->rs);
+
   const unsigned int error = mysql_errno(con);
   DEBUG("mysql_errno(%p) = %u", con, sb_con->sql_errno);
 

$ sudo /usr/share/bcc/tools/memleak -c "sysbench/src/sysbench --mysql-user=root --mysql-db=test --mysql-socket=/tmp/build-mariadb-server-10.6.sock  --threads=16 --time=60 --report-interval=20  --mysql-ignore-errors=1927,1213,2013,2006 oltp_read_write_kill_MDEV-29190.lua  run"
Executing 'sysbench/src/sysbench --mysql-user=root --mysql-db=test --mysql-socket=/tmp/build-mariadb-server-10.6.sock  --threads=16 --time=60 --report-interval=20  --mysql-ignore-errors=1927,1213,2013,2006 oltp_read_write_kill_MDEV-29190.lua  run' and tracing the resulting process.
sysbench 1.1.0-df89d34 (using bundled LuaJIT 2.1.0-beta3)

Running the test with following options:
Number of threads: 16
Report intermediate results every 20 second(s)
Initializing random number generator from current time


Initializing worker threads...

Threads started!

Attaching to pid 395171, Ctrl+C to quit.
[18:57:47] Top 10 stacks with outstanding allocations:
	640 bytes in 5 allocations from stack
		db_connection_create+0x16 [sysbench]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
	896 bytes in 7 allocations from stack
		db_connection_create+0x16 [sysbench]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
	1536 bytes in 12 allocations from stack
		db_connection_create+0x16 [sysbench]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
	6144 bytes in 48 allocations from stack
		db_connection_create+0x16 [sysbench]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
	6784 bytes in 53 allocations from stack
		db_connection_create+0x16 [sysbench]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
	1300800 bytes in 13550 allocations from stack
		[unknown] [libmariadb.so.3]
	1967328 bytes in 13662 allocations from stack
		mysql_store_result+0x53 [libmariadb.so.3]
	224603472 bytes in 27506 allocations from stack
		[unknown] [libmariadb.so.3]
[18:57:53] Top 10 stacks with outstanding allocations:
	49152 bytes in 6 allocations from stack
		[unknown] [libmariadb.so.3]
		[unknown]
	352640 bytes in 380 allocations from stack
		mysql_stmt_init+0x1a [libmariadb.so.3]
	416976 bytes in 51 allocations from stack
		mysql_optionsv+0x1454 [libmariadb.so.3]
	729344 bytes in 352 allocations from stack
		mysql_stmt_init+0x196 [libmariadb.so.3]
	814296 bytes in 393 allocations from stack
		mysql_stmt_init+0xf1 [libmariadb.so.3]
	835584 bytes in 51 allocations from stack
		[unknown] [libmariadb.so.3]
	2018800 bytes in 490 allocations from stack
		mysql_stmt_init+0x146 [libmariadb.so.3]
	4833312 bytes in 50347 allocations from stack
		[unknown] [libmariadb.so.3]
	7267248 bytes in 50467 allocations from stack
		mysql_store_result+0x53 [libmariadb.so.3]
	830521856 bytes in 101696 allocations from stack
		[unknown] [libmariadb.so.3]
[18:57:59] Top 10 stacks with outstanding allocations:
	12032 bytes in 94 allocations from stack
		db_connection_create+0x16 [sysbench]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
		[unknown]
	25984 bytes in 28 allocations from stack
		mysql_stmt_init+0x1a [libmariadb.so.3]
	60088 bytes in 29 allocations from stack
		mysql_stmt_init+0x196 [libmariadb.so.3]
	65408 bytes in 8 allocations from stack
		mysql_optionsv+0x1454 [libmariadb.so.3]
	68376 bytes in 33 allocations from stack
		mysql_stmt_init+0xf1 [libmariadb.so.3]
	114688 bytes in 7 allocations from stack
		[unknown] [libmariadb.so.3]
	197760 bytes in 48 allocations from stack
		mysql_stmt_init+0x146 [libmariadb.so.3]
	2391744 bytes in 24914 allocations from stack
		[unknown] [libmariadb.so.3]
	3598560 bytes in 24990 allocations from stack
		mysql_store_result+0x53 [libmariadb.so.3]
	409584264 bytes in 50149 allocations from stack
		[unknown] [libmariadb.so.3]

grooverdan avatar Aug 11 '22 08:08 grooverdan