Skip to content

Commit 0b053cc

Browse files
committed
fix(events): handle subscribe and get/fill cases separately
* subscribe-type calls always wants future reverts but only historical reverts when a tipset is specified * get-type calls only want reverts when a tipset is specified Add a new Fill() method to avoid the unnecessary install + remove step for get- type calls. Closes: #12584
1 parent 4b384ff commit 0b053cc

File tree

4 files changed

+132
-100
lines changed

4 files changed

+132
-100
lines changed

chain/events/filter/event.go

+37-19
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,10 @@ type eventFilter struct {
4646
keysWithCodec map[string][]types.ActorEventBlock // map of key names to a list of alternate values that may match
4747
maxResults int // maximum number of results to collect, 0 is unlimited
4848

49-
mu sync.Mutex
50-
collected []*CollectedEvent
51-
lastTaken time.Time
52-
ch chan<- interface{}
53-
excludeReverted bool
49+
mu sync.Mutex
50+
collected []*CollectedEvent
51+
lastTaken time.Time
52+
ch chan<- interface{}
5453
}
5554

5655
var _ Filter = (*eventFilter)(nil)
@@ -84,9 +83,6 @@ func (f *eventFilter) ClearSubChannel() {
8483
}
8584

8685
func (f *eventFilter) CollectEvents(ctx context.Context, te *TipSetEvents, revert bool, resolver AddressResolver) error {
87-
if f.excludeReverted && revert {
88-
return nil
89-
}
9086
if !f.matchTipset(te) {
9187
return nil
9288
}
@@ -380,8 +376,14 @@ func (m *EventFilterManager) Revert(ctx context.Context, from, to *types.TipSet)
380376
return nil
381377
}
382378

383-
func (m *EventFilterManager) Install(ctx context.Context, minHeight, maxHeight abi.ChainEpoch, tipsetCid cid.Cid, addresses []address.Address,
384-
keysWithCodec map[string][]types.ActorEventBlock, excludeReverted bool) (EventFilter, error) {
379+
func (m *EventFilterManager) Fill(
380+
ctx context.Context,
381+
minHeight,
382+
maxHeight abi.ChainEpoch,
383+
tipsetCid cid.Cid,
384+
addresses []address.Address,
385+
keysWithCodec map[string][]types.ActorEventBlock,
386+
) (EventFilter, error) {
385387
m.mu.Lock()
386388
if m.currentHeight == 0 {
387389
// sync in progress, we haven't had an Apply
@@ -400,28 +402,44 @@ func (m *EventFilterManager) Install(ctx context.Context, minHeight, maxHeight a
400402
}
401403

402404
f := &eventFilter{
403-
id: id,
404-
minHeight: minHeight,
405-
maxHeight: maxHeight,
406-
tipsetCid: tipsetCid,
407-
addresses: addresses,
408-
keysWithCodec: keysWithCodec,
409-
maxResults: m.MaxFilterResults,
410-
excludeReverted: excludeReverted,
405+
id: id,
406+
minHeight: minHeight,
407+
maxHeight: maxHeight,
408+
tipsetCid: tipsetCid,
409+
addresses: addresses,
410+
keysWithCodec: keysWithCodec,
411+
maxResults: m.MaxFilterResults,
411412
}
412413

413414
if m.EventIndex != nil && minHeight != -1 && minHeight < currentHeight {
414415
// Filter needs historic events
416+
excludeReverted := tipsetCid != cid.Undef
415417
if err := m.EventIndex.prefillFilter(ctx, f, excludeReverted); err != nil {
416418
return nil, err
417419
}
418420
}
419421

422+
return f, nil
423+
}
424+
425+
func (m *EventFilterManager) Install(
426+
ctx context.Context,
427+
minHeight,
428+
maxHeight abi.ChainEpoch,
429+
tipsetCid cid.Cid,
430+
addresses []address.Address,
431+
keysWithCodec map[string][]types.ActorEventBlock,
432+
) (EventFilter, error) {
433+
f, err := m.Fill(ctx, minHeight, maxHeight, tipsetCid, addresses, keysWithCodec)
434+
if err != nil {
435+
return nil, err
436+
}
437+
420438
m.mu.Lock()
421439
if m.filters == nil {
422440
m.filters = make(map[types.FilterID]EventFilter)
423441
}
424-
m.filters[id] = f
442+
m.filters[f.(*eventFilter).id] = f
425443
m.mu.Unlock()
426444

427445
return f, nil

node/impl/full/actor_events.go

+10-11
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,19 @@ type ChainAccessor interface {
3232
}
3333

3434
type EventFilterManager interface {
35+
Fill(
36+
ctx context.Context,
37+
minHeight, maxHeight abi.ChainEpoch,
38+
tipsetCid cid.Cid,
39+
addresses []address.Address,
40+
keysWithCodec map[string][]types.ActorEventBlock,
41+
) (filter.EventFilter, error)
3542
Install(
3643
ctx context.Context,
3744
minHeight, maxHeight abi.ChainEpoch,
3845
tipsetCid cid.Cid,
3946
addresses []address.Address,
4047
keysWithCodec map[string][]types.ActorEventBlock,
41-
excludeReverted bool,
4248
) (filter.EventFilter, error)
4349
Remove(ctx context.Context, id types.FilterID) error
4450
}
@@ -102,22 +108,15 @@ func (a *ActorEventHandler) GetActorEventsRaw(ctx context.Context, evtFilter *ty
102108
return nil, err
103109
}
104110

105-
// Install a filter just for this call, collect events, remove the filter
111+
// Fill a filter and collect events
106112
tipSetCid, err := params.GetTipSetCid()
107113
if err != nil {
108114
return nil, fmt.Errorf("failed to get tipset cid: %w", err)
109115
}
110-
excludeReverted := tipSetCid == cid.Undef
111-
f, err := a.eventFilterManager.Install(ctx, params.MinHeight, params.MaxHeight, tipSetCid, evtFilter.Addresses, evtFilter.Fields, excludeReverted)
116+
f, err := a.eventFilterManager.Fill(ctx, params.MinHeight, params.MaxHeight, tipSetCid, evtFilter.Addresses, evtFilter.Fields)
112117
if err != nil {
113118
return nil, err
114119
}
115-
defer func() {
116-
// Remove the temporary filter regardless of the original context.
117-
if err := a.eventFilterManager.Remove(context.Background(), f.ID()); err != nil {
118-
log.Warnf("failed to remove filter: %s", err)
119-
}
120-
}()
121120
return getCollected(ctx, f), nil
122121
}
123122

@@ -218,7 +217,7 @@ func (a *ActorEventHandler) SubscribeActorEventsRaw(ctx context.Context, evtFilt
218217
if err != nil {
219218
return nil, fmt.Errorf("failed to get tipset cid: %w", err)
220219
}
221-
fm, err := a.eventFilterManager.Install(ctx, params.MinHeight, params.MaxHeight, tipSetCid, evtFilter.Addresses, evtFilter.Fields, false)
220+
fm, err := a.eventFilterManager.Install(ctx, params.MinHeight, params.MaxHeight, tipSetCid, evtFilter.Addresses, evtFilter.Fields)
222221
if err != nil {
223222
return nil, err
224223
}

0 commit comments

Comments
 (0)