From cccb97d5f0ed6cdef1a64f9bb37266cfc81b52d1 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Wed, 5 Apr 2023 19:30:00 -0700 Subject: [PATCH] Switch to sync.Map because go maps are unsound --- model/experiments.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/model/experiments.go b/model/experiments.go index 2c940de..6bffdd9 100644 --- a/model/experiments.go +++ b/model/experiments.go @@ -6,15 +6,20 @@ import "sync" // examples of experiments include File Sharing, Profile Images and Groups. type Experiments struct { enabled bool - experiments map[string]bool - lock sync.Mutex + experiments sync.Map } // InitExperiments encapsulates a set of experiments separate from their storage in GlobalSettings. func InitExperiments(enabled bool, experiments map[string]bool) Experiments { + + var syncExperiments sync.Map + for experiment, set := range experiments { + syncExperiments.Store(experiment, set) + } + return Experiments{ enabled: enabled, - experiments: experiments, + experiments: syncExperiments, } } @@ -28,12 +33,9 @@ func (e *Experiments) IsEnabled(experiment string) bool { return false } - // go will sometimes panic if we do not lock this read-only map... - e.lock.Lock() - defer e.lock.Unlock() - enabled, exists := e.experiments[experiment] + enabled, exists := e.experiments.Load(experiment) if !exists { return false } - return enabled + return enabled.(bool) }