Optimize network hosts
This commit is contained in:
@@ -6,8 +6,10 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"github.com/debridmediamanager/zurg/pkg/logutil"
|
||||
@@ -37,25 +39,67 @@ func (r *IPRepository) NetworkTest(forceRun bool) {
|
||||
ipv4latencyFile := "data/latency4.json"
|
||||
ipv6latencyFile := "data/latency6.json"
|
||||
if !forceRun {
|
||||
ipv4Loaded := false
|
||||
ipv6Loaded := false
|
||||
latencyData := r.readLatencyFile(ipv4latencyFile)
|
||||
if latencyData != nil {
|
||||
r.ipv4latencyMap = *latencyData
|
||||
ipv4Loaded = true
|
||||
}
|
||||
latencyData = r.readLatencyFile(ipv6latencyFile)
|
||||
if latencyData != nil {
|
||||
r.ipv6latencyMap = *latencyData
|
||||
ipv6Loaded = true
|
||||
}
|
||||
if ipv4Loaded && ipv6Loaded {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
r.log.Info("Network test will start now. IGNORE THE WARNINGS!")
|
||||
r.log.Info("Network test will start now (this will only run once). IGNORE THE WARNINGS!")
|
||||
r.runLatencyTest()
|
||||
r.log.Infof("Network test completed. Saving the results to %s and %s", ipv4latencyFile, ipv6latencyFile)
|
||||
r.log.Debugf("ipv4 %v", r.ipv4latencyMap)
|
||||
r.log.Debugf("ipv6 %v", r.ipv6latencyMap)
|
||||
r.writeLatencyFile(ipv4latencyFile, r.ipv4latencyMap)
|
||||
r.writeLatencyFile(ipv6latencyFile, r.ipv6latencyMap)
|
||||
}
|
||||
|
||||
func (r *IPRepository) GetOptimalHosts(ipv6 bool) []string {
|
||||
latencyMap := r.ipv4latencyMap
|
||||
if ipv6 {
|
||||
latencyMap = r.ipv6latencyMap
|
||||
}
|
||||
|
||||
// Convert the latency map to a slice of key-value pairs
|
||||
type kv struct {
|
||||
Key string
|
||||
Value float64
|
||||
}
|
||||
|
||||
var kvList []kv
|
||||
for k, v := range latencyMap {
|
||||
kvList = append(kvList, kv{k, v})
|
||||
}
|
||||
|
||||
// Sort the slice by latency values
|
||||
sort.Slice(kvList, func(i, j int) bool {
|
||||
return kvList[i].Value < kvList[j].Value
|
||||
})
|
||||
|
||||
// Calculate the number of hosts to return (top 50%)
|
||||
n := len(kvList) / 5
|
||||
if len(kvList)%5 != 0 {
|
||||
n++
|
||||
}
|
||||
|
||||
// Collect the keys of the top 50% hosts
|
||||
var optimalHosts []string
|
||||
for i := 0; i < n; i++ {
|
||||
optimalHosts = append(optimalHosts, kvList[i].Key)
|
||||
}
|
||||
|
||||
return optimalHosts
|
||||
}
|
||||
|
||||
func (r *IPRepository) runLatencyTest() {
|
||||
limit := 99
|
||||
start := 0
|
||||
@@ -63,10 +107,10 @@ func (r *IPRepository) runLatencyTest() {
|
||||
lastDomainsWorked := false
|
||||
for i := start; i <= limit; i++ {
|
||||
domain := fmt.Sprintf("%d.download.real-debrid.com", i)
|
||||
// ips, err := net.LookupIP(domain)
|
||||
// if err != nil || len(ips) == 0 {
|
||||
// continue
|
||||
// }
|
||||
ips, err := net.LookupIP(domain)
|
||||
if err != nil || len(ips) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
latency, err := r.testDomainLatency(r.ipv4client, domain)
|
||||
if err == nil {
|
||||
@@ -87,10 +131,10 @@ func (r *IPRepository) runLatencyTest() {
|
||||
}
|
||||
|
||||
domain = fmt.Sprintf("%d.download.real-debrid.cloud", i)
|
||||
// ips, err = net.LookupIP(domain)
|
||||
// if err != nil || len(ips) == 0 {
|
||||
// continue
|
||||
// }
|
||||
ips, err = net.LookupIP(domain)
|
||||
if err != nil || len(ips) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
latency, err = r.testDomainLatency(r.ipv4client, domain)
|
||||
if err == nil {
|
||||
|
||||
Reference in New Issue
Block a user