1
0
mirror of https://github.com/MariaDB/server.git synced 2025-12-24 11:21:21 +03:00

MDEV-22271 Excessive stack memory usage due to WSREP_LOG

- Made WSREP_LOG a function and moved the body out of header.
- Reduced the stack allocated buffer size and implemented
  reprint into dynamically allocated buffer if stack buffer is not
  large enough to hold the message.
This commit is contained in:
Teemu Ollakka
2020-03-03 16:50:48 +02:00
committed by Marko Mäkelä
parent af91266498
commit c79051e587
2 changed files with 42 additions and 7 deletions

View File

@@ -267,6 +267,45 @@ char* wsrep_cluster_capabilities = NULL;
wsp::Config_state *wsrep_config_state;
void WSREP_LOG(void (*fun)(const char* fmt, ...), const char* fmt, ...)
{
/* Allocate short buffer from stack. If the vsnprintf() return value
indicates that the message was truncated, a new buffer will be allocated
dynamically and the message will be reprinted. */
char msg[128] = {'\0'};
va_list arglist;
va_start(arglist, fmt);
int n= vsnprintf(msg, sizeof(msg) - 1, fmt, arglist);
va_end(arglist);
if (n < 0)
{
sql_print_warning("WSREP: Printing message failed");
}
else if (n < (int)sizeof(msg))
{
fun("WSREP: %s", msg);
}
else
{
size_t dynbuf_size= std::max(n, 4096);
char* dynbuf= (char*) my_malloc(dynbuf_size, MYF(0));
if (dynbuf)
{
va_start(arglist, fmt);
(void)vsnprintf(&dynbuf[0], dynbuf_size - 1, fmt, arglist);
va_end(arglist);
dynbuf[dynbuf_size - 1] = '\0';
fun("WSREP: %s", &dynbuf[0]);
my_free(dynbuf);
}
else
{
/* Memory allocation for vector failed, print truncated message. */
fun("WSREP: %s", msg);
}
}
}
wsrep_uuid_t local_uuid = WSREP_UUID_UNDEFINED;
wsrep_seqno_t local_seqno = WSREP_SEQNO_UNDEFINED;

View File

@@ -242,13 +242,9 @@ extern wsrep_seqno_t wsrep_locked_seqno;
((wsrep_forced_binlog_format != BINLOG_FORMAT_UNSPEC) ? \
wsrep_forced_binlog_format : my_format)
// prefix all messages with "WSREP"
#define WSREP_LOG(fun, ...) \
do { \
char msg[1024]= {'\0'}; \
snprintf(msg, sizeof(msg) - 1, ## __VA_ARGS__); \
fun("WSREP: %s", msg); \
} while(0)
/* A wrapper function for MySQL log functions. The call will prefix
the log message with WSREP and forward the result buffer to fun. */
void WSREP_LOG(void (*fun)(const char* fmt, ...), const char* fmt, ...);
#define WSREP_DEBUG(...) \
if (wsrep_debug) WSREP_LOG(sql_print_information, ##__VA_ARGS__)