Skip to content

Commit bd1e41a

Browse files
authored
Merge pull request #171 from arangodb/bugfix/abort-on-cleanout-failure
Abort reconcilientation plan on failed cleanout server
2 parents dbf8686 + b462816 commit bd1e41a

27 files changed

+642
-262
lines changed

deps/github.com/arangodb/go-driver/Makefile

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,9 @@ else ifeq ("$(TEST_AUTH)", "jwt")
5858
ARANGOARGS := --server.jwt-secret=/jwtsecret
5959
endif
6060

61-
ifeq ("$(TEST_MODE)", "single")
62-
TEST_NET := container:$(DBCONTAINER)
63-
TEST_ENDPOINTS := http://localhost:8529
64-
else
65-
TEST_NET := container:$(TESTCONTAINER)-ns
66-
TEST_ENDPOINTS := http://localhost:7001
67-
TESTS := $(REPOPATH)/test
61+
TEST_NET := container:$(TESTCONTAINER)-ns
62+
TEST_ENDPOINTS := http://localhost:7001
63+
TESTS := $(REPOPATH)/test
6864
ifeq ("$(TEST_AUTH)", "rootpw")
6965
CLUSTERENV := JWTSECRET=testing
7066
TEST_AUTHENTICATION := basic:root:
@@ -77,7 +73,6 @@ ifeq ("$(TEST_SSL)", "auto")
7773
CLUSTERENV := SSL=auto $(CLUSTERENV)
7874
TEST_ENDPOINTS = https://localhost:7001
7975
endif
80-
endif
8176

8277
ifeq ("$(TEST_CONNECTION)", "vst")
8378
TESTS := $(REPOPATH)/test
@@ -133,13 +128,13 @@ run-tests-http: $(GOBUILDDIR)
133128
# Single server tests
134129
run-tests-single: run-tests-single-json run-tests-single-vpack run-tests-single-vst-1.0 $(VST11_SINGLE_TESTS)
135130

136-
run-tests-single-json: run-tests-single-json-with-auth run-tests-single-json-no-auth
131+
run-tests-single-json: run-tests-single-json-with-auth run-tests-single-json-no-auth run-tests-single-json-ssl
137132

138-
run-tests-single-vpack: run-tests-single-vpack-with-auth run-tests-single-vpack-no-auth
133+
run-tests-single-vpack: run-tests-single-vpack-with-auth run-tests-single-vpack-no-auth run-tests-single-vpack-ssl
139134

140-
run-tests-single-vst-1.0: run-tests-single-vst-1.0-with-auth run-tests-single-vst-1.0-no-auth
135+
run-tests-single-vst-1.0: run-tests-single-vst-1.0-with-auth run-tests-single-vst-1.0-no-auth run-tests-single-vst-1.0-ssl
141136

142-
run-tests-single-vst-1.1: run-tests-single-vst-1.1-with-auth run-tests-single-vst-1.1-jwt-auth run-tests-single-vst-1.1-no-auth
137+
run-tests-single-vst-1.1: run-tests-single-vst-1.1-with-auth run-tests-single-vst-1.1-jwt-auth run-tests-single-vst-1.1-no-auth run-tests-single-vst-1.1-ssl run-tests-single-vst-1.1-jwt-ssl
143138

144139
run-tests-single-json-no-auth:
145140
@echo "Single server, HTTP+JSON, no authentication"
@@ -177,6 +172,26 @@ run-tests-single-vst-1.1-jwt-auth:
177172
@echo "Single server, Velocystream 1.1, JWT authentication"
178173
@${MAKE} TEST_MODE="single" TEST_AUTH="jwt" TEST_CONNECTION="vst" TEST_CVERSION="1.1" __run_tests
179174

175+
run-tests-single-json-ssl:
176+
@echo "Single server, HTTP+JSON, with authentication, SSL"
177+
@${MAKE} TEST_MODE="single" TEST_AUTH="rootpw" TEST_SSL="auto" TEST_CONTENT_TYPE="json" __run_tests
178+
179+
run-tests-single-vpack-ssl:
180+
@echo "Single server, HTTP+Velocypack, with authentication, SSL"
181+
@${MAKE} TEST_MODE="single" TEST_AUTH="rootpw" TEST_SSL="auto" TEST_CONTENT_TYPE="vpack" __run_tests
182+
183+
run-tests-single-vst-1.0-ssl:
184+
@echo "Single server, Velocystream 1.0, with authentication, SSL"
185+
@${MAKE} TEST_MODE="single" TEST_AUTH="rootpw" TEST_SSL="auto" TEST_CONNECTION="vst" TEST_CVERSION="1.0" __run_tests
186+
187+
run-tests-single-vst-1.1-ssl:
188+
@echo "Single server, Velocystream 1.1, with authentication, SSL"
189+
@${MAKE} TEST_MODE="single" TEST_AUTH="rootpw" TEST_SSL="auto" TEST_CONNECTION="vst" TEST_CVERSION="1.1" __run_tests
190+
191+
run-tests-single-vst-1.1-jwt-ssl:
192+
@echo "Single server, Velocystream 1.1, JWT authentication, SSL"
193+
@${MAKE} TEST_MODE="single" TEST_AUTH="jwt" TEST_SSL="auto" TEST_CONNECTION="vst" TEST_CVERSION="1.1" __run_tests
194+
180195
# ResilientSingle server tests
181196
run-tests-resilientsingle: run-tests-resilientsingle-json run-tests-resilientsingle-vpack run-tests-resilientsingle-vst-1.0 $(VST11_RESILIENTSINGLE_TESTS)
182197

@@ -310,25 +325,14 @@ else
310325
ifdef JWTSECRET
311326
echo "$JWTSECRET" > "${JWTSECRETFILE}"
312327
endif
313-
ifeq ("$(TEST_MODE)", "single")
314-
@-docker rm -f -v $(DBCONTAINER) $(TESTCONTAINER) &> /dev/null
315-
docker run -d --name $(DBCONTAINER) \
316-
$(ARANGOENV) $(ARANGOVOL) \
317-
$(ARANGODB) --log.level requests=debug --log.use-microtime true $(ARANGOARGS)
318-
else
319328
@-docker rm -f -v $(TESTCONTAINER) &> /dev/null
320329
@TESTCONTAINER=$(TESTCONTAINER) ARANGODB=$(ARANGODB) STARTER=$(STARTER) STARTERMODE=$(TEST_MODE) TMPDIR=${GOBUILDDIR} $(CLUSTERENV) $(ROOTDIR)/test/cluster.sh start
321330
endif
322-
endif
323331

324332
__test_cleanup:
325333
@docker rm -f -v $(TESTCONTAINER) &> /dev/null
326334
ifndef TEST_ENDPOINTS_OVERRIDE
327-
ifeq ("$(TEST_MODE)", "single")
328-
@docker rm -f -v $(DBCONTAINER) &> /dev/null
329-
else
330335
@TESTCONTAINER=$(TESTCONTAINER) ARANGODB=$(ARANGODB) STARTER=$(STARTER) STARTERMODE=$(TEST_MODE) $(ROOTDIR)/test/cluster.sh cleanup
331-
endif
332336
endif
333337
@sleep 3
334338

deps/github.com/arangodb/go-driver/cluster_impl.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ type cleanOutServerRequest struct {
123123
Server string `json:"server"`
124124
}
125125

126+
type cleanOutServerResponse struct {
127+
JobID string `json:"id"`
128+
}
129+
126130
// CleanOutServer triggers activities to clean out a DBServers.
127131
func (c *cluster) CleanOutServer(ctx context.Context, serverID string) error {
128132
req, err := c.conn.NewRequest("POST", "_admin/cluster/cleanOutServer")
@@ -135,14 +139,21 @@ func (c *cluster) CleanOutServer(ctx context.Context, serverID string) error {
135139
if _, err := req.SetBody(input); err != nil {
136140
return WithStack(err)
137141
}
138-
applyContextSettings(ctx, req)
142+
cs := applyContextSettings(ctx, req)
139143
resp, err := c.conn.Do(ctx, req)
140144
if err != nil {
141145
return WithStack(err)
142146
}
143147
if err := resp.CheckStatus(200, 202); err != nil {
144148
return WithStack(err)
145149
}
150+
var result cleanOutServerResponse
151+
if err := resp.ParseBody("", &result); err != nil {
152+
return WithStack(err)
153+
}
154+
if cs.JobIDResponse != nil {
155+
*cs.JobIDResponse = result.JobID
156+
}
146157
return nil
147158
}
148159

deps/github.com/arangodb/go-driver/context.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ const (
5656
keyFollowLeaderRedirect ContextKey = "arangodb-followLeaderRedirect"
5757
keyDBServerID ContextKey = "arangodb-dbserverID"
5858
keyBatchID ContextKey = "arangodb-batchID"
59+
keyJobIDResponse ContextKey = "arangodb-jobIDResponse"
5960
)
6061

6162
// WithRevision is used to configure a context to make document
@@ -213,6 +214,13 @@ func WithBatchID(parent context.Context, id string) context.Context {
213214
return context.WithValue(contextOrBackground(parent), keyBatchID, id)
214215
}
215216

217+
// WithJobIDResponse is used to configure a context that includes a reference to a JobID
218+
// that is filled on a error-free response.
219+
// This is used in cluster functions.
220+
func WithJobIDResponse(parent context.Context, jobID *string) context.Context {
221+
return context.WithValue(contextOrBackground(parent), keyJobIDResponse, jobID)
222+
}
223+
216224
type contextSettings struct {
217225
Silent bool
218226
WaitForSync bool
@@ -229,6 +237,7 @@ type contextSettings struct {
229237
FollowLeaderRedirect *bool
230238
DBServerID string
231239
BatchID string
240+
JobIDResponse *string
232241
}
233242

234243
// applyContextSettings returns the settings configured in the context in the given request.
@@ -356,6 +365,12 @@ func applyContextSettings(ctx context.Context, req Request) contextSettings {
356365
result.BatchID = id
357366
}
358367
}
368+
// JobIDResponse
369+
if v := ctx.Value(keyJobIDResponse); v != nil {
370+
if idRef, ok := v.(*string); ok {
371+
result.JobIDResponse = idRef
372+
}
373+
}
359374
return result
360375
}
361376

deps/github.com/arangodb/go-driver/cursor_impl.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ package driver
2424

2525
import (
2626
"context"
27+
"encoding/json"
2728
"path"
29+
"reflect"
2830
"sync"
2931
"sync/atomic"
3032
"time"
@@ -165,12 +167,23 @@ func (c *cursor) ReadDocument(ctx context.Context, result interface{}) (Document
165167
}
166168
c.resultIndex++
167169
var meta DocumentMeta
168-
if err := c.conn.Unmarshal(*c.Result[index], &meta); err != nil {
169-
// If a cursor returns something other than a document, this will fail.
170-
// Just ignore it.
171-
}
172-
if err := c.conn.Unmarshal(*c.Result[index], result); err != nil {
173-
return DocumentMeta{}, WithStack(err)
170+
resultPtr := c.Result[index]
171+
if resultPtr == nil {
172+
// Got NULL result
173+
rv := reflect.ValueOf(result)
174+
if rv.Kind() != reflect.Ptr || rv.IsNil() {
175+
return DocumentMeta{}, WithStack(&json.InvalidUnmarshalError{Type: reflect.TypeOf(result)})
176+
}
177+
e := rv.Elem()
178+
e.Set(reflect.Zero(e.Type()))
179+
} else {
180+
if err := c.conn.Unmarshal(*resultPtr, &meta); err != nil {
181+
// If a cursor returns something other than a document, this will fail.
182+
// Just ignore it.
183+
}
184+
if err := c.conn.Unmarshal(*resultPtr, result); err != nil {
185+
return DocumentMeta{}, WithStack(err)
186+
}
174187
}
175188
return meta, nil
176189
}

0 commit comments

Comments
 (0)