提交 bf444887 编写于 作者: J Jesse Glick

[FIXED JENKINS-19377] ViewJob.removeRun must take effect synchronously or LogRotator gets confused.

上级 1d20c524
......@@ -55,7 +55,9 @@ Upcoming changes</a>
<!-- Record your changes in the trunk here. -->
<div id="trunk" style="display:none"><!--=TRUNK-BEGIN=-->
<ul class=image>
<li class=>
<li class=bug>
Deleting an external run did not immediately remove it from build list, leading to errors from log rotation.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-19377">issue 19377</a>)
</ul>
</div><!--=TRUNK-END=-->
......
......@@ -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<JobT extends ViewJob<JobT,RunT>, RunT extends Run<JobT,RunT>>
extends Job<JobT,RunT> {
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<JobT extends ViewJob<JobT,RunT>, 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() {
......
/*
* 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<J,R> implements TopLevelItem {
public J(ItemGroup parent, String name) {
super(parent, name);
}
@Override protected void reload() {
runs.load(this, new RunMap.Constructor<R>() {
@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<J,R> {
public R(J j) throws IOException {
super(j);
}
public R(J j, File d) throws IOException {
super(j, d);
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册