Skip to content

Commit

Permalink
[FIXED JENKINS-19377] ViewJob.removeRun must take effect synchronousl…
Browse files Browse the repository at this point in the history
…y or LogRotator gets confused.
  • Loading branch information
jglick committed Aug 27, 2013
1 parent 1d20c52 commit bf44488
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 3 deletions.
4 changes: 3 additions & 1 deletion changelog.html
Expand Up @@ -55,7 +55,9 @@
<!-- 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=-->

Expand Down
9 changes: 7 additions & 2 deletions core/src/main/java/hudson/model/ViewJob.java
Expand Up @@ -33,6 +33,8 @@
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,
Expand All @@ -46,6 +48,8 @@
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.
Expand Down Expand Up @@ -126,8 +130,9 @@ protected SortedMap<Integer,RunT> _getRuns() {
}

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() {
Expand Down
103 changes: 103 additions & 0 deletions 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<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);
}

}

}

0 comments on commit bf44488

Please sign in to comment.