@@ -29,6 +29,8 @@ type Poller struct {
2929 pollUntilBlock * big.Int
3030 parallelPollers int
3131 workModeChan chan WorkMode
32+ currentWorkMode WorkMode
33+ workModeMutex sync.RWMutex
3234}
3335
3436type BlockNumberWithError struct {
@@ -117,6 +119,15 @@ func (p *Poller) Start(ctx context.Context) {
117119 if ! ok {
118120 return
119121 }
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+
120131 blockRangeMutex .Lock ()
121132 blockNumbers , err := p .getNextBlockRange (pollCtx )
122133 blockRangeMutex .Unlock ()
@@ -149,10 +160,24 @@ func (p *Poller) Start(ctx context.Context) {
149160 p .shutdown (cancel , tasks , & wg )
150161 return
151162 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+ }
156181 }
157182 case <- ticker .C :
158183 select {
0 commit comments