ipn/ipnlocal: add basic support for netmap caching (#18530)
This commit is based on ff0978ab, and extends #18497 to connect network map caching to the LocalBackend. As implemented, only "whole" netmap values are stored, and we do not yet handle incremental updates. As-written, the feature must be explicitly enabled via the TS_USE_CACHED_NETMAP envknob, and must be considered experimental. Updates #12639 Co-Authored-by: Brad Fitzpatrick <bradfitz@tailscale.com> Change-Id: I48a1e92facfbf7fb3a8e67cff7f2c9ab4ed62c83 Signed-off-by: M. J. Fromberger <fromberger@tailscale.com>main
parent
fbbf0d6669
commit
f4aea70f7a
@ -0,0 +1,56 @@ |
|||||||
|
// Copyright (c) Tailscale Inc & contributors
|
||||||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
package ipnlocal |
||||||
|
|
||||||
|
import ( |
||||||
|
"tailscale.com/feature/buildfeatures" |
||||||
|
"tailscale.com/ipn/ipnlocal/netmapcache" |
||||||
|
"tailscale.com/types/netmap" |
||||||
|
) |
||||||
|
|
||||||
|
// diskCache is the state netmap caching to disk.
|
||||||
|
type diskCache struct { |
||||||
|
// all fields guarded by LocalBackend.mu
|
||||||
|
|
||||||
|
dir string // active profile cache directory
|
||||||
|
cache *netmapcache.Cache |
||||||
|
} |
||||||
|
|
||||||
|
func (b *LocalBackend) writeNetmapToDiskLocked(nm *netmap.NetworkMap) error { |
||||||
|
if !buildfeatures.HasCacheNetMap || nm == nil || nm.Cached { |
||||||
|
return nil |
||||||
|
} |
||||||
|
b.logf("writing netmap to disk cache") |
||||||
|
|
||||||
|
dir, err := b.profileMkdirAllLocked(b.pm.CurrentProfile().ID(), "netmap-cache") |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
if c := b.diskCache; c.cache == nil || c.dir != dir { |
||||||
|
b.diskCache.cache = netmapcache.NewCache(netmapcache.FileStore(dir)) |
||||||
|
b.diskCache.dir = dir |
||||||
|
} |
||||||
|
return b.diskCache.cache.Store(b.currentNode().Context(), nm) |
||||||
|
} |
||||||
|
|
||||||
|
func (b *LocalBackend) loadDiskCacheLocked() (om *netmap.NetworkMap, ok bool) { |
||||||
|
if !buildfeatures.HasCacheNetMap { |
||||||
|
return nil, false |
||||||
|
} |
||||||
|
dir, err := b.profileMkdirAllLocked(b.pm.CurrentProfile().ID(), "netmap-cache") |
||||||
|
if err != nil { |
||||||
|
b.logf("profile data directory: %v", err) |
||||||
|
return nil, false |
||||||
|
} |
||||||
|
if c := b.diskCache; c.cache == nil || c.dir != dir { |
||||||
|
b.diskCache.cache = netmapcache.NewCache(netmapcache.FileStore(dir)) |
||||||
|
b.diskCache.dir = dir |
||||||
|
} |
||||||
|
nm, err := b.diskCache.cache.Load(b.currentNode().Context()) |
||||||
|
if err != nil { |
||||||
|
b.logf("load netmap from cache: %v", err) |
||||||
|
return nil, false |
||||||
|
} |
||||||
|
return nm, true |
||||||
|
} |
||||||
Loading…
Reference in new issue