Brandon Nesterenko <brandon.nestere...@mariadb.com> writes:

> I always appreciate learning the history of why some things exist as they
> are :)

Oh yes, there's a _lot_ of history in the replication code...

> is logged. Reading the whole comment really solidified it. I'll incorporate
> your feedback.

Thanks Brandon!
I think generally the new patch looks good. It's a nice cleanup of the
Query_log_event::begin_event() to simply pad with Q_DUMMY instead of
special-casing different lengths (which then was buggy due to not being
updated as GTID_EVENT was extended).

Just one small but important oversight:

>      case Q_GTID_FLAGS3:
>      {
>        CHECK_SPACE(pos, end, 1);
>        gtid_flags_extra= *pos++;
>        if (gtid_flags_extra & (Gtid_log_event::FL_COMMIT_ALTER_E1 |
>                                Gtid_log_event::FL_ROLLBACK_ALTER_E1))
>        {
>          CHECK_SPACE(pos, end, 8);
>          sa_seq_no = uint8korr(pos);
>          pos+= 8;
>        }
>      }
>      case Q_DUMMY:
>      {
> +      /*
> +        At some point, this query event was translated from a GTID event, 
> with
> +        these Q_DUMMY bytes added to pad the end of the header. We can skip 
> the
> +        rest of processing these vars. Note this is a separate case from the
> +        default to avoid the DBUG_PRINT of an unknown status var.
> +      */
> +      pos= (const uchar*) end;
>        break;
>      }

The `break` at the end of the prior case Q_GTID_FLAGS3 was lost, that needs
to be restored.

This part looks a bit odd:

> +  int2store(q + Q_STATUS_VARS_LEN_OFFSET, dummy_bytes);
> +  for (size_t i= 0; i < dummy_bytes; i++)
> +    q[Q_DATA_OFFSET + i]= Q_DUMMY;
> +  q+= dummy_bytes;
> +  q[Q_DATA_OFFSET]= 0;                    /* Zero terminator for empty db */
> +  q+= Q_DATA_OFFSET + 1;

The line `q+= dummy_bytes;` leaves q with a strange value, which is
Q_DATA_OFFSET before the end of the usevar section. I would have done
something like this:

  q+= dummy_bytes + Q_DATA_OFFSET;
  *q+= 0;                    /* Zero terminator for empty db */

Or this:

  q[Q_DATA_OFFSET + dummy_bytes]= 0;         /* Zero terminator for empty db */
  q+= Q_DATA_OFFSET + dummy_bytes + 1;

But I think the current code is correct, so it's up to you what you prefer.

 - Kristian.
_______________________________________________
developers mailing list -- developers@lists.mariadb.org
To unsubscribe send an email to developers-le...@lists.mariadb.org

Reply via email to