Index: testzmq/mockupclient.scm ================================================================== --- testzmq/mockupclient.scm +++ testzmq/mockupclient.scm @@ -1,10 +1,10 @@ -(use zmq) +(use zmq posix) (define cname "Bob") (let ((args (argv))) - (if (< (length args) 3) + (if (< (length args) 2) (begin (print "Usage: mockupclient clientname") (exit)) (set! cname (cadr args)))) @@ -16,15 +16,20 @@ (define (dbaccess cmd var val) (let ((msg (conc cname ":" cmd ":" (if val (conc var " " val) var)))) (print "Sending msg: " msg) (send-message push msg) + (receive-message* sub) (receive-message* sub))) (let loop () - (case (random 5) - ((1)(dbaccess sync "" #f)) - (else - (thread-sleep! 1))) - (loop)) + (let ((x (random 15)) + (varname (list-ref (list "hello" "goodbye" "saluton" "kiaorana")(random 4)))) + (case x + ((1)(dbaccess 'sync "nodat" #f)) + ((2 3 4 5)(dbaccess 'set varname (random 999))) + ((6 7 8 9 10)(print cname ": Get \"" varname "\" " (dbaccess 'get varname #f))) + (else + (thread-sleep! 0.01))) + (loop))) Index: testzmq/mockupserver.scm ================================================================== --- testzmq/mockupserver.scm +++ testzmq/mockupserver.scm @@ -10,24 +10,44 @@ (bind-socket pub "tcp://*:5563") (bind-socket pull "tcp://*:5564") (define (open-db) - (let* ((dbpath "mockupserver.db") + (let* ((dbpath "mockup.db") (dbexists (file-exists? dbpath)) (db (open-database dbpath)) ;; (never-give-up-open-db dbpath)) (handler (make-busy-timeout 10))) (set-busy-handler! db handler) (if (not dbexists) (for-each (lambda (stmt) (execute db stmt)) (list - "CREATE TABLE clients (id INTEGER PRIMARY KEY,name TEXT,num_accesses INTEGER);" + "CREATE TABLE clients (id INTEGER PRIMARY KEY,name TEXT,num_accesses INTEGER DEFAULT 0);" "CREATE TABLE vars (var TEXT,val TEXT,CONSTRAINT vars_constraint UNIQUE (var));"))) db)) +(define cid-cache (make-hash-table)) + +(define (get-client-id db cname) + (let ((cid (hash-table-ref/default cid-cache cname #f))) + (if cid + cid + (begin + (execute db "INSERT OR REPLACE INTO clients (name) VALUES(?);" cname) + (for-each-row + (lambda (id) + (set! cid id)) + db + "SELECT id FROM clients WHERE name=?;" cname) + (hash-table-set! cid-cache cname cid) + cid)))) + +(define (count-client db cname) + (let ((cid (get-client-id db cname))) + (execute db "UPDATE clients SET num_accesses=num_accesses+1 WHERE id=?;" cid))) + (define db (open-db)) ;; (define queuelst '()) ;; (define mx1 (make-mutex)) (define (process-queue queuelst) @@ -36,14 +56,14 @@ (let ((cname (vector-ref item 1)) (clcmd (vector-ref item 2)) (cdata (vector-ref item 3))) (send-message pub cname send-more: #t) (send-message pub (case clcmd - ((setval) + ((set) (apply execute db "INSERT OR REPLACE INTO vars (var,val) VALUES (?,?);" (string-split cdata)) "ok") - ((getval) + ((get) (let ((res "noval")) (for-each-row (lambda (val) (set! res val)) db @@ -60,11 +80,11 @@ (parts (string-split indat ":")) (cname (car parts)) ;; client name (clcmd (string->symbol (cadr parts))) ;; client cmd (cdata (caddr parts)) ;; client data (svect (vector (current-seconds) cname clcmd cdata))) ;; record for the queue - ;; (print "Got indat=" indat) + (count-client db cname) (case clcmd ((sync) ;; just process the queue (print "Got sync from " cname) (process-queue queuelst) (loop '())) @@ -80,14 +100,14 @@ ;; send a sync to the pull port (define th2 (make-thread (lambda () (let loop () - (thread-sleep! 3) + (thread-sleep! 5) ;; (print "Sending sync from server") (send-message push "server:sync:nodat") (loop))) "sync thread")) (thread-start! th1) (thread-start! th2) (thread-join! th1) Index: testzmq/testmockup.sh ================================================================== --- testzmq/testmockup.sh +++ testzmq/testmockup.sh @@ -1,10 +1,24 @@ #!/bin/bash +rm -f mockup.db + +echo Compiling mockupserver.scm and mockupclient.scm csc mockupserver.scm csc mockupclient.scm +echo Starting server ./mockupserver & -for i in a b;do - ./mockupclient $i & +sleep 1 + +echo Starting clients +for i in a b c d e f g h i j k l m n o p q s t u v w x y z;do + for j in 0 1 2 3 4 5 6 7 8 9;do + echo Starting client $i$j + ./mockupclient $i$j & + done done + +echo "Running for one minute then killing all mockupserver and mockupclient processes" +sleep 60 +killall -v mockupserver mockupclient