63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
+
+
+
-
-
+
+
+
+
+
|
(else
(let ((res (* 50 (exp (- x targ)))))
(cond
((and (> res 0)(< res 0.01)) 0.01)
((> res 45) 45) ;; cap at 45 seconds
(else res))))))
;; x input value (current number in the queue)
;; targ is the desired queue length
;;
(define (piecewise-droop-calc x targ)
(let ((top 50))
(cond
((> (- x targ) 0) top) ;; top off at 45 seconds
((> x (- targ top))(+ (* 1 (- x (- targ top)))(/ (- top targ) targ)))
((> (- x targ) 0)
top) ;; top off at top seconds
((> x (- targ top))
(+ (* 1 (- x (- targ top)))
(/ (- top targ) targ)))
(else (let ((res (/ x targ)))
(if (< res 0.01)
0.01
res))))))
(define (server soc)
(print "server starting")
|
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
-
+
|
(define *current-delay-mutex* (make-mutex))
;; update the *current-delay* value every minute or QUEUE_CHK_DELAY seconds
(thread-start! (make-thread (lambda ()
(let ((delay-time (string->number (or (get-environment-variable "QUEUE_CHK_DELAY") "30"))))
(let loop ()
(with-input-from-pipe
cmd
cmd ;;; my query to get queue length
(lambda ()
(let* ((val (read))
(droop-val (if (number? val)(piecewise-droop-calc val queuelen) #f)))
;; val is number of jobs in queue. Use a linear droop of val/40
(mutex-lock! *current-delay-mutex*)
(set! *current-delay* (or droop-val 30)) ;; (/ (or droop-val 100) 50))
(mutex-unlock! *current-delay-mutex*)
|