Skip to content

Commit 8734b9a

Browse files
committed
utils: use optimal path then creating Subject from unix principals
Motivation: The sanity checks in Subject class are too expensive when to constructor set of principal is passed, as internally a new LinkedList copy is created: Benchmark Mode Cnt Score Error Units SubjectBenchmark.subjectByAddingToSet thrpt 9 2061025.436 ± 24807.881 ops/s SubjectBenchmark.subjectByPassingSet thrpt 9 1341492.178 ± 34701.882 ops/s Modification: Update UnixSubjects#toSubject to use more optimal form. Added benchmark. Result: Not a real performance boost, but anyway :) Acked-by: Karen Hoyos Target: master
1 parent d8893d9 commit 8734b9a

File tree

2 files changed

+63
-10
lines changed

2 files changed

+63
-10
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.dcache.nfs.benchmarks;
2+
3+
import com.sun.security.auth.UnixNumericGroupPrincipal;
4+
import com.sun.security.auth.UnixNumericUserPrincipal;
5+
import java.security.Principal;
6+
import java.util.Set;
7+
import javax.security.auth.Subject;
8+
import org.openjdk.jmh.annotations.Benchmark;
9+
import org.openjdk.jmh.annotations.BenchmarkMode;
10+
11+
import org.openjdk.jmh.annotations.Mode;
12+
import org.openjdk.jmh.annotations.Scope;
13+
import org.openjdk.jmh.annotations.State;
14+
15+
@BenchmarkMode(Mode.Throughput)
16+
@State(Scope.Benchmark)
17+
public class SubjectBenchmark {
18+
19+
20+
@Benchmark
21+
public Subject subjectByAddingToSet() {
22+
Subject subject = new Subject();
23+
subject.getPrincipals().add(new UnixNumericUserPrincipal(0));
24+
subject.getPrincipals().add(new UnixNumericGroupPrincipal(0, true));
25+
subject.getPrincipals().add(new UnixNumericGroupPrincipal(1, false));
26+
subject.getPrincipals().add(new UnixNumericGroupPrincipal(2, false));
27+
subject.getPrincipals().add(new UnixNumericGroupPrincipal(3, false));
28+
subject.getPrincipals().add(new UnixNumericGroupPrincipal(4, false));
29+
subject.getPrincipals().add(new UnixNumericGroupPrincipal(5, false));
30+
subject.getPrincipals().add(new UnixNumericGroupPrincipal(6, false));
31+
subject.setReadOnly();
32+
return subject;
33+
}
34+
35+
36+
@Benchmark
37+
public Subject subjectByPassingSet() {
38+
39+
Principal[] principals = new Principal[]{
40+
new UnixNumericUserPrincipal(0),
41+
new UnixNumericGroupPrincipal(0, true),
42+
new UnixNumericGroupPrincipal(1, false),
43+
new UnixNumericGroupPrincipal(2, false),
44+
new UnixNumericGroupPrincipal(3, false),
45+
new UnixNumericGroupPrincipal(4, false),
46+
new UnixNumericGroupPrincipal(5, false),
47+
new UnixNumericGroupPrincipal(6, false)
48+
};
49+
50+
return new Subject(true, Set.of(principals), Set.of(), Set.of());
51+
}
52+
}
53+
54+

core/src/main/java/org/dcache/nfs/util/UnixSubjects.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,11 @@ public static boolean hasGid(Subject subject, long gid) {
9595
* @return subject with given uid, gid.
9696
*/
9797
public static Subject toSubject(long uid, long gid) {
98-
return new Subject(false,
99-
Set.of(new UnixNumericUserPrincipal(uid), new UnixNumericGroupPrincipal(gid, true)),
100-
Set.of(),
101-
Set.of());
98+
var subject = new Subject();
99+
subject.getPrincipals().add(new UnixNumericUserPrincipal(uid));
100+
subject.getPrincipals().add(new UnixNumericGroupPrincipal(gid, true));
101+
102+
return subject;
102103
}
103104

104105
/**
@@ -110,12 +111,10 @@ public static Subject toSubject(long uid, long gid) {
110111
* @return subject with given uid, gid and gids.
111112
*/
112113
public static Subject toSubject(long uid, long gid, long... gids) {
113-
Subject subject = toSubject(uid, gid);
114-
subject.getPrincipals()
115-
.addAll(
116-
Arrays.stream(gids)
117-
.mapToObj(l -> new UnixNumericGroupPrincipal(l, false))
118-
.collect(Collectors.toSet()));
114+
var subject = toSubject(uid, gid);
115+
for (long aux : gids) {
116+
subject.getPrincipals().add(new UnixNumericGroupPrincipal(aux, false));
117+
}
119118
return subject;
120119
}
121120

0 commit comments

Comments
 (0)