fix main relay context being canceled instead of just the dial context.

This commit is contained in:
fiatjaf
2025-07-11 13:01:04 -03:00
parent dcd505712a
commit 9f8b810882
3 changed files with 12 additions and 18 deletions

View File

@@ -34,7 +34,13 @@ func NewConnection(
requestHeader http.Header, requestHeader http.Header,
tlsConfig *tls.Config, tlsConfig *tls.Config,
) (*Connection, error) { ) (*Connection, error) {
c, _, err := ws.Dial(ctx, url, getConnectionOptions(requestHeader, tlsConfig)) dialCtx := ctx
if _, ok := dialCtx.Deadline(); !ok {
// if no timeout is set, force it to 7 seconds
dialCtx, _ = context.WithTimeoutCause(ctx, 7*time.Second, errors.New("connection took too long"))
}
c, _, err := ws.Dial(dialCtx, url, getConnectionOptions(requestHeader, tlsConfig))
if err != nil { if err != nil {
return nil, err return nil, err
} }

13
pool.go
View File

@@ -145,17 +145,10 @@ func (pool *Pool) EnsureRelay(url string) (*Relay, error) {
return relay, nil return relay, nil
} }
relay = NewRelay(pool.Context, url, pool.relayOptions)
// try to connect // try to connect
// we use this ctx here so when the pool dies everything dies // we use this ctx here so when the pool dies everything dies
ctx, cancel := context.WithTimeoutCause( if err := relay.Connect(pool.Context); err != nil {
pool.Context,
time.Second*7,
errors.New("connecting to the relay took too long"),
)
defer cancel()
relay = NewRelay(pool.Context, url, pool.relayOptions)
if err := relay.Connect(ctx); err != nil {
if pool.penaltyBox != nil { if pool.penaltyBox != nil {
// putting relay in penalty box // putting relay in penalty box
pool.penaltyBoxMu.Lock() pool.penaltyBoxMu.Lock()
@@ -469,7 +462,7 @@ func (pool *Pool) subMany(
subscribe: subscribe:
sub, err = relay.Subscribe(ctx, filter, opts) sub, err = relay.Subscribe(ctx, filter, opts)
if err != nil { if err != nil {
debugLogf("%s reconnecting because subscription died\n", nm) debugLogf("%s reconnecting because subscription died: %s\n", nm, err)
goto reconnect goto reconnect
} }

View File

@@ -117,11 +117,6 @@ func (r *Relay) ConnectWithTLS(ctx context.Context, tlsConfig *tls.Config) error
return fmt.Errorf("invalid relay URL '%s'", r.URL) return fmt.Errorf("invalid relay URL '%s'", r.URL)
} }
if _, ok := ctx.Deadline(); !ok {
// if no timeout is set, force it to 7 seconds
ctx, _ = context.WithTimeoutCause(ctx, 7*time.Second, errors.New("connection took too long"))
}
conn, err := NewConnection(ctx, r.URL, r.handleMessage, r.requestHeader, tlsConfig) conn, err := NewConnection(ctx, r.URL, r.handleMessage, r.requestHeader, tlsConfig)
if err != nil { if err != nil {
return fmt.Errorf("error opening websocket to '%s': %w", r.URL, err) return fmt.Errorf("error opening websocket to '%s': %w", r.URL, err)
@@ -230,10 +225,10 @@ func (r *Relay) WriteWithError(msg []byte) error {
ch := make(chan error) ch := make(chan error)
select { select {
case r.Connection.writeQueue <- writeRequest{msg: msg, answer: ch}: case r.Connection.writeQueue <- writeRequest{msg: msg, answer: ch}:
case <-r.Connection.closedNotify:
return fmt.Errorf("failed to write to %s: <closed>", r.URL)
case <-r.connectionContext.Done(): case <-r.connectionContext.Done():
return fmt.Errorf("failed to write to %s: %w", r.URL, context.Cause(r.connectionContext)) return fmt.Errorf("failed to write to %s: %w", r.URL, context.Cause(r.connectionContext))
case <-r.Connection.closedNotify:
return fmt.Errorf("failed to write to %s: <closed>", r.URL)
} }
return <-ch return <-ch
} }