mirror of
https://github.com/logos-messaging/go-libp2p-pubsub.git
synced 2026-01-03 05:13:07 +00:00
add defensive checks for potentially duplicate traces
This commit is contained in:
parent
8c96dc4bdb
commit
ed0d01f92b
19
score.go
19
score.go
@ -90,6 +90,7 @@ type messageDeliveries struct {
|
||||
|
||||
type deliveryRecord struct {
|
||||
status int
|
||||
firstSeen time.Time
|
||||
validated time.Time
|
||||
peers map[peer.ID]struct{}
|
||||
}
|
||||
@ -511,6 +512,12 @@ func (ps *peerScore) DeliverMessage(msg *Message) {
|
||||
|
||||
drec := ps.deliveries.getRecord(ps.msgID(msg.Message))
|
||||
|
||||
// defensive check that this is the first delivery trace -- delivery status should be unknown
|
||||
if drec.status != deliveryUnknown {
|
||||
log.Warningf("unexpected delivery trace: message from %s was first seen %s ago and has delivery status %d", msg.ReceivedFrom, time.Now().Sub(drec.firstSeen), drec.status)
|
||||
return
|
||||
}
|
||||
|
||||
// mark the message as valid and reward mesh peers that have already forwarded it to us
|
||||
drec.status = deliveryValid
|
||||
drec.validated = time.Now()
|
||||
@ -552,6 +559,12 @@ func (ps *peerScore) RejectMessage(msg *Message, reason string) {
|
||||
|
||||
drec := ps.deliveries.getRecord(ps.msgID(msg.Message))
|
||||
|
||||
// defensive check that this is the first rejection trace -- delivery status should be unknown
|
||||
if drec.status != deliveryUnknown {
|
||||
log.Warningf("unexpected rejection trace: message from %s was first seen %s ago and has delivery status %d", msg.ReceivedFrom, time.Now().Sub(drec.firstSeen), drec.status)
|
||||
return
|
||||
}
|
||||
|
||||
switch reason {
|
||||
case rejectValidationThrottled:
|
||||
// if we reject with "validation throttled" we don't penalize the peer(s) that forward it
|
||||
@ -621,10 +634,12 @@ func (d *messageDeliveries) getRecord(id string) *deliveryRecord {
|
||||
return rec
|
||||
}
|
||||
|
||||
rec = &deliveryRecord{peers: make(map[peer.ID]struct{})}
|
||||
now := time.Now()
|
||||
|
||||
rec = &deliveryRecord{peers: make(map[peer.ID]struct{}), firstSeen: now}
|
||||
d.records[id] = rec
|
||||
|
||||
entry := &deliveryEntry{id: id, expire: time.Now().Add(TimeCacheDuration)}
|
||||
entry := &deliveryEntry{id: id, expire: now.Add(TimeCacheDuration)}
|
||||
if d.tail != nil {
|
||||
d.tail.next = entry
|
||||
d.tail = entry
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user