Skip to content

Commit 53825a1

Browse files
committed
feat: optimizing retrieval of jobs when using token to auth
1 parent 026c2c8 commit 53825a1

File tree

4 files changed

+106
-22
lines changed

4 files changed

+106
-22
lines changed

logging.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Logging
22
handlers = java.util.logging.ConsoleHandler
3-
org.jenkinsci.plugins.gwt.level = FINE
3+
org.jenkinsci.plugins.gwt.level = FINEST
44

55
# Console Logging
6-
java.util.logging.ConsoleHandler.level = FINE
6+
java.util.logging.ConsoleHandler.level = FINEST
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.jenkinsci.plugins.gwt.jobfinder;
2+
3+
import hudson.triggers.Trigger;
4+
import hudson.triggers.TriggerDescriptor;
5+
import java.util.Map;
6+
import org.jenkinsci.plugins.gwt.GenericTrigger;
7+
8+
public class GenericTriggerFinder {
9+
public static GenericTrigger findGenericTrigger(
10+
final Map<TriggerDescriptor, Trigger<?>> triggers) {
11+
if (triggers == null) {
12+
return null;
13+
}
14+
for (final Trigger<?> candidate : triggers.values()) {
15+
if (candidate instanceof GenericTrigger) {
16+
return (GenericTrigger) candidate;
17+
}
18+
}
19+
return null;
20+
}
21+
}

src/main/java/org/jenkinsci/plugins/gwt/jobfinder/JobFinder.java

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,8 @@
77
import com.google.common.annotations.VisibleForTesting;
88
import com.google.common.base.Optional;
99
import hudson.model.Item;
10-
import hudson.triggers.Trigger;
11-
import hudson.triggers.TriggerDescriptor;
1210
import java.util.ArrayList;
1311
import java.util.List;
14-
import java.util.Map;
1512
import java.util.logging.Level;
1613
import java.util.logging.Logger;
1714
import jenkins.model.ParameterizedJobMixIn.ParameterizedJob;
@@ -40,7 +37,8 @@ public static List<FoundJob> findAllJobsWithTrigger(final String givenToken) {
4037
final List<ParameterizedJob> candidateProjects =
4138
jobFinderImpersonater.getAllParameterizedJobs(impersonate);
4239
for (final ParameterizedJob candidateJob : candidateProjects) {
43-
final GenericTrigger genericTriggerOpt = findGenericTrigger(candidateJob.getTriggers());
40+
final GenericTrigger genericTriggerOpt =
41+
GenericTriggerFinder.findGenericTrigger(candidateJob.getTriggers());
4442
if (genericTriggerOpt != null) {
4543
final String configuredToken =
4644
determineTokenValue(
@@ -116,17 +114,4 @@ private static boolean authenticationTokenMatchesGeneric(
116114
}
117115
return false;
118116
}
119-
120-
private static GenericTrigger findGenericTrigger(
121-
final Map<TriggerDescriptor, Trigger<?>> triggers) {
122-
if (triggers == null) {
123-
return null;
124-
}
125-
for (final Trigger<?> candidate : triggers.values()) {
126-
if (candidate instanceof GenericTrigger) {
127-
return (GenericTrigger) candidate;
128-
}
129-
}
130-
return null;
131-
}
132117
}

src/main/java/org/jenkinsci/plugins/gwt/jobfinder/JobFinderImpersonater.java

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,47 @@
11
package org.jenkinsci.plugins.gwt.jobfinder;
22

3+
import hudson.Extension;
4+
import hudson.model.Item;
5+
import hudson.model.listeners.ItemListener;
36
import hudson.security.ACL;
7+
import java.util.ArrayList;
48
import java.util.List;
9+
import java.util.Map;
10+
import java.util.TreeSet;
11+
import java.util.concurrent.ConcurrentHashMap;
12+
import java.util.logging.Level;
513
import java.util.logging.Logger;
614
import jenkins.model.Jenkins;
715
import jenkins.model.ParameterizedJobMixIn.ParameterizedJob;
816
import org.acegisecurity.context.SecurityContext;
917
import org.acegisecurity.context.SecurityContextHolder;
1018

11-
public class JobFinderImpersonater {
19+
@Extension
20+
public class JobFinderImpersonater extends ItemListener {
1221
private static Logger LOGGER = Logger.getLogger(JobFinderImpersonater.class.getName());
13-
14-
public JobFinderImpersonater() {}
22+
private static final Map<String, ParameterizedJob> JOBS_WITH_GWT = new ConcurrentHashMap<>();
1523

1624
public List<ParameterizedJob> getAllParameterizedJobs(final boolean impersonate) {
25+
if (LOGGER.isLoggable(Level.FINEST)) {
26+
LOGGER.finest("There are " + this.JOBS_WITH_GWT.size() + " jobs in cache:");
27+
final TreeSet<String> sortedSet = new TreeSet<>(this.JOBS_WITH_GWT.keySet());
28+
for (final String job : sortedSet) {
29+
LOGGER.finest(" " + job);
30+
}
31+
}
32+
if (impersonate) {
33+
LOGGER.log(Level.FINE, "Using the cache");
34+
return new ArrayList<>(this.JOBS_WITH_GWT.values());
35+
}
36+
LOGGER.log(
37+
Level.FINE,
38+
"Not using the cache because jobs are not retreieved with impersonation SYSTEM. "
39+
+ "SYSTEM is only impersonated when using a token."
40+
+ " If SYSTEM is not impersonated, only jobs available for the currently authenticated user is found.");
41+
return doGetAllParameterizedJobs(impersonate);
42+
}
43+
44+
private static List<ParameterizedJob> doGetAllParameterizedJobs(final boolean impersonate) {
1745
SecurityContext orig = null;
1846
try {
1947
if (impersonate) {
@@ -26,4 +54,54 @@ public List<ParameterizedJob> getAllParameterizedJobs(final boolean impersonate)
2654
}
2755
}
2856
}
57+
58+
@Override
59+
public void onLoaded() {
60+
for (final ParameterizedJob job : doGetAllParameterizedJobs(true)) {
61+
this.putJob(job);
62+
}
63+
LOGGER.info("Loaded " + this.JOBS_WITH_GWT.size() + " jobs in cache");
64+
}
65+
66+
@Override
67+
public void onUpdated(final Item job) {
68+
this.putJob(job);
69+
}
70+
71+
@Override
72+
public void onCreated(final Item job) {
73+
this.putJob(job);
74+
}
75+
76+
@Override
77+
public void onDeleted(final Item job) {
78+
this.deleteJob(job);
79+
}
80+
81+
@Override
82+
public void onCopied(final Item src, final Item job) {
83+
this.putJob(job);
84+
}
85+
86+
@Override
87+
public void onLocationChanged(
88+
final Item item, final String oldFullName, final String newFullName) {
89+
this.JOBS_WITH_GWT.remove(oldFullName);
90+
this.putJob(item);
91+
}
92+
93+
private void putJob(final Item job) {
94+
if (job instanceof ParameterizedJob) {
95+
final ParameterizedJob parameterizedJob = (ParameterizedJob) job;
96+
final boolean hasGenericTrigger =
97+
GenericTriggerFinder.findGenericTrigger(parameterizedJob.getTriggers()) != null;
98+
if (hasGenericTrigger) {
99+
this.JOBS_WITH_GWT.put(parameterizedJob.getFullName(), parameterizedJob);
100+
}
101+
}
102+
}
103+
104+
private void deleteJob(final Item job) {
105+
this.JOBS_WITH_GWT.remove(job.getFullName());
106+
}
29107
}

0 commit comments

Comments
 (0)