storage: Improve thread safety
This commit is contained in:
+21
-2
@@ -219,6 +219,8 @@ type fsLockedRepo struct {
|
||||
ds datastore.Batching
|
||||
dsErr error
|
||||
dsOnce sync.Once
|
||||
|
||||
storageLk sync.Mutex
|
||||
}
|
||||
|
||||
func (fsr *fsLockedRepo) Path() string {
|
||||
@@ -278,6 +280,13 @@ func (fsr *fsLockedRepo) Config() (interface{}, error) {
|
||||
}
|
||||
|
||||
func (fsr *fsLockedRepo) GetStorage() (config.StorageConfig, error) {
|
||||
fsr.storageLk.Lock()
|
||||
defer fsr.storageLk.Unlock()
|
||||
|
||||
return fsr.getStorage()
|
||||
}
|
||||
|
||||
func (fsr *fsLockedRepo) getStorage() (config.StorageConfig, error) {
|
||||
c, err := config.StorageFromFile(fsr.join(fsStorageConfig), nil)
|
||||
if err != nil {
|
||||
return config.StorageConfig{}, err
|
||||
@@ -285,8 +294,18 @@ func (fsr *fsLockedRepo) GetStorage() (config.StorageConfig, error) {
|
||||
return *c, nil
|
||||
}
|
||||
|
||||
func (fsr *fsLockedRepo) SetStorage(c config.StorageConfig) error {
|
||||
return config.WriteStorageFile(fsr.join(fsStorageConfig), c)
|
||||
func (fsr *fsLockedRepo) SetStorage(c func(*config.StorageConfig)) error {
|
||||
fsr.storageLk.Lock()
|
||||
defer fsr.storageLk.Unlock()
|
||||
|
||||
sc, err := fsr.getStorage()
|
||||
if err != nil {
|
||||
return xerrors.Errorf("get storage: %w", err)
|
||||
}
|
||||
|
||||
c(&sc)
|
||||
|
||||
return config.WriteStorageFile(fsr.join(fsStorageConfig), sc)
|
||||
}
|
||||
|
||||
func (fsr *fsLockedRepo) SetAPIEndpoint(ma multiaddr.Multiaddr) error {
|
||||
|
||||
@@ -39,7 +39,7 @@ type LockedRepo interface {
|
||||
Config() (interface{}, error)
|
||||
|
||||
GetStorage() (config.StorageConfig, error)
|
||||
SetStorage(config.StorageConfig) error
|
||||
SetStorage(func(*config.StorageConfig)) error
|
||||
|
||||
// SetAPIEndpoint sets the endpoint of the current API
|
||||
// so it can be read by API clients
|
||||
|
||||
@@ -53,8 +53,10 @@ func (lmem *lockedMemRepo) GetStorage() (config.StorageConfig, error) {
|
||||
return *lmem.sc, nil
|
||||
}
|
||||
|
||||
func (lmem *lockedMemRepo) SetStorage(sc config.StorageConfig) error {
|
||||
lmem.sc = &sc
|
||||
func (lmem *lockedMemRepo) SetStorage(c func(*config.StorageConfig)) error {
|
||||
_, _ = lmem.GetStorage()
|
||||
|
||||
c(lmem.sc)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user