@@ -25,7 +25,6 @@ package test
2525import (
2626 "context"
2727 "crypto/tls"
28- "fmt"
2928 "log"
3029 httplib "net/http"
3130 "os"
@@ -196,7 +195,7 @@ func createConnectionFromEnv(t testEnv) driver.Connection {
196195}
197196
198197// createClientFromEnv initializes a Client from information specified in environment variables.
199- func createClientFromEnv (t testEnv , waitUntilReady bool , connection ... * driver. Connection ) driver.Client {
198+ func createClientFromEnv (t testEnv , waitUntilReady bool ) driver.Client {
200199 runPProfServerOnce .Do (func () {
201200 if os .Getenv ("TEST_PPROF" ) != "" {
202201 go func () {
@@ -216,16 +215,14 @@ func createClientFromEnv(t testEnv, waitUntilReady bool, connection ...*driver.C
216215 conn = wrappers .NewLoggerConnection (conn , wrappers .NewZeroLogLogger (l ), true )
217216 }
218217
219- if len (connection ) == 1 {
220- * connection [0 ] = conn
221- }
222218 c , err := driver .NewClient (driver.ClientConfig {
223219 Connection : conn ,
224220 Authentication : createAuthenticationFromEnv (t ),
225221 })
226222 if err != nil {
227223 t .Fatalf ("Failed to create new client: %s" , describe (err ))
228224 }
225+
229226 if waitUntilReady {
230227 timeout := time .Minute
231228 ctx , cancel := context .WithTimeout (context .Background (), timeout )
@@ -250,39 +247,42 @@ func createClientFromEnv(t testEnv, waitUntilReady bool, connection ...*driver.C
250247
251248// waitUntilServerAvailable keeps waiting until the server/cluster that the client is addressing is available.
252249func waitUntilServerAvailable (ctx context.Context , c driver.Client , t testEnv ) error {
253- instanceUp := make (chan error )
254- go func () {
255- for {
256- verCtx , cancel := context .WithTimeout (ctx , time .Second * 5 )
257- if _ , err := c .Version (verCtx ); err == nil {
258-
259- // check if leader challenge is ongoing
260- if _ , err := c .ServerRole (verCtx ); err != nil {
261- if ! driver .IsNoLeaderOrOngoing (err ) {
262- cancel ()
263- instanceUp <- err
264- return
265- }
266- //t.Logf("Retry. Waiting for leader: %s", describe(err))
267- continue
268- }
269-
270- //t.Logf("Found version %s", v.Version)
271- cancel ()
272- instanceUp <- nil
273- return
250+ return driverErrorCheck (ctx , c , func (ctx context.Context , client driver.Client ) error {
251+ if getTestMode () != testModeSingle {
252+ // Refresh endpoints
253+ if err := client .SynchronizeEndpoints2 (ctx , "_system" ); err != nil {
254+ return err
274255 }
275- cancel ()
276- //t.Logf("Version failed: %s %#v", describe(err), err)
277- time .Sleep (time .Second * 2 )
278256 }
279- }()
280- select {
281- case up := <- instanceUp :
282- return up
283- case <- ctx .Done ():
257+
258+ if _ , err := client .Version (ctx ); err != nil {
259+ return err
260+ }
261+
262+ if _ , err := client .Databases (ctx ); err != nil {
263+ return err
264+ }
265+
284266 return nil
285- }
267+ }, func (err error ) (bool , error ) {
268+ if err == nil {
269+ return true , nil
270+ }
271+
272+ if driver .IsNoLeaderOrOngoing (err ) {
273+ t .Logf ("Retry. Waiting for leader: %s" , describe (err ))
274+ return false , nil
275+ }
276+
277+ if driver .IsArangoErrorWithCode (err , 503 ) {
278+ t .Logf ("Retry. Service not ready: %s" , describe (err ))
279+ return false , nil
280+ }
281+
282+ t .Logf ("Retry. Unknown error: %s" , describe (err ))
283+
284+ return false , nil
285+ }).Retry (3 * time .Second , time .Minute )
286286}
287287
288288// waitUntilClusterHealthy keeps waiting until the servers are healthy
@@ -325,31 +325,21 @@ func waitUntilClusterHealthy(c driver.Client) error {
325325
326326// waitUntilEndpointSynchronized keeps waiting until the endpoints are synchronized. leadership might be ongoing.
327327func waitUntilEndpointSynchronized (ctx context.Context , c driver.Client , dbname string , t testEnv ) error {
328- endpointsSynced := make (chan error )
329- go func () {
330- for {
331- callCtx , cancel := context .WithTimeout (ctx , time .Second * 5 )
332- if err := c .SynchronizeEndpoints2 (callCtx , dbname ); err != nil {
333- t .Logf ("SynchonizedEnpoints failed: %s" , describe (err ))
334- } else {
335- cancel ()
336- endpointsSynced <- nil
337- return
338- }
339- cancel ()
340- select {
341- case <- ctx .Done ():
342- return
343- case <- time .After (time .Second ):
344- }
328+ return driverErrorCheck (ctx , c , func (ctx context.Context , client driver.Client ) error {
329+ callCtx , cancel := context .WithTimeout (ctx , time .Second * 5 )
330+ defer cancel ()
331+ if err := c .SynchronizeEndpoints2 (callCtx , dbname ); err != nil {
332+ return err
345333 }
346- }()
347- select {
348- case up := <- endpointsSynced :
349- return up
350- case <- ctx .Done ():
351- return fmt .Errorf ("Timeout while synchronizing endpoints" )
352- }
334+
335+ return nil
336+ }, func (err error ) (bool , error ) {
337+ if err == nil {
338+ return true , nil
339+ } else {
340+ return false , nil
341+ }
342+ }).Retry (3 * time .Second , time .Minute )
353343}
354344
355345// TestCreateClientHttpConnection creates an HTTP connection to the environment specified
0 commit comments