Skip to content

Commit b168081

Browse files
Copilothsluoyz
andcommitted
perf(core): optimize rebuild() to avoid O(N^2) complexity
Temporarily disable detector during rebuild loop to prevent repeated cycle checks on each addLink call. Perform a single check at the end. This reduces rebuild() complexity from O(N^2) to O(N) when detector is enabled. - Save original detector before rebuild - Set detector to null during addLink loop - Restore detector and perform single check after loop - Properly restore detector in exception handler Co-authored-by: hsluoyz <3787410+hsluoyz@users.noreply.github.com>
1 parent 4ecff15 commit b168081

File tree

1 file changed

+23
-3
lines changed

1 file changed

+23
-3
lines changed

src/main/java/org/casbin/jcasbin/rbac/DefaultRoleManager.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,29 @@ public void setDetector(Detector detector) {
9595
private void rebuild() {
9696
Map<String, Role> roles = new HashMap<>(this.allRoles);
9797
this.clear();
98-
roles.values().forEach(user -> {
99-
user.getAllRoles().keySet().forEach(roleName -> addLink(user.getName(), roleName, DEFAULT_DOMAIN));
100-
});
98+
99+
// Temporarily disable detector to avoid O(N^2) complexity during rebuild
100+
Detector originalDetector = this.detector;
101+
this.detector = null;
102+
103+
try {
104+
roles.values().forEach(user -> {
105+
user.getAllRoles().keySet().forEach(roleName -> addLink(user.getName(), roleName, DEFAULT_DOMAIN));
106+
});
107+
108+
// Restore detector and perform single check at the end
109+
this.detector = originalDetector;
110+
if (this.detector != null) {
111+
String errorMsg = this.detector.check(this);
112+
if (errorMsg != null && !errorMsg.isEmpty()) {
113+
throw new IllegalArgumentException(errorMsg);
114+
}
115+
}
116+
} catch (IllegalArgumentException e) {
117+
// Restore detector before re-throwing
118+
this.detector = originalDetector;
119+
throw e;
120+
}
101121
}
102122

103123
boolean match(String str, String pattern) {

0 commit comments

Comments
 (0)