func (c *cluster) bootstrap() error { size := len(c.agents) members := make([]*member, size) memberNameURLs := make([]string, size) for i, a := range c.agents { agent, err := client.NewAgent(a.endpoint) if err != nil { return err } host, _, err := net.SplitHostPort(a.endpoint) if err != nil { return err } members[i] = &member{ Agent: agent, Endpoint: a.endpoint, Name: fmt.Sprintf("etcd-%d", i), ClientURL: fmt.Sprintf("http://%s:%d", host, a.clientPort), PeerURL: fmt.Sprintf("http://%s:%d", host, a.peerPort), FailpointURL: fmt.Sprintf("http://%s:%d", host, a.failpointPort), } memberNameURLs[i] = members[i].ClusterEntry() } clusterStr := strings.Join(memberNameURLs, ",") token := fmt.Sprint(rand.Int()) for i, m := range members { flags := append( m.Flags(), "--data-dir", c.agents[i].datadir, "--initial-cluster-token", token, "--initial-cluster", clusterStr) if _, err := m.Agent.Start(flags...); err != nil { // cleanup for _, m := range members[:i] { m.Agent.Terminate() } return err } } c.Stressers = make([]Stresser, len(members)) for i, m := range members { c.Stressers[i] = c.stressBuilder(m) go c.Stressers[i].Stress() } c.Size = size c.Members = members return nil }
func (c *cluster) bootstrap(agentEndpoints []string) error { size := len(agentEndpoints) members := make([]*member, size) memberNameURLs := make([]string, size) for i, u := range agentEndpoints { agent, err := client.NewAgent(u) if err != nil { return err } host, _, err := net.SplitHostPort(u) if err != nil { return err } members[i] = &member{ Agent: agent, Endpoint: u, Name: fmt.Sprintf("etcd-%d", i), ClientURL: fmt.Sprintf("http://%s:2379", host), PeerURL: fmt.Sprintf("http://%s:%d", host, peerURLPort), FailpointURL: fmt.Sprintf("http://%s:%d", host, failpointPort), } memberNameURLs[i] = members[i].ClusterEntry() } clusterStr := strings.Join(memberNameURLs, ",") token := fmt.Sprint(rand.Int()) for i, m := range members { flags := append( m.Flags(), "--data-dir", c.datadir, "--initial-cluster-token", token, "--initial-cluster", clusterStr) if _, err := m.Agent.Start(flags...); err != nil { // cleanup for _, m := range members[:i] { m.Agent.Terminate() } return err } } // TODO: Too intensive stressers can panic etcd member with // 'out of memory' error. Put rate limits in server side. stressN := 100 c.Stressers = make([]Stresser, len(members)) for i, m := range members { if c.v2Only { c.Stressers[i] = &stresserV2{ Endpoint: m.ClientURL, KeySize: c.stressKeySize, KeySuffixRange: c.stressKeySuffixRange, N: stressN, } } else { c.Stressers[i] = &stresser{ Endpoint: m.grpcAddr(), KeySize: c.stressKeySize, KeySuffixRange: c.stressKeySuffixRange, qps: c.stressQPS, N: stressN, } } go c.Stressers[i].Stress() } c.Size = size c.Members = members return nil }
func (c *cluster) Bootstrap() error { size := len(c.agentEndpoints) agents := make([]client.Agent, size) names := make([]string, size) grpcURLs := make([]string, size) clientURLs := make([]string, size) peerURLs := make([]string, size) members := make([]string, size) for i, u := range c.agentEndpoints { var err error agents[i], err = client.NewAgent(u) if err != nil { return err } names[i] = fmt.Sprintf("etcd-%d", i) host, _, err := net.SplitHostPort(u) if err != nil { return err } grpcURLs[i] = fmt.Sprintf("%s:2378", host) clientURLs[i] = fmt.Sprintf("http://%s:2379", host) peerURLs[i] = fmt.Sprintf("http://%s:%d", host, peerURLPort) members[i] = fmt.Sprintf("%s=%s", names[i], peerURLs[i]) } clusterStr := strings.Join(members, ",") token := fmt.Sprint(rand.Int()) for i, a := range agents { flags := []string{ "--name", names[i], "--data-dir", c.datadir, "--listen-client-urls", clientURLs[i], "--advertise-client-urls", clientURLs[i], "--listen-peer-urls", peerURLs[i], "--initial-advertise-peer-urls", peerURLs[i], "--initial-cluster-token", token, "--initial-cluster", clusterStr, "--initial-cluster-state", "new", } if !c.v2Only { flags = append(flags, "--experimental-v3demo", "--experimental-gRPC-addr", grpcURLs[i], ) } if _, err := a.Start(flags...); err != nil { // cleanup for j := 0; j < i; j++ { agents[j].Terminate() } return err } } var stressers []Stresser if c.v2Only { for _, u := range clientURLs { s := &stresserV2{ Endpoint: u, KeySize: c.stressKeySize, KeySuffixRange: c.stressKeySuffixRange, N: 200, } go s.Stress() stressers = append(stressers, s) } } else { for _, u := range grpcURLs { s := &stresser{ Endpoint: u, KeySize: c.stressKeySize, KeySuffixRange: c.stressKeySuffixRange, N: 200, } go s.Stress() stressers = append(stressers, s) } } c.Size = size c.Agents = agents c.Stressers = stressers c.Names = names c.GRPCURLs = grpcURLs c.ClientURLs = clientURLs return nil }
func (c *cluster) Bootstrap() error { size := len(c.agentEndpoints) agents := make([]client.Agent, size) names := make([]string, size) clientURLs := make([]string, size) peerURLs := make([]string, size) members := make([]string, size) for i, u := range c.agentEndpoints { var err error agents[i], err = client.NewAgent(u) if err != nil { return err } names[i] = fmt.Sprintf("etcd-%d", i) host, _, err := net.SplitHostPort(u) if err != nil { return err } clientURLs[i] = fmt.Sprintf("http://%s:2379", host) peerURLs[i] = fmt.Sprintf("http://%s:%d", host, peerURLPort) members[i] = fmt.Sprintf("%s=%s", names[i], peerURLs[i]) } clusterStr := strings.Join(members, ",") token := fmt.Sprint(rand.Int()) for i, a := range agents { _, err := a.Start( "-name", names[i], "-data-dir", c.datadir, "-advertise-client-urls", clientURLs[i], "-listen-client-urls", clientURLs[i], "-initial-advertise-peer-urls", peerURLs[i], "-listen-peer-urls", peerURLs[i], "-initial-cluster-token", token, "-initial-cluster", clusterStr, "-initial-cluster-state", "new", ) if err != nil { // cleanup for j := 0; j < i; j++ { agents[j].Terminate() } return err } } stressers := make([]Stresser, len(clientURLs)) for i, u := range clientURLs { s := &stresser{ Endpoint: u, KeySize: c.stressKeySize, KeySuffixRange: c.stressKeySuffixRange, N: 200, } go s.Stress() stressers[i] = s } c.Size = size c.Agents = agents c.Stressers = stressers c.Names = names c.ClientURLs = clientURLs return nil }