@@ -29,6 +29,8 @@ type Poller struct {
29
29
pollUntilBlock * big.Int
30
30
parallelPollers int
31
31
workModeChan chan WorkMode
32
+ currentWorkMode WorkMode
33
+ workModeMutex sync.RWMutex
32
34
}
33
35
34
36
type BlockNumberWithError struct {
@@ -117,6 +119,15 @@ func (p *Poller) Start(ctx context.Context) {
117
119
if ! ok {
118
120
return
119
121
}
122
+
123
+ // Do not poll if not in backfill mode
124
+ p .workModeMutex .RLock ()
125
+ if p .currentWorkMode != WorkModeBackfill {
126
+ p .workModeMutex .RUnlock ()
127
+ continue
128
+ }
129
+ p .workModeMutex .RUnlock ()
130
+
120
131
blockRangeMutex .Lock ()
121
132
blockNumbers , err := p .getNextBlockRange (pollCtx )
122
133
blockRangeMutex .Unlock ()
@@ -149,10 +160,24 @@ func (p *Poller) Start(ctx context.Context) {
149
160
p .shutdown (cancel , tasks , & wg )
150
161
return
151
162
case workMode := <- p .workModeChan :
152
- if workMode == WorkModeLive {
153
- log .Info ().Msg ("Switching to live mode, stopping poller" )
154
- p .shutdown (cancel , tasks , & wg )
155
- return
163
+ p .workModeMutex .RLock ()
164
+ currentWorkMode := p .currentWorkMode
165
+ p .workModeMutex .RUnlock ()
166
+ if workMode != currentWorkMode && workMode != "" {
167
+ log .Info ().Msgf ("Poller work mode changing from %s to %s" , currentWorkMode , workMode )
168
+ p .workModeMutex .Lock ()
169
+ changedToBackfillFromLive := currentWorkMode == WorkModeLive && workMode == WorkModeBackfill
170
+ p .currentWorkMode = workMode
171
+ p .workModeMutex .Unlock ()
172
+ if changedToBackfillFromLive {
173
+ lastBlockInMainStorage , err := p .storage .MainStorage .GetMaxBlockNumber (p .rpc .GetChainID ())
174
+ if err != nil {
175
+ log .Error ().Err (err ).Msg ("Error getting last block in main storage" )
176
+ } else {
177
+ p .lastPolledBlock = lastBlockInMainStorage
178
+ log .Debug ().Msgf ("Switching to backfill mode, updating last polled block to %s" , p .lastPolledBlock .String ())
179
+ }
180
+ }
156
181
}
157
182
case <- ticker .C :
158
183
select {
0 commit comments