From 27038ee3c281b69b76fd184b7cf77cc3ab063005 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Mon, 1 Apr 2024 16:26:20 -0400 Subject: [PATCH] hostinfo: cache device model to speed up init This was causing a relatively consistent ~10ms of delay on Linux. Signed-off-by: Kyle Carberry --- hostinfo/hostinfo.go | 22 ++++++++++++++++------ hostinfo/hostinfo_linux.go | 6 ++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/hostinfo/hostinfo.go b/hostinfo/hostinfo.go index 6fb1d231c..4ba7b4d61 100644 --- a/hostinfo/hostinfo.go +++ b/hostinfo/hostinfo.go @@ -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 { diff --git a/hostinfo/hostinfo_linux.go b/hostinfo/hostinfo_linux.go index d52c084b8..d194fbb0d 100644 --- a/hostinfo/hostinfo_linux.go +++ b/hostinfo/hostinfo_linux.go @@ -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"