[Tarantool-patches] [PATCH] relay: yield explicitly every N sent rows
Kirill Yukhin
kyukhin at tarantool.org
Fri Feb 26 11:41:36 MSK 2021
Hello,
On 12 фев 14:25, Serge Petrenko via Tarantool-patches wrote:
> While sending a WAL, relay only yields in `coio_write_xrow`, once it
> sees the socket isn't ready for writes.
> It may happen that the socket is always ready for a long period of time,
> and relay doesn't yield at all while recovering a whole .xlog file. This
> may take well more than a minute.
> During this period of time, relay doesn't read replica's ACKs due to
> relay reader fiber not being scheduled, and once the reader is finally
> live it times out immediately, causing the replica to reconnect.
>
> The problem is amplified by the fact that replica waits for
> replication_timeout to pass prior to reconnecting, which lets master
> pile up even more ready WALs, and effectively making it impossible for
> the replica to sync.
>
> To fix the problem let's yield explicitly in relay_send_row every
> WAL_ROWS_PER_YIELD rows. The same is already done in local recovery, and
> serves the same purpose: to not block the event loop for too long.
>
> Closes #5762
> ---
> No test provided as the fix is quite obvious but rather hard to test
> automatically.
> https://github.com/tarantool/tarantool/issues/5762
> https://github.com/tarantool/tarantool/tree/sp/gh-5762-relay-yield
I've checked your patch into 2.6, 2.6 and master.
--
Regards, Kirill Yukhin
More information about the Tarantool-patches
mailing list