From a259dd83b2a0fc0a04e7b0d6ca106d65283d0639 Mon Sep 17 00:00:00 2001 From: sagitchu Date: Fri, 1 May 2026 23:24:48 +0800 Subject: [PATCH] fix: load probe target with tunnel record --- .../http/handler/tunnel_quality_prober.go | 18 +------------ go-backend/internal/store/model/model.go | 14 +++++----- .../internal/store/repo/repository_flow.go | 14 +++++----- .../store/repo/repository_flow_batch_test.go | 27 +++++++++++++++++++ 4 files changed, 44 insertions(+), 29 deletions(-) diff --git a/go-backend/internal/http/handler/tunnel_quality_prober.go b/go-backend/internal/http/handler/tunnel_quality_prober.go index e1df91e..f8adfe4 100644 --- a/go-backend/internal/http/handler/tunnel_quality_prober.go +++ b/go-backend/internal/http/handler/tunnel_quality_prober.go @@ -242,7 +242,7 @@ func (p *tunnelQualityProber) probeTunnel(tunnelID int64) { pingTimeoutMS: tunnelQualityPingTimeoutMs, timeoutMessage: "探测超时", } - probeTarget := p.probeTargetForTunnel(tunnelID) + probeTarget := effectiveTunnelProbeTargetValues(tunnel.ProbeTargetHost, tunnel.ProbeTargetPort) p.probeBestExitOwners(tunnelID, inNodes, midNodesGrouped, outNodes, ipPreference, options, probeTarget) switch tunnel.Type { @@ -422,22 +422,6 @@ func (p *tunnelQualityProber) probeBestExitOwners(tunnelID int64, inNodes []chai } } -func (p *tunnelQualityProber) probeTargetForTunnel(tunnelID int64) tunnelProbeTarget { - if p == nil || p.handler == nil || p.handler.repo == nil { - return defaultTunnelProbeTarget() - } - tunnels, err := p.handler.repo.ListTunnels() - if err != nil { - return defaultTunnelProbeTarget() - } - for _, tunnel := range tunnels { - if asInt64(tunnel["id"], 0) == tunnelID { - return effectiveTunnelProbeTargetValues(asString(tunnel["probeTargetHost"]), asInt(tunnel["probeTargetPort"], 0)) - } - } - return defaultTunnelProbeTarget() -} - func (p *tunnelQualityProber) tcpPingNode(nodeID int64, ip string, port int, options diagnosisExecOptions) (latency float64, loss float64, err error) { h := p.handler if h == nil { diff --git a/go-backend/internal/store/model/model.go b/go-backend/internal/store/model/model.go index 31646b5..e5b0f59 100644 --- a/go-backend/internal/store/model/model.go +++ b/go-backend/internal/store/model/model.go @@ -555,12 +555,14 @@ type ForwardRecord struct { // TunnelRecord is a minimal tunnel view used by control plane. type TunnelRecord struct { - ID int64 - Type int - Status int - Flow int64 - TrafficRatio float64 - Protocol string + ID int64 + Type int + Status int + Flow int64 + TrafficRatio float64 + Protocol string + ProbeTargetHost string + ProbeTargetPort int } type UserQuotaView struct { diff --git a/go-backend/internal/store/repo/repository_flow.go b/go-backend/internal/store/repo/repository_flow.go index e67ca28..7393548 100644 --- a/go-backend/internal/store/repo/repository_flow.go +++ b/go-backend/internal/store/repo/repository_flow.go @@ -253,12 +253,14 @@ func (r *Repository) GetTunnelRecord(tunnelID int64) (*model.TunnelRecord, error return nil, err } tr := model.TunnelRecord{ - ID: t.ID, - Type: t.Type, - Status: t.Status, - Flow: t.Flow, - TrafficRatio: t.TrafficRatio, - Protocol: t.Protocol, + ID: t.ID, + Type: t.Type, + Status: t.Status, + Flow: t.Flow, + TrafficRatio: t.TrafficRatio, + Protocol: t.Protocol, + ProbeTargetHost: t.ProbeTargetHost, + ProbeTargetPort: t.ProbeTargetPort, } if tr.Flow <= 0 { tr.Flow = 1 diff --git a/go-backend/internal/store/repo/repository_flow_batch_test.go b/go-backend/internal/store/repo/repository_flow_batch_test.go index 81711ec..1f055ae 100644 --- a/go-backend/internal/store/repo/repository_flow_batch_test.go +++ b/go-backend/internal/store/repo/repository_flow_batch_test.go @@ -111,6 +111,33 @@ func TestGetFlowUploadForwardMetasKeepsForwardsWhenTunnelRowMissing(t *testing.T } } +func TestGetTunnelRecordIncludesProbeTarget(t *testing.T) { + r, err := Open(filepath.Join(t.TempDir(), "tunnel-record-probe-target.db")) + if err != nil { + t.Fatalf("open repo: %v", err) + } + defer r.Close() + + now := time.Now().UnixMilli() + if err := r.DB().Exec(` + INSERT INTO tunnel(id, name, traffic_ratio, type, protocol, flow, created_time, updated_time, status, in_ip, inx, probe_target_host, probe_target_port) + VALUES(1, 't1', 1, 2, 'tls', 1, ?, ?, 1, NULL, 0, 'speed.example.com', 8443) + `, now, now).Error; err != nil { + t.Fatalf("insert tunnel: %v", err) + } + + record, err := r.GetTunnelRecord(1) + if err != nil { + t.Fatalf("get tunnel record: %v", err) + } + if record == nil { + t.Fatalf("expected tunnel record") + } + if record.ProbeTargetHost != "speed.example.com" || record.ProbeTargetPort != 8443 { + t.Fatalf("unexpected probe target on record: %#v", record) + } +} + func TestAddUserQuotaUsageBatchReturnsNormalizedViews(t *testing.T) { r, err := Open(filepath.Join(t.TempDir(), "quota-batch.db")) if err != nil {