use sync.Once instead of a mutex

Signed-off-by: Olga Shestopalova <oshestopalova1@gmail.com>
This commit is contained in:
Olga Shestopalova 2024-10-04 10:24:48 -04:00
parent 0746672679
commit a13e9f6457
No known key found for this signature in database

View File

@ -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
}