← Back to team overview

maria-developers team mailing list archive

Re: strange IF in translog_flush_buffers()

 

Hi, Sanja!

On May 17, Oleksandr Byelkin wrote:
> Hi!
> 
> Actually code should work as it is, but it check unnecessary condition and
> also very dificult to understand. I propose following fix (comment in it
> explains why it work now and why condition is always TRUE)

I cannot review it, this is between you and Monty. If you think it's ok,
please push it (into 10.0). Or I can push it together with all other
similar fixes.

> diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c
> index 86e51cc3526..e680e830703 100644
> --- a/storage/maria/ma_loghandler.c
> +++ b/storage/maria/ma_loghandler.c
> @@ -7789,8 +7789,23 @@ void translog_flush_buffers(TRANSLOG_ADDRESS *lsn,
>      translog_force_current_buffer_to_finish();
>      translog_buffer_unlock(buffer);
>    }
> -  else if (log_descriptor.bc.buffer->prev_last_lsn != LSN_IMPOSSIBLE)
> +  else
>    {
> +    if (log_descriptor.bc.buffer->last_lsn == LSN_IMPOSSIBLE)
> +    {
> +      /*
> +        In this case both last_lsn & prev_last_lsn are LSN_IMPOSSIBLE
> +        otherwise it will go in the first IF because LSN_IMPOSSIBLE less
> +        then any real LSN and cmp_translog_addr(*lsn,
> +        log_descriptor.bc.buffer->prev_last_lsn) will be TRUE
> +      */
> +      DBUG_ASSERT(log_descriptor.bc.buffer->prev_last_lsn ==
> +                  LSN_IMPOSSIBLE);
> +      DBUG_PRINT("info", ("There is no LSNs yet generated => do nothing"));
> +      translog_unlock();
> +      DBUG_VOID_RETURN;
> +    }
> +
>      /* fix lsn if it was horizon */
>      *lsn= log_descriptor.bc.buffer->prev_last_lsn;
>      DBUG_PRINT("info", ("LSN to flush fixed to prev last lsn: (%lu,0x%lx)",
> @@ -7799,13 +7814,6 @@ void translog_flush_buffers(TRANSLOG_ADDRESS *lsn,
>                       TRANSLOG_BUFFERS_NO);
>      translog_unlock();
>    }
> -  else if (log_descriptor.bc.buffer->last_lsn == LSN_IMPOSSIBLE)
> -  {
> -    DBUG_PRINT("info", ("There is no LSNs yet generated => do nothing"));
> -    translog_unlock();
> -    DBUG_VOID_RETURN;
> -  }
> -
>    /* flush buffers */
>    *sent_to_disk= translog_get_sent_to_disk();
>    if (cmp_translog_addr(*lsn, *sent_to_disk) > 0)

Regards,
Sergei
Chief Architect MariaDB
and security@xxxxxxxxxxx