@@ -36,6 +36,7 @@ import (
3636 "strconv"
3737 "strings"
3838 "sync"
39+ "sync/atomic"
3940 "time"
4041
4142 "go.uber.org/cadence/internal/common/isolationgroup"
@@ -792,7 +793,7 @@ func (aw *aggregatedWorker) RegisterActivityWithOptions(a interface{}, options R
792793}
793794
794795func (aw * aggregatedWorker ) Start () error {
795- if err := initBinaryChecksum (); err != nil {
796+ if _ , err := initBinaryChecksum (); err != nil {
796797 return fmt .Errorf ("failed to get executable checksum: %v" , err )
797798 }
798799
@@ -874,66 +875,62 @@ func (aw *aggregatedWorker) Start() error {
874875 return nil
875876}
876877
877- var binaryChecksum string
878+ var binaryChecksum atomic. Value
878879var binaryChecksumLock sync.Mutex
879880
880881// SetBinaryChecksum set binary checksum
881882func SetBinaryChecksum (checksum string ) {
882- binaryChecksumLock .Lock ()
883- defer binaryChecksumLock .Unlock ()
884-
885- binaryChecksum = checksum
883+ binaryChecksum .Store (checksum )
886884}
887885
888- func initBinaryChecksum () error {
886+ func initBinaryChecksum () (string , error ) {
887+ // initBinaryChecksum may be called multiple times concurrently during worker startup.
888+ // To avoid reading and hashing the contents of the binary multiple times acquire mutex here.
889889 binaryChecksumLock .Lock ()
890890 defer binaryChecksumLock .Unlock ()
891891
892- return initBinaryChecksumLocked ()
893- }
894-
895- // callers MUST hold binaryChecksumLock before calling
896- func initBinaryChecksumLocked () error {
897- if len (binaryChecksum ) > 0 {
898- return nil
892+ // check if binaryChecksum already set/initialized.
893+ if bcsVal , ok := binaryChecksum .Load ().(string ); ok {
894+ return bcsVal , nil
899895 }
900896
901897 exec , err := os .Executable ()
902898 if err != nil {
903- return err
899+ return "" , err
904900 }
905901
906902 f , err := os .Open (exec )
907903 if err != nil {
908- return err
904+ return "" , err
909905 }
910906 defer func () {
911907 _ = f .Close () // error is unimportant as it is read-only
912908 }()
913909
914910 h := md5 .New ()
915911 if _ , err := io .Copy (h , f ); err != nil {
916- return err
912+ return "" , err
917913 }
918914
919915 checksum := h .Sum (nil )
920- binaryChecksum = hex .EncodeToString (checksum [:])
916+ bcsVal := hex .EncodeToString (checksum [:])
917+ binaryChecksum .Store (bcsVal )
921918
922- return nil
919+ return bcsVal , err
923920}
924921
925922func getBinaryChecksum () string {
926- binaryChecksumLock .Lock ()
927- defer binaryChecksumLock .Unlock ()
923+ bcsVal , ok := binaryChecksum .Load ().(string )
924+ if ok {
925+ return bcsVal
926+ }
928927
929- if len (binaryChecksum ) == 0 {
930- err := initBinaryChecksumLocked ()
931- if err != nil {
932- panic (err )
933- }
928+ bcsVal , err := initBinaryChecksum ()
929+ if err != nil {
930+ panic (err )
934931 }
935932
936- return binaryChecksum
933+ return bcsVal
937934}
938935
939936func (aw * aggregatedWorker ) Run () error {
0 commit comments