Index: common.scm ================================================================== --- common.scm +++ common.scm @@ -249,33 +249,10 @@ (define (common:get-sync-lock-filepath) (let* ((tmp-area (common:get-db-tmp-area)) (lockfile (conc tmp-area "/megatest.db.sync-lock"))) lockfile)) -;;====================================================================== -;; when called from a wrapper I need sometimes to find the calling -;; wrapper, this is for dashboard to find the correct megatest. -;; -(define (common:find-local-megatest #!optional (progname "megatest")) - (let ((res (filter file-exists? - (map (lambda (updir) - (let* ((lm (car (argv))) - (dir (pathname-directory lm)) - (exe (pathname-strip-directory lm))) - (conc (if dir (conc dir "/") "") - (case (string->symbol exe) - ((dboard) (conc updir progname)) - ((mtest) (conc updir progname)) - ((dashboard) progname) - (else exe))))) - '("../../" "../"))))) - (if (null? res) - (begin - (debug:print 0 *default-log-port* "Failed to find this executable! Using what can be found on the path") - progname) - (car res)))) - (define *common:logpro-exit-code->status-sym-alist* '( ( 0 . pass ) ( 1 . fail ) ( 2 . warn ) ( 3 . check ) Index: commonmod.scm ================================================================== --- commonmod.scm +++ commonmod.scm @@ -17,10 +17,11 @@ ;; along with Megatest. If not, see . ;;====================================================================== (declare (unit commonmod)) +;; (declare (uses debugprint)) (use srfi-69) (module commonmod * @@ -40,10 +41,12 @@ regex-case srfi-1 srfi-18 srfi-69 typed-records + + ;; debugprint ) ;;====================================================================== ;; CONTENTS ;; @@ -535,7 +538,30 @@ (define (db:hoh-get dat key1 key2) (let* ((subhash (hash-table-ref/default dat key1 #f))) (and subhash (hash-table-ref/default subhash key2 #f)))) + +;;====================================================================== +;; when called from a wrapper I need sometimes to find the calling +;; wrapper, this is for dashboard to find the correct megatest. +;; +(define (common:find-local-megatest #!optional (progname "megatest")) + (let ((res (filter file-exists? + (map (lambda (updir) + (let* ((lm (car (argv))) + (dir (pathname-directory lm)) + (exe (pathname-strip-directory lm))) + (conc (if dir (conc dir "/") "") + (case (string->symbol exe) + ((dboard) (conc updir progname)) + ((mtest) (conc updir progname)) + ((dashboard) progname) + (else exe))))) + '("../../" "../"))))) + (if (null? res) + (begin + ;; (debug:print 0 *default-log-port* "Failed to find this executable! Using what can be found on the path") + progname) + (car res)))) ) Index: db.scm ================================================================== --- db.scm +++ db.scm @@ -22,10 +22,20 @@ ;; Database access ;;====================================================================== ;; dbstruct vector containing all the relevant dbs like main.db, megatest.db, run.db etc +(declare (unit db)) +(declare (uses common)) +(declare (uses debugprint)) +(declare (uses dbmod)) +(declare (uses dbfile)) +(declare (uses keys)) +(declare (uses ods)) +(declare (uses client)) +(declare (uses mt)) + (use (srfi 18) extras tcp stack (prefix sqlite3 sqlite3:) @@ -44,28 +54,19 @@ z3 typed-records matchable files) -(declare (unit db)) -(declare (uses common)) -(declare (uses dbmod)) -;; (declare (uses debugprint)) -(declare (uses dbfile)) -(declare (uses keys)) -(declare (uses ods)) -(declare (uses client)) -(declare (uses mt)) - (include "common_records.scm") (include "db_records.scm") (include "key_records.scm") (include "run_records.scm") (define *number-of-writes* 0) (define *number-non-write-queries* 0) +(import debugprint) (import dbmod) (import dbfile) ;; record for keeping state,status and count for doing roll-ups in ;; iterated tests Index: dbfile.scm ================================================================== --- dbfile.scm +++ dbfile.scm @@ -41,11 +41,12 @@ commonmod ;; debugprint ) (define keep-age-param (make-parameter 10)) ;; qif file age, if over move to attic -(define num-run-dbs (make-parameter 10)) ;; number of db's in .megatest +(define num-run-dbs (make-parameter 10)) ;; number of db's in .megatest +(define dbfile:testsuite-name (make-parameter #f)) ;;====================================================================== ;; R E C O R D S ;;====================================================================== Index: dbmemmod.scm ================================================================== --- dbmemmod.scm +++ dbmemmod.scm @@ -17,11 +17,11 @@ ;; along with Megatest. If not, see . ;;====================================================================== (declare (unit dbmemmod)) -;; (declare (uses debugprint)) +(declare (uses debugprint)) (declare (uses commonmod)) (module dbmemmod * @@ -36,12 +36,12 @@ srfi-69 stack files ports + debugprint commonmod - ;; debugprint ) (define keep-age-param (make-parameter 10)) ;; qif file age, if over move to attic (define num-run-dbs (make-parameter 10)) ;; number of db's in .megatest Index: launch.scm ================================================================== --- launch.scm +++ launch.scm @@ -33,17 +33,19 @@ (declare (uses common)) (declare (uses commonmod)) (declare (uses configf)) (declare (uses db)) (declare (uses ezsteps)) +(declare (uses dbfile)) (include "common_records.scm") (include "key_records.scm") (include "db_records.scm") (include "megatest-fossil-hash.scm") -(import commonmod) +(import commonmod + dbfile) ;;====================================================================== ;; ezsteps ;;====================================================================== @@ -1143,11 +1145,14 @@ (setenv "MT_TESTSUITENAME" (common:get-testsuite-name))) (begin (debug:print-error 0 *default-log-port* "failed to find the top path to your Megatest area.") (set! *toppath* #f) ;; force it to be false so we return #f #f)) - + + ;; needed by various transport and db modules + (dbfile:testsuite-name (get-testsuite-name *toppath* *configdat*)) + ;; one more attempt to cache the configs for future reading (let* ((cachefiles (launch:get-cache-file-paths areapath toppath target mtconfig)) (mtcachef (car cachefiles)) (rccachef (cdr cachefiles))) Index: megatest.scm ================================================================== --- megatest.scm +++ megatest.scm @@ -25,10 +25,12 @@ (declare (uses common)) ;; (declare (uses megatest-version)) (declare (uses margs)) (declare (uses commonmod)) (declare (uses commonmod.import)) +(declare (uses mtargs)) +(declare (uses mtargs.import)) (declare (uses debugprint)) (declare (uses debugprint.import)) (declare (uses runs)) (declare (uses launch)) (declare (uses server)) @@ -50,14 +52,13 @@ (declare (uses dbfile)) (declare (uses dbfile.import)) (declare (uses dbmod)) (declare (uses dbmod.import)) (declare (uses tcp-transportmod)) +(declare (uses tcp-transportmod.import)) ;; (declare (uses debugprint)) ;; (declare (uses debugprint.import)) -;; (declare (uses mtargs)) -;; (declare (uses mtargs.import)) ;; (declare (uses ftail)) ;; (import ftail) (import debugprint @@ -85,12 +86,12 @@ (require-library mutils) (define *usage-log-file* #f) ;; put path to file for logging usage in this var in the ~/.megatestrc file (define *usage-use-seconds* #t) ;; for Epoc seconds in usage logging change this to #t in ~/.megatestrc file +;; set some parameters here (include "transport-mode.scm") - (dbfile:db-init-proc db:initialize-main-db) ;; load the ~/.megatestrc file, put (use trace)(trace-call-sites #t)(trace function-you-want-to-trace) in this file ;; (let ((debugcontrolf (conc (get-environment-variable "HOME") "/.megatestrc"))) Index: rmt.scm ================================================================== --- rmt.scm +++ rmt.scm @@ -21,20 +21,22 @@ (use format typed-records) ;; RADT => purpose of json format?? (declare (unit rmt)) (declare (uses api)) (declare (uses http-transport)) +(declare (uses commonmod)) (declare (uses dbfile)) (declare (uses dbmemmod)) (declare (uses tcp-transportmod)) (include "common_records.scm") ;; (declare (uses rmtmod)) ;; used by http-transport (import dbfile) ;; rmtmod) -(import dbmemmod +(import commonmod + dbmemmod tcp-transportmod) (define rmt:transport-mode (make-parameter 'http)) ;; ;; THESE ARE ALL CALLED ON THE CLIENT SIDE!!! Index: tcp-transportmod.scm ================================================================== --- tcp-transportmod.scm +++ tcp-transportmod.scm @@ -42,21 +42,22 @@ message-digest ports posix regex regex-case + s11n srfi-1 srfi-18 srfi-4 srfi-69 stack typed-records tcp-server tcp - commonmod debugprint + commonmod dbfile dbmod ) ;;====================================================================== @@ -67,10 +68,13 @@ (defstruct tt-conn host port dbfname + server-id + server-start + pid ) (defstruct tt ;; client related (conns (make-hash-table)) ;; dbfname -> conn @@ -89,12 +93,38 @@ ) (define (tt:make-remote areapath) (make-tt area: areapath)) -(define (tt:client-connect-to-server ttdat) - #f) +;; +;; DUPLICATED WITH tt:handler (I think) +;; + +(define (tt:client-connect-to-server ttdat dbfname run-id) + (let* ((conn (hash-table-ref/default (tt-conns ttdat) dbfname #f))) + (if conn + conn ;; we are already connected to the server + (let* ((sdat (tt:get-current-server-info ttdat dbfname run-id))) + (match sdat + ((host port start-time server-id pid) + (let ((conn (make-tt-conn + host: host + port: port + dbfname: dbfname + server-id: server-id + server-start: start-time + pid: pid))) + (hash-table-set! (tt-conns ttdat) dbfname conn) + conn)) + (else + (tt:server-process-run + (tt-areapath ttdat) + (dbfile:testsuite-name) + (common:find-local-megatest) + run-id) + (thread-sleep! 1) + (tt:client-connect-to-server ttdat dbfname run-id))))))) ;; client side handler ;; (define (tt:handler runremote cmd rid params attemptnum area-dat areapath readonly-mode dbfname testsuite mtexe) ;; NOTE: areapath is passed in and in tt struct. We'll use passed in value for now. @@ -123,15 +153,33 @@ readonly-mode dbfname testsuite mtexe))))))) (define (tt:bid-for-servership run-id) #f) -(define (tt:get-current-server run-id) - #f) +(define (tt:get-current-server-info ttdat dbfname run-id) + (let* ((sfiles (tt:find-server ttdat dbfname))) + (case (length sfiles) + ((0) #f) ;; no server around + ((1) (tt:server-get-info (car sfiles))) + (else #f) ;; we'll want to wait until extra servers have exited + ))) (define (tt:send-receive ttdat conn cmd run-id params) - #f) + (let* ((host-port (conc (tt-conn-host conn)":"(tt-conn-port conn))) + (dat (list cmd run-id params))) + (let-values (((inp oup)(tcp-connect host-port))) + (let ((res (if (and inp oup) + (begin + (serialize dat oup) + (close-output-port oup) + (deserialize inp)) + (begin + (debug:print 0 *default-log-port* "ERROR: send called but no receiver has been setup. Please call setup first!") + #f)))) + (close-input-port inp) + ;; (mutex-unlock! *send-mutex*) ;; DOESN'T SEEM TO HELP + res)))) ;;====================================================================== ;; server ;;====================================================================== @@ -243,10 +291,59 @@ (define (tt:find-server ttdat dbfname) (let* ((areapath (tt-areapath ttdat)) (servdir (tt:get-servinfo-dir areapath)) (sfiles (glob (conc servdir"/*:"dbfname)))) sfiles)) + +;; given a path to a server info file return: host port startseconds server-id +;; example of what it's looking for in the log file: +;; SERVER STARTED: 10.38.175.67:50216 AT 1616502350.0 server-id: 4907e90fc55c7a09694e3f658c639cf4 +;; +(define (tt:server-get-info logf) + (let ((server-rx (regexp "^SERVER STARTED: (\\S+):(\\d+) AT ([\\d\\.]+) server-id: (\\S+) pid: (\\d+)")) ;; SERVER STARTED: host:port AT timesecs server id + (dbprep-rx (regexp "^SERVER: dbprep")) + (dbprep-found 0) + (bad-dat (list #f #f #f #f #f))) + (handle-exceptions + exn + (begin + ;; WARNING: this is potentially dangerous to blanket ignore the errors + (if (file-exists? logf) + (debug:print-info 2 *default-log-port* "Unable to get server info from "logf", exn=" exn)) + bad-dat) ;; no idea what went wrong, call it a bad server + (with-input-from-file + logf + (lambda () + (let loop ((inl (read-line)) + (lnum 0)) + (if (not (eof-object? inl)) + (let ((mlst (string-match server-rx inl)) + (dbprep (string-match dbprep-rx inl))) + (if dbprep (set! dbprep-found 1)) + (if (not mlst) + (if (< lnum 500) ;; give up if more than 500 lines of server log read + (loop (read-line)(+ lnum 1)) + (begin + (debug:print-info 0 *default-log-port* "Unable to get server info from first 500 lines of " logf ) + bad-dat)) + (match mlst + ((_ host port start server-id pid) + (list host + (string->number port) + (string->number start) + server-id + (string->number pid))) + (else + (debug:print 0 *default-log-port* "ERROR: did not recognise SERVER line info "mlst) + bad-dat)))) + (begin + (if dbprep-found + (begin + (debug:print-info 2 *default-log-port* "Server is in dbprep at " (common:human-time)) + (thread-sleep! 0.5)) ;; was 25 sec but that blocked things from starting? + (debug:print-info 0 *default-log-port* "Unable to get server info from " logf " at " (seconds->time-string (current-seconds)))) + bad-dat)))))))) ;; Given an area path, start a server process ### NOTE ### > file 2>&1 ;; if the target-host is set ;; try running on that host ;; incidental: rotate logs in logs/ dir.