Optimize network hosts

This commit is contained in:
Ben Adrian Sarmiento
2024-06-16 09:14:12 +02:00
parent 5aea569be7
commit f4d3f273f6
3 changed files with 88 additions and 47 deletions

View File

@@ -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 {