From a13e9f64573afc3605b9fe21423663ebad4278cb Mon Sep 17 00:00:00 2001 From: Olga Shestopalova Date: Fri, 4 Oct 2024 10:24:48 -0400 Subject: [PATCH] use sync.Once instead of a mutex Signed-off-by: Olga Shestopalova --- pkg/volume/flexvolume/probe.go | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/pkg/volume/flexvolume/probe.go b/pkg/volume/flexvolume/probe.go index dd4b0370d58..65b53fb4e7a 100644 --- a/pkg/volume/flexvolume/probe.go +++ b/pkg/volume/flexvolume/probe.go @@ -40,6 +40,7 @@ type flexVolumeProber struct { factory PluginFactory fs utilfs.Filesystem probeAllNeeded bool + probeAllOnce sync.Once eventsMap map[string]volume.ProbeOperation // the key is the driver directory path, the value is the corresponding operation } @@ -55,7 +56,7 @@ func GetDynamicPluginProber(pluginDir string, runner exec.Interface) volume.Dyna } func (prober *flexVolumeProber) Init() error { - prober.testAndSetProbeAllNeeded(true) + prober.probeAllNeeded = true prober.eventsMap = map[string]volume.ProbeOperation{} if err := prober.createPluginDir(); err != nil { @@ -68,23 +69,18 @@ func (prober *flexVolumeProber) Init() error { return nil } -// If probeAllNeeded is true, probe all pluginDir +// If we haven't yet done so, probe all pluginDir // else probe events in eventsMap func (prober *flexVolumeProber) Probe() (events []volume.ProbeEvent, err error) { - prober.mutex.RLock() - if prober.probeAllNeeded { - prober.mutex.RUnlock() - prober.mutex.Lock() - // check again, if multiple readers got through the first if, only one should probeAll - if prober.probeAllNeeded { - events, err = prober.probeAll() - prober.probeAllNeeded = false - prober.mutex.Unlock() - return - } - prober.mutex.Unlock() + probedAll := false + prober.probeAllOnce.Do(func() { + events, err = prober.probeAll() + probedAll = true + prober.probeAllNeeded = false + }) + if probedAll { + return events, err } - prober.mutex.RUnlock() return prober.probeMap() } @@ -287,10 +283,3 @@ func (prober *flexVolumeProber) createPluginDir() error { return nil } - -func (prober *flexVolumeProber) testAndSetProbeAllNeeded(newval bool) (oldval bool) { - prober.mutex.Lock() - defer prober.mutex.Unlock() - oldval, prober.probeAllNeeded = prober.probeAllNeeded, newval - return -}