From 4074565a6b8197e153a6a3c29c46854c160c5e03 Mon Sep 17 00:00:00 2001 From: "A.Unger" Date: Thu, 30 Jul 2020 10:06:29 +0200 Subject: [PATCH 1/2] use global mutex --- pkg/service/v0/accounts.go | 9 +++++---- pkg/service/v0/groups.go | 7 ++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/pkg/service/v0/accounts.go b/pkg/service/v0/accounts.go index 6a3e8ec..f8a8f28 100644 --- a/pkg/service/v0/accounts.go +++ b/pkg/service/v0/accounts.go @@ -32,6 +32,9 @@ import ( _ "github.com/tredoe/osutil/user/crypt/sha512_crypt" ) +// M synchronizes access to account files to readers and writers +var M sync.RWMutex + func (s Service) indexAccounts(path string) (err error) { var f *os.File if f, err = os.Open(path); err != nil { @@ -85,8 +88,6 @@ func (s Service) loadAccount(id string, a *proto.Account) (err error) { return } -var accountMutex sync.Mutex - func (s Service) writeAccount(a *proto.Account) (err error) { // leave only the group id @@ -99,8 +100,8 @@ func (s Service) writeAccount(a *proto.Account) (err error) { path := filepath.Join(s.Config.Server.AccountsDataPath, "accounts", a.Id) - accountMutex.Lock() - defer accountMutex.Unlock() + M.Lock() + defer M.Unlock() if err = ioutil.WriteFile(path, bytes, 0600); err != nil { return merrors.InternalServerError(s.id, "could not write account: %v", err.Error()) } diff --git a/pkg/service/v0/groups.go b/pkg/service/v0/groups.go index 150dc7d..5d8b887 100644 --- a/pkg/service/v0/groups.go +++ b/pkg/service/v0/groups.go @@ -6,7 +6,6 @@ import ( "io/ioutil" "os" "path/filepath" - "sync" "github.com/CiscoM31/godata" "github.com/blevesearch/bleve" @@ -67,8 +66,6 @@ func (s Service) loadGroup(id string, g *proto.Group) (err error) { return } -var groupMutex sync.Mutex - func (s Service) writeGroup(g *proto.Group) (err error) { // leave only the member id @@ -81,8 +78,8 @@ func (s Service) writeGroup(g *proto.Group) (err error) { path := filepath.Join(s.Config.Server.AccountsDataPath, "groups", g.Id) - groupMutex.Lock() - defer groupMutex.Unlock() + M.Lock() + defer M.Unlock() if err = ioutil.WriteFile(path, bytes, 0600); err != nil { return merrors.InternalServerError(s.id, "could not write group: %v", err.Error()) } From c432f296ebbebf4c23ae80c4fac1d25baef29414 Mon Sep 17 00:00:00 2001 From: "A.Unger" Date: Thu, 30 Jul 2020 10:10:52 +0200 Subject: [PATCH 2/2] set lock on read --- pkg/service/v0/accounts.go | 11 +++++++---- pkg/service/v0/groups.go | 10 ++++++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/pkg/service/v0/accounts.go b/pkg/service/v0/accounts.go index f8a8f28..18d0429 100644 --- a/pkg/service/v0/accounts.go +++ b/pkg/service/v0/accounts.go @@ -32,8 +32,8 @@ import ( _ "github.com/tredoe/osutil/user/crypt/sha512_crypt" ) -// M synchronizes access to account files to readers and writers -var M sync.RWMutex +// accLock mutually exclude readers from writers on account files +var accLock sync.RWMutex func (s Service) indexAccounts(path string) (err error) { var f *os.File @@ -77,6 +77,9 @@ var authQuery = regexp.MustCompile(`^login eq '(.*)' and password eq '(.*)'$`) / func (s Service) loadAccount(id string, a *proto.Account) (err error) { path := filepath.Join(s.Config.Server.AccountsDataPath, "accounts", id) + accLock.Lock() + defer accLock.Unlock() + var data []byte if data, err = ioutil.ReadFile(path); err != nil { return merrors.NotFound(s.id, "could not read account: %v", err.Error()) @@ -100,8 +103,8 @@ func (s Service) writeAccount(a *proto.Account) (err error) { path := filepath.Join(s.Config.Server.AccountsDataPath, "accounts", a.Id) - M.Lock() - defer M.Unlock() + accLock.Lock() + defer accLock.Unlock() if err = ioutil.WriteFile(path, bytes, 0600); err != nil { return merrors.InternalServerError(s.id, "could not write account: %v", err.Error()) } diff --git a/pkg/service/v0/groups.go b/pkg/service/v0/groups.go index 5d8b887..63ca4a0 100644 --- a/pkg/service/v0/groups.go +++ b/pkg/service/v0/groups.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "os" "path/filepath" + "sync" "github.com/CiscoM31/godata" "github.com/blevesearch/bleve" @@ -35,6 +36,9 @@ func (s Service) indexGroups(path string) (err error) { return } +// accLock mutually exclude readers from writers on group files +var groupLock sync.RWMutex + func (s Service) indexGroup(id string) error { g := &proto.BleveGroup{ BleveType: "group", @@ -54,6 +58,8 @@ func (s Service) indexGroup(id string) error { func (s Service) loadGroup(id string, g *proto.Group) (err error) { path := filepath.Join(s.Config.Server.AccountsDataPath, "groups", id) + groupLock.Lock() + defer groupLock.Unlock() var data []byte if data, err = ioutil.ReadFile(path); err != nil { return merrors.NotFound(s.id, "could not read group: %v", err.Error()) @@ -78,8 +84,8 @@ func (s Service) writeGroup(g *proto.Group) (err error) { path := filepath.Join(s.Config.Server.AccountsDataPath, "groups", g.Id) - M.Lock() - defer M.Unlock() + groupLock.Lock() + defer groupLock.Unlock() if err = ioutil.WriteFile(path, bytes, 0600); err != nil { return merrors.InternalServerError(s.id, "could not write group: %v", err.Error()) }