1
0
mirror of https://github.com/MetaCubeX/mihomo.git synced 2026-10-10 04:03:11 +08:00

fix: keep fake-ip allocation state when cloning the pool on reload (#3283)

This commit is contained in:
Younes Beriane
2026-10-08 09:57:16 +02:00
committed by GitHub
parent 80101933c0
commit e4dd968de9
2 changed files with 38 additions and 0 deletions
+11
View File
@@ -88,7 +88,18 @@ func (p *Pool) IPNet() netip.Prefix {
// CloneFrom clone cache from old pool // CloneFrom clone cache from old pool
func (p *Pool) CloneFrom(o *Pool) { func (p *Pool) CloneFrom(o *Pool) {
p.mux.Lock()
defer p.mux.Unlock()
o.mux.Lock()
defer o.mux.Unlock()
o.store.CloneTo(p.store) o.store.CloneTo(p.store)
// the allocation state only matches the cloned entries if both pools cover the same range
if o.first == p.first && o.last == p.last {
p.offset, p.cycle = o.offset, o.cycle
}
} }
func (p *Pool) get(host string) netip.Addr { func (p *Pool) get(host string) netip.Addr {
+27
View File
@@ -212,6 +212,33 @@ func TestPool_Clone(t *testing.T) {
assert.True(t, lastExist) assert.True(t, lastExist)
} }
func TestPool_CloneKeepsAllocationState(t *testing.T) {
ipnet := netip.MustParsePrefix("192.168.0.1/24")
pool, _ := New(Options{
IPNet: ipnet,
Size: 10,
})
foo := pool.Lookup("foo.com")
bar := pool.Lookup("bar.com")
newPool, _ := New(Options{
IPNet: ipnet,
Size: 10,
})
newPool.CloneFrom(pool)
// a fresh allocation must not overwrite the retained mappings
baz := newPool.Lookup("baz.com")
assert.NotEqual(t, foo, baz)
assert.NotEqual(t, bar, baz)
assert.Equal(t, foo, newPool.Lookup("foo.com"))
assert.Equal(t, bar, newPool.Lookup("bar.com"))
host, ok := newPool.LookBack(foo)
assert.True(t, ok)
assert.Equal(t, "foo.com", host)
}
func TestPool_Error(t *testing.T) { func TestPool_Error(t *testing.T) {
ipnet := netip.MustParsePrefix("192.168.0.1/31") ipnet := netip.MustParsePrefix("192.168.0.1/31")
_, err := New(Options{ _, err := New(Options{