Index: loadwatch/queuefeeder-server.scm ================================================================== --- loadwatch/queuefeeder-server.scm +++ loadwatch/queuefeeder-server.scm @@ -63,12 +63,12 @@ (loop (nn-recv soc)(+ count 1))) (else (mutex-lock! *current-delay-mutex*) (let ((current-delay *current-delay*)) (mutex-unlock! *current-delay-mutex*) - (thread-sleep! current-delay) - (nn-send soc (conc "hello " msg-in " you waited " current-delay " seconds")) + ;; (thread-sleep! current-delay) + (nn-send soc (conc current-delay " hello " msg-in " you waited " current-delay " seconds")) (loop (nn-recv soc)(if (> count 20000000) 0 (+ count 1)))))))) (define (ping-self host port #!key (return-socket #t)) Index: loadwatch/queuefeeder.scm ================================================================== --- loadwatch/queuefeeder.scm +++ loadwatch/queuefeeder.scm @@ -16,11 +16,11 @@ ;; Methodology ;; ;; Connect to the server, the server delays the appropriate time (if ;; any) and then launch the task. ;; -(use nanomsg posix regex) +(use nanomsg posix regex message-digest md5) (define req (nn-socket 'req)) ;; get needed stuff from commandline ;; @@ -40,10 +40,18 @@ (define (client-send-receive soc msg) (nn-send soc msg) (nn-recv soc)) +;; Generate a unique signature for this client location +;; +(define (make-signature) + (message-digest-string (md5-primitive) + (with-output-to-string + (lambda () + (write (current-directory)))))) + ;; (define ((talk-to-server soc)) ;; (let loop ((cnt 200000)) ;; (let ((name (list-ref '("Matt" "Tom" "Bob" "Jill" "James" "Jane")(random 6)))) ;; ;; (print "Sending " name) ;; ;; (print @@ -52,17 +60,36 @@ ;; (print (client-send-receive req "quit")) ;; (nn-close req) ;; (exit)) ;; -(thread-start! (lambda () - (thread-sleep! 60) - (print "Give up on waiting for the server") - (nn-close req) - ;; (exit) - )) -(thread-join! (thread-start! (lambda () - (print (client-send-receive req (conc (current-user-name) "@" (get-host-name))))))) +(define (get-delay signature) + (let* ((full-msg (client-send-receive req (conc (current-user-name) "@" (get-host-name) ":" signature)))) + (print "Got " full-msg) + (let* ((reply-msg (string-match "^([\\d\\.]+)\\s+(.*)$" full-msg)) + (delay-time (if (> (length reply-msg) 2) + (string->number (cadr reply-msg)) + 1)) ;; fall back to one sec delay + (msg (if (> (length reply-msg) 2) + (caddr reply-msg) + full-msg))) + (values delay-time msg)))) + + +(let ((signature (make-signature))) + + (thread-start! (lambda () + (thread-sleep! 60) + (print "Give up on waiting for the server") + (nn-close req) + ;; (exit) + )) + (thread-join! (thread-start! (lambda () + (let-values + (((delay-time msg)(get-delay signature))) + (print "INFO: sleeping " delay-time " seconds per request of queuefeeder server") + (thread-sleep! delay-time) + (print "INFO: done waiting, now executing requested task.")))))) (process-execute (car cmd) (cdr cmd))