/* tests for single bucket operations */ static void test_leak_bucket(void) { /* set initial value */ bkt.avg = 150; bkt.max = 15; bkt.level = 1.5; /* leak an op work of time */ throttle_leak_bucket(&bkt, NANOSECONDS_PER_SECOND / 150); g_assert(bkt.avg == 150); g_assert(bkt.max == 15); g_assert(double_cmp(bkt.level, 0.5)); /* leak again emptying the bucket */ throttle_leak_bucket(&bkt, NANOSECONDS_PER_SECOND / 150); g_assert(bkt.avg == 150); g_assert(bkt.max == 15); g_assert(double_cmp(bkt.level, 0)); /* check that the bucket level won't go lower */ throttle_leak_bucket(&bkt, NANOSECONDS_PER_SECOND / 150); g_assert(bkt.avg == 150); g_assert(bkt.max == 15); g_assert(double_cmp(bkt.level, 0)); }
/* Calculate the time delta since last leak and make proportionals leaks * * @now: the current timestamp in ns */ static void throttle_do_leak(ThrottleState *ts, int64_t now) { /* compute the time elapsed since the last leak */ int64_t delta_ns = now - ts->previous_leak; int i; ts->previous_leak = now; if (delta_ns <= 0) { return; } /* make each bucket leak */ for (i = 0; i < BUCKETS_COUNT; i++) { throttle_leak_bucket(&ts->cfg.buckets[i], delta_ns); } }