From 3e9ef5ac6c75b045feeed365afe7fc0bf25595dc Mon Sep 17 00:00:00 2001 From: anonpenguin23 Date: Sun, 22 Feb 2026 11:39:59 +0200 Subject: [PATCH] feat: enhance WebRTC port allocation with existing allocation checks and increase upload timeout --- pkg/gateway/middleware.go | 8 +++++++- pkg/namespace/cluster_manager_webrtc.go | 1 + pkg/namespace/webrtc_port_allocator.go | 14 ++++++++++++++ scripts/upgrade-nodes.sh | 4 ++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/pkg/gateway/middleware.go b/pkg/gateway/middleware.go index 6c9718b..8e25840 100644 --- a/pkg/gateway/middleware.go +++ b/pkg/gateway/middleware.go @@ -1054,8 +1054,14 @@ func (g *Gateway) handleNamespaceGatewayRequest(w http.ResponseWriter, r *http.R proxyReq.Header.Set(HeaderInternalAuthNamespace, validatedNamespace) } + // Use a longer timeout for upload paths (IPFS add can be slow for large files) + proxyTimeout := 30 * time.Second + if strings.HasPrefix(r.URL.Path, "/v1/storage/upload") || strings.HasPrefix(r.URL.Path, "/v1/storage/pin") { + proxyTimeout = 300 * time.Second + } + // Execute proxy request using shared transport for connection pooling - httpClient := &http.Client{Timeout: 30 * time.Second, Transport: g.proxyTransport} + httpClient := &http.Client{Timeout: proxyTimeout, Transport: g.proxyTransport} resp, err := httpClient.Do(proxyReq) if err != nil { cb.RecordFailure() diff --git a/pkg/namespace/cluster_manager_webrtc.go b/pkg/namespace/cluster_manager_webrtc.go index 9ba75ca..2acf298 100644 --- a/pkg/namespace/cluster_manager_webrtc.go +++ b/pkg/namespace/cluster_manager_webrtc.go @@ -331,6 +331,7 @@ func (cm *ClusterManager) getClusterNodesWithIPs(ctx context.Context, clusterID FROM namespace_cluster_nodes ncn JOIN dns_nodes dn ON ncn.node_id = dn.id WHERE ncn.namespace_cluster_id = ? + GROUP BY ncn.node_id ` if err := cm.db.Query(internalCtx, &rows, query, clusterID); err != nil { return nil, err diff --git a/pkg/namespace/webrtc_port_allocator.go b/pkg/namespace/webrtc_port_allocator.go index 39d7a6e..8f21149 100644 --- a/pkg/namespace/webrtc_port_allocator.go +++ b/pkg/namespace/webrtc_port_allocator.go @@ -49,6 +49,13 @@ func (wpa *WebRTCPortAllocator) AllocateSFUPorts(ctx context.Context, nodeID, na retryDelay := 100 * time.Millisecond for attempt := 0; attempt < maxRetries; attempt++ { + // Re-check for existing allocation (handles read-after-write lag on retries) + if attempt > 0 { + if existing, err := wpa.GetSFUPorts(ctx, namespaceClusterID, nodeID); err == nil && existing != nil { + return existing, nil + } + } + block, err := wpa.tryAllocateSFUPorts(internalCtx, nodeID, namespaceClusterID) if err == nil { wpa.logger.Info("SFU ports allocated", @@ -148,6 +155,13 @@ func (wpa *WebRTCPortAllocator) AllocateTURNPorts(ctx context.Context, nodeID, n retryDelay := 100 * time.Millisecond for attempt := 0; attempt < maxRetries; attempt++ { + // Re-check for existing allocation (handles read-after-write lag on retries) + if attempt > 0 { + if existing, err := wpa.GetTURNPorts(ctx, namespaceClusterID, nodeID); err == nil && existing != nil { + return existing, nil + } + } + block, err := wpa.tryAllocateTURNPorts(internalCtx, nodeID, namespaceClusterID) if err == nil { wpa.logger.Info("TURN ports allocated", diff --git a/scripts/upgrade-nodes.sh b/scripts/upgrade-nodes.sh index da20bfe..0c1d076 100755 --- a/scripts/upgrade-nodes.sh +++ b/scripts/upgrade-nodes.sh @@ -75,6 +75,10 @@ resolve_nodes "$@" | while IFS='|' read -r user host pass; do echo "[$i/$node_count] $user@$host" upgrade_node "$user" "$host" "$pass" echo " ✓ Done" + if [ "$i" -lt "$node_count" ]; then + echo " Waiting 30s before next node..." + sleep 30 + fi echo "" done