[Tarantool-patches] [PATCH v2 4/4] qsync: don't send negative timeouts into fiber_cond_wait_timeout
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Fri Jul 17 01:45:16 MSK 2020
Thanks for the patch!
On 14.07.2020 16:53, Cyrill Gorcunov wrote:
> Basically our timeout is calculated via (a - b), where
> @a is a constant positive value fetched once, in turn
> the @b is rather a dynamic value thus the result may
> be negative. libev uses assert() call to catch such
> values when passed to timers setup. Thus lets intercept
> potential assert() trigger and exit early if timeout
> is already expired.
>
> Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
> ---
> There were a typo, so I force-updated the branch
>
> src/box/txn_limbo.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/src/box/txn_limbo.c b/src/box/txn_limbo.c
> index d5b887d36..0924952b7 100644
> --- a/src/box/txn_limbo.c
> +++ b/src/box/txn_limbo.c
> @@ -174,8 +174,10 @@ txn_limbo_wait_complete(struct txn_limbo *limbo, struct txn_limbo_entry *entry)
> double start_time = fiber_clock();
> while (true) {
> double deadline = start_time + replication_synchro_timeout;
> - bool cancellable = fiber_set_cancellable(false);
> double timeout = deadline - fiber_clock();
> + if (timeout < 0)
> + goto do_rollback;
> + bool cancellable = fiber_set_cancellable(false);
I added timeout = -1; here and tried to commit a sync transaction. I
got timed out error, no assertions. Please, tell me, how to reproduce
the assertion you mention in the commit message. Otherwise I don't see
why would we need the < 0 check. If it is done somewhere inside
fiber_cond_wait_timeout anyway.
> int rc = fiber_cond_wait_timeout(&limbo->wait_cond, timeout);
> fiber_set_cancellable(cancellable);
> if (txn_limbo_entry_is_complete(entry))
> @@ -509,8 +511,10 @@ txn_limbo_wait_confirm(struct txn_limbo *limbo)
> double start_time = fiber_clock();
> while (true) {
> double deadline = start_time + replication_synchro_timeout;
> - bool cancellable = fiber_set_cancellable(false);
> double timeout = deadline - fiber_clock();
> + if (timeout < 0)
> + goto timed_out;
> + bool cancellable = fiber_set_cancellable(false);
> int rc = fiber_cond_wait_timeout(&limbo->wait_cond, timeout);
> fiber_set_cancellable(cancellable);
> if (cwp.is_confirm || cwp.is_rollback)
>
More information about the Tarantool-patches
mailing list