From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Vladimir Davydov Subject: [PATCH v2 04/11] vinyl: move transaction size sanity check to quota Date: Fri, 28 Sep 2018 20:40:02 +0300 Message-Id: In-Reply-To: References: In-Reply-To: References: To: kostja@tarantool.org Cc: tarantool-patches@freelists.org List-ID: There's a sanity check in vinyl_engine_prepare, which checks if the transaction size is less than the configured limit and fails without waiting for quota if it isn't. Let's move this check to vy_quota_use, because it's really a business of the quota object. This implies that vy_quota_use has to set diag to differentiate this error from timeout. --- src/box/vinyl.c | 14 +------------- src/box/vy_quota.c | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/box/vinyl.c b/src/box/vinyl.c index 1c0192cb..4ca2953b 100644 --- a/src/box/vinyl.c +++ b/src/box/vinyl.c @@ -2331,16 +2331,6 @@ vinyl_engine_prepare(struct engine *engine, struct txn *txn) return -1; /* - * The configured memory limit will never allow us to commit - * this transaction. Fail early. - */ - if (tx->write_size > env->quota.limit) { - diag_set(OutOfMemory, tx->write_size, - "lsregion", "vinyl transaction"); - return -1; - } - - /* * Do not abort join/subscribe on quota timeout - replication * is asynchronous anyway and there's box.info.replication * available for the admin to track the lag so let the applier @@ -2354,10 +2344,8 @@ vinyl_engine_prepare(struct engine *engine, struct txn *txn) * the transaction to be sent to read view or aborted, we call * it before checking for conflicts. */ - if (vy_quota_use(&env->quota, tx->write_size, timeout) != 0) { - diag_set(ClientError, ER_VY_QUOTA_TIMEOUT); + if (vy_quota_use(&env->quota, tx->write_size, timeout) != 0) return -1; - } size_t mem_used_before = lsregion_used(&env->mem_env.allocator); diff --git a/src/box/vy_quota.c b/src/box/vy_quota.c index 64ce56c0..2afed6b7 100644 --- a/src/box/vy_quota.c +++ b/src/box/vy_quota.c @@ -35,6 +35,9 @@ #include #include +#include "diag.h" +#include "error.h" +#include "errcode.h" #include "fiber.h" #include "fiber_cond.h" #include "say.h" @@ -139,6 +142,15 @@ vy_quota_use(struct vy_quota *q, size_t size, double timeout) return 0; } + /* + * Fail early if the configured memory limit never allows + * us to commit the transaction. + */ + if (size > q->limit) { + diag_set(OutOfMemory, size, "lsregion", "vinyl transaction"); + return -1; + } + /* Wait for quota. */ double wait_start = ev_monotonic_now(loop()); double deadline = wait_start + timeout; @@ -152,8 +164,10 @@ vy_quota_use(struct vy_quota *q, size_t size, double timeout) */ if (q->used + size > q->limit) q->quota_exceeded_cb(q); - if (fiber_cond_wait_deadline(&q->cond, deadline) != 0) - return -1; /* timed out */ + if (fiber_cond_wait_deadline(&q->cond, deadline) != 0) { + diag_set(ClientError, ER_VY_QUOTA_TIMEOUT); + return -1; + } } while (!vy_quota_may_use(q, size)); double wait_time = ev_monotonic_now(loop()) - wait_start; -- 2.11.0