( id uuid.UUID, n *proto.Node, k proto.CoordinateResponse_PeerUpdate_Kind, reason string, )
| 85 | var errNoResp = xerrors.New("no response needed") |
| 86 | |
| 87 | func (p *peer) storeMappingLocked( |
| 88 | id uuid.UUID, n *proto.Node, k proto.CoordinateResponse_PeerUpdate_Kind, reason string, |
| 89 | ) ( |
| 90 | *proto.CoordinateResponse_PeerUpdate, error, |
| 91 | ) { |
| 92 | p.logger.Debug(context.Background(), "got updated mapping", |
| 93 | slog.F("from_id", id), slog.F("kind", k), slog.F("reason", reason)) |
| 94 | sn, ok := p.sent[id] |
| 95 | switch { |
| 96 | case !ok && (k == proto.CoordinateResponse_PeerUpdate_LOST || k == proto.CoordinateResponse_PeerUpdate_DISCONNECTED): |
| 97 | // we don't need to send a lost/disconnect update if we've never sent an update about this peer |
| 98 | return nil, errNoResp |
| 99 | case !ok && k == proto.CoordinateResponse_PeerUpdate_NODE: |
| 100 | p.sent[id] = n |
| 101 | case ok && k == proto.CoordinateResponse_PeerUpdate_LOST: |
| 102 | delete(p.sent, id) |
| 103 | case ok && k == proto.CoordinateResponse_PeerUpdate_DISCONNECTED: |
| 104 | delete(p.sent, id) |
| 105 | case ok && k == proto.CoordinateResponse_PeerUpdate_NODE: |
| 106 | eq, err := sn.Equal(n) |
| 107 | if err != nil { |
| 108 | p.logger.Critical(context.Background(), "failed to compare nodes", slog.F("old", sn), slog.F("new", n)) |
| 109 | return nil, xerrors.Errorf("failed to compare nodes: %s", sn.String()) |
| 110 | } |
| 111 | if eq { |
| 112 | return nil, errNoResp |
| 113 | } |
| 114 | p.sent[id] = n |
| 115 | } |
| 116 | return &proto.CoordinateResponse_PeerUpdate{ |
| 117 | Id: id[:], |
| 118 | Kind: k, |
| 119 | Node: n, |
| 120 | Reason: reason, |
| 121 | }, nil |
| 122 | } |
| 123 | |
| 124 | func (p *peer) reqLoop(ctx context.Context, logger slog.Logger, handler func(context.Context, *peer, *proto.CoordinateRequest) error) error { |
| 125 | for { |
no test coverage detected