static void test_compute_wait(void) { int64_t wait; int64_t result; /* no operation limit set */ bkt.avg = 0; bkt.max = 15; bkt.level = 1.5; wait = throttle_compute_wait(&bkt); g_assert(!wait); /* zero delta */ bkt.avg = 150; bkt.max = 15; bkt.level = 15; wait = throttle_compute_wait(&bkt); g_assert(!wait); /* below zero delta */ bkt.avg = 150; bkt.max = 15; bkt.level = 9; wait = throttle_compute_wait(&bkt); g_assert(!wait); /* half an operation above max */ bkt.avg = 150; bkt.max = 15; bkt.level = 15.5; wait = throttle_compute_wait(&bkt); /* time required to do half an operation */ result = (int64_t) NANOSECONDS_PER_SECOND / 150 / 2; g_assert(wait == result); }
/* This function compute the time that must be waited while this IO * * @is_write: true if the current IO is a write, false if it's a read * @ret: time to wait */ static int64_t throttle_compute_wait_for(ThrottleState *ts, bool is_write) { BucketType to_check[2][4] = { {THROTTLE_BPS_TOTAL, THROTTLE_OPS_TOTAL, THROTTLE_BPS_READ, THROTTLE_OPS_READ}, {THROTTLE_BPS_TOTAL, THROTTLE_OPS_TOTAL, THROTTLE_BPS_WRITE, THROTTLE_OPS_WRITE}, }; int64_t wait, max_wait = 0; int i; for (i = 0; i < 4; i++) { BucketType index = to_check[is_write][i]; wait = throttle_compute_wait(&ts->cfg.buckets[index]); if (wait > max_wait) { max_wait = wait; } } return max_wait; }