Fix log manager race condition
The log manager could send two messages if a log message was posted soon before the log manager was stopped. This caused a debug assertion which then manifested as a deadlock inside the log manager.
This commit is contained in:
parent
e0a584a626
commit
e9fceff8ce
@ -2321,7 +2321,9 @@ static void* thr_filewriter_fun(void* data)
|
||||
|
||||
/** Inform log manager about the state. */
|
||||
skygw_message_send(fwr->fwr_clientmes);
|
||||
while (!skygw_thread_must_exit(thr))
|
||||
bool running = true;
|
||||
|
||||
do
|
||||
{
|
||||
/**
|
||||
* Wait until new log arrival message appears.
|
||||
@ -2347,14 +2349,23 @@ static void* thr_filewriter_fun(void* data)
|
||||
}
|
||||
}
|
||||
|
||||
bool send_message = false;
|
||||
|
||||
if (flushall_done_flag)
|
||||
{
|
||||
flushall_done_flag = false;
|
||||
flushall_logfiles(false);
|
||||
skygw_message_send(fwr->fwr_clientmes);
|
||||
send_message = true;
|
||||
}
|
||||
|
||||
} /* while (!skygw_thread_must_exit) */
|
||||
running = !skygw_thread_must_exit(thr);
|
||||
|
||||
if (running && send_message)
|
||||
{
|
||||
skygw_message_send(fwr->fwr_clientmes);
|
||||
}
|
||||
}
|
||||
while (running);
|
||||
|
||||
ss_debug(skygw_thread_set_state(thr, THR_STOPPED));
|
||||
/** Inform log manager that file writer thread has stopped. */
|
||||
|
@ -436,7 +436,9 @@ bool skygw_thread_set_exitflag(skygw_thread_t* thr, skygw_message_t* sendmes,
|
||||
skygw_message_wait(recmes);
|
||||
}
|
||||
|
||||
ss_dassert(simple_mutex_lock(thr->sth_mutex, true) == 0);
|
||||
ss_dassert(thr->sth_state == THR_STOPPED);
|
||||
ss_dassert(simple_mutex_unlock(thr->sth_mutex) == 0);
|
||||
|
||||
return_succp:
|
||||
return succp;
|
||||
|
@ -221,8 +221,6 @@ int main(int argc, char* argv[])
|
||||
err = MXS_NOTICE("%s", logstr);
|
||||
ss_dassert(err == 0);
|
||||
|
||||
succp = mxs_log_init(NULL, "/tmp", MXS_LOG_TARGET_FS);
|
||||
ss_dassert(succp);
|
||||
skygw_log_enable(LOG_INFO);
|
||||
logstr = ("6.\tWrite to ERROR and thus also to MESSAGE and TRACE logs.");
|
||||
err = MXS_ERROR("%s", logstr);
|
||||
|
Loading…
x
Reference in New Issue
Block a user