hostinfo: cache device model to speed up init

This was causing a relatively consistent ~10ms of delay on Linux.

Signed-off-by: Kyle Carberry <kyle@carberry.com>
This commit is contained in:
Kyle Carberry 2024-04-01 16:26:20 -04:00 committed by Brad Fitzpatrick
parent ec87e219ae
commit 27038ee3c2
2 changed files with 18 additions and 10 deletions

View File

@ -52,7 +52,7 @@ func New() *tailcfg.Hostinfo {
GoArchVar: lazyGoArchVar.Get(),
GoVersion: runtime.Version(),
Machine: condCall(unameMachine),
DeviceModel: deviceModel(),
DeviceModel: deviceModelCached(),
Cloud: string(cloudenv.Get()),
NoLogsNoSupport: envknob.NoLogsNoSupport(),
AllowsUpdate: envknob.AllowsRemoteUpdate(),
@ -68,6 +68,7 @@ var (
distroVersion func() string
distroCodeName func() string
unameMachine func() string
deviceModel func() string
)
func condCall[T any](fn func() T) T {
@ -176,6 +177,20 @@ var (
// SetDeviceModel sets the device model for use in Hostinfo updates.
func SetDeviceModel(model string) { deviceModelAtomic.Store(model) }
func deviceModelCached() string {
if v, _ := deviceModelAtomic.Load().(string); v != "" {
return v
}
if deviceModel == nil {
return ""
}
v := deviceModel()
if v != "" {
deviceModelAtomic.Store(v)
}
return v
}
// SetOSVersion sets the OS version.
func SetOSVersion(v string) { osVersionAtomic.Store(v) }
@ -193,11 +208,6 @@ func SetPackage(v string) { packagingType.Store(v) }
// and "k8s-operator".
func SetApp(v string) { appType.Store(v) }
func deviceModel() string {
s, _ := deviceModelAtomic.Load().(string)
return s
}
// FirewallMode returns the firewall mode for the app.
// It is empty if unset.
func FirewallMode() string {

View File

@ -22,9 +22,7 @@ func init() {
distroName = distroNameLinux
distroVersion = distroVersionLinux
distroCodeName = distroCodeNameLinux
if v := linuxDeviceModel(); v != "" {
SetDeviceModel(v)
}
deviceModel = deviceModelLinux
}
var (
@ -50,7 +48,7 @@ func distroCodeNameLinux() string {
return lazyVersionMeta.Get().DistroCodeName
}
func linuxDeviceModel() string {
func deviceModelLinux() string {
for _, path := range []string{
// First try the Synology-specific location.
// Example: "DS916+-j"