/* This function compute the wait time in ns that a leaky bucket should trigger * * @bkt: the leaky bucket we operate on * @ret: the resulting wait time in ns or 0 if the operation can go through */ int64_t throttle_compute_wait(LeakyBucket *bkt) { double extra; /* the number of extra units blocking the io */ if (!bkt->avg) { return 0; } /* If the bucket is full then we have to wait */ extra = bkt->level - bkt->max * bkt->burst_length; if (extra > 0) { return throttle_do_compute_wait(bkt->avg, extra); } /* If the bucket is not full yet we have to make sure that we * fulfill the goal of bkt->max units per second. */ if (bkt->burst_length > 1) { /* We use 1/10 of the max value to smooth the throttling. * See throttle_fix_bucket() for more details. */ extra = bkt->burst_level - bkt->max / 10; if (extra > 0) { return throttle_do_compute_wait(bkt->max, extra); } } return 0; }
/* This function compute the wait time in ns that a leaky bucket should trigger * * @bkt: the leaky bucket we operate on * @ret: the resulting wait time in ns or 0 if the operation can go through */ int64_t throttle_compute_wait(LeakyBucket *bkt) { double extra; /* the number of extra units blocking the io */ if (!bkt->avg) { return 0; } extra = bkt->level - bkt->max; if (extra <= 0) { return 0; } return throttle_do_compute_wait(bkt->avg, extra); }