diff options
-rw-r--r-- | include/my_service_manager.h (renamed from include/my_systemd.h) | 11 | ||||
-rw-r--r-- | sql/mysqld.cc | 6 | ||||
-rw-r--r-- | storage/innobase/buf/buf0dump.cc | 9 | ||||
-rw-r--r-- | storage/innobase/buf/buf0flu.cc | 10 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 2 | ||||
-rw-r--r-- | storage/innobase/include/univ.i | 4 | ||||
-rw-r--r-- | storage/innobase/log/log0log.cc | 26 | ||||
-rw-r--r-- | storage/innobase/log/log0recv.cc | 9 | ||||
-rw-r--r-- | storage/innobase/srv/srv0srv.cc | 10 | ||||
-rw-r--r-- | storage/innobase/trx/trx0roll.cc | 12 | ||||
-rw-r--r-- | storage/xtradb/buf/buf0dump.cc | 9 | ||||
-rw-r--r-- | storage/xtradb/buf/buf0flu.cc | 10 | ||||
-rw-r--r-- | storage/xtradb/handler/ha_innodb.cc | 2 | ||||
-rw-r--r-- | storage/xtradb/include/univ.i | 4 | ||||
-rw-r--r-- | storage/xtradb/log/log0log.cc | 26 | ||||
-rw-r--r-- | storage/xtradb/log/log0recv.cc | 9 | ||||
-rw-r--r-- | storage/xtradb/srv/srv0srv.cc | 10 | ||||
-rw-r--r-- | storage/xtradb/trx/trx0roll.cc | 12 |
18 files changed, 151 insertions, 30 deletions
diff --git a/include/my_systemd.h b/include/my_service_manager.h index bef75576422..4d88e992b5e 100644 --- a/include/my_systemd.h +++ b/include/my_service_manager.h @@ -16,8 +16,8 @@ */ -#ifndef MY_SYSTEMD_INCLUDED -#define MY_SYSTEMD_INCLUDED +#ifndef MY_SERVICE_MANAGER_INCLUDED +#define MY_SERVICE_MANAGER_INCLUDED #if defined(HAVE_SYSTEMD) && !defined(EMBEDDED_LIBRARY) /* @@ -26,9 +26,14 @@ */ #define __STDC_FORMAT_MACROS #include <systemd/sd-daemon.h> +/** INTERVAL in seconds followed by printf style status */ +#define service_manager_extend_timeout(INTERVAL, FMTSTR, ...) \ + sd_notifyf(0, "STATUS=" FMTSTR "\nEXTEND_TIMEOUT_USEC=%u\n", ##__VA_ARGS__, INTERVAL * 1000000) + #else #define sd_notify(X, Y) #define sd_notifyf(E, F, ...) +#define service_manager_extend_timeout(I, FMTSTR, ...) #endif -#endif /* MY_SYSTEMD_INCLUDED */ +#endif /* MY_SERVICE_MANAGER_INCLUDED */ diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 7875d41d706..fc633a4fc46 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -111,7 +111,7 @@ #include <poll.h> #endif -#include <my_systemd.h> +#include <my_service_manager.h> #define mysqld_charset &my_charset_latin1 @@ -6482,7 +6482,7 @@ void handle_connections_sockets() #endif sd_notify(0, "READY=1\n" - "STATUS=Taking your SQL requests now..."); + "STATUS=Taking your SQL requests now...\n"); DBUG_PRINT("general",("Waiting for connections.")); MAYBE_BROKEN_SYSCALL; @@ -6700,7 +6700,7 @@ void handle_connections_sockets() set_current_thd(0); } sd_notify(0, "STOPPING=1\n" - "STATUS=Shutdown in progress"); + "STATUS=Shutdown in progress\n"); DBUG_VOID_RETURN; } diff --git a/storage/innobase/buf/buf0dump.cc b/storage/innobase/buf/buf0dump.cc index bd9b6c92994..7d9dbc74951 100644 --- a/storage/innobase/buf/buf0dump.cc +++ b/storage/innobase/buf/buf0dump.cc @@ -42,6 +42,7 @@ Created April 08, 2011 Vasil Dimov #include "ut0byte.h" /* ut_ull_create() */ #include "ut0sort.h" /* UT_SORT_FUNCTION_BODY */ #include "mysql/service_wsrep.h" /* wsrep_recovery */ +#include <my_service_manager.h> enum status_severity { STATUS_INFO, @@ -333,6 +334,14 @@ buf_dump( i + 1, srv_buf_pool_instances, j + 1, n_pages); } + if ( (j % 1024) == 0) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Dumping buffer pool " + ULINTPF "/" ULINTPF ", " + "page " ULINTPF "/" ULINTPF, + i + 1, srv_buf_pool_instances, + j + 1, n_pages); + } } ut_free(dump); diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index dacddfca385..ef73ea51696 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -54,6 +54,8 @@ Created 11/11/1995 Heikki Tuuri #include "mysql/service_thd_wait.h" #include "fil0pagecompress.h" +#include <my_service_manager.h> + /** Number of pages flushed through non flush_list flushes. */ static ulint buf_lru_flush_page_count = 0; @@ -528,6 +530,14 @@ buf_flush_remove( buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); ulint zip_size; + /* TODO Marko: "I think that it might be useful to have a global time base for the shutdown progress reporting and extending the timeout intervals." */ + if (UNIV_UNLIKELY(srv_shutdown_state == SRV_SHUTDOWN_FLUSH_PHASE)) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Flush and remove page with tablespace id %d" + ", Poolid %d, flush list length %d", + bpage->space, buf_pool->instance_no, UT_LIST_GET_LEN(buf_pool->flush_list)); + } + ut_ad(buf_pool_mutex_own(buf_pool)); ut_ad(mutex_own(buf_page_get_mutex(bpage))); ut_ad(bpage->in_flush_list); diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 7c412344920..9401f737a06 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -55,7 +55,7 @@ MYSQL_PLUGIN_IMPORT extern char mysql_unpacked_real_data_home[]; #include <io.h> #endif -#include <my_systemd.h> +#include <my_service_manager.h> /** @file ha_innodb.cc */ diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index 24bcab56870..0d5657b30ff 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -65,6 +65,10 @@ component, i.e. we show M.N.P as M.N */ IB_TO_STR(INNODB_VERSION_MAJOR) "." \ IB_TO_STR(INNODB_VERSION_MINOR) "/en/" +/** How far ahead should we tell the service manager the timeout +(time in seconds) */ +#define INNODB_EXTEND_TIMEOUT_INTERVAL 30 + #ifdef MYSQL_DYNAMIC_PLUGIN /* In the dynamic plugin, redefine some externally visible symbols in order not to conflict with the symbols of a builtin InnoDB. */ diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index 4929106b22c..1d562a6ef68 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -39,7 +39,7 @@ Created 12/9/1995 Heikki Tuuri #ifndef UNIV_HOTBACKUP #if MYSQL_VERSION_ID < 100200 -# include <my_systemd.h> /* sd_notifyf() */ +# include <my_service_manager.h> #endif #include "mem0mem.h" @@ -1443,6 +1443,11 @@ log_write_up_to( return; } + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "log write up to: %llu", lsn); + } + loop: ut_ad(++loop_count < 100); @@ -2351,8 +2356,9 @@ loop: if (recv_sys->report(ut_time())) { ib_logf(IB_LOG_LEVEL_INFO, "Read redo log up to LSN=" LSN_PF, start_lsn); - sd_notifyf(0, "STATUS=Read redo log up to LSN=" LSN_PF, - start_lsn); + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Read redo log up to LSN=" LSN_PF, + start_lsn); } if (start_lsn != end_lsn) { @@ -3320,10 +3326,16 @@ wait_suspend_loop: before proceeding further. */ count = 0; +#define COUNT_INTERVAL 600 +#define CHECK_INTERVAL 100000 + service_manager_extend_timeout(COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for page cleaner"); while (buf_page_cleaner_is_active) { ++count; - os_thread_sleep(100000); - if (srv_print_verbose_log && count > 600) { + os_thread_sleep(CHECK_INTERVAL); + if (srv_print_verbose_log && count > COUNT_INTERVAL) { + service_manager_extend_timeout(COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for page cleaner"); ib_logf(IB_LOG_LEVEL_INFO, "Waiting for page_cleaner to " "finish flushing of buffer pool"); @@ -3408,6 +3420,8 @@ wait_suspend_loop: } if (!srv_read_only_mode) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "ensuring dirty buffer pool are written to log"); log_make_checkpoint_at(LSN_MAX, TRUE); mutex_enter(&log_sys->mutex); @@ -3451,6 +3465,8 @@ wait_suspend_loop: srv_thread_type type = srv_get_active_thread_type(); ut_a(type == SRV_NONE); + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Free innodb buffer pool"); buf_all_freed(); ut_a(lsn == log_sys->lsn); diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 6e6d8aae25e..deaf5e88d7c 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -30,7 +30,7 @@ Created 9/20/1997 Heikki Tuuri #include <stdio.h> // Solaris/x86 header file bug #include <vector> -#include <my_systemd.h> +#include <my_service_manager.h> #include "log0recv.h" @@ -1717,8 +1717,8 @@ recv_recover_page_func( if (recv_sys->report(time)) { ib_logf(IB_LOG_LEVEL_INFO, "To recover: " ULINTPF " pages from log", n); - sd_notifyf(0, "STATUS=To recover: " ULINTPF - " pages from log", n); + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, "To recover: " ULINTPF " pages from log", n); } } @@ -2911,6 +2911,9 @@ recv_init_crash_recovery(void) and restore them from the doublewrite buffer if possible */ + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, "Starting Innodb crash recovery"); + if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) { buf_dblwr_process(); diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 561df0bd060..4f25672d4aa 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -77,6 +77,12 @@ Created 10/8/1995 Heikki Tuuri #include "fil0pagecompress.h" #include "btr0scrub.h" +#include <my_service_manager.h> + +#ifdef WITH_WSREP +extern int wsrep_debug; +extern int wsrep_trx_is_aborting(void *thd_ptr); +#endif /* The following is the maximum allowed duration of a lock wait. */ UNIV_INTERN ulong srv_fatal_semaphore_wait_threshold = DEFAULT_SRV_FATAL_SEMAPHORE_TIMEOUT; @@ -2727,6 +2733,10 @@ srv_do_purge( *n_total_purged += n_pages_purged; + if (n_pages_purged > 0) { + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, "Innodb %d pages purged", n_pages_purged); + } } while (!srv_purge_should_exit(n_pages_purged) && n_pages_purged > 0 && purge_sys->state == PURGE_STATE_RUN); diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index fc237ca1c16..d91988d56cd 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -25,7 +25,7 @@ Created 3/26/1996 Heikki Tuuri *******************************************************/ #include "my_config.h" -#include <my_systemd.h> +#include <my_service_manager.h> #include "trx0roll.h" @@ -740,11 +740,17 @@ UNIV_INTERN void trx_roll_report_progress() n_rows += t->undo_no; } } + + if (n_rows > 0) { + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, + "To roll back: " ULINTPF " transactions, " + "%llu rows", n_trx, n_rows); + } + ib_logf(IB_LOG_LEVEL_INFO, "To roll back: " ULINTPF " transactions, " "%llu rows", n_trx, n_rows); - sd_notifyf(0, "STATUS=To roll back: " ULINTPF " transactions, " - "%llu rows", n_trx, n_rows); } mutex_exit(&recv_sys->mutex); diff --git a/storage/xtradb/buf/buf0dump.cc b/storage/xtradb/buf/buf0dump.cc index 1cc40fcfbad..ce21a308960 100644 --- a/storage/xtradb/buf/buf0dump.cc +++ b/storage/xtradb/buf/buf0dump.cc @@ -42,6 +42,7 @@ Created April 08, 2011 Vasil Dimov #include "ut0byte.h" /* ut_ull_create() */ #include "ut0sort.h" /* UT_SORT_FUNCTION_BODY */ #include "mysql/service_wsrep.h" /* wsrep_recovery */ +#include <my_service_manager.h> enum status_severity { STATUS_INFO, @@ -333,6 +334,14 @@ buf_dump( i + 1, srv_buf_pool_instances, j + 1, n_pages); } + if ( (j % 1024) == 0) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Dumping buffer pool " + ULINTPF "/" ULINTPF ", " + "page " ULINTPF "/" ULINTPF, + i + 1, srv_buf_pool_instances, + j + 1, n_pages); + } } ut_free(dump); diff --git a/storage/xtradb/buf/buf0flu.cc b/storage/xtradb/buf/buf0flu.cc index abbcd5141cf..2b4d796d1d6 100644 --- a/storage/xtradb/buf/buf0flu.cc +++ b/storage/xtradb/buf/buf0flu.cc @@ -54,6 +54,8 @@ Created 11/11/1995 Heikki Tuuri #include "mysql/service_thd_wait.h" #include "fil0pagecompress.h" +#include <my_service_manager.h> + /** Number of pages flushed through non flush_list flushes. */ // static ulint buf_lru_flush_page_count = 0; @@ -575,6 +577,14 @@ buf_flush_remove( buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); ulint zip_size; + /* TODO Marko: "I think that it might be useful to have a global time base for the shutdown progress reporting and extending the timeout intervals." */ + if (UNIV_UNLIKELY(srv_shutdown_state == SRV_SHUTDOWN_FLUSH_PHASE)) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Flush and remove page with tablespace id %d" + ", Poolid %d, flush list length %d", + bpage->space, buf_pool->instance_no, UT_LIST_GET_LEN(buf_pool->flush_list)); + } + ut_ad(mutex_own(buf_page_get_mutex(bpage))); #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG ut_ad(buf_page_get_state(bpage) != BUF_BLOCK_ZIP_DIRTY diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 2b7dc01238c..25c8f3c6495 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -50,7 +50,7 @@ this program; if not, write to the Free Software Foundation, Inc., #include <io.h> #endif -#include <my_systemd.h> +#include <my_service_manager.h> /** @file ha_innodb.cc */ diff --git a/storage/xtradb/include/univ.i b/storage/xtradb/include/univ.i index e6c4917f532..f4adc2e8e54 100644 --- a/storage/xtradb/include/univ.i +++ b/storage/xtradb/include/univ.i @@ -73,6 +73,10 @@ component, i.e. we show M.N.P as M.N */ IB_TO_STR(INNODB_VERSION_MAJOR) "." \ IB_TO_STR(INNODB_VERSION_MINOR) "/en/" +/** How far ahead should we tell the service manager the timeout +(time in seconds) */ +#define INNODB_EXTEND_TIMEOUT_INTERVAL 30 + #ifdef MYSQL_DYNAMIC_PLUGIN /* In the dynamic plugin, redefine some externally visible symbols in order not to conflict with the symbols of a builtin InnoDB. */ diff --git a/storage/xtradb/log/log0log.cc b/storage/xtradb/log/log0log.cc index ee23bc49850..4387dddc16a 100644 --- a/storage/xtradb/log/log0log.cc +++ b/storage/xtradb/log/log0log.cc @@ -49,7 +49,7 @@ Created 12/9/1995 Heikki Tuuri #ifndef UNIV_HOTBACKUP #if MYSQL_VERSION_ID < 100200 -# include <my_systemd.h> /* sd_notifyf() */ +# include <my_service_manager.h> #endif #include "mem0mem.h" @@ -1561,6 +1561,11 @@ log_write_up_to( return; } + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "log write up to: %llu", lsn); + } + loop: ut_ad(++loop_count < 100); @@ -2602,8 +2607,9 @@ loop: if (recv_recovery_is_on() && recv_sys && recv_sys->report(ut_time())) { ib_logf(IB_LOG_LEVEL_INFO, "Read redo log up to LSN=" LSN_PF, start_lsn); - sd_notifyf(0, "STATUS=Read redo log up to LSN=" LSN_PF, - start_lsn); + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Read redo log up to LSN=" LSN_PF, + start_lsn); } if (start_lsn != end_lsn) { @@ -3636,6 +3642,10 @@ wait_suspend_loop: before proceeding further. */ count = 0; +#define COUNT_INTERVAL 600 +#define CHECK_INTERVAL 100000 + service_manager_extend_timeout(COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for page cleaner"); os_rmb; while (buf_page_cleaner_is_active || buf_lru_manager_is_active) { if (srv_print_verbose_log && count == 0) { @@ -3644,8 +3654,10 @@ wait_suspend_loop: "finish flushing of buffer pool"); } ++count; - os_thread_sleep(100000); - if (count > 600) { + os_thread_sleep(CHECK_INTERVAL); + if (srv_print_verbose_log && count > COUNT_INTERVAL) { + service_manager_extend_timeout(COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for page cleaner"); count = 0; } os_rmb; @@ -3730,6 +3742,8 @@ wait_suspend_loop: } if (!srv_read_only_mode) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "ensuring dirty buffer pool are written to log"); log_make_checkpoint_at(LSN_MAX, TRUE); mutex_enter(&log_sys->mutex); @@ -3774,6 +3788,8 @@ wait_suspend_loop: srv_thread_type type = srv_get_active_thread_type(); ut_a(type == SRV_NONE); + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Free innodb buffer pool"); buf_all_freed(); ut_a(lsn == log_sys->lsn); diff --git a/storage/xtradb/log/log0recv.cc b/storage/xtradb/log/log0recv.cc index 1943fb51f37..d8e90de45e9 100644 --- a/storage/xtradb/log/log0recv.cc +++ b/storage/xtradb/log/log0recv.cc @@ -30,7 +30,7 @@ Created 9/20/1997 Heikki Tuuri #include <stdio.h> // Solaris/x86 header file bug #include <vector> -#include <my_systemd.h> +#include <my_service_manager.h> #include "log0recv.h" @@ -1804,8 +1804,8 @@ recv_recover_page_func( if (recv_sys->report(time)) { ib_logf(IB_LOG_LEVEL_INFO, "To recover: " ULINTPF " pages from log", n); - sd_notifyf(0, "STATUS=To recover: " ULINTPF - " pages from log", n); + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, "To recover: " ULINTPF " pages from log", n); } } @@ -3001,6 +3001,9 @@ recv_init_crash_recovery(void) and restore them from the doublewrite buffer if possible */ + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, "Starting Innodb crash recovery"); + if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) { buf_dblwr_process(); diff --git a/storage/xtradb/srv/srv0srv.cc b/storage/xtradb/srv/srv0srv.cc index f431c47de4d..b53948d9371 100644 --- a/storage/xtradb/srv/srv0srv.cc +++ b/storage/xtradb/srv/srv0srv.cc @@ -86,6 +86,12 @@ ibool innobase_get_slow_log(); in the server */ UNIV_INTERN ulint srv_activity_count = 0; +#include <my_service_manager.h> + +#ifdef WITH_WSREP +extern int wsrep_debug; +extern int wsrep_trx_is_aborting(void *thd_ptr); +#endif /* The following is the maximum allowed duration of a lock wait. */ UNIV_INTERN ulong srv_fatal_semaphore_wait_threshold = DEFAULT_SRV_FATAL_SEMAPHORE_TIMEOUT; @@ -3435,6 +3441,10 @@ srv_do_purge( *n_total_purged += n_pages_purged; + if (n_pages_purged > 0) { + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, "Innodb %d pages purged", n_pages_purged); + } } while (!srv_purge_should_exit(n_pages_purged) && n_pages_purged > 0 && purge_sys->state == PURGE_STATE_RUN); diff --git a/storage/xtradb/trx/trx0roll.cc b/storage/xtradb/trx/trx0roll.cc index 9066e4fac4f..a031217e51d 100644 --- a/storage/xtradb/trx/trx0roll.cc +++ b/storage/xtradb/trx/trx0roll.cc @@ -25,7 +25,7 @@ Created 3/26/1996 Heikki Tuuri *******************************************************/ #include "my_config.h" -#include <my_systemd.h> +#include <my_service_manager.h> #include "trx0roll.h" @@ -752,11 +752,17 @@ UNIV_INTERN void trx_roll_report_progress() n_rows += t->undo_no; } } + + if (n_rows > 0) { + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, + "To roll back: " ULINTPF " transactions, " + "%llu rows", n_trx, n_rows); + } + ib_logf(IB_LOG_LEVEL_INFO, "To roll back: " ULINTPF " transactions, " "%llu rows", n_trx, n_rows); - sd_notifyf(0, "STATUS=To roll back: " ULINTPF " transactions, " - "%llu rows", n_trx, n_rows); } mutex_exit(&recv_sys->mutex); |