@@ -45,10 +45,11 @@ type ListenerManager[T TxInfo] interface {
45
45
type TxInfoCallback [T TxInfo ] func (T ) error
46
46
47
47
type DeliveryListenerManagerConfig struct {
48
- MapperParallelism int
49
- ListenerTimeout time.Duration
50
- LRUSize int
51
- LRUBuffer int
48
+ MapperParallelism int
49
+ BlockProcessParallelism int
50
+ ListenerTimeout time.Duration
51
+ LRUSize int
52
+ LRUBuffer int
52
53
}
53
54
54
55
func NewListenerManager [T TxInfo ](config DeliveryListenerManagerConfig , delivery * fabric.Delivery , tracer trace.Tracer , mapper TxInfoMapper [T ]) (* listenerManager [T ], error ) {
@@ -71,12 +72,13 @@ func NewListenerManager[T TxInfo](config DeliveryListenerManagerConfig, delivery
71
72
txInfos = cache .NewMapCache [driver2.TxID , T ]()
72
73
}
73
74
flm := & listenerManager [T ]{
74
- mapper : & parallelBlockMapper [T ]{cap : max (config .MapperParallelism , 1 ), mapper : mapper },
75
- tracer : tracer ,
76
- listeners : listeners ,
77
- txInfos : txInfos ,
78
- ignoreBlockErrors : true ,
79
- delivery : delivery ,
75
+ mapper : & parallelBlockMapper [T ]{cap : max (config .MapperParallelism , 1 ), mapper : mapper },
76
+ tracer : tracer ,
77
+ listeners : listeners ,
78
+ txInfos : txInfos ,
79
+ ignoreBlockErrors : true ,
80
+ blockProcessingParallelism : config .BlockProcessParallelism ,
81
+ delivery : delivery ,
80
82
}
81
83
logger .Infof ("Starting delivery service..." )
82
84
go flm .start ()
@@ -110,22 +112,40 @@ func fetchTxs[T TxInfo](evicted map[driver2.TxID][]ListenerEntry[T], mapper TxIn
110
112
111
113
func (m * listenerManager [T ]) start () {
112
114
// In case the delivery service fails, it will try to reconnect automatically.
113
- err := m .delivery .ScanBlock (context .Background (), func (ctx context.Context , block * common.Block ) (bool , error ) {
114
- err := m .onBlock (ctx , block )
115
- return ! m .ignoreBlockErrors && err != nil , err
116
- })
115
+ err := m .delivery .ScanBlock (context .Background (), m .newBlockCallback ())
117
116
logger .Errorf ("failed running delivery: %v" , err )
118
117
}
119
118
119
+ func (m * listenerManager [T ]) newBlockCallback () fabric.BlockCallback {
120
+ if m .blockProcessingParallelism <= 1 {
121
+ return func (ctx context.Context , block * common.Block ) (bool , error ) {
122
+ err := m .onBlock (ctx , block )
123
+ return ! m .ignoreBlockErrors && err != nil , err
124
+ }
125
+ }
126
+ eg := errgroup.Group {}
127
+ eg .SetLimit (m .blockProcessingParallelism )
128
+ return func (ctx context.Context , block * common.Block ) (bool , error ) {
129
+ eg .Go (func () error {
130
+ if err := m .onBlock (ctx , block ); err != nil {
131
+ logger .Warnf ("Mapping block [%d] errored: %v" , block .Header .Number , err )
132
+ }
133
+ return nil
134
+ })
135
+ return false , nil
136
+ }
137
+ }
138
+
120
139
type listenerManager [T TxInfo ] struct {
121
140
tracer trace.Tracer
122
141
mapper * parallelBlockMapper [T ]
123
142
124
- mu sync.RWMutex
125
- listeners cache.Map [driver2.TxID , []ListenerEntry [T ]]
126
- txInfos cache.Map [driver2.TxID , T ]
127
- delivery * fabric.Delivery
128
- ignoreBlockErrors bool
143
+ mu sync.RWMutex
144
+ listeners cache.Map [driver2.TxID , []ListenerEntry [T ]]
145
+ txInfos cache.Map [driver2.TxID , T ]
146
+ delivery * fabric.Delivery
147
+ blockProcessingParallelism int
148
+ ignoreBlockErrors bool
129
149
}
130
150
131
151
func (m * listenerManager [T ]) onBlock (ctx context.Context , block * common.Block ) error {
0 commit comments