Skip to content

Commit

Permalink
Fix for bugs ##1588439, 1588447.
Browse files Browse the repository at this point in the history
Bug 1588439: Audit log hangs when trying to write log record of
             length audit_log_buffer_size

Bug 1588447: Audit log in ASYNC mode should not skip log records
             which don't fit into log buffer

Fix for bug 1588439:

Adjust conditions in audit_log_buffer_write and audit_log_flush to
allow records to pass through.

Fix for bug 1588447:

In ASYNCHRONOUS mode when audit record is longer than log buffer
size, log this record directly into file.
  • Loading branch information
gl-sergei committed Jun 2, 2016
1 parent 5d4c1fe commit 62f97b8
Showing 1 changed file with 21 additions and 3 deletions.
24 changes: 21 additions & 3 deletions plugin/audit_log/buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ struct audit_log_buffer {
mysql_mutex_t mutex;
mysql_cond_t flushed_cond;
mysql_cond_t written_cond;
log_record_state_t state;
};

#if defined(HAVE_PSI_INTERFACE)
Expand Down Expand Up @@ -68,8 +69,9 @@ void audit_log_flush(audit_log_buffer_t *log)
mysql_cond_timedwait(&log->written_cond, &log->mutex, &abstime);
}

if (log->flush_pos > log->write_pos % log->size)
if (log->flush_pos >= log->write_pos % log->size)
{
log->state= LOG_RECORD_INCOMPLETE;
mysql_mutex_unlock(&log->mutex);
log->write_func(log->write_func_data,
log->buf + log->flush_pos,
Expand All @@ -88,6 +90,7 @@ void audit_log_flush(audit_log_buffer_t *log)
LOG_RECORD_COMPLETE);
mysql_mutex_lock(&log->mutex);
log->flush_pos+= flushlen;
log->state= LOG_RECORD_COMPLETE;
}
DBUG_ASSERT(log->write_pos >= log->flush_pos);
mysql_cond_broadcast(&log->flushed_cond);
Expand Down Expand Up @@ -134,6 +137,7 @@ audit_log_buffer_t *audit_log_buffer_init(size_t size, int drop_if_full,
log->write_func= write_func;
log->write_func_data= data;
log->size= size;
log->state= LOG_RECORD_COMPLETE;

mysql_mutex_init(key_log_mutex, &log->mutex, MY_MUTEX_INIT_FAST);
mysql_cond_init(key_log_flushed_cond, &log->flushed_cond, NULL);
Expand Down Expand Up @@ -163,11 +167,25 @@ void audit_log_buffer_shutdown(audit_log_buffer_t *log)
int audit_log_buffer_write(audit_log_buffer_t *log, const char *buf, size_t len)
{
if (len > log->size)
return(1);
{
if (!log->drop_if_full)
{
mysql_mutex_lock(&log->mutex);
while (log->state == LOG_RECORD_INCOMPLETE)
{
mysql_cond_wait(&log->flushed_cond, &log->mutex);
}
/* do not release log->mutex to not allow flush thread to make one more
incomplete record */
log->write_func(log->write_func_data, buf, len, LOG_RECORD_COMPLETE);
mysql_mutex_unlock(&log->mutex);
}
return(0);
}

mysql_mutex_lock(&log->mutex);
loop:
if (log->write_pos + len < log->flush_pos + log->size)
if (log->write_pos + len <= log->flush_pos + log->size)
{
size_t wrlen= min(len, log->size -
(log->write_pos % log->size));
Expand Down

0 comments on commit 62f97b8

Please sign in to comment.