Overview
Comment: | wip |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | v1.6584-ck5 |
Files: | files | file ages | folders |
SHA1: |
e3fed709f076d70f1ee87ed363ff7043 |
User & Date: | matt on 2021-05-18 00:01:20 |
Other Links: | branch diff | manifest | tags |
Context
2021-05-18
| ||
22:20 | main.db starting again. check-in: 8c1d89ef36 user: matt tags: v1.6584-ck5 | |
00:01 | wip check-in: e3fed709f0 user: matt tags: v1.6584-ck5 | |
2021-05-17
| ||
08:23 | Removed remaining traces of http-transportmod check-in: 7104368879 user: matt tags: v1.6584-ck5 | |
Changes
Modified apimod.scm from [fc2d6a4da7] to [43bf5f787b].
︙ | ︙ | |||
183 184 185 186 187 188 189 | (match params ((apath dbname) (api:run-server-process apath dbname) 'server-started) (else (debug:print-info 0 *default-log-port* "api:start-server called with wrong params: "params) 'bad-params))))) | < > | 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 | (match params ((apath dbname) (api:run-server-process apath dbname) 'server-started) (else (debug:print-info 0 *default-log-port* "api:start-server called with wrong params: "params) 'bad-params))))) (define (api:dispatch-cmd dbstruct cmd params) (case cmd ;;=============================================== ;; READ/WRITE QUERIES ;;=============================================== ((get-keys-write) (db:get-keys dbstruct)) ;; force a dummy "write" query to force server; for debug in -repl ;; SERVERS ;; ((start-server) (apply server:kind-run params)) ((kill-server) (set! *server-run* #f)) ((get-server) (api:start-server dbstruct params)) ((register-server) (apply db:register-server dbstruct params) );; dbstruct host port servkey pid ipaddr dbpath) ;; TESTS ;;((test-set-state-status-by-id) (apply mt:test-set-state-status-by-id dbstruct params)) ;;BB - commented out above because it was calling below, eventually, incorrectly (dbstruct passed to mt:test-set-state-status-by-id, which previosly did more, but now only passes thru to db:set-state-status-and-roll-up-items. ((test-set-state-status-by-id) |
︙ | ︙ |
Modified megatest.scm from [f3e9d865ae] to [496e14dd89].
︙ | ︙ | |||
1139 1140 1141 1142 1143 1144 1145 | ;; Server? Start up here. ;; (if (args:get-arg "-server") (if (not (args:get-arg "-db")) (debug:print 0 *default-log-port* "ERROR: -db required to start server") (let ((tl (launch:setup)) (dbname (args:get-arg "-db"))) ;; transport-type (string->symbol (or (args:get-arg "-transport") "http")))) | | | 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 | ;; Server? Start up here. ;; (if (args:get-arg "-server") (if (not (args:get-arg "-db")) (debug:print 0 *default-log-port* "ERROR: -db required to start server") (let ((tl (launch:setup)) (dbname (args:get-arg "-db"))) ;; transport-type (string->symbol (or (args:get-arg "-transport") "http")))) (rmt:launch dbname) (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 rmtmod.scm from [2af7e5fefe] to [5a65f46de3].
︙ | ︙ | |||
256 257 258 259 260 261 262 263 264 | lastmsg: (current-seconds) expires: (+ (current-seconds) 60) ;; this needs to be gathered during the ping )) #t) (start-main-srv))) (start-main-srv)))) ;; NB// remote is a rmt:remote struct ;; | > > > > | > > > > > | > > | < | | 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 | lastmsg: (current-seconds) expires: (+ (current-seconds) 60) ;; this needs to be gathered during the ping )) #t) (start-main-srv))) (start-main-srv)))) (define (rmt:main-open-connection remote apath) (rmt:open-main-connection remote apath) (rmt:get-connection remote apath (db:run-id->dbname #f))) ;; NB// remote is a rmt:remote struct ;; (define (rmt:general-open-connection remote apath dbname #!key (num-tries 5)) (let ((mainconn (rmt:get-connection remote apath (db:run-id->dbname #f)))) ;; (debug:print 0 *default-log-port* "remote: " remote) (if (not mainconn) (begin (rmt:open-main-connection remote apath) (thread-sleep! 1) (rmt:general-open-connection remote apath dbname)) ;; we have a connection to main, ask for contact info for dbname (let* ((res (rmt:send-receive 'get-server #f `(,apath ,dbname)))) (case res ((server-started) (if (> num-tries 0) (begin (thread-sleep! 2) (rmt:general-open-connection remote apath dbname num-tries: (- num-tries 1))) 'failed)) (else res)))))) ;;====================================================================== ;; Defaults to current area ;; (define (rmt:send-receive cmd rid params #!key (attemptnum 1)(area-dat #f)) (if (not *rmt:remote*)(set! *rmt:remote* (make-rmt:remote))) (let* ((apath *toppath*) (conns *rmt:remote*) (dbname (db:run-id->dbname rid))) (rmt:send-receive-real conns apath dbname rid cmd params))) |
︙ | ︙ | |||
1481 1482 1483 1484 1485 1486 1487 | (if *server-info* (let ((pkt-file (conc (get-pkts-dir *toppath*) "/" (servdat-uuid *server-info*) ".pkt")) (dbfile (servdat-dbfile *server-info*))) (debug:print-info 0 *default-log-port* "removing pkt "pkt-file) (delete-file* pkt-file) | | | | | | | | > > > > > > > > | 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 | (if *server-info* (let ((pkt-file (conc (get-pkts-dir *toppath*) "/" (servdat-uuid *server-info*) ".pkt")) (dbfile (servdat-dbfile *server-info*))) (debug:print-info 0 *default-log-port* "removing pkt "pkt-file) (delete-file* pkt-file) (if dbfile (if (string-match ".*/main.db$" dbfile) (begin (debug:print-info 0 *default-log-port* "Releasing lock for "dbfile) (db:with-lock-db (servdat-dbfile *server-info*) (lambda (dbh dbfile) (db:release-lock dbh dbfile)))) (let* ((sdat *server-info*)) ;; we have a run-id server (rmt:send-receive-real *rmt:remote* *toppath* (db:run-id->dbname #f) #f 'register-server `(,(servdat-uuid sdat) ,(current-process-id) ,(servdat-host sdat) ;; iface ,(servdat-port sdat)))))))) (if (bdat-task-db *bdat*) ;; TODO: Check that this is correct for task db (let ((db (cdr (bdat-task-db *bdat*)))) (if (sqlite3:database? db) (begin (sqlite3:interrupt! db) (sqlite3:finalize! db #t) (bdat-task-db-set! *bdat* #f))))) |
︙ | ︙ | |||
1876 1877 1878 1879 1880 1881 1882 | (send-response body: ((http-get-function 'http-transport:html-test-log) $) headers: '((content-type text/HTML)))) ((equal? (uri-path (request-uri (current-request))) '(/ "dashboard")) (send-response body: ((http-get-function 'http-transport:html-dboard) $) headers: '((content-type text/HTML)))) (else (continue)))))))) | < < < < | | > > > > | 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 | (send-response body: ((http-get-function 'http-transport:html-test-log) $) headers: '((content-type text/HTML)))) ((equal? (uri-path (request-uri (current-request))) '(/ "dashboard")) (send-response body: ((http-get-function 'http-transport:html-dboard) $) headers: '((content-type text/HTML)))) (else (continue)))))))) (http-transport:try-start-server ipaddrstr start-port))) ;; This is recursively run by http-transport:run until sucessful, it then runs until server is stopped ;; (define (http-transport:try-start-server ipaddrstr portnum) (let ((config-hostname (configf:lookup *configdat* "server" "hostname")) (config-use-proxy (equal? (configf:lookup *configdat* "client" "use-http_proxy") "yes"))) (if (not config-use-proxy) (determine-proxy (constantly #f))) (debug:print-info 0 *default-log-port* "http-transport:try-start-server time=" (seconds->time-string (current-seconds)) " ipaddrsstr=" ipaddrstr " portnum=" portnum " config-hostname=" config-hostname) (handle-exceptions exn (begin (print-error-message exn) (if (< portnum 64000) (begin (debug:print 0 *default-log-port* "WARNING: attempt to start server failed. Trying again ...") |
︙ | ︙ | |||
1971 1972 1973 1974 1975 1976 1977 | (set! *http-connections-next-cleanup* (+ (current-seconds) 10)) (mutex-unlock! *http-mutex*)) (define (http-transport:inc-requests-and-prep-to-close-all-connections) (mutex-lock! *http-mutex*) (set! *http-requests-in-progress* (+ 1 *http-requests-in-progress*))) | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 | (set! *http-connections-next-cleanup* (+ (current-seconds) 10)) (mutex-unlock! *http-mutex*)) (define (http-transport:inc-requests-and-prep-to-close-all-connections) (mutex-lock! *http-mutex*) (set! *http-requests-in-progress* (+ 1 *http-requests-in-progress*))) ;; careful closing of connections stored in *runremote* ;; (define (http-transport:close-connections #!key (area-dat #f)) (debug:print-info 0 *default-log-port* "http-transport:close-connections doesn't do anything now!")) ;; (let* ((runremote (or area-dat *runremote*)) ;; (server-dat (if runremote ;; (remote-conndat runremote) |
︙ | ︙ | |||
2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 | (loop (cdr tail) new-best))))))) ;;====================================================================== ;; END NEW SERVER METHOD ;;====================================================================== (define (http-transport:wait-for-server pkts-dir db-file server-key) (let* ((sdat *server-info*)) (let loop ((start-time (current-seconds)) (changed #t) (last-sdat "not this")) (begin ;; let ((sdat #f)) (thread-sleep! 0.01) | > > | 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 | (loop (cdr tail) new-best))))))) ;;====================================================================== ;; END NEW SERVER METHOD ;;====================================================================== ;; if .db/main.db check the pkts ;; (define (http-transport:wait-for-server pkts-dir db-file server-key) (let* ((sdat *server-info*)) (let loop ((start-time (current-seconds)) (changed #t) (last-sdat "not this")) (begin ;; let ((sdat #f)) (thread-sleep! 0.01) |
︙ | ︙ | |||
2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 | (if (> (- (current-seconds) start-time) 120) ;; been waiting for two minutes (begin (debug:print-error 0 *default-log-port* "transport appears to have died, exiting server") (exit)) (loop start-time (equal? sdat last-sdat) sdat)))))))) ;; run http-transport:keep-running in a parallel thread to monitor that the db is being ;; used and to shutdown after sometime if it is not. ;; (define (http-transport:keep-running dbname) ;; if none running or if > 20 seconds since ;; server last used then start shutdown ;; This thread waits for the server to come alive (debug:print-info 0 *default-log-port* "Starting the sync-back, keep alive thread in server") | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | < < < < < < < < | < < | | | > > | | > | | | | < > | | | < | < | | | | | | | < < < < < < < < < < < < | | | | | | | | | | | | | | | | | | | | < < < < < < < < < < < < < < < < < < | | | | | < < < < < < < | | | | | | | | | | | < < < < < < | | | | | 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 | (if (> (- (current-seconds) start-time) 120) ;; been waiting for two minutes (begin (debug:print-error 0 *default-log-port* "transport appears to have died, exiting server") (exit)) (loop start-time (equal? sdat last-sdat) sdat)))))))) (define (rmt:register-server remote apath iface port server-key db-file) (rmt:send-receive-real remote apath ;; params: host port servkey pid ipaddr dbpath (db:run-id->dbname #f) #f 'register-server `(,iface ,port ,server-key ,(current-process-id) ,iface ,db-file))) (define (http-transport:wait-for-stable-interface #!optional (num-tries-allowed 100)) ;; wait until *server-info* stops changing (let loop ((sdat #f) ;; this is our copy of the *last* *server-info* (tries 0)) ;; first we verify port and interface, update *server-info* in need be. (cond ((> tries num-tries-allowed) (debug:print 0 *default-log-port* "http-transport:keep-running, giving up after trying for several minutes.") (exit 1)) ((not *server-info*) (thread-sleep! 1.5) (loop *server-info* (+ tries 1))) ((not sdat) (debug:print 0 *default-log-port* "http-transport:keep-running, impossible, should never get here.") (thread-sleep! 1.5) (loop *server-info* (+ tries 1))) ((or (not (equal? (servdat-host sdat)(servdat-host *server-info*))) (not (equal? (servdat-port sdat)(servdat-port *server-info*)))) (debug:print-info 0 *default-log-port* "WARNING: interface changed, refreshing iface and port info") (thread-sleep! 1.5) (loop *server-info* (+ tries 1))) (else (if (not *server-id*)(set! *server-id* (server:mk-signature))) (debug:print 0 *default-log-port* "SERVER STARTED: " (servdat-host *server-info*) ":" (servdat-port *server-info*) " AT " (current-seconds) " server-id: " *server-id*) (flush-output *default-log-port*) #t)))) ;; run http-transport:keep-running in a parallel thread to monitor that the db is being ;; used and to shutdown after sometime if it is not. ;; (define (http-transport:keep-running dbname) ;; if none running or if > 20 seconds since ;; server last used then start shutdown ;; This thread waits for the server to come alive (debug:print-info 0 *default-log-port* "Starting the sync-back, keep alive thread in server") (let* ((server-start-time (current-seconds)) (pkts-dir (get-pkts-dir)) (server-key (server:mk-signature)) (is-main (equal? (args:get-arg "-db") ".db/main.db")) (last-access 0) (server-timeout (server:expiration-timeout))) ;; exits if nothing found in 100 tries (switch to a duration would be good) (http-transport:wait-for-stable-interface) (if is-main (http-transport:wait-for-server pkts-dir dbname server-key)) (let* ((iface (servdat-host *server-info*)) (port (servdat-port *server-info*))) (let loop ((count 0) (server-state 'available) (bad-sync-count 0) (start-time (current-milliseconds))) ;; set up the database handle (if (not *dbstruct-db*) ;; no db opened yet, open the db and register with main if appropriate (let ((watchdog (bdat-watchdog *bdat*))) (debug:print 0 *default-log-port* "SERVER: dbprep") (db:setup dbname) ;; sets *dbstruct-db* as side effect ;; IFF I'm not main, call into main and register self (if (not is-main) (debug:print-info 0 *default-log-port* "Register server returned: " (rmt:register-server *rmt:remote* *toppath* iface port server-key dbname))) (debug:print 0 *default-log-port* "SERVER: running, megatest version: " (common:get-full-version)) ;; NOTE: the server is NOT yet marked as running in the log. We do that in the keep-running routine. (if watchdog (if (not (member (thread-state watchdog) '(ready running blocked sleeping dead))) (begin (debug:print-info 0 *default-log-port* "Starting watchdog thread (in state "(thread-state watchdog)")") (thread-start! watchdog))) (debug:print 0 *default-log-port* "ERROR: *watchdog* not setup, cannot start it.")))) ;; when things go wrong we don't want to be doing the various queries too often ;; so we strive to run this stuff only every four seconds or so. (let* ((sync-time (- (current-milliseconds) start-time)) (rem-time (quotient (- 4000 sync-time) 1000))) (if (and (<= rem-time 4) (> rem-time 0)) (thread-sleep! rem-time))) (if (< count 1) ;; 3x3 = 9 secs aprox (loop (+ count 1) 'running bad-sync-count (current-milliseconds))) ;; Transfer *db-last-access* to last-access to use in checking that we are still alive (mutex-lock! *heartbeat-mutex*) (set! last-access *db-last-access*) (mutex-unlock! *heartbeat-mutex*) (if (common:low-noise-print 60 "dbstats") (begin (debug:print 0 *default-log-port* "Server stats:") (db:print-current-query-stats))) (let* ((hrs-since-start (/ (- (current-seconds) server-start-time) 3600))) (cond ((and *server-run* (> (+ last-access server-timeout) (current-seconds))) (if (common:low-noise-print 120 "server continuing") (debug:print-info 0 *default-log-port* "Server continuing, seconds since last db access: " (- (current-seconds) last-access))) (loop 0 server-state bad-sync-count (current-milliseconds))) (else (debug:print-info 0 *default-log-port* "Server timed out. seconds since last db access: " (- (current-seconds) last-access)) (http-transport:server-shutdown port)))))))) (define (http-transport:server-shutdown port) (begin ;;(BB> "http-transport:server-shutdown called") (debug:print-info 0 *default-log-port* "Starting to shutdown the server. pid="(current-process-id)) ;; ;; start_shutdown |
︙ | ︙ | |||
2466 2467 2468 2469 2470 2471 2472 | (pid . ,(current-process-id))) *configdat* #t) (debug:print-info 0 *default-log-port* "Server shutdown complete. Exiting") (exit))) ;; Call this to start the actual server ;; | < | | | | | | | | | < < < < < < < < < < < < < | | | | | | | | | | | | | | | | | | 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 | (pid . ,(current-process-id))) *configdat* #t) (debug:print-info 0 *default-log-port* "Server shutdown complete. Exiting") (exit))) ;; Call this to start the actual server ;; ;; all routes though here end in exit ... ;; ;; This is the point at which servers are started ;; (define (rmt:launch dbname) ;;(let* ((tmp-area (common:get-db-tmp-area)) ;; (server-start (conc tmp-area "/.server-start")) ;; (server-started (conc tmp-area "/.server-started")) ;; (start-time (common:lazy-modification-time server-start)) ;; (started-time (common:lazy-modification-time server-started)) ;; (server-starting (< start-time started-time)) ;; if start-time is less than started-time then a server is still starting ;; (start-time-old (> (- (current-seconds) start-time) 5)) (let* ((th2 (make-thread (lambda () (debug:print-info 0 *default-log-port* "Server run thread started") (http-transport:run (if (args:get-arg "-server") (args:get-arg "-server") "-") )) "Server run")) (th3 (make-thread (lambda () (debug:print-info 0 *default-log-port* "Server monitor thread started") (http-transport:keep-running dbname) "Keep running")))) (thread-start! th2) (thread-sleep! 0.252) ;; give the server time to settle before starting the keep-running monitor. (thread-start! th3) (set! *didsomething* #t) (thread-join! th2) (exit))) ;; Generate a unique signature for this server (define (server:mk-signature) (message-digest-string (md5-primitive) (with-output-to-string (lambda () (write (list (current-directory) |
︙ | ︙ | |||
2544 2545 2546 2547 2548 2549 2550 | (else #f)) (loop (read-line) inl)))))) ;;====================================================================== ;; S E R V E R ;;====================================================================== | < < < < < < < < < < < | 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 | (else #f)) (loop (read-line) inl)))))) ;;====================================================================== ;; S E R V E R ;;====================================================================== ;;====================================================================== ;; S E R V E R U T I L I T I E S ;;====================================================================== ;; NOT USED (well, ok, reference in rpc-transport but otherwise not used). ;; #;(define (server:login toppath) |
︙ | ︙ |
Modified tests/unittests/basicserver.scm from [4ef17a5055] to [fb0b1abb4c].
︙ | ︙ | |||
18 19 20 21 22 23 24 | ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; Run like this: ;; ;; ./rununittest.sh server 1;(cd simplerun;megatest -stop-server 0) | | | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | ;; You should have received a copy of the GNU General Public License ;; along with Megatest. If not, see <http://www.gnu.org/licenses/>. ;; Run like this: ;; ;; ./rununittest.sh server 1;(cd simplerun;megatest -stop-server 0) (import rmtmod trace http-client apimod dbmod) (trace-call-sites #t) (trace ;; db:get-dbdat ;; rmt:find-main-server ;; rmt:send-receive-real ;; sexpr->string ) |
︙ | ︙ | |||
45 46 47 48 49 50 51 | (for-each (lambda (tdat) (test #f tdat (loop-test (rmt:conn-ipaddr *main*) (rmt:conn-port *main*) tdat))) (list 'a '(a "b" 123 1.23 ))) (test #f #t (number? (rmt:send-receive 'ping #f 'hello))) (trace | | < < < > | > | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | (for-each (lambda (tdat) (test #f tdat (loop-test (rmt:conn-ipaddr *main*) (rmt:conn-port *main*) tdat))) (list 'a '(a "b" 123 1.23 ))) (test #f #t (number? (rmt:send-receive 'ping #f 'hello))) (trace rmt:register-server ) (define *db* (db:setup #f)) (test #f 'server-started (api:execute-requests *db* 'get-server (list *toppath* ".db/1.db"))) (set! *dbstruct-db* #f) (test #f 'server-started (rmt:general-open-connection *rmt:remote* *toppath* ".db/1.db")) (thread-sleep! 2) (test #f 'server-started (rmt:general-open-connection *rmt:remote* *toppath* ".db/1.db")) (test #f '("SYSTEM" "RELEASE") (rmt:get-keys)) (test #f 1 (rmt:register-run '(("SYSTEM" "a")("RELEASE" "b")) "run1" "new" "n/a" "justme" #f)) ;; (delete-file* "logs/1.log") ;; (define run-id 1) ;; (test "setup for run" #t (begin (launch:setup) ;; (string? (getenv "MT_RUN_AREA_HOME")))) |
︙ | ︙ |