| 122 | } |
| 123 | |
| 124 | func (p *peer) reqLoop(ctx context.Context, logger slog.Logger, handler func(context.Context, *peer, *proto.CoordinateRequest) error) error { |
| 125 | for { |
| 126 | select { |
| 127 | case <-ctx.Done(): |
| 128 | logger.Debug(ctx, "peerReadLoop context done") |
| 129 | return ctx.Err() |
| 130 | case req, ok := <-p.reqs: |
| 131 | if !ok { |
| 132 | logger.Debug(ctx, "peerReadLoop channel closed") |
| 133 | return nil |
| 134 | } |
| 135 | logger.Debug(ctx, "peerReadLoop got request") |
| 136 | if err := handler(ctx, p, req); err != nil { |
| 137 | if xerrors.Is(err, ErrAlreadyRemoved) || xerrors.Is(err, ErrClosed) { |
| 138 | return nil |
| 139 | } |
| 140 | logger.Error(ctx, "peerReadLoop error handling request", slog.Error(err), slog.F("request", req)) |
| 141 | return err |
| 142 | } |
| 143 | } |
| 144 | } |
| 145 | } |
| 146 | |
| 147 | func (p *peer) htmlDebug() HTMLPeer { |
| 148 | node := "<nil>" |