[PATCH v2 02/11] vinyl: factor load regulator out of quota

Vladimir Davydov vdavydov.dev at gmail.com
Mon Oct 1 13:31:51 MSK 2018


On Fri, Sep 28, 2018 at 08:40:00PM +0300, Vladimir Davydov wrote:
> +static void
> +vy_regulator_update_write_rate(struct vy_regulator *regulator)
> +{
> +	size_t used_curr = regulator->quota->used;
> +	size_t used_last = regulator->used_last;
> +
> +	/*
> +	 * Memory can be dumped between two subsequent timer
> +	 * callback invocations, in which case memory usage
> +	 * will decrease. Ignore such observations - it's not
> +	 * a big deal, because dump is a rare event.
> +	 */
> +	if (used_curr < used_last)
> +		return;

There's a bug here: we must update regulator->used_last in this case,
otherwise we may stop updating the rate at all if used_last happens to
be close to the limit. The fix is below. I updated the commit on the
branch.

> +
> +	size_t rate_avg = regulator->write_rate;
> +	size_t rate_curr = (used_curr - used_last) / VY_REGULATOR_TIMER_PERIOD;
> +
> +	double weight = 1 - exp(-VY_REGULATOR_TIMER_PERIOD /
> +				VY_WRITE_RATE_AVG_WIN);
> +	rate_avg = (1 - weight) * rate_avg + weight * rate_curr;
> +
> +	regulator->write_rate = rate_avg;
> +	regulator->used_last = used_curr;
> +}

diff --git a/src/box/vy_regulator.c b/src/box/vy_regulator.c
index da35cc74..0d633abe 100644
--- a/src/box/vy_regulator.c
+++ b/src/box/vy_regulator.c
@@ -108,8 +108,10 @@ vy_regulator_update_write_rate(struct vy_regulator *regulator)
 	 * will decrease. Ignore such observations - it's not
 	 * a big deal, because dump is a rare event.
 	 */
-	if (used_curr < used_last)
+	if (used_curr < used_last) {
+		regulator->used_last = used_curr;
 		return;
+	}
 
 	size_t rate_avg = regulator->write_rate;
 	size_t rate_curr = (used_curr - used_last) / VY_REGULATOR_TIMER_PERIOD;



More information about the Tarantool-patches mailing list