Skip to content

Commit

Permalink
Revert "fix: lock less when syncing (casbin#988)"
Browse files Browse the repository at this point in the history
This reverts commit 756b994.
  • Loading branch information
johanneswuerbach committed Jun 3, 2022
1 parent 290ed05 commit 8cc7c19
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 64 deletions.
73 changes: 34 additions & 39 deletions enforcer.go
Expand Up @@ -287,37 +287,46 @@ func (e *Enforcer) ClearPolicy() {

// LoadPolicy reloads the policy from file/database.
func (e *Enforcer) LoadPolicy() error {
newModel, err := e.prepareNewModel(e.model.Copy())
if err != nil {
return err
}
needToRebuild := false
newModel := e.model.Copy()
newModel.ClearPolicy()

if e.autoBuildRoleLinks {
if err := e.tryBuildingRoleLinksWithModel(newModel); err != nil {
return err
var err error
defer func() {
if err != nil {
if e.autoBuildRoleLinks && needToRebuild {
_ = e.BuildRoleLinks()
}
}
}
e.model = newModel
return nil
}

// prepareNewModel prepares a new model with the policy from file/database.
func (e *Enforcer) prepareNewModel(newModel model.Model) (model.Model, error) {
newModel.ClearPolicy()
}()

if err := e.adapter.LoadPolicy(newModel); err != nil && err.Error() != "invalid file path, file path cannot be empty" {
return nil, err
if err = e.adapter.LoadPolicy(newModel); err != nil && err.Error() != "invalid file path, file path cannot be empty" {
return err
}

if err := newModel.SortPoliciesBySubjectHierarchy(); err != nil {
return nil, err
if err = newModel.SortPoliciesBySubjectHierarchy(); err != nil {
return err
}

if err := newModel.SortPoliciesByPriority(); err != nil {
return nil, err
if err = newModel.SortPoliciesByPriority(); err != nil {
return err
}

return newModel, nil
if e.autoBuildRoleLinks {
needToRebuild = true
for _, rm := range e.rmMap {
err := rm.Clear()
if err != nil {
return err
}
}
err = newModel.BuildRoleLinks(e.rmMap)
if err != nil {
return err
}
}
e.model = newModel
return nil
}

func (e *Enforcer) loadFilteredPolicy(filter interface{}) error {
Expand Down Expand Up @@ -435,30 +444,16 @@ func (e *Enforcer) EnableAutoBuildRoleLinks(autoBuildRoleLinks bool) {
e.autoBuildRoleLinks = autoBuildRoleLinks
}

// buildingRoleLinksWithModel attempts to build the role links for a new model
func (e *Enforcer) buildingRoleLinksWithModel(newModel model.Model) error {
// BuildRoleLinks manually rebuild the role inheritance relations.
func (e *Enforcer) BuildRoleLinks() error {
for _, rm := range e.rmMap {
err := rm.Clear()
if err != nil {
return err
}
}

return newModel.BuildRoleLinks(e.rmMap)
}

// BuildRoleLinks manually rebuild the role inheritance relations.
func (e *Enforcer) BuildRoleLinks() error {
return e.buildingRoleLinksWithModel(e.model)
}

// tryBuildingRoleLinksWithModel attempts to build the role links for a new model falls back to the existing model in case of errors
func (e *Enforcer) tryBuildingRoleLinksWithModel(newModel model.Model) error {
if err := e.buildingRoleLinksWithModel(newModel); err != nil {
_ = e.buildingRoleLinksWithModel(e.model)
return err
}
return nil
return e.model.BuildRoleLinks(e.rmMap)
}

// BuildIncrementalRoleLinks provides incremental build the role inheritance relations.
Expand Down
16 changes: 1 addition & 15 deletions enforcer_synced.go
Expand Up @@ -110,23 +110,9 @@ func (e *SyncedEnforcer) ClearPolicy() {

// LoadPolicy reloads the policy from file/database.
func (e *SyncedEnforcer) LoadPolicy() error {
e.m.RLock()
cleanedNewModel := e.model.Copy()
e.m.RUnlock()
newModel, err := e.prepareNewModel(cleanedNewModel)
if err != nil {
return err
}

e.m.Lock()
defer e.m.Unlock()
if e.autoBuildRoleLinks {
if err := e.tryBuildingRoleLinksWithModel(newModel); err != nil {
return err
}
}
e.model = newModel
return nil
return e.Enforcer.LoadPolicy()
}

// LoadFilteredPolicy reloads a filtered policy from file/database.
Expand Down
9 changes: 0 additions & 9 deletions enforcer_synced_test.go
Expand Up @@ -40,15 +40,6 @@ func TestSync(t *testing.T) {
testEnforceSync(t, e, "bob", "data2", "read", false)
testEnforceSync(t, e, "bob", "data2", "write", true)

// Simulate a policy change
e.ClearPolicy()
testEnforceSync(t, e, "bob", "data2", "write", false)

// Wait for at least one sync
time.Sleep(time.Millisecond * 300)

testEnforceSync(t, e, "bob", "data2", "write", true)

// Stop the reloading policy periodically.
e.StopAutoLoadPolicy()
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Expand Up @@ -5,4 +5,4 @@ require (
github.com/golang/mock v1.4.4
)

go 1.13
go 1.13

0 comments on commit 8cc7c19

Please sign in to comment.