@@ -84,27 +84,28 @@ ;; if none running or if > 20 seconds since ;; server last used then start shutdown (let loop ((count 0)) (thread-sleep! 1) ;; no need to do this very often (db:write-cached-data) - (print "Server running, count is " count) + ;; (print "Server running, count is " count) (if (< count 10) (loop (+ count 1)) (let ((numrunning (open-run-close db:get-count-tests-running #f))) (if (or (> numrunning 0) (> (+ *last-db-access* 60)(current-seconds))) (begin (debug:print-info 0 "Server continuing, tests running: " numrunning ", seconds since last db access: " (- (current-seconds) *last-db-access*)) (loop 0))) (begin - (debug:print-info 0 "Starting to shutdown the server side") + (debug:print-info 0 "Starting to shutdown the server.") ;; need to delete only *my* server entry (future use) (open-run-close db:del-var #f "SERVER") (thread-sleep! 10) (debug:print-info 0 "Max cached queries was " *max-cache-size*) (debug:print-info 0 "Server shutdown complete. Exiting") - ))))) + (open-run-close tasks:server-deregister-self tasks:open-db) + (exit)))))) (define (server:find-free-port-and-open host s port #!key (trynum 50)) (let ((s (if s s (make-socket 'rep))) (p (if (number? port) port 5555))) (handle-exceptions @@ -137,24 +138,28 @@ (set! *my-client-signature* sig) *my-client-signature*))) ;; (define (server:client-connect host port) + (debug:print 3 "client-connect " host ":" port) (let ((connect-ok #f) (zmq-socket (make-socket 'req)) (conurl (server:make-server-url (list host port)))) - (connect-socket zmq-socket conurl) - zmq-socket)) + (if (socket? zmq-socket) + (begin + (connect-socket zmq-socket conurl) + zmq-socket) + #f))) (define (server:client-login zmq-socket) (cdb:login zmq-socket *toppath* (server:get-client-signature))) (define (server:client-logout zmq-socket) (let ((ok (and (socket? zmq-socket) (cdb:logout zmq-socket *toppath* (server:get-client-signature))))) - (close-socket zmq-socket) + ;; (close-socket zmq-socket) ok)) ;; Do all the connection work, start a server if not already running (define (server:client-setup #!key (numtries 10)) (if (not *toppath*)(setup-for-run)) @@ -197,22 +202,60 @@ (debug:print-info 1 "Too many retries, giving up"))))) (define (server:launch) (let* ((toppath (setup-for-run))) (debug:print-info 0 "Starting the standalone server") - (if *toppath* - (let* ((th2 (make-thread (lambda () - (server:run (args:get-arg "-server")))))) - ;; (th3 (make-thread (lambda () - ;; (server:keep-running))))) - (thread-start! th2) - ;; (thread-start! th3) - (set! *didsomething* #t) - (thread-join! th2)) - (debug:print 0 "ERROR: Failed to setup for megatest")))) + (let ((hostinfo (open-run-close tasks:get-best-server tasks:open-db))) + (if hostinfo + (debug:print-info 1 "NOT starting new server, one is already running on " (car hostinfo) ":" (cadr hostinfo)) + (if *toppath* + (let* ((th2 (make-thread (lambda () + (server:run (args:get-arg "-server"))))) + (th3 (make-thread (lambda () + (server:keep-running))))) + (thread-start! th2) + (thread-start! th3) + (set! *didsomething* #t) + (thread-join! th3)) + (debug:print 0 "ERROR: Failed to setup for megatest")))))) (define (server:client-launch) (if (server:client-setup) (debug:print-info 0 "connected as client") (begin (debug:print 0 "ERROR: Failed to connect as client") (exit)))) + +;; ping a server and return number of clients or #f (if no response) +(define (server:ping host port #!key (secs 10)) + (cdb:use-non-blocking-mode + (lambda () + (let* ((res #f) + (th1 (make-thread + (lambda () + (let ((zmq-socket (server:client-connect host port))) + (if zmq-socket + (if (server:client-login zmq-socket) + (let ((numclients (cdb:num-clients zmq-socket))) + (server:client-logout zmq-socket) + (close-socket zmq-socket) + (set! res (list #t numclients))) + (begin + ;; (close-socket zmq-socket) + (set! res (list #f "CAN'T LOGIN")))) + (set! res (list #f "CAN'T CONNECT"))))))) + (th2 (make-thread + (lambda () + (let loop ((count 1)) + (debug:print-info 1 "Ping " count " server on " host " at port " port) + (thread-sleep! 2) + (if (< count (/ secs 2)) + (loop (+ count 1)))) + ;; (thread-terminate! th1) + (set! res (list #f "TIMED OUT")))))) + (thread-start! th2) + (thread-start! th1) + (handle-exceptions + exn + (set! res (list #f "TIMED OUT")) + (thread-join! th1 secs)) + res))))