From bf444887ac16cc802695827da0a0f30949aa0f1f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 27 Aug 2013 12:22:26 -0400 Subject: [PATCH] [FIXED JENKINS-19377] ViewJob.removeRun must take effect synchronously or LogRotator gets confused. --- changelog.html | 4 +- core/src/main/java/hudson/model/ViewJob.java | 9 +- .../test/java/hudson/model/ViewJobTest.java | 103 ++++++++++++++++++ 3 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 test/src/test/java/hudson/model/ViewJobTest.java diff --git a/changelog.html b/changelog.html index 84681beec4..d95da25520 100644 --- a/changelog.html +++ b/changelog.html @@ -55,7 +55,9 @@ Upcoming changes diff --git a/core/src/main/java/hudson/model/ViewJob.java b/core/src/main/java/hudson/model/ViewJob.java index c113665b57..7b74dbd959 100644 --- a/core/src/main/java/hudson/model/ViewJob.java +++ b/core/src/main/java/hudson/model/ViewJob.java @@ -33,6 +33,8 @@ import java.util.LinkedHashSet; import java.util.SortedMap; import hudson.model.Descriptor.FormException; +import java.util.logging.Level; +import java.util.logging.Logger; /** * {@link Job} that monitors activities that happen outside Hudson, @@ -46,6 +48,8 @@ import hudson.model.Descriptor.FormException; public abstract class ViewJob, RunT extends Run> extends Job { + private static final Logger LOGGER = Logger.getLogger(ViewJob.class.getName()); + /** * We occasionally update the list of {@link Run}s from a file system. * The next scheduled update time. @@ -126,8 +130,9 @@ public abstract class ViewJob, RunT extends Run< } public void removeRun(RunT run) { - // reload the info next time - nextUpdate = 0; + if (runs != null && !runs.remove(run)) { + LOGGER.log(Level.WARNING, "{0} did not contain {1} to begin with", new Object[] {this, run}); + } } private void _reload() { diff --git a/test/src/test/java/hudson/model/ViewJobTest.java b/test/src/test/java/hudson/model/ViewJobTest.java new file mode 100644 index 0000000000..e352c3cc5f --- /dev/null +++ b/test/src/test/java/hudson/model/ViewJobTest.java @@ -0,0 +1,103 @@ +/* + * The MIT License + * + * Copyright 2013 Jesse Glick. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package hudson.model; + +import java.io.File; +import java.io.IOException; +import jenkins.model.Jenkins; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.TestExtension; + +public class ViewJobTest { + + @Rule public JenkinsRule rule = new JenkinsRule(); + + @Bug(19377) + @Test public void removeRun() throws Exception { + J j = rule.jenkins.createProject(J.class, "j"); + R r1 = j.nue(); + R r2 = j.nue(); + assertEquals("[2, 1]", j.getBuildsAsMap().keySet().toString()); + j.removeRun(r1); + assertEquals("[2]", j.getBuildsAsMap().keySet().toString()); + } + + @SuppressWarnings({"rawtypes", "unchecked", "deprecation"}) + public static final class J extends ViewJob implements TopLevelItem { + + public J(ItemGroup parent, String name) { + super(parent, name); + } + + @Override protected void reload() { + runs.load(this, new RunMap.Constructor() { + @Override public R create(File d) throws IOException { + return new R(J.this, d); + } + }); + } + + @Override public TopLevelItemDescriptor getDescriptor() { + return Jenkins.getInstance().getDescriptorByType(DescriptorImpl.class); + } + + @TestExtension public static final class DescriptorImpl extends TopLevelItemDescriptor { + + @Override public String getDisplayName() { + return "J"; + } + + @Override public TopLevelItem newInstance(ItemGroup parent, String name) { + return new J(parent, name); + } + + } + + R nue() throws IOException { + R r = new R(this); + _getRuns(); + runs.put(r); + return r; + } + + } + + public static final class R extends Run { + + public R(J j) throws IOException { + super(j); + } + + public R(J j, File d) throws IOException { + super(j, d); + } + + } + +} -- GitLab