Skip to content
This repository was archived by the owner on Feb 7, 2024. It is now read-only.

Commit 3206099

Browse files
committed
fix: use sync.Mutex instead of sync.Once to avoid race
1 parent 8e37330 commit 3206099

File tree

1 file changed

+24
-14
lines changed

1 file changed

+24
-14
lines changed

shell.go

+24-14
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ type Shell struct {
3838
url string
3939
httpcli gohttp.Client
4040

41-
versionOnce sync.Once
42-
version *semver.Version
41+
versionMu sync.Mutex
42+
version *semver.Version
4343
}
4444

4545
func NewLocalShell() *Shell {
@@ -130,33 +130,34 @@ func NewShellWithClient(url string, client *gohttp.Client) *Shell {
130130
// multipart requests is %-encoded. Before this version, its sent raw.
131131
var encodedAbsolutePathVersion = semver.MustParse("0.23.0-dev")
132132

133-
func (s *Shell) loadRemoteVersion() error {
133+
func (s *Shell) loadRemoteVersion() (*semver.Version, error) {
134+
s.versionMu.Lock()
135+
defer s.versionMu.Unlock()
136+
134137
if s.version == nil {
135138
version, _, err := s.Version()
136139
if err != nil {
137-
return err
140+
return nil, err
138141
}
139142

140143
remoteVersion, err := semver.New(version)
141144
if err != nil {
142-
return err
145+
return nil, err
143146
}
144147

145-
s.versionOnce.Do(func() {
146-
s.version = remoteVersion
147-
})
148+
s.version = remoteVersion
148149
}
149150

150-
return nil
151+
return s.version, nil
151152
}
152153

153154
func (s *Shell) newMultiFileReader(dir files.Directory) (*files.MultiFileReader, error) {
154-
err := s.loadRemoteVersion()
155+
version, err := s.loadRemoteVersion()
155156
if err != nil {
156157
return nil, err
157158
}
158159

159-
return files.NewMultiFileReader(dir, true, s.version.LT(encodedAbsolutePathVersion)), nil
160+
return files.NewMultiFileReader(dir, true, version.LT(encodedAbsolutePathVersion)), nil
160161
}
161162

162163
func (s *Shell) SetTimeout(d time.Duration) {
@@ -406,7 +407,10 @@ func (s *Shell) PatchData(root string, set bool, data interface{}) (string, erro
406407

407408
fr := files.NewReaderFile(read)
408409
slf := files.NewSliceDirectory([]files.DirEntry{files.FileEntry("", fr)})
409-
fileReader := files.NewMultiFileReader(slf, true, s.version.LT(encodedAbsolutePathVersion))
410+
fileReader, err := s.newMultiFileReader(slf)
411+
if err != nil {
412+
return "", err
413+
}
410414

411415
var out object
412416
return out.Hash, s.Request("object/patch/"+cmd, root).
@@ -508,7 +512,10 @@ func (s *Shell) BlockPut(block []byte, format, mhtype string, mhlen int) (string
508512

509513
fr := files.NewBytesFile(block)
510514
slf := files.NewSliceDirectory([]files.DirEntry{files.FileEntry("", fr)})
511-
fileReader := files.NewMultiFileReader(slf, true, s.version.LT(encodedAbsolutePathVersion))
515+
fileReader, err := s.newMultiFileReader(slf)
516+
if err != nil {
517+
return "", err
518+
}
512519

513520
return out.Key, s.Request("block/put").
514521
Option("mhtype", mhtype).
@@ -545,7 +552,10 @@ func (s *Shell) ObjectPut(obj *IpfsObject) (string, error) {
545552

546553
fr := files.NewReaderFile(&data)
547554
slf := files.NewSliceDirectory([]files.DirEntry{files.FileEntry("", fr)})
548-
fileReader := files.NewMultiFileReader(slf, true, s.version.LT(encodedAbsolutePathVersion))
555+
fileReader, err := s.newMultiFileReader(slf)
556+
if err != nil {
557+
return "", err
558+
}
549559

550560
var out object
551561
return out.Hash, s.Request("object/put").

0 commit comments

Comments
 (0)