mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
Merge desktop.sanja.is.com.ua:/home/bell/mysql/bk/mysql-maria
into desktop.sanja.is.com.ua:/home/bell/mysql/bk/work-maria-bug
This commit is contained in:
commit
494409bdc6
1 changed files with 46 additions and 18 deletions
|
@ -155,7 +155,7 @@ struct st_translog_descriptor
|
||||||
/* maximum LSN of the current (not finished) file */
|
/* maximum LSN of the current (not finished) file */
|
||||||
LSN max_lsn;
|
LSN max_lsn;
|
||||||
|
|
||||||
/* Last flushed LSN */
|
/* Last flushed LSN (protected by log_flush_lock) */
|
||||||
LSN flushed;
|
LSN flushed;
|
||||||
/* Last LSN sent to the disk (but maybe not written yet) */
|
/* Last LSN sent to the disk (but maybe not written yet) */
|
||||||
LSN sent_to_file;
|
LSN sent_to_file;
|
||||||
|
@ -220,6 +220,14 @@ LOG_DESC log_record_type_descriptor[LOGREC_NUMBER_OF_TYPES];
|
||||||
|
|
||||||
|
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
|
|
||||||
|
#define translog_buffer_lock_assert_owner(B) \
|
||||||
|
safe_mutex_assert_owner(&B->mutex);
|
||||||
|
void translog_lock_assert_owner()
|
||||||
|
{
|
||||||
|
translog_buffer_lock_assert_owner(log_descriptor.bc.buffer);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief check the description table validity
|
@brief check the description table validity
|
||||||
|
|
||||||
|
@ -294,6 +302,9 @@ static void check_translog_description_table(int num)
|
||||||
}
|
}
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
#define translog_buffer_lock_assert_owner(B)
|
||||||
|
#define translog_lock_assert_owner()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static LOG_DESC INIT_LOGREC_FIXED_RECORD_0LSN_EXAMPLE=
|
static LOG_DESC INIT_LOGREC_FIXED_RECORD_0LSN_EXAMPLE=
|
||||||
|
@ -3051,13 +3062,6 @@ void translog_destroy()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define translog_buffer_lock_assert_owner(B) \
|
|
||||||
safe_mutex_assert_owner(&B->mutex);
|
|
||||||
void translog_lock_assert_owner()
|
|
||||||
{
|
|
||||||
translog_buffer_lock_assert_owner(log_descriptor.bc.buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Start new page
|
Start new page
|
||||||
|
@ -3314,6 +3318,7 @@ static inline void
|
||||||
translog_buffer_increase_writers(struct st_translog_buffer *buffer)
|
translog_buffer_increase_writers(struct st_translog_buffer *buffer)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("translog_buffer_increase_writers");
|
DBUG_ENTER("translog_buffer_increase_writers");
|
||||||
|
translog_buffer_lock_assert_owner(buffer);
|
||||||
buffer->copy_to_buffer_in_progress++;
|
buffer->copy_to_buffer_in_progress++;
|
||||||
DBUG_PRINT("info", ("copy_to_buffer_in_progress. Buffer #%u 0x%lx: %d",
|
DBUG_PRINT("info", ("copy_to_buffer_in_progress. Buffer #%u 0x%lx: %d",
|
||||||
(uint) buffer->buffer_no, (ulong) buffer,
|
(uint) buffer->buffer_no, (ulong) buffer,
|
||||||
|
@ -3334,6 +3339,7 @@ translog_buffer_increase_writers(struct st_translog_buffer *buffer)
|
||||||
static void translog_buffer_decrease_writers(struct st_translog_buffer *buffer)
|
static void translog_buffer_decrease_writers(struct st_translog_buffer *buffer)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("translog_buffer_decrease_writers");
|
DBUG_ENTER("translog_buffer_decrease_writers");
|
||||||
|
translog_buffer_lock_assert_owner(buffer);
|
||||||
buffer->copy_to_buffer_in_progress--;
|
buffer->copy_to_buffer_in_progress--;
|
||||||
DBUG_PRINT("info", ("copy_to_buffer_in_progress. Buffer #%u 0x%lx: %d",
|
DBUG_PRINT("info", ("copy_to_buffer_in_progress. Buffer #%u 0x%lx: %d",
|
||||||
(uint) buffer->buffer_no, (ulong) buffer,
|
(uint) buffer->buffer_no, (ulong) buffer,
|
||||||
|
@ -6147,6 +6153,30 @@ static void translog_force_current_buffer_to_finish()
|
||||||
log_descriptor.bc.write_counter= write_counter;
|
log_descriptor.bc.write_counter= write_counter;
|
||||||
log_descriptor.bc.previous_offset= previous_offset;
|
log_descriptor.bc.previous_offset= previous_offset;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Advances this log pointer, increases writers and let other threads to
|
||||||
|
write to the log while we process old page content
|
||||||
|
*/
|
||||||
|
if (left)
|
||||||
|
{
|
||||||
|
log_descriptor.bc.ptr+= current_page_fill;
|
||||||
|
log_descriptor.bc.buffer->size= log_descriptor.bc.current_page_fill=
|
||||||
|
current_page_fill;
|
||||||
|
new_buffer->overlay= old_buffer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
translog_new_page_header(&log_descriptor.horizon, &log_descriptor.bc);
|
||||||
|
translog_buffer_increase_writers(new_buffer);
|
||||||
|
translog_buffer_unlock(new_buffer);
|
||||||
|
|
||||||
|
/*
|
||||||
|
We have to wait until all writers finish before start changing the
|
||||||
|
pages by applying protection and copying the page content in the
|
||||||
|
new buffer.
|
||||||
|
*/
|
||||||
|
translog_wait_for_writers(old_buffer);
|
||||||
|
|
||||||
|
|
||||||
if (data[TRANSLOG_PAGE_FLAGS] & TRANSLOG_SECTOR_PROTECTION)
|
if (data[TRANSLOG_PAGE_FLAGS] & TRANSLOG_SECTOR_PROTECTION)
|
||||||
{
|
{
|
||||||
translog_put_sector_protection(data, &log_descriptor.bc);
|
translog_put_sector_protection(data, &log_descriptor.bc);
|
||||||
|
@ -6175,19 +6205,17 @@ static void translog_force_current_buffer_to_finish()
|
||||||
if (left)
|
if (left)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
TODO: do not copy begining of the page if we have no CRC or sector
|
TODO: do not copy beginning of the page if we have no CRC or sector
|
||||||
checks on
|
checks on
|
||||||
*/
|
*/
|
||||||
memcpy(new_buffer->buffer, data, current_page_fill);
|
memcpy(new_buffer->buffer, data, current_page_fill);
|
||||||
log_descriptor.bc.ptr+= current_page_fill;
|
|
||||||
log_descriptor.bc.buffer->size= log_descriptor.bc.current_page_fill=
|
|
||||||
current_page_fill;
|
|
||||||
new_buffer->overlay= old_buffer;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
translog_new_page_header(&log_descriptor.horizon, &log_descriptor.bc);
|
|
||||||
old_buffer->next_buffer_offset= new_buffer->offset;
|
old_buffer->next_buffer_offset= new_buffer->offset;
|
||||||
|
|
||||||
|
translog_buffer_lock(new_buffer);
|
||||||
|
translog_buffer_decrease_writers(new_buffer);
|
||||||
|
translog_buffer_unlock(new_buffer);
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6246,6 +6274,7 @@ my_bool translog_flush(LSN lsn)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("already flushed: (%lu,0x%lx)",
|
DBUG_PRINT("info", ("already flushed: (%lu,0x%lx)",
|
||||||
LSN_IN_PARTS(log_descriptor.flushed)));
|
LSN_IN_PARTS(log_descriptor.flushed)));
|
||||||
|
translog_unlock();
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
/* send to the file if it is not sent */
|
/* send to the file if it is not sent */
|
||||||
|
@ -6282,9 +6311,9 @@ my_bool translog_flush(LSN lsn)
|
||||||
rc= 1;
|
rc= 1;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (!full_circle)
|
translog_lock();
|
||||||
translog_lock();
|
|
||||||
}
|
}
|
||||||
|
translog_unlock();
|
||||||
|
|
||||||
for (i= LSN_FILE_NO(old_flushed); i <= LSN_FILE_NO(lsn); i++)
|
for (i= LSN_FILE_NO(old_flushed); i <= LSN_FILE_NO(lsn); i++)
|
||||||
{
|
{
|
||||||
|
@ -6313,7 +6342,6 @@ my_bool translog_flush(LSN lsn)
|
||||||
/** @todo LOG decide if syncing of directory is needed */
|
/** @todo LOG decide if syncing of directory is needed */
|
||||||
rc|= my_sync(log_descriptor.directory_fd, MYF(MY_WME | MY_IGNORE_BADFD));
|
rc|= my_sync(log_descriptor.directory_fd, MYF(MY_WME | MY_IGNORE_BADFD));
|
||||||
out:
|
out:
|
||||||
translog_unlock();
|
|
||||||
pthread_mutex_unlock(&log_descriptor.log_flush_lock);
|
pthread_mutex_unlock(&log_descriptor.log_flush_lock);
|
||||||
DBUG_RETURN(rc);
|
DBUG_RETURN(rc);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue