[PATCH v2 04/11] vinyl: move transaction size sanity check to quota
Vladimir Davydov
vdavydov.dev at gmail.com
Fri Sep 28 20:40:02 MSK 2018
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 <stddef.h>
#include <tarantool_ev.h>
+#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
More information about the Tarantool-patches
mailing list