|
|
@@ -18,6 +18,7 @@ import (
|
|
|
"flag"
|
|
|
"fmt"
|
|
|
"net/http"
|
|
|
+ "os"
|
|
|
"strings"
|
|
|
|
|
|
"github.com/coreos/pkg/capnslog"
|
|
|
@@ -26,8 +27,18 @@ import (
|
|
|
|
|
|
var plog = capnslog.NewPackageLogger("github.com/coreos/etcd", "etcd-tester")
|
|
|
|
|
|
+const (
|
|
|
+ defaultClientPort = 2379
|
|
|
+ defaultPeerPort = 2380
|
|
|
+ defaultFailpointPort = 2381
|
|
|
+)
|
|
|
+
|
|
|
func main() {
|
|
|
endpointStr := flag.String("agent-endpoints", "localhost:9027", "HTTP RPC endpoints of agents. Do not specify the schema.")
|
|
|
+ clientPorts := flag.String("client-ports", "", "etcd client port for each agent endpoint")
|
|
|
+ peerPorts := flag.String("peer-ports", "", "etcd peer port for each agent endpoint")
|
|
|
+ failpointPorts := flag.String("failpoint-ports", "", "etcd failpoint port for each agent endpoint")
|
|
|
+
|
|
|
datadir := flag.String("data-dir", "agent.etcd", "etcd data directory location on agent machine.")
|
|
|
stressKeyLargeSize := flag.Uint("stress-key-large-size", 32*1024+1, "the size of each large key written into etcd.")
|
|
|
stressKeySize := flag.Uint("stress-key-size", 100, "the size of each small key written into etcd.")
|
|
|
@@ -39,15 +50,29 @@ func main() {
|
|
|
isV2Only := flag.Bool("v2-only", false, "'true' to run V2 only tester.")
|
|
|
flag.Parse()
|
|
|
|
|
|
+ eps := strings.Split(*endpointStr, ",")
|
|
|
+ cports := portsFromArg(*clientPorts, len(eps), defaultClientPort)
|
|
|
+ pports := portsFromArg(*peerPorts, len(eps), defaultPeerPort)
|
|
|
+ fports := portsFromArg(*failpointPorts, len(eps), defaultFailpointPort)
|
|
|
+ agents := make([]agentConfig, len(eps))
|
|
|
+ for i := range eps {
|
|
|
+ agents[i].endpoint = eps[i]
|
|
|
+ agents[i].clientPort = cports[i]
|
|
|
+ agents[i].peerPort = pports[i]
|
|
|
+ agents[i].failpointPort = fports[i]
|
|
|
+ agents[i].datadir = *datadir
|
|
|
+ }
|
|
|
+
|
|
|
c := &cluster{
|
|
|
+ agents: agents,
|
|
|
v2Only: *isV2Only,
|
|
|
- datadir: *datadir,
|
|
|
stressQPS: *stressQPS,
|
|
|
stressKeyLargeSize: int(*stressKeyLargeSize),
|
|
|
stressKeySize: int(*stressKeySize),
|
|
|
stressKeySuffixRange: int(*stressKeySuffixRange),
|
|
|
}
|
|
|
- if err := c.bootstrap(strings.Split(*endpointStr, ",")); err != nil {
|
|
|
+
|
|
|
+ if err := c.bootstrap(); err != nil {
|
|
|
plog.Fatal(err)
|
|
|
}
|
|
|
defer c.Terminate()
|
|
|
@@ -102,3 +127,26 @@ func main() {
|
|
|
|
|
|
t.runLoop()
|
|
|
}
|
|
|
+
|
|
|
+// portsFromArg converts a comma separated list into a slice of ints
|
|
|
+func portsFromArg(arg string, n, defaultPort int) []int {
|
|
|
+ ret := make([]int, n)
|
|
|
+ if len(arg) == 0 {
|
|
|
+ for i := range ret {
|
|
|
+ ret[i] = defaultPort
|
|
|
+ }
|
|
|
+ return ret
|
|
|
+ }
|
|
|
+ s := strings.Split(arg, ",")
|
|
|
+ if len(s) != n {
|
|
|
+ fmt.Printf("expected %d ports, got %d (%s)\n", n, len(s), arg)
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ for i := range s {
|
|
|
+ if _, err := fmt.Sscanf(s[i], "%d", &ret[i]); err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ret
|
|
|
+}
|