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