fix pinging relays: use the main relay context, not the relay connection temporary context.

This commit is contained in:
fiatjaf 2025-01-17 14:08:54 -03:00
parent 06a15fdaab
commit 3e1c0ddc7e
3 changed files with 10 additions and 7 deletions

View File

@ -3,9 +3,11 @@ package nostr
import ( import (
"context" "context"
"crypto/tls" "crypto/tls"
"errors"
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
"time"
ws "github.com/coder/websocket" ws "github.com/coder/websocket"
) )
@ -51,5 +53,7 @@ func (c *Connection) Close() error {
} }
func (c *Connection) Ping(ctx context.Context) error { func (c *Connection) Ping(ctx context.Context) error {
ctx, cancel := context.WithTimeoutCause(ctx, time.Millisecond*800, errors.New("ping took too long"))
defer cancel()
return c.conn.Ping(ctx) return c.conn.Ping(ctx)
} }

View File

@ -186,7 +186,7 @@ func (r *Relay) ConnectWithTLS(ctx context.Context, tlsConfig *tls.Config) error
select { select {
case <-ticker.C: case <-ticker.C:
if r.Connection != nil { if r.Connection != nil {
err := r.Connection.Ping(ctx) err := r.Connection.Ping(r.connectionContext)
if err != nil { if err != nil {
InfoLogger.Printf("{%s} error writing ping: %v; closing websocket", r.URL, err) InfoLogger.Printf("{%s} error writing ping: %v; closing websocket", r.URL, err)
r.Close() // this should trigger a context cancelation r.Close() // this should trigger a context cancelation
@ -213,6 +213,7 @@ func (r *Relay) ConnectWithTLS(ctx context.Context, tlsConfig *tls.Config) error
for { for {
buf.Reset() buf.Reset()
if err := conn.ReadMessage(r.connectionContext, buf); err != nil { if err := conn.ReadMessage(r.connectionContext, buf); err != nil {
r.ConnectionError = err r.ConnectionError = err
r.close(err) r.close(err)

View File

@ -55,12 +55,10 @@ func TestFollowListRecursion(t *testing.T) {
results := make(chan result) results := make(chan result)
go func() { go func() {
for _, item := range followList.Items { for _, item := range followList.Items {
go func() {
fl := sys.FetchFollowList(ctx, item.Pubkey) fl := sys.FetchFollowList(ctx, item.Pubkey)
meta := sys.FetchProfileMetadata(ctx, item.Pubkey) meta := sys.FetchProfileMetadata(ctx, item.Pubkey)
fmt.Println(" ~", item.Pubkey, meta.Name, len(fl.Items)) fmt.Println(" ~", item.Pubkey, meta.Name, len(fl.Items))
results <- result{item.Pubkey, fl, meta} results <- result{item.Pubkey, fl, meta}
}()
} }
}() }()