From 5f32626177e16cbc8fbb58307cf38cbb279f4d48 Mon Sep 17 00:00:00 2001 From: saturn Date: Sun, 25 Dec 2022 00:22:26 -0600 Subject: [PATCH] Debug and optimize token-bucket-decrement. --- src/backend.lisp | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/backend.lisp b/src/backend.lisp index 57ec8d5a..0471e9fd 100644 --- a/src/backend.lisp +++ b/src/backend.lisp @@ -171,24 +171,35 @@ :tokens (round (* token-limit fill-ratio)))))) (defun token-bucket-decrement (token-bucket n &optional with-punishment) - (let ((time (get-internal-real-time)) - (timediff 0) - (tpu (token-bucket-tokens-per-unit token-bucket)) - (limit (token-bucket-token-limit token-bucket)) - (cost (round (* n (token-bucket-base-cost token-bucket)))) - (result nil)) - (declare (fixnum time timediff tpu limit)) + (let* ((time (get-internal-real-time)) + (tpu (token-bucket-tokens-per-unit token-bucket)) + (limit (token-bucket-token-limit token-bucket)) + (cost (round (* n (token-bucket-base-cost token-bucket)))) + (max-increment (+ limit cost)) + (max-timediff (ceiling max-increment tpu)) + (increment 0) + (result nil)) + (declare (type (and fixnum (integer 0)) time) + (type (unsigned-byte 32) limit cost max-increment increment) + (type (integer 1 10000000) tpu)) (sb-ext:atomic-update (token-bucket-last-update token-bucket) (lambda (previous) - (setf timediff (- time (min previous time))) + (declare (type (and fixnum (integer 0)) previous)) + (if (> (- time max-timediff) previous) + (setf increment max-increment) + (let ((timediff (- time (min previous time)))) + (declare (type (unsigned-byte 32) timediff)) + (setf increment (* timediff tpu)))) (max previous time))) (sb-ext:atomic-update (token-bucket-tokens token-bucket) (lambda (previous) - (let ((new (+ previous (* timediff tpu) (- cost)))) + (declare (type (signed-byte 32) previous)) + (let* ((new-refill (+ previous increment)) + (new (- new-refill cost))) (setf result (> new 0)) (if (or result with-punishment) (min new limit) - previous)))) + (max (- limit) (min new-refill limit)))))) result)) (defun parse-ipv4 (string) -- 2.11.4.GIT