From 889323c0613277332bdb039f06f8c2b4f389e6ad Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sun, 4 May 2014 17:06:45 -0400 Subject: [PATCH] Multi-backend echo testing; erlang server --- echo-client.rkt | 11 +++++++++-- echo-server.rkt | 9 ++++++++- echoserver.erl | 37 ++++++++++++++++++++++++++++--------- external-latency.rkt | 38 +++++++++++++++++++++++++++++++++++--- run-erlang-server.sh | 3 +++ 5 files changed, 83 insertions(+), 15 deletions(-) create mode 100755 run-erlang-server.sh diff --git a/echo-client.rkt b/echo-client.rkt index 036000d..8eb8c18 100644 --- a/echo-client.rkt +++ b/echo-client.rkt @@ -6,15 +6,22 @@ (require logbook) (define server-entry-name (standard-logbook-entry-name)) +(define server-entry-type #f) (command-line #:program "echo-client.rkt" #:once-each ["--logbook-entry-name" name "set logbook entry name to use when recording run statistics" - (set! server-entry-name name)]) + (set! server-entry-name name)] + ["--logbook-entry-type" type + "set logbook entry type to use" + (set! server-entry-type type)]) + +(when (not server-entry-type) + (error 'echo-client "Please supply the --logbook-entry-type command-line argument.")) (define L (default-logbook)) -(define E (logbook-entry L "minimart" server-entry-name "external-latency")) +(define E (logbook-entry L "minimart" server-entry-name server-entry-type)) (when (not (logbook-machine-info-recorded? E)) (logbook-record-machine-info! E)) (define Tgrowth (logbook-table E "client-grow-times" #:column-spec '(initial-count diff --git a/echo-server.rkt b/echo-server.rkt index a8be1b6..1b19d4a 100644 --- a/echo-server.rkt +++ b/echo-server.rkt @@ -9,12 +9,19 @@ (require racket/cmdline) (define server-entry-name #f) +(define server-entry-type #f) (command-line #:program "echo-server.rkt" #:once-each ["--logbook-entry-name" name "set logbook entry name to use when recording run statistics" - (set! server-entry-name name)]) + (set! server-entry-name name)] + ["--logbook-entry-type" type + "set logbook entry type to use" + (set! server-entry-type type)]) + +(when (not server-entry-type) + (error 'echo-server "Please supply the --logbook-entry-type command-line argument.")) (define L (default-logbook)) (define E (logbook-entry L "minimart" server-entry-name "external-latency")) diff --git a/echoserver.erl b/echoserver.erl index 296b79b..45b0b3c 100644 --- a/echoserver.erl +++ b/echoserver.erl @@ -3,22 +3,41 @@ -export([start/0]). start() -> - {ok, LSock} = gen_tcp:listen(5999, [{active, true}, {packet, line}, {reuseaddr, true}]), - accept_loop(LSock). + Port = 5999, + CounterPid = spawn(fun () -> counter(0) end), + {ok, LSock} = gen_tcp:listen(Port, [{active, true}, {packet, line}, {reuseaddr, true}]), + io:format("Erlang echo server running on port ~p.~n", [Port]), + accept_loop(LSock, CounterPid). -accept_loop(LSock) -> - case gen_tcp:accept(LSock) of - {ok, Sock} -> - gen_tcp:controlling_process(Sock, spawn(fun () -> connection(Sock) end)), - accept_loop(LSock) +counter(Count) -> + receive + inc -> + counter(Count + 1); + dec -> + case Count - 1 of + 0 -> + io:format("Exiting on zero connection count.~n"), + init:stop(); + NewCount -> + counter(NewCount) + end end. -connection(Sock) -> +accept_loop(LSock, CounterPid) -> + case gen_tcp:accept(LSock) of + {ok, Sock} -> + CounterPid ! inc, + gen_tcp:controlling_process(Sock, spawn(fun () -> connection(Sock, CounterPid) end)), + accept_loop(LSock, CounterPid) + end. + +connection(Sock, CounterPid) -> receive {tcp, _, Line} -> gen_tcp:send(Sock, Line), - connection(Sock); + connection(Sock, CounterPid); {tcp_closed, _} -> + CounterPid ! dec, ok; Other -> error_logger:error_report({connection, unhandled, Other}) diff --git a/external-latency.rkt b/external-latency.rkt index c5a601a..3b7185b 100644 --- a/external-latency.rkt +++ b/external-latency.rkt @@ -2,11 +2,27 @@ (require racket/match) (require racket/system) +(require racket/string) +(require racket/port) +(require racket/cmdline) (require logbook) +(define server-variation #f) + +(command-line #:program "external-latency.rkt" + #:once-any + ["--erlang" "use erlang server" (set! server-variation 'erlang)] + ["--minimart" "use minimart server" (set! server-variation 'minimart)]) + +(when (not server-variation) + (error 'external-latency "Please choose a server variation.")) + +(define entry-type (format "external-latency-~a" server-variation)) + (define L (default-logbook)) -(define E (standard-logbook-entry L "minimart" "external-latency")) +(define E (standard-logbook-entry L "minimart" entry-type)) (define entry-name (logbook-entry-name E)) +(define Tmachine (logbook-table E "machine-info" "machine-info")) (define (start-bg command) (match-define (list #f #f pid #f control) @@ -18,13 +34,29 @@ (log-info "Starting server...") (define server-control - (start-bg (format "racket echo-server.rkt --logbook-entry-name ~a" entry-name))) + (start-bg + (match server-variation + ['minimart + (format "racket echo-server.rkt --logbook-entry-name ~a --logbook-entry-type ~a" + entry-name + entry-type)] + ['erlang + (define erlang-version-command + "erl -noshell -eval 'io:format(erlang:system_info(otp_release)), halt().'") + (write-logbook-datum! Tmachine + #:label "erlang-version" + (string-trim (with-output-to-string + (lambda () (system erlang-version-command))))) + "./run-erlang-server.sh"]))) (sleep 5) (log-info "Starting client...") (define client-control - (start-bg (format "racket echo-client.rkt --logbook-entry-name ~a" entry-name))) + (start-bg + (format "racket echo-client.rkt --logbook-entry-name ~a --logbook-entry-type ~a" + entry-name + entry-type))) (log-info "Waiting for client termination...") (client-control 'wait) diff --git a/run-erlang-server.sh b/run-erlang-server.sh new file mode 100755 index 0000000..7ade0a5 --- /dev/null +++ b/run-erlang-server.sh @@ -0,0 +1,3 @@ +#!/bin/sh +erlc echoserver.erl +erl -noshell -run echoserver start