-
Notifications
You must be signed in to change notification settings - Fork 0
/
retryer.go
87 lines (76 loc) · 1.94 KB
/
retryer.go
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
package scanner
import (
"strings"
"sync"
"time"
"github.com/nightowlcasino/nightowl/erg"
"go.uber.org/zap"
)
type Retryer struct {
mu sync.Mutex
ergNode *erg.ErgNode
retryInterval time.Duration
UnsignedTxs map[string]UnsignedTx
}
type UnsignedTx struct {
Payload []byte `json:"payload"`
RetryCount int `json:"retryCount"`
LastAttempt string `json:"lastAttempt"`
}
func (r *Retryer) Add(uuid string, payload []byte) {
r.mu.Lock()
defer r.mu.Unlock()
unsTx := UnsignedTx{
Payload: payload,
LastAttempt: time.Now().Format(time.RFC3339),
}
r.UnsignedTxs[uuid] = unsTx
}
func (r *Retryer) Delete(uuid string) {
r.mu.Lock()
defer r.mu.Unlock()
delete(r.UnsignedTxs, uuid)
}
func (r *Retryer) RetryLoop() {
retry := make(chan bool, 1)
retry <- true
for {
<-retry
// loop through map[string]UnsignedTx and retry each unsigned tx
for uuid, unsignedTx := range r.UnsignedTxs {
err := r.RetrySend(uuid)
if err != nil {
// update retry count and last attempt time
r.mu.Lock()
unsignedTx.RetryCount += 1
unsignedTx.LastAttempt = time.Now().Format(time.RFC3339)
r.UnsignedTxs[uuid] = unsignedTx
r.mu.Unlock()
}
}
go wait(r.retryInterval, retry)
}
}
func (r *Retryer) RetrySend(uuid string) error {
start := time.Now()
ergTxId, err := r.ergNode.PostErgOracleTx(r.UnsignedTxs[uuid].Payload)
if err != nil {
log.Error("failed to create erg tx",
zap.Error(err),
zap.String("context", "retryer loop"),
zap.Int("retry_count", r.UnsignedTxs[uuid].RetryCount+1),
zap.Int64("durationMs", time.Since(start).Milliseconds()),
)
return err
} else {
log.Info("successfully created erg tx",
zap.String("erg_tx_id", strings.Trim(string(ergTxId),"\"")),
zap.String("context", "retryer loop"),
zap.Int("retry_count", r.UnsignedTxs[uuid].RetryCount),
zap.Int64("durationMs", time.Since(start).Milliseconds()),
)
// remove tx from retry list
r.Delete(uuid)
}
return nil
}