diff --git a/cmd/rqbench/http.go b/cmd/rqbench/http.go index b1b6b759..cb00a709 100644 --- a/cmd/rqbench/http.go +++ b/cmd/rqbench/http.go @@ -5,11 +5,21 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "time" ) +// Result represents a single result from a test request. +type Result struct { + Error string `json:"error,omitempty"` + Rest json.RawMessage +} + +// Response represents a response from a test request. +type Response struct { + Results []Result `json:"results"` +} + // HTTPTester represents an HTTP transport tester. type HTTPTester struct { client http.Client @@ -61,13 +71,22 @@ func (h *HTTPTester) Once() (time.Duration, error) { } defer resp.Body.Close() - _, err = ioutil.ReadAll(resp.Body) + if resp.StatusCode != http.StatusOK { + return 0, fmt.Errorf("received %s", resp.Status) + } + + r := Response{} + err = json.NewDecoder(resp.Body).Decode(&r) if err != nil { return 0, err } - - if resp.StatusCode != http.StatusOK { - return 0, fmt.Errorf("received %s", resp.Status) + if len(r.Results) == 0 { + return 0, fmt.Errorf("expected at least 1 result, got %d", len(r.Results)) + } + for _, res := range r.Results { + if res.Error != "" { + return 0, fmt.Errorf("received error: %s", res.Error) + } } dur := time.Since(start) diff --git a/cmd/rqbench/simple_load.sh b/cmd/rqbench/simple_load.sh index 78719c1e..34857469 100755 --- a/cmd/rqbench/simple_load.sh +++ b/cmd/rqbench/simple_load.sh @@ -1,10 +1,28 @@ #!/bin/bash -EXECUTE_HOST=localhost:4001 +if [[ -z "$EXECUTE_HOST" ]]; then + EXECUTE_HOST=localhost:4001 +fi -$RQBENCH -o 'CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name TEXT, surname TEXT)' -m 100 -n 1500000 -a $EXECUTE_HOST 'INSERT INTO foo(name) VALUES("fiona")' & -$RQBENCH -o 'CREATE TABLE bar (id INTEGER NOT NULL PRIMARY KEY, name TEXT, surname TEXT)' -m 100 -n 1500000 -a $EXECUTE_HOST 'INSERT INTO bar(name, surname) VALUES("fiona", "OTOOLE")' & -$RQBENCH -o 'CREATE TABLE qux (id INTEGER NOT NULL PRIMARY KEY, name TEXT)' -m 100 -n 1500000 -a $EXECUTE_HOST 'INSERT INTO qux(name) VALUES("fionafionafionafionafionafionafionafionafionafionafionafionafionafionafionafionafionafiona")' & +if [[ -z "$RQBENCH" ]]; then + RQBENCH="./rqbench" +fi + +handle_ctrl_c() { + echo "Killing all load testing..." + killall rqbench + exit 1 +} + +trap 'handle_ctrl_c' SIGINT + + +$RQBENCH -o 'CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name TEXT, surname TEXT)' -m 100 -n 500000 -a $EXECUTE_HOST 'INSERT INTO foo(name) VALUES("fiona")' & +$RQBENCH -o 'CREATE TABLE bar (id INTEGER NOT NULL PRIMARY KEY, name TEXT, surname TEXT)' -m 100 -n 500000 -a $EXECUTE_HOST 'INSERT INTO bar(name, surname) VALUES("fiona", "OTOOLE")' & +$RQBENCH -o 'CREATE TABLE qux (id INTEGER NOT NULL PRIMARY KEY, name TEXT)' -m 100 -n 500000 -a $EXECUTE_HOST 'INSERT INTO qux(name) VALUES("fionafionafionafionafionafionafionafionafionafionafionafionafionafionafionafionafionafiona")' & + +echo "Waiting for tables to be created before starting queries" +sleep 5 $RQBENCH -p "/db/query" -n 150000000 -m 1000 "SELECT COUNT(*) FROM foo" & $RQBENCH -p "/db/query" -n 150000000 -m 1000 "SELECT COUNT(*) FROM bar" &