Ubuntu Pastebin

Paste from rog at Thu, 6 Oct 2016 16:23:02 +0000

Download as text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
diff --git a/resource/resourceadapters/charmstore.go b/resource/resourceadapters/charmstore.go
index a497eb3..e7e2525 100644
--- a/resource/resourceadapters/charmstore.go
+++ b/resource/resourceadapters/charmstore.go
@@ -8,8 +8,7 @@ import (
 	"time"
 
 	"github.com/juju/errors"
-	"github.com/juju/retry"
-	"github.com/juju/utils/clock"
+	"github.com/juju/utils/retry"
 	charmresource "gopkg.in/juju/charm.v6-unstable/resource"
 	"gopkg.in/juju/names.v2"
 
@@ -71,57 +70,32 @@ func (cs *charmstoreOpener) NewClient() (*CSRetryClient, error) {
 // retries GetResource() calls.
 type CSRetryClient struct {
 	charmstore.Client
-	retryArgs retry.CallArgs
 }
 
 func newCSRetryClient(client charmstore.Client) *CSRetryClient {
-	retryArgs := retry.CallArgs{
-		// The only error that stops the retry loop should be "not found".
-		IsFatalError: errors.IsNotFound,
-		// We want to retry until the charm store either gives us the
-		// resource (and we cache it) or the resource isn't found in the
-		// charm store.
-		Attempts: -1, // retry forever...
-		// A one minute gives enough time for potential connection
-		// issues to sort themselves out without making the caller wait
-		// for an exceptional amount of time.
-		Delay: 1 * time.Minute,
-		Clock: clock.WallClock,
-	}
 	return &CSRetryClient{
-		Client:    client,
-		retryArgs: retryArgs,
+		Client: client,
 	}
 }
 
+var retryStrategy = retry.Regular{
+	Delay: 1 * time.Minute,
+	Total: 5 * time.Hour,
+}
+
 // GetResource returns a reader for the resource's data.
 func (client CSRetryClient) GetResource(req charmstore.ResourceRequest) (charmstore.ResourceData, error) {
-	args := client.retryArgs // a copy
-
-	var data charmstore.ResourceData
-	args.Func = func() error {
-		var err error
-		data, err = client.Client.GetResource(req)
-		if err != nil {
-			return errors.Trace(err)
+	i := 0
+	for a := retryStrategy.Start(nil, nil); a.Next(); {
+		data, err := client.Client.GetResource(req)
+		if err == nil || errors.IsNotFound(err) {
+			return data, errors.Trace(err)
 		}
-		return nil
-	}
-
-	var lastErr error
-	args.NotifyFunc = func(err error, i int) {
-		// Remember the error we're hiding and then retry!
+		if !a.HasNext() {
+			return charmstore.ResourceData{}, errors.Annotatef(err, "failed after retrying")
+		}
+		i++
 		logger.Debugf("(attempt %d) retrying resource download from charm store due to error: %v", i, err)
-		lastErr = err
 	}
-
-	err := retry.Call(args)
-	if retry.IsAttemptsExceeded(err) {
-		return data, errors.Annotate(lastErr, "failed after retrying")
-	}
-	if err != nil {
-		return data, errors.Trace(err)
-	}
-
-	return data, nil
+	panic("unreachable")
 }
Download as text