[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