@@ -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,21 @@ 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+ if workMode != p .currentWorkMode && workMode != "" {
164+ log .Info ().Msgf ("Poller work mode changing from %s to %s" , p .currentWorkMode , workMode )
165+ p .workModeMutex .Lock ()
166+ changedToBackfillFromLive := p .currentWorkMode == WorkModeLive && workMode == WorkModeBackfill
167+ p .currentWorkMode = workMode
168+ p .workModeMutex .Unlock ()
169+ if changedToBackfillFromLive {
170+ lastBlockInMainStorage , err := p .storage .MainStorage .GetMaxBlockNumber (p .rpc .GetChainID ())
171+ if err != nil {
172+ log .Error ().Err (err ).Msg ("Error getting last block in main storage" )
173+ } else {
174+ p .lastPolledBlock = lastBlockInMainStorage
175+ log .Debug ().Msgf ("Switching to backfill mode, updating last polled block to %s" , p .lastPolledBlock .String ())
176+ }
177+ }
156178 }
157179 case <- ticker .C :
158180 select {
0 commit comments