Skip to content

Commit 6bcf0a1

Browse files
authored
Merge branch 'master' into expose-history
2 parents d0d39c4 + a44a6d3 commit 6bcf0a1

File tree

1 file changed

+24
-27
lines changed

1 file changed

+24
-27
lines changed

internal/internal_worker.go

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

794795
func (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
878879
var binaryChecksumLock sync.Mutex
879880

880881
// SetBinaryChecksum set binary checksum
881882
func 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

925922
func 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

939936
func (aw *aggregatedWorker) Run() error {

0 commit comments

Comments
 (0)