auth: clean up range_perm_cache.go

release-3.0
Xiang Li 2016-06-10 15:21:04 -07:00
parent 65abcc1a59
commit 77efe4cda9
2 changed files with 17 additions and 19 deletions

View File

@ -27,9 +27,10 @@ func isSubset(a, b *rangePerm) bool {
return 0 <= strings.Compare(a.begin, b.begin) && strings.Compare(a.end, b.end) <= 0 return 0 <= strings.Compare(a.begin, b.begin) && strings.Compare(a.end, b.end) <= 0
} }
func reduceSubsets(perms []*rangePerm) []*rangePerm { // removeSubsetRangePerms removes any rangePerms that are subsets of other rangePerms.
func removeSubsetRangePerms(perms []*rangePerm) []*rangePerm {
// TODO(mitake): currently it is O(n^2), we need a better algorithm // TODO(mitake): currently it is O(n^2), we need a better algorithm
ret := make([]*rangePerm, 0) newp := make([]*rangePerm, 0)
for i := range perms { for i := range perms {
subset := false subset := false
@ -45,34 +46,31 @@ func reduceSubsets(perms []*rangePerm) []*rangePerm {
continue continue
} }
ret = append(ret, perms[i]) newp = append(newp, perms[i])
} }
return ret return newp
} }
func unifyPerms(perms []*rangePerm) []*rangePerm { // mergeRangePerms merges adjacent rangePerms.
ret := make([]*rangePerm, 0) func mergeRangePerms(perms []*rangePerm) []*rangePerm {
perms = reduceSubsets(perms) merged := make([]*rangePerm, 0)
perms = removeSubsetRangePerms(perms)
sort.Sort(RangePermSliceByBegin(perms)) sort.Sort(RangePermSliceByBegin(perms))
i := 0 i := 0
for i < len(perms) { for i < len(perms) {
begin := i begin, next := i, i
for i+1 < len(perms) && perms[i].end >= perms[i+1].begin { for next+1 < len(perms) && perms[next].end >= perms[next+1].begin {
i++ next++
} }
if i == begin { merged = append(merged, &rangePerm{begin: perms[begin].begin, end: perms[next].end})
ret = append(ret, &rangePerm{begin: perms[i].begin, end: perms[i].end})
} else {
ret = append(ret, &rangePerm{begin: perms[begin].begin, end: perms[i].end})
}
i++ i = next + 1
} }
return ret return merged
} }
func (as *authStore) makeUnifiedPerms(tx backend.BatchTx, userName string) *unifiedRangePermissions { func (as *authStore) makeUnifiedPerms(tx backend.BatchTx, userName string) *unifiedRangePermissions {
@ -105,7 +103,7 @@ func (as *authStore) makeUnifiedPerms(tx backend.BatchTx, userName string) *unif
} }
} }
return &unifiedRangePermissions{readPerms: unifyPerms(readPerms), writePerms: unifyPerms(writePerms)} return &unifiedRangePermissions{readPerms: mergeRangePerms(readPerms), writePerms: mergeRangePerms(writePerms)}
} }
func checkCachedPerm(cachedPerms *unifiedRangePermissions, userName string, key, rangeEnd string, write, read bool) bool { func checkCachedPerm(cachedPerms *unifiedRangePermissions, userName string, key, rangeEnd string, write, read bool) bool {

View File

@ -88,7 +88,7 @@ func TestUnifyParams(t *testing.T) {
} }
for i, tt := range tests { for i, tt := range tests {
result := unifyPerms(tt.params) result := mergeRangePerms(tt.params)
if !isPermsEqual(result, tt.want) { if !isPermsEqual(result, tt.want) {
t.Errorf("#%d: result=%q, want=%q", i, result, tt.want) t.Errorf("#%d: result=%q, want=%q", i, result, tt.want)
} }