Overview
Comment: | wip. compiles. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | v1.80-tcp-inmem |
Files: | files | file ages | folders |
SHA1: |
4c52a47431a71bdc0539f4ca1a3a6c25 |
User & Date: | matt on 2023-02-15 19:21:15 |
Other Links: | branch diff | manifest | tags |
Context
2023-02-15
| ||
19:28 | wip. compiles. check-in: 24ddf5d235 user: matt tags: v1.80-tcp-inmem | |
19:21 | wip. compiles. check-in: 4c52a47431 user: matt tags: v1.80-tcp-inmem | |
15:39 | Make tcp vs. http compile time configurable. check-in: 3ca4260740 user: matt tags: v1.80-tcp-inmem | |
Changes
Modified megatest.scm from [020e1b8ba1] to [f24c5b91ed].
︙ | ︙ | |||
585 586 587 588 589 590 591 | ;; this segment will run launch:setup only if -log is not set. This is fairly safe as servers are not ;; manually started and thus should never be started in a non-megatest area. Thus no need to handle situation ;; where (launch:setup) returns #f? ;; (if (or (args:get-arg "-log")(args:get-arg "-server")) ;; redirect the log always when a server (handle-exceptions exn | | | < | 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 | ;; this segment will run launch:setup only if -log is not set. This is fairly safe as servers are not ;; manually started and thus should never be started in a non-megatest area. Thus no need to handle situation ;; where (launch:setup) returns #f? ;; (if (or (args:get-arg "-log")(args:get-arg "-server")) ;; redirect the log always when a server (handle-exceptions exn (begin (print "ERROR: Failed to switch to log output. " ((condition-property-accessor 'exn 'message) exn) ", exn=" exn)) (let* ((tl (or (args:get-arg "-log")(launch:setup))) ;; run launch:setup if -server, ensure we do NOT run launch:setup if -log specified (logf (or (args:get-arg "-log") ;; use -log unless we are a server, then craft a logfile name (conc tl "/logs/server-" (current-process-id) "-" (get-host-name) ".log"))) (oup (open-logfile logf))) (if (not (args:get-arg "-log")) (hash-table-set! args:arg-hash "-log" logf)) ;; fake out future queries of -log (debug:print-info 0 *default-log-port* "Sending log output to " logf) |
︙ | ︙ | |||
921 922 923 924 925 926 927 | ;; Start the server - can be done in conjunction with -runall or -runtests (one day...) ;; we start the server if not running else start the client thread ;;====================================================================== ;; Server? Start up here. ;; (if (args:get-arg "-server") | > | | > > > > > | | 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 | ;; Start the server - can be done in conjunction with -runall or -runtests (one day...) ;; we start the server if not running else start the client thread ;;====================================================================== ;; Server? Start up here. ;; (if (args:get-arg "-server") (let* ((run-id (args:get-arg-number "-run-id")) (tl (launch:setup))) (case (rmt:transport-mode) ((http)(http-transport:launch)) ((tcp) (if run-id (tt:start-server tl (dbmod:run-id->dbfname run-id)) (begin (debug:print 0 *default-log-port* "ERROR: transport mode is tcp - -run-id is required.") (exit 1)))) (else (debug:print 0 *default-log-port* "ERROR: rmt:transport-mode value not recognised "(rmt:transport-mode)))) (set! *didsomething* #t))) ;; The adjutant is a bit different, it does NOT run (launch:setup) as it is not necessarily tied to ;; a specific Megatest area. Detail are being hashed out and this may change. ;; (if (args:get-arg "-adjutant") (begin |
︙ | ︙ |
Modified tcp-transportmod.scm from [25502ac37c] to [724c5d0f96].
︙ | ︙ | |||
44 45 46 47 48 49 50 | regex-case srfi-1 srfi-18 srfi-4 srfi-69 stack typed-records | > | | 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | regex-case srfi-1 srfi-18 srfi-4 srfi-69 stack typed-records tcp-server tcp commonmod debugprint ) ;;====================================================================== ;; client |
︙ | ︙ | |||
72 73 74 75 76 77 78 | (defstruct tt-conn host port dbfname ) (defstruct tt-srv | | > > | | | > > | 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | (defstruct tt-conn host port dbfname ) (defstruct tt-srv ;; server related (areapath #f) (host #f) (port #f) (conn #f) (cleanup-proc #f) (handler #f) ;; receives data and responds (socket #f) (thread #f) (host-port #f) (cmd-thread #f) ) (define (tt:make-remote areapath) (make-tt area: areapath)) (define (tt:client-connect-to-server ttdat) #f) ;; client side handler ;; (define (tt:handler runremote cmd rid params attemptnum area-dat areapath readonly-mode dbfname) ;; NOTE: areapath is passed in and in tt struct. We'll use passed in value for now. (let* ((conn (hash-table-ref/default (tt-conns runremote) dbfname #f))) (if conn ;; have connection, call the server (let* ((res (tt:send-receive runremote conn cmd rid params))) (cond |
︙ | ︙ | |||
131 132 133 134 135 136 137 | ;;====================================================================== (define (tt:sync-dbs ttdat) #f) ;; start the listener and start responding to requests ;; | > > > | > > | > | > > > | | | > > | > > > > > > > > | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | ;;====================================================================== (define (tt:sync-dbs ttdat) #f) ;; start the listener and start responding to requests ;; ;; NOTE: organise by dbfname, not run-id so we don't need ;; to pull in more modules ;; (define (tt:start-server areapath dbfname handler) ;; is there already a server for this dbfile? Then exit. (let* ((ttdat (make-tt-srv areapath: areapath)) ;; (dbfname (dbmod:run-id->dbfname run-id)) (servers (tt:find-server ttdat dbfname))) (tt-srv-handler-set! ttdat handler) (if (null? servers) (begin (tt:start-tcp-server ttdat) ;; start the tcp-server which applies handler to incoming data (tt:keep-running ttdat dbfname)) (begin (debug:print 0 *default-log-port* "INFO: found server(s) already running for db "dbfname", "(string-intersperse servers ",")" Exiting.") (exit))))) ((make-tcp-server (tcp-listen 6504) (lambda () (write-line (seconds->string (current-seconds))))) #t) ;; find a port and start tcp-server ;; (define (tt:start-tcp-server ttdat) (setup-listener ttdat) (let* ((socket (tt-srv-socket ttdat)) (handler (tt-srv-handler ttdat))) ((make-tcp-server socket handler) #t ;; yes, send error messages to std-err ))) (define (tt:keep-running ttdat dbfile) ;; verfiy conn for ready ;; listener socket has been started by this stage (debug:print 0 *default-log-port* "INFO: Got here!!!!")) ;; ;; given an already set up uconn start the cmd-loop ;; ;; ;; (define (tt:cmd-loop ttdat) ;; (let* ((serv-listener (-socket uconn)) ;; (listener (lambda () ;; (let loop ((state 'start)) ;; (let-values (((inp oup)(tcp-accept serv-listener))) ;; ;; (mutex-lock! *send-mutex*) ;; DOESN'T SEEM TO HELP ;; (let* ((rdat (deserialize inp)) ;; '(my-host-port qrykey cmd params) ;; (resp (ulex-handler uconn rdat))) ;; (serialize resp oup) ;; (close-input-port inp) ;; (close-output-port oup) ;; ;; (mutex-unlock! *send-mutex*) ;; DOESN'T SEEM TO HELP ;; ) ;; (loop state)))))) ;; ;; start N of them ;; (let loop ((thnum 0) ;; (threads '())) ;; (if (< thnum 100) ;; (let* ((th (make-thread listener (conc "listener" thnum)))) ;; (thread-start! th) ;; (loop (+ thnum 1) ;; (cons th threads))) ;; (map thread-join! threads))))) ;; ;; ;; ;; (define (wait-and-close uconn) ;; (thread-join! (udat-cmd-thread uconn)) ;; (tcp-close (udat-socket uconn))) ;; ;; (define (tt:shutdown-server ttdat) (let* ((cleanproc (tt-srv-cleanup-proc ttdat))) (if cleanproc (cleanproc)) (tcp-close (tt-srv-socket ttdat)) ;; close up ports here )) ;; (define (wait-and-close uconn) ;; (thread-join! (tt-srv-cmd-thread uconn)) ;; (tcp-close (tt-srv-socket uconn))) ;; return servid ;; side-effects: ;; ttdat-cleanup-proc is populated with function to remove the serverinfo file (define (tt:create-server-registration-file ttdat dbfname) (let* ((areapath (tt-areapath ttdat)) (servdir (tt:get-servinfo-dir areapath)) |
︙ | ︙ | |||
221 222 223 224 225 226 227 228 229 230 231 232 233 234 | ;; my port, address, hostname, pid etc. ;; return #f if fail to find a port to allocate. ;; ;; if udata-in is #f create the record ;; if there is already a serv-listener return the udata ;; (define (setup-listener uconn #!optional (port 4242)) (handle-exceptions exn (if (< port 65535) (setup-listener uconn (+ port 1)) #f) (connect-listener uconn port))) | > | 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 | ;; my port, address, hostname, pid etc. ;; return #f if fail to find a port to allocate. ;; ;; if udata-in is #f create the record ;; if there is already a serv-listener return the udata ;; (define (setup-listener uconn #!optional (port 4242)) (assert (tt-srv? uconn) "FATAL: setup-listener called with wrong struct "uconn) (handle-exceptions exn (if (< port 65535) (setup-listener uconn (+ port 1)) #f) (connect-listener uconn port))) |
︙ | ︙ |