@@ -7,53 +7,81 @@ import (
77 "net/http"
88 "time"
99
10+ "github.com/Layr-Labs/eigensdk-go/logging"
1011 "github.com/ugorji/go/codec"
12+ retry "github.com/yetanotherco/aligned_layer/core"
1113 "github.com/yetanotherco/aligned_layer/operator/merkle_tree"
1214)
1315
14- func (o * Operator ) getBatchFromDataService (ctx context.Context , batchURL string , expectedMerkleRoot [32 ]byte , maxRetries int , retryDelay time.Duration ) ([]VerificationData , error ) {
15- o .Logger .Infof ("Getting batch from data service, batchURL: %s" , batchURL )
16-
17- var resp * http.Response
18- var err error
19- var req * http.Request
20-
21- for attempt := 0 ; attempt < maxRetries ; attempt ++ {
22- if attempt > 0 {
23- o .Logger .Infof ("Waiting for %s before retrying data fetch (attempt %d of %d)" , retryDelay , attempt + 1 , maxRetries )
24- select {
25- case <- time .After (retryDelay ):
26- // Wait before retrying
27- case <- ctx .Done ():
28- return nil , ctx .Err ()
29- }
30- retryDelay *= 2 // Exponential backoff. Ex: 5s, 10s, 20s
31- }
32-
33- req , err = http .NewRequestWithContext (ctx , "GET" , batchURL , nil )
34- if err != nil {
35- return nil , err
36- }
16+ func RequestBatch (req * http.Request , ctx context.Context ) func () (* http.Response , error ) {
3717
38- resp , err = http .DefaultClient .Do (req )
39- if err == nil && resp .StatusCode == http .StatusOK {
40- break // Successful request, exit retry loop
41- }
18+ req_func := func () (* http.Response , error ) {
19+ resp , err := http .DefaultClient .Do (req )
4220
4321 if resp != nil {
4422 err := resp .Body .Close ()
4523 if err != nil {
4624 return nil , err
4725 }
4826 }
27+ return resp , err
28+ }
29+ return req_func
30+ }
31+
32+ // TODO: How to log retries?
33+ func RequestBatchRetryable (ctx context.Context , logger logging.Logger , req * http.Request ) (* http.Response , error ) {
34+
35+ return retry .RetryWithData (RequestBatch (req , ctx ), retry .DefaultRetryConfig ())
36+ }
37+
38+ func (o * Operator ) getBatchFromDataService (ctx context.Context , batchURL string , expectedMerkleRoot [32 ]byte , maxRetries int , retryDelay time.Duration ) ([]VerificationData , error ) {
39+ o .Logger .Infof ("Getting batch from data service, batchURL: %s" , batchURL )
4940
50- o .Logger .Warnf ("Error fetching batch from data service - (attempt %d): %v" , attempt + 1 , err )
41+ req , err := http .NewRequestWithContext (ctx , "GET" , batchURL , nil )
42+ if err != nil {
43+ return nil , err
5144 }
5245
46+ resp , err := RequestBatchRetryable (ctx , o .Logger , req )
5347 if err != nil {
5448 return nil , err
5549 }
5650
51+ /*
52+ for attempt := 0; attempt < maxRetries; attempt++ {
53+ if attempt > 0 {
54+ o.Logger.Infof("Waiting for %s before retrying data fetch (attempt %d of %d)", retryDelay, attempt+1, maxRetries)
55+ select {
56+ case <-time.After(retryDelay):
57+ // Wait before retrying
58+ case <-ctx.Done():
59+ return nil, ctx.Err()
60+ }
61+ retryDelay *= 2 // Exponential backoff. Ex: 5s, 10s, 20s
62+ }
63+
64+ req, err = http.NewRequestWithContext(ctx, "GET", batchURL, nil)
65+ if err != nil {
66+ return nil, err
67+ }
68+
69+ resp, err = http.DefaultClient.Do(req)
70+ if err == nil && resp.StatusCode == http.StatusOK {
71+ break // Successful request, exit retry loop
72+ }
73+
74+ if resp != nil {
75+ err := resp.Body.Close()
76+ if err != nil {
77+ return nil, err
78+ }
79+ }
80+
81+ o.Logger.Warnf("Error fetching batch from data service - (attempt %d): %v", attempt+1, err)
82+ }
83+ */
84+
5785 // At this point, the HTTP request was successfull.
5886
5987 defer func (Body io.ReadCloser ) {
0 commit comments