Overview
Comment: | WIP: Enabled inmem. Works for somecases, smashes the heap on megatest -run |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | v2.0001-inmem |
Files: | files | file ages | folders |
SHA1: |
871f52772970ddf32e0dd6cc50cb1cbe |
User & Date: | matt on 2022-01-18 19:14:42 |
Other Links: | branch diff | manifest | tags |
Context
2022-01-19
| ||
13:25 | Added very conservative (and slow) encode/decode serialization to be resiliant over transport problems. Fixed transport problem created by use of print. Leaf check-in: e4218567cc user: matt tags: v2.0001-inmem | |
2022-01-18
| ||
19:14 | WIP: Enabled inmem. Works for somecases, smashes the heap on megatest -run check-in: 871f527729 user: matt tags: v2.0001-inmem | |
08:43 | Make simple the default check-in: 27444d9beb user: matt tags: v2.0001 | |
Changes
Modified dbmod.scm from [2dc9d5a75d] to [c50dc3ce24].
︙ | ︙ | |||
420 421 422 423 424 425 426 | ;; open or create the disk db file ;; create and fill the inmemory db ;; assemble into dbr:dbdat struct and return ;; (define (db:open-dbdat apath dbfile dbinit-proc) (let* ((db (db:open-run-db dbfile dbinit-proc)) | | | | > > | < < < < < < < < < < < < | 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 | ;; open or create the disk db file ;; create and fill the inmemory db ;; assemble into dbr:dbdat struct and return ;; (define (db:open-dbdat apath dbfile dbinit-proc) (let* ((db (db:open-run-db dbfile dbinit-proc)) (inmem (db:open-inmem-db dbinit-proc)) (dbdat (make-dbr:dbdat db: db inmem: inmem ;; run-id: run-id ;; no can do, there are many run-id values that point to single db fname: dbfile))) (assert (and (sqlite3:database? db)(sqlite3:database? inmem)) "FATAL: should have both inmem and on-disk db at this time.") ;; now sync the disk file data into the inmemory db (db:sync-tables (db:sync-all-tables-list) '("last_update" . 0) db inmem) ;; (sqlite3:finalize! db) ;; open and close every sync dbdat)) ;; open the disk database file ;; NOTE: May need to add locking to file create process here ;; returns an sqlite3 database handle ;; (define (db:open-run-db dbfile dbinit-proc) (let* ((parent-dir (pathname-directory dbfile))) |
︙ | ︙ | |||
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 | ;; called in http-transport and replicated in rmt.scm for *local* access. ;; (define (db:setup db-file) ;; run-id) (assert *toppath* "FATAL: db:setup called before toppath is available.") (let* ((dbstruct (or *dbstruct-db* (make-dbr:dbstruct)))) (db:get-dbdat dbstruct *toppath* db-file) (if (not *dbstruct-db*)(set! *dbstruct-db* dbstruct)) dbstruct)) ;;====================================================================== ;; setting/getting a lock on the db for only one server per db ;; ;; NOTE: ;; These operate directly on the disk file, NOT on the inmemory db ;; The lockname is the filename (can have many to one, run-id to fname | > > > > > > > > > | 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 | ;; called in http-transport and replicated in rmt.scm for *local* access. ;; (define (db:setup db-file) ;; run-id) (assert *toppath* "FATAL: db:setup called before toppath is available.") (let* ((dbstruct (or *dbstruct-db* (make-dbr:dbstruct)))) (db:get-dbdat dbstruct *toppath* db-file) (if (not *dbstruct-db*)(set! *dbstruct-db* dbstruct)) (assert (db:check-setup dbstruct *toppath* db-file) "FATAL: db:setup did NOT complete properly") dbstruct)) (define (db:check-setup dbstruct apath dbfile) (let* ((dbdat (db:get-dbdat dbstruct apath dbfile)) (dbfullname (conc apath "/" dbfile)) (db (dbr:dbdat-db dbdat)) ;; (db:open-run-db dbfullname db:initialize-db)) ;; (inmem (dbr:dbdat-inmem dbdat))) (and (sqlite3:database? db) (sqlite3:database? inmem)))) ;;====================================================================== ;; setting/getting a lock on the db for only one server per db ;; ;; NOTE: ;; These operate directly on the disk file, NOT on the inmemory db ;; The lockname is the filename (can have many to one, run-id to fname |
︙ | ︙ | |||
691 692 693 694 695 696 697 | ;; ;; (mutex-unlock! *db-multi-sync-mutex*) ;; ;; (stack-push! (dbr:dbstruct-dbstack dbstruct) tmpdb))) ;; NOTE: touched logic is disabled/not done ;; sync run to disk if touched ;; (define (db:sync-inmem->disk dbstruct apath dbfile #!key (force-sync #f)) | < < < | | | | | | | > > > | | | | | | | | | | | > | | | | 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 | ;; ;; (mutex-unlock! *db-multi-sync-mutex*) ;; ;; (stack-push! (dbr:dbstruct-dbstack dbstruct) tmpdb))) ;; NOTE: touched logic is disabled/not done ;; sync run to disk if touched ;; (define (db:sync-inmem->disk dbstruct apath dbfile #!key (force-sync #f)) (let* ((dbdat (db:get-dbdat dbstruct apath dbfile)) (dbfullname (conc apath "/" dbfile)) (db (dbr:dbdat-db dbdat)) ;; (db:open-run-db dbfullname db:initialize-db)) ;; (inmem (dbr:dbdat-inmem dbdat)) (start-t (current-seconds)) (last-update (dbr:dbdat-last-write dbdat)) (last-sync (dbr:dbdat-last-sync dbdat))) (if (and (sqlite3:database? db) (sqlite3:database? inmem)) (begin (debug:print-info 0 *default-log-port* "Syncing for dbfile: "dbfile", last-update: "last-update", last-sync: "last-sync) (mutex-lock! *db-multi-sync-mutex*) (let* ((update_info (cons "last_update" (if force-sync 0 last-update))) ;; "last_update")) (need-sync (or force-sync (>= last-update last-sync)))) (if need-sync (begin (db:sync-tables (db:sync-all-tables-list) update_info inmem db) (dbr:dbdat-last-sync-set! dbdat start-t)) (debug:print 0 *default-log-port* "Skipping sync as nothing touched."))) ;; (sqlite3:finalize! db) (mutex-unlock! *db-multi-sync-mutex*)) (debug:print-info 0 *default-log-port* "Skipping sync due to databases not being open.")))) ;; TODO: Add final sync to this ;; (define (db:safely-close-sqlite3-db db stmt-cache #!key (try-num 3)) (if (<= try-num 0) #f (handle-exceptions exn (begin (print "Attempt to safely close sqlite3 db failed. Trying again. exn=" exn) (thread-sleep! 3) (sqlite3:interrupt! db) (db:safely-close-sqlite3-db db stmt-cache try-num: (- try-num 1))) (if (sqlite3:database? db) (let* ((stmts (and stmt-cache (hash-table-ref/default stmt-cache db #f)))) (if stmts (map sqlite3:finalize! (hash-table-values stmts))) (sqlite3:finalize! db) #t) #f)))) ;; close all opened run-id dbs (define (db:close-all dbstruct) (assert (dbr:dbstruct? dbstruct) "FATAL: db:close-all called with dbstruct not set up.") (handle-exceptions exn (begin (debug:print 0 *default-log-port* "WARNING: Finalizing failed, " ((condition-property-accessor 'exn 'message) exn) ", note - exn=" exn) (print-call-chain *default-log-port*)) ;; (db:sync-touched dbstruct 0 force-sync: #t) ;; NO. Do not do this here. Instead we rely on a server to be started when there are writes, even if the server itself is not going to be used as a server. |
︙ | ︙ |
Modified tests/simplerun/debug.scm from [16d17455ce] to [0b0b787662].
︙ | ︙ | |||
30 31 32 33 34 35 36 37 38 39 40 41 42 | (lambda () (let loop ((r 0) (i 1) (s 0)) ;; sum (let ((start-time (current-milliseconds)) (run-id (+ r (make-run-id)))) (rmt:register-test run-id "test1" (conc "item_" i)) (let* ((qry-time (- (current-milliseconds) start-time)) (tot-query-time (+ qry-time s)) (avg-query-time (* 1.0 (/ tot-query-time i)))) (if (> qry-time 500) (print "WARNING: rmt:register-test took more than 500ms, "qry-time"ms, i="i", avg-query-time="avg-query-time)) (if (eq? (modulo i 100) 0) | > | | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | (lambda () (let loop ((r 0) (i 1) (s 0)) ;; sum (let ((start-time (current-milliseconds)) (run-id (+ r (make-run-id)))) (rmt:register-test run-id "test1" (conc "item_" i)) (thread-sleep! 0.01) (let* ((qry-time (- (current-milliseconds) start-time)) (tot-query-time (+ qry-time s)) (avg-query-time (* 1.0 (/ tot-query-time i)))) (if (> qry-time 500) (print "WARNING: rmt:register-test took more than 500ms, "qry-time"ms, i="i", avg-query-time="avg-query-time)) (if (eq? (modulo i 100) 0) (print "For run-id="run-id", "(rmt:get-keys-write)" num tests registered="i" avg-query-time="avg-query-time)) (if (< i 500) (loop r (+ i 1) tot-query-time) (if (< r 100) (let* ((start-time (current-milliseconds))) (print "rmt:get-keys "(rmt:get-keys)" in "(- (current-milliseconds) start-time)) (print "Got "(length (rmt:get-tests-for-run run-id "%" '() '() 0 #f #f #f #f #f 0 #f))" tests for run "run-id) (print "Average query time: "avg-query-time) |
︙ | ︙ |