DHT Deadlockfix
This commit is contained in:
parent
8f485829f7
commit
2b7f44b2d7
@ -1,6 +1,7 @@
|
||||
package dht
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/rand"
|
||||
"crypto/sha1"
|
||||
"database/sql"
|
||||
@ -2217,18 +2218,29 @@ func (d *DHT) queryNodesParallel(candidates []*Node, targetID NodeID, queryType
|
||||
|
||||
resultChan := make(chan queryResult, len(candidates))
|
||||
var wg sync.WaitGroup
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
defer cancel()
|
||||
|
||||
// Launch parallel queries
|
||||
for _, candidate := range candidates {
|
||||
wg.Add(1)
|
||||
go func(node *Node) {
|
||||
defer wg.Done()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Printf("DHT query panic recovered: %v", r)
|
||||
}
|
||||
wg.Done()
|
||||
}()
|
||||
|
||||
key := fmt.Sprintf("%s:%d", node.Addr.IP, node.Addr.Port)
|
||||
queried[key] = true
|
||||
|
||||
var discoveredNodes []*Node
|
||||
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
default:
|
||||
if queryType == "find_node" {
|
||||
nodes, err := d.FindNode(targetID, node.Addr)
|
||||
if err == nil {
|
||||
@ -2241,17 +2253,32 @@ func (d *DHT) queryNodesParallel(candidates []*Node, targetID NodeID, queryType
|
||||
}
|
||||
}
|
||||
|
||||
resultChan <- queryResult{nodes: discoveredNodes, node: node}
|
||||
select {
|
||||
case resultChan <- queryResult{nodes: discoveredNodes, node: node}:
|
||||
case <-ctx.Done():
|
||||
return
|
||||
}
|
||||
}
|
||||
}(candidate)
|
||||
}
|
||||
|
||||
// Close channel when all queries complete
|
||||
// Close channel when all queries complete or timeout
|
||||
go func() {
|
||||
done := make(chan struct{})
|
||||
go func() {
|
||||
defer close(done)
|
||||
wg.Wait()
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-done:
|
||||
case <-ctx.Done():
|
||||
log.Printf("DHT parallel query timeout after 30s")
|
||||
}
|
||||
close(resultChan)
|
||||
}()
|
||||
|
||||
// Collect results
|
||||
// Collect results with timeout
|
||||
var allNodes []*Node
|
||||
for result := range resultChan {
|
||||
if len(result.nodes) > 0 {
|
||||
|
@ -107,6 +107,11 @@ func NewUnifiedP2PGateway(config *config.Config, db *sql.DB) *UnifiedP2PGateway
|
||||
func (g *UnifiedP2PGateway) Initialize() error {
|
||||
log.Printf("P2P Gateway: Initializing unified P2P system")
|
||||
|
||||
// Create database tables
|
||||
if err := g.CreateP2PTables(); err != nil {
|
||||
return fmt.Errorf("failed to create P2P database tables: %w", err)
|
||||
}
|
||||
|
||||
// Initialize tracker
|
||||
if err := g.initializeTracker(); err != nil {
|
||||
return fmt.Errorf("failed to initialize tracker: %w", err)
|
||||
|
BIN
torrent-gateway
BIN
torrent-gateway
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user