Browse Source

Merge pull request #5635 from xiang90/cl

auth: clean up range_perm_cache.go
Xiang Li 9 years ago
parent
commit
3eab6bef6a
2 changed files with 17 additions and 19 deletions
  1. 16 18
      auth/range_perm_cache.go
  2. 1 1
      auth/range_perm_cache_test.go

+ 16 - 18
auth/range_perm_cache.go

@@ -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 {
-	ret := make([]*rangePerm, 0)
-	perms = reduceSubsets(perms)
+// mergeRangePerms merges adjacent rangePerms.
+func mergeRangePerms(perms []*rangePerm) []*rangePerm {
+	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
-		for i+1 < len(perms) && perms[i].end >= perms[i+1].begin {
-			i++
+		begin, next := i, i
+		for next+1 < len(perms) && perms[next].end >= perms[next+1].begin {
+			next++
 		}
 		}
 
 
-		if i == begin {
-			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})
-		}
+		merged = append(merged, &rangePerm{begin: perms[begin].begin, end: perms[next].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 {

+ 1 - 1
auth/range_perm_cache_test.go

@@ -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)
 		}
 		}