mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-05-08 14:13:22 +00:00
Observatory: Clear removed outbounds (#5876)
* fix: prune stale observatory status * More readable Refactor observer to clear removed outbounds instead of updating status. Introduced slices package for improved outbound checking. --------- Co-authored-by: 风扇滑翔翼 <Fangliding.fshxy@outlook.com>
This commit is contained in:
committed by
Fangliding
parent
3f608b3a58
commit
6c4008edad
@@ -5,6 +5,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"slices"
|
||||||
"sort"
|
"sort"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -70,7 +71,7 @@ func (o *Observer) background() {
|
|||||||
|
|
||||||
outbounds := hs.Select(o.config.SubjectSelector)
|
outbounds := hs.Select(o.config.SubjectSelector)
|
||||||
|
|
||||||
o.updateStatus(outbounds)
|
o.clearRemovedOutbounds(outbounds)
|
||||||
|
|
||||||
sleepTime := time.Second * 10
|
sleepTime := time.Second * 10
|
||||||
if o.config.ProbeInterval != 0 {
|
if o.config.ProbeInterval != 0 {
|
||||||
@@ -111,11 +112,19 @@ func (o *Observer) background() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *Observer) updateStatus(outbounds []string) {
|
func (o *Observer) clearRemovedOutbounds(outbounds []string) {
|
||||||
o.statusLock.Lock()
|
o.statusLock.Lock()
|
||||||
defer o.statusLock.Unlock()
|
defer o.statusLock.Unlock()
|
||||||
// TODO should remove old inbound that is removed
|
if len(o.status) == 0 {
|
||||||
_ = outbounds
|
return
|
||||||
|
}
|
||||||
|
var pruned []*OutboundStatus
|
||||||
|
for _, status := range o.status {
|
||||||
|
if slices.Contains(outbounds, status.OutboundTag) {
|
||||||
|
pruned = append(pruned, status)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
o.status = pruned
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *Observer) probe(outbound string) ProbeResult {
|
func (o *Observer) probe(outbound string) ProbeResult {
|
||||||
|
|||||||
64
app/observatory/observer_test.go
Normal file
64
app/observatory/observer_test.go
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
package observatory
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestObserverUpdateStatusPrunesStaleOutbounds(t *testing.T) {
|
||||||
|
observer := &Observer{
|
||||||
|
status: []*OutboundStatus{
|
||||||
|
{
|
||||||
|
OutboundTag: "keep",
|
||||||
|
Alive: true,
|
||||||
|
Delay: 42,
|
||||||
|
LastErrorReason: "",
|
||||||
|
LastSeenTime: 111,
|
||||||
|
LastTryTime: 222,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
OutboundTag: "drop",
|
||||||
|
Alive: false,
|
||||||
|
Delay: 99999999,
|
||||||
|
LastErrorReason: "probe failed",
|
||||||
|
LastSeenTime: 333,
|
||||||
|
LastTryTime: 444,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
observer.clearRemovedOutbounds([]string{"keep"})
|
||||||
|
|
||||||
|
if len(observer.status) != 1 {
|
||||||
|
t.Fatalf("expected 1 status after pruning, got %d", len(observer.status))
|
||||||
|
}
|
||||||
|
|
||||||
|
got := observer.status[0]
|
||||||
|
if got.OutboundTag != "keep" {
|
||||||
|
t.Fatalf("expected remaining status for keep, got %q", got.OutboundTag)
|
||||||
|
}
|
||||||
|
if !got.Alive {
|
||||||
|
t.Fatal("expected remaining status to preserve Alive field")
|
||||||
|
}
|
||||||
|
if got.Delay != 42 {
|
||||||
|
t.Fatalf("expected remaining status to preserve Delay, got %d", got.Delay)
|
||||||
|
}
|
||||||
|
if got.LastSeenTime != 111 {
|
||||||
|
t.Fatalf("expected remaining status to preserve LastSeenTime, got %d", got.LastSeenTime)
|
||||||
|
}
|
||||||
|
if got.LastTryTime != 222 {
|
||||||
|
t.Fatalf("expected remaining status to preserve LastTryTime, got %d", got.LastTryTime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestObserverUpdateStatusClearsWhenNoOutboundsRemain(t *testing.T) {
|
||||||
|
observer := &Observer{
|
||||||
|
status: []*OutboundStatus{
|
||||||
|
{OutboundTag: "drop-1"},
|
||||||
|
{OutboundTag: "drop-2"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
observer.clearRemovedOutbounds(nil)
|
||||||
|
|
||||||
|
if len(observer.status) != 0 {
|
||||||
|
t.Fatalf("expected all statuses to be removed, got %d", len(observer.status))
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user