Overview
Comment: | Added rpctest continuous client - shows that with reasonable rate of client creation/exiting that rpc can keep up fine and no issue with rpc running amok |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | v1.60 |
Files: | files | file ages | folders |
SHA1: |
15f70448fd98d462c89612b122b41c1e |
User & Date: | matt on 2015-12-08 22:15:21 |
Other Links: | branch diff | manifest | tags |
Context
2015-12-10
| ||
14:22 | Adding sretrieve check-in: 3c7d705195 user: mrwellan tags: v1.60 | |
2015-12-08
| ||
22:15 | Added rpctest continuous client - shows that with reasonable rate of client creation/exiting that rpc can keep up fine and no issue with rpc running amok check-in: 15f70448fd user: matt tags: v1.60 | |
08:44 | Merged fork check-in: ca3c827888 user: mrwellan tags: v1.60 | |
Changes
Added rpctest/rpctest-continuous-client.scm version [9a7f357955].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 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 70 71 72 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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | ;;;; rpc-demo.scm ;;;; Simple database server / client ;;; start server thusly: ./rpctest server test.db ;;; you will need to init test.db: ;;; sqlite3 test.db "CREATE TABLE foo (id INTEGER PRIMARY KEY, var TEXT, val TEXT);" (require-extension (srfi 18) extras tcp rpc sql-de-lite) ;;; Common things (define total-queries 0) (define start-time (current-seconds)) (define operation (string->symbol (car (command-line-arguments)))) (define param (cadr (command-line-arguments))) (print "Operation: " operation ", param: " param) ;; have a pool of db's to pick from (define *dbpool* '()) (define *pool-mutex* (make-mutex)) (define (get-db) (mutex-lock! *pool-mutex*) (if (null? *dbpool*) (begin (mutex-unlock! *pool-mutex*) (let ((db (open-database param))) (set-busy-handler! db (busy-timeout 10000)) (exec (sql db "PRAGMA synchronous=0;")) db)) (let ((res (car *dbpool*))) (set! *dbpool* (cdr *dbpool*)) (mutex-unlock! *pool-mutex*) res))) (define (return-db db) (mutex-lock! *pool-mutex*) (set! *dbpool* (cons db *dbpool* )) (let ((res (length *dbpool*))) (mutex-unlock! *pool-mutex*) res)) (define rpc:listener (if (eq? operation 'server) (tcp-listen (rpc:default-server-port)) (tcp-listen 0))) ;; Start server thread (define rpc:server (make-thread (cute (rpc:make-server rpc:listener) "rpc:server") 'rpc:server)) (thread-start! rpc:server) ;;; Server side (define (server) (rpc:publish-procedure! 'change-response-port (lambda (port) (rpc:default-server-port port)) #f) ;;(let ((db (get-db))(open-database param))) ;; (set-finalizer! db finalize!) (rpc:publish-procedure! 'query (lambda (sqlstmt callback) (set! total-queries (+ total-queries 1)) (print "Executing query '" sqlstmt "' ...") (let ((db (get-db))) (query (for-each-row callback) (sql db sqlstmt)) (print "Query rate: " (/ total-queries (/ (- (current-seconds) start-time) 60)) " per minute") (print "num dbs: " (return-db db)) ))) (thread-join! rpc:server)) ;;; Client side (define (callback1 . columns) (let loop ((c columns) (i 0)) (unless (null? c) (printf "~a=~s " i (car c)) (loop (cdr c) (+ i 1)))) (newline)) (define callback2-results '()) (define (callback2 . columns) (set! callback2-results (cons columns callback2-results))) (define (client param) ((rpc:procedure 'change-response-port "localhost") (tcp-listener-port rpc:listener)) ((rpc:procedure 'query "localhost") param callback1) (rpc:publish-procedure! 'callback2 callback2) ((rpc:procedure 'query "localhost") param callback2) (pp callback2-results) (rpc:close-all-connections!) ;; (rpc:close-connection! "localhost" (rpc:default-server-port)) ) (define (run-query param) ((rpc:procedure 'query "localhost") param callback1) ((rpc:procedure 'query "localhost") param callback2) callback2-results) (define (continuous-client #!key (duration 600)) ;; default - run for 10 minutes ((rpc:procedure 'change-response-port "localhost") (tcp-listener-port rpc:listener)) (rpc:publish-procedure! 'callback2 callback2) (let loop () (if (< (- (current-seconds) start-time) duration) (begin (run-query (conc "INSERT INTO foo (var,val) VALUES (" (random 1000) "," (random 1000) ");")) (let ((numrows (caaar (run-query "SELECT COUNT(id) FROM foo;")))) (if (and (number? numrows) (> numrows 300)) (print (run-query (conc "DELETE FROM foo WHERE var > " (random 1000) ";"))))) (loop)))) (rpc:close-all-connections!)) ;;; Run it (if (eq? operation 'server) (server) (continuous-client)) |