Skip to content

Commit 758b794

Browse files
authored
Merge pull request #96 from arangodb-helper/error-info-on-failure
Error info on failure
2 parents cd9eda1 + f5b80e3 commit 758b794

File tree

5 files changed

+135
-31
lines changed

5 files changed

+135
-31
lines changed

service/cluster_config.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -154,18 +154,6 @@ func (p ClusterConfig) HaveEnoughAgents() bool {
154154
return count >= p.AgencySize
155155
}
156156

157-
// HaveEnoughResilientSingles returns true when the number of peers that have an resilient single server
158-
// is equal to 2.
159-
func (p ClusterConfig) HaveEnoughResilientSingles() bool {
160-
count := 0
161-
for _, x := range p.AllPeers {
162-
if x.HasResilientSingle() {
163-
count++
164-
}
165-
}
166-
return count >= 2
167-
}
168-
169157
// IsSecure returns true if any of the peers is secure.
170158
func (p ClusterConfig) IsSecure() bool {
171159
for _, x := range p.AllPeers {

service/service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ func (s *Service) HandleHello(ownAddress, remoteAddress string, req *HelloReques
663663
if req.Coordinator != nil {
664664
hasCoordinator = *req.Coordinator
665665
}
666-
hasResilientSingle := !s.myPeers.HaveEnoughResilientSingles()
666+
hasResilientSingle := true
667667
if req.ResilientSingle != nil {
668668
hasResilientSingle = *req.ResilientSingle
669669
}

test/docker_resilientsingle_default_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,113 @@ func TestDockerResilientSingleDefault(t *testing.T) {
103103
defer dockerRun2.Close()
104104
defer removeDockerContainer(t, cID2)
105105

106+
cID3 := createDockerID("starter-test-resilientsingle-default3-")
107+
dockerRun3 := Spawn(t, strings.Join([]string{
108+
"docker run -i",
109+
"--label starter-test=true",
110+
"--name=" + cID3,
111+
"--rm",
112+
fmt.Sprintf("-p %d:%d", basePort+10, basePort),
113+
fmt.Sprintf("-v %s:/data", volID3),
114+
"-v /var/run/docker.sock:/var/run/docker.sock",
115+
"arangodb/arangodb-starter",
116+
"--docker.container=" + cID3,
117+
"--starter.address=$IP",
118+
"--starter.mode=resilientsingle",
119+
createEnvironmentStarterOptions(),
120+
fmt.Sprintf("--starter.join=$IP:%d", basePort),
121+
}, " "))
122+
defer dockerRun3.Close()
123+
defer removeDockerContainer(t, cID3)
124+
125+
if ok := WaitUntilStarterReady(t, whatResilientSingle, dockerRun1, dockerRun2, dockerRun3); ok {
126+
t.Logf("ResilientSingle start took %s", time.Since(start))
127+
testResilientSingle(t, insecureStarterEndpoint(0), false, false)
128+
testResilientSingle(t, insecureStarterEndpoint(5), false, false)
129+
testResilientSingle(t, insecureStarterEndpoint(10), false, false)
130+
}
131+
132+
if isVerbose {
133+
t.Log("Waiting for termination")
134+
}
135+
ShutdownStarter(t, insecureStarterEndpoint(0))
136+
ShutdownStarter(t, insecureStarterEndpoint(5))
137+
ShutdownStarter(t, insecureStarterEndpoint(10))
138+
}
139+
140+
// TestDockerResilientSingle2Instance runs 3 arangodb starters in docker with mode=resilientsingle
141+
// and only 2 servers should start a single server instance.
142+
func TestDockerResilientSingle2Instance(t *testing.T) {
143+
needTestMode(t, testModeDocker)
144+
needStarterMode(t, starterModeResilientSingle)
145+
if os.Getenv("IP") == "" {
146+
t.Fatal("IP envvar must be set to IP address of this machine")
147+
}
148+
/*
149+
docker volume create arangodb1
150+
docker run -i --name=adb1 --rm -p 8528:8528 \
151+
-v arangodb1:/data \
152+
-v /var/run/docker.sock:/var/run/docker.sock \
153+
arangodb/arangodb-starter \
154+
--docker.container=adb1 \
155+
--starter.address=$IP \
156+
--starter.mode=resilientsingle
157+
*/
158+
volID1 := createDockerID("vol-starter-test-resilientsingle-default1-")
159+
createDockerVolume(t, volID1)
160+
defer removeDockerVolume(t, volID1)
161+
162+
volID2 := createDockerID("vol-starter-test-resilientsingle-default2-")
163+
createDockerVolume(t, volID2)
164+
defer removeDockerVolume(t, volID2)
165+
166+
volID3 := createDockerID("vol-starter-test-resilientsingle-default3-")
167+
createDockerVolume(t, volID3)
168+
defer removeDockerVolume(t, volID3)
169+
170+
// Cleanup of left over tests
171+
removeDockerContainersByLabel(t, "starter-test=true")
172+
removeStarterCreatedDockerContainers(t)
173+
174+
start := time.Now()
175+
176+
cID1 := createDockerID("starter-test-resilientsingle-default1-")
177+
dockerRun1 := Spawn(t, strings.Join([]string{
178+
"docker run -i",
179+
"--label starter-test=true",
180+
"--name=" + cID1,
181+
"--rm",
182+
fmt.Sprintf("-p %d:%d", basePort, basePort),
183+
fmt.Sprintf("-v %s:/data", volID1),
184+
"-v /var/run/docker.sock:/var/run/docker.sock",
185+
"arangodb/arangodb-starter",
186+
"--docker.container=" + cID1,
187+
"--starter.address=$IP",
188+
"--starter.mode=resilientsingle",
189+
createEnvironmentStarterOptions(),
190+
}, " "))
191+
defer dockerRun1.Close()
192+
defer removeDockerContainer(t, cID1)
193+
194+
cID2 := createDockerID("starter-test-resilientsingle-default2-")
195+
dockerRun2 := Spawn(t, strings.Join([]string{
196+
"docker run -i",
197+
"--label starter-test=true",
198+
"--name=" + cID2,
199+
"--rm",
200+
fmt.Sprintf("-p %d:%d", basePort+5, basePort),
201+
fmt.Sprintf("-v %s:/data", volID2),
202+
"-v /var/run/docker.sock:/var/run/docker.sock",
203+
"arangodb/arangodb-starter",
204+
"--docker.container=" + cID2,
205+
"--starter.address=$IP",
206+
"--starter.mode=resilientsingle",
207+
createEnvironmentStarterOptions(),
208+
fmt.Sprintf("--starter.join=$IP:%d", basePort),
209+
}, " "))
210+
defer dockerRun2.Close()
211+
defer removeDockerContainer(t, cID2)
212+
106213
cID3 := createDockerID("starter-test-resilientsingle-default3-")
107214
dockerRun3 := Spawn(t, strings.Join([]string{
108215
"docker run -i",

test/process_resilientsingle_default_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ func TestProcessResilientSingleDefault(t *testing.T) {
4949

5050
dataDirSlave2 := SetUniqueDataDir(t)
5151
defer os.RemoveAll(dataDirSlave2)
52-
slave2 := Spawn(t, "${STARTER} --starter.port=8538 --starter.mode=resilientsingle --starter.join 127.0.0.1 "+createEnvironmentStarterOptions())
52+
slave2 := Spawn(t, "${STARTER} --starter.port=8538 --starter.mode=resilientsingle --cluster.start-single=false --starter.join 127.0.0.1 "+createEnvironmentStarterOptions())
5353
defer slave2.Close()
5454

5555
if ok := WaitUntilStarterReady(t, whatResilientSingle, master, slave1 /* not slave2 */); ok {
5656
t.Logf("ResilientSingle start took %s", time.Since(start))
5757
testResilientSingle(t, insecureStarterEndpoint(0), false, false)
5858
testResilientSingle(t, insecureStarterEndpoint(5), false, false)
59-
testResilientSingle(t, insecureStarterEndpoint(10), false, true)
59+
testResilientSingle(t, insecureStarterEndpoint(10), false, true) // due to --cluster.start-single=false
6060
}
6161

6262
if isVerbose {
@@ -86,14 +86,14 @@ func TestProcessResilientSingleDefaultShutdownViaAPI(t *testing.T) {
8686

8787
dataDirSlave2 := SetUniqueDataDir(t)
8888
defer os.RemoveAll(dataDirSlave2)
89-
slave2 := Spawn(t, "${STARTER} --starter.port=8538 --starter.mode=resilientsingle --cluster.start-single=false --starter.join 127.0.0.1 "+createEnvironmentStarterOptions())
89+
slave2 := Spawn(t, "${STARTER} --starter.port=8538 --starter.mode=resilientsingle --starter.join 127.0.0.1 "+createEnvironmentStarterOptions())
9090
defer slave2.Close()
9191

92-
if ok := WaitUntilStarterReady(t, whatResilientSingle, master, slave1 /*not slave2*/); ok {
92+
if ok := WaitUntilStarterReady(t, whatResilientSingle, master, slave1, slave2); ok {
9393
t.Logf("ResilientSingle start took %s", time.Since(start))
9494
testResilientSingle(t, insecureStarterEndpoint(0), false, false)
9595
testResilientSingle(t, insecureStarterEndpoint(5), false, false)
96-
testResilientSingle(t, insecureStarterEndpoint(10), false, true)
96+
testResilientSingle(t, insecureStarterEndpoint(10), false, false)
9797
}
9898

9999
if isVerbose {

test/server_util.go

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,26 +75,27 @@ func secureStarterEndpoint(portOffset int) string {
7575
// testCluster runs a series of tests to verify a good cluster.
7676
func testCluster(t *testing.T, starterEndpoint string, isSecure bool) client.API {
7777
c := NewStarterClient(t, starterEndpoint)
78-
testProcesses(t, c, "cluster", starterEndpoint, isSecure, false)
78+
testProcesses(t, c, "cluster", starterEndpoint, isSecure, false, 0)
7979
return c
8080
}
8181

8282
// testSingle runs a series of tests to verify a good single server.
8383
func testSingle(t *testing.T, starterEndpoint string, isSecure bool) client.API {
8484
c := NewStarterClient(t, starterEndpoint)
85-
testProcesses(t, c, "single", starterEndpoint, isSecure, false)
85+
testProcesses(t, c, "single", starterEndpoint, isSecure, false, 0)
8686
return c
8787
}
8888

8989
// testResilientSingle runs a series of tests to verify good resilientsingle servers.
9090
func testResilientSingle(t *testing.T, starterEndpoint string, isSecure bool, expectAgencyOnly bool) client.API {
9191
c := NewStarterClient(t, starterEndpoint)
92-
testProcesses(t, c, "resilientsingle", starterEndpoint, isSecure, expectAgencyOnly)
92+
testProcesses(t, c, "resilientsingle", starterEndpoint, isSecure, expectAgencyOnly, time.Second*30)
9393
return c
9494
}
9595

9696
// testProcesses runs a series of tests to verify a good series of database servers.
97-
func testProcesses(t *testing.T, c client.API, mode, starterEndpoint string, isSecure bool, expectAgencyOnly bool) {
97+
func testProcesses(t *testing.T, c client.API, mode, starterEndpoint string, isSecure bool,
98+
expectAgencyOnly bool, reachableTimeout time.Duration) {
9899
ctx := context.Background()
99100

100101
// Fetch version
@@ -123,7 +124,7 @@ func testProcesses(t *testing.T, c client.API, mode, starterEndpoint string, isS
123124
if isVerbose {
124125
t.Logf("Found agent at %s:%d", sp.IP, sp.Port)
125126
}
126-
testArangodReachable(t, sp)
127+
testArangodReachable(t, sp, reachableTimeout)
127128
}
128129
}
129130

@@ -138,7 +139,7 @@ func testProcesses(t *testing.T, c client.API, mode, starterEndpoint string, isS
138139
if isVerbose {
139140
t.Logf("Found coordinator at %s:%d", sp.IP, sp.Port)
140141
}
141-
testArangodReachable(t, sp)
142+
testArangodReachable(t, sp, reachableTimeout)
142143
}
143144
} else if mode == "cluster" {
144145
t.Errorf("No coordinator found in %s", starterEndpoint)
@@ -155,7 +156,7 @@ func testProcesses(t *testing.T, c client.API, mode, starterEndpoint string, isS
155156
if isVerbose {
156157
t.Logf("Found dbserver at %s:%d", sp.IP, sp.Port)
157158
}
158-
testArangodReachable(t, sp)
159+
testArangodReachable(t, sp, reachableTimeout)
159160
}
160161
} else if mode == "cluster" {
161162
t.Errorf("No dbserver found in %s", starterEndpoint)
@@ -172,7 +173,7 @@ func testProcesses(t *testing.T, c client.API, mode, starterEndpoint string, isS
172173
if isVerbose {
173174
t.Logf("Found single at %s:%d", sp.IP, sp.Port)
174175
}
175-
testArangodReachable(t, sp)
176+
testArangodReachable(t, sp, reachableTimeout)
176177
}
177178
} else if (mode == "single" || mode == "resilientsingle") && !expectAgencyOnly {
178179
t.Errorf("No single found in %s", starterEndpoint)
@@ -181,14 +182,22 @@ func testProcesses(t *testing.T, c client.API, mode, starterEndpoint string, isS
181182

182183
// testArangodReachable tries to call some HTTP API methods of the given server process to make sure
183184
// it is reachable.
184-
func testArangodReachable(t *testing.T, sp client.ServerProcess) {
185+
func testArangodReachable(t *testing.T, sp client.ServerProcess, timeout time.Duration) {
185186
scheme := "http"
186187
if sp.IsSecure {
187188
scheme = "https"
188189
}
189-
url := fmt.Sprintf("%s://%s:%d/_api/version", scheme, sp.IP, sp.Port)
190-
_, err := httpClient.Get(url)
191-
if err != nil {
192-
t.Errorf("Failed to reach arangod at %s:%d", sp.IP, sp.Port)
190+
start := time.Now()
191+
for {
192+
url := fmt.Sprintf("%s://%s:%d/_api/version", scheme, sp.IP, sp.Port)
193+
_, err := httpClient.Get(url)
194+
if err == nil {
195+
return
196+
}
197+
if timeout == 0 || time.Since(start) > timeout {
198+
t.Errorf("Failed to reach arangod at %s:%d (%#v)", sp.IP, sp.Port, err)
199+
return
200+
}
201+
time.Sleep(time.Second)
193202
}
194203
}

0 commit comments

Comments
 (0)