Skip to content

Commit 0b49138

Browse files
committed
Start submitting misbehavior reports
1 parent 7666a1b commit 0b49138

File tree

1 file changed

+37
-10
lines changed

1 file changed

+37
-10
lines changed

pkg/sync/syncWorker.go

+37-10
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/xmtp/xmtpd/pkg/db/queries"
1313
envUtils "github.com/xmtp/xmtpd/pkg/envelopes"
1414
clientInterceptors "github.com/xmtp/xmtpd/pkg/interceptors/client"
15+
"github.com/xmtp/xmtpd/pkg/misbehavior"
1516
"github.com/xmtp/xmtpd/pkg/proto/xmtpv4/envelopes"
1617
"github.com/xmtp/xmtpd/pkg/proto/xmtpv4/message_api"
1718
"github.com/xmtp/xmtpd/pkg/registrant"
@@ -31,6 +32,7 @@ type syncWorker struct {
3132
subscriptions map[uint32]struct{}
3233
subscriptionsMutex sync.RWMutex
3334
cancel context.CancelFunc
35+
misbehaviorService misbehavior.MisbehaviorService
3436
}
3537

3638
type originatorStream struct {
@@ -58,14 +60,15 @@ func startSyncWorker(
5860
ctx, cancel := context.WithCancel(ctx)
5961

6062
s := &syncWorker{
61-
ctx: ctx,
62-
log: log.Named("syncWorker"),
63-
nodeRegistry: nodeRegistry,
64-
registrant: registrant,
65-
store: store,
66-
wg: sync.WaitGroup{},
67-
subscriptions: make(map[uint32]struct{}),
68-
cancel: cancel,
63+
ctx: ctx,
64+
log: log.Named("syncWorker"),
65+
nodeRegistry: nodeRegistry,
66+
registrant: registrant,
67+
store: store,
68+
wg: sync.WaitGroup{},
69+
subscriptions: make(map[uint32]struct{}),
70+
cancel: cancel,
71+
misbehaviorService: misbehavior.NewLoggingMisbehaviorService(log),
6972
}
7073
if err := s.start(); err != nil {
7174
return nil, err
@@ -362,8 +365,10 @@ func (s *syncWorker) validateAndInsertEnvelope(
362365
lastNs = stream.lastEnvelope.OriginatorNs()
363366
}
364367
if env.OriginatorSequenceID() != lastSequenceID+1 || env.OriginatorNs() < lastNs {
365-
// TODO(rich) Submit misbehavior report and continue
366-
s.log.Error("Received out of order envelope")
368+
err = s.submitOutOfOrderReport(stream.nodeID, stream.lastEnvelope, env)
369+
if err != nil {
370+
s.log.Error("Failed to submit out of order report", zap.Error(err))
371+
}
367372
}
368373

369374
if env.OriginatorSequenceID() > lastSequenceID {
@@ -375,6 +380,28 @@ func (s *syncWorker) validateAndInsertEnvelope(
375380
s.insertEnvelope(env)
376381
}
377382

383+
func (s *syncWorker) submitOutOfOrderReport(
384+
nodeID uint32,
385+
lastEnvelope *envUtils.OriginatorEnvelope,
386+
currentEnvelope *envUtils.OriginatorEnvelope,
387+
) error {
388+
report, err := misbehavior.NewSafetyFailureReport(
389+
nodeID,
390+
message_api.Misbehavior_MISBEHAVIOR_OUT_OF_ORDER,
391+
true,
392+
[]*envUtils.OriginatorEnvelope{lastEnvelope, currentEnvelope},
393+
)
394+
if err != nil {
395+
return err
396+
}
397+
398+
err = s.misbehaviorService.SafetyFailure(report)
399+
if err != nil {
400+
return err
401+
}
402+
return nil
403+
}
404+
378405
func (s *syncWorker) insertEnvelope(env *envUtils.OriginatorEnvelope) {
379406
s.log.Debug("Replication server received envelope", zap.Any("envelope", env))
380407
originatorBytes, err := env.Bytes()

0 commit comments

Comments
 (0)