Skip to content

Commit

Permalink
Merge pull request #1807 from jtnord/JENKINS-30057
Browse files Browse the repository at this point in the history
[FIXED JENKINS-30057] NodeProperties should be owned by the corresponding Saveable
  • Loading branch information
jtnord committed Aug 24, 2015
2 parents 05a0b6c + d72d7b8 commit 5e9492d
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 16 deletions.
32 changes: 18 additions & 14 deletions core/src/main/java/hudson/model/Computer.java
Expand Up @@ -28,7 +28,6 @@
import edu.umd.cs.findbugs.annotations.When;
import hudson.EnvVars;
import hudson.Extension;
import hudson.Functions;
import hudson.Launcher.ProcStarter;
import hudson.Util;
import hudson.cli.declarative.CLIMethod;
Expand Down Expand Up @@ -64,9 +63,10 @@
import hudson.util.Futures;
import hudson.util.NamingThreadFactory;
import jenkins.model.Jenkins;
import jenkins.model.queue.AsynchronousExecution;
import jenkins.util.ContextResettingExecutorService;
import jenkins.security.MasterToSlaveCallable;
import jenkins.security.NotReallyRoleSensitiveCallable;

import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.DoNotUse;
import org.kohsuke.accmod.restrictions.NoExternalUse;
Expand All @@ -87,6 +87,7 @@

import javax.annotation.concurrent.GuardedBy;
import javax.servlet.ServletException;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
Expand All @@ -108,6 +109,7 @@
import java.net.Inet4Address;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
Expand Down Expand Up @@ -1426,21 +1428,23 @@ public void doConfigDotXml(StaplerRequest req, StaplerResponse rsp)
/**
* Replaces the current {@link Node} by another one.
*/
private void replaceBy(Node newNode) throws ServletException, IOException {
private void replaceBy(final Node newNode) throws ServletException, IOException {
final Jenkins app = Jenkins.getInstance();

// replace the old Node object by the new one
synchronized (app) {
List<Node> nodes = new ArrayList<Node>(app.getNodes());
Node node = getNode();
int i = (node != null) ? nodes.indexOf(node) : -1;
if(i<0) {
throw new IOException("This slave appears to be removed while you were editing the configuration");
// use the queue lock until Nodes has a way of directly modifying a single node.
Queue.withLock(new NotReallyRoleSensitiveCallable<Void, IOException>() {
public Void call() throws IOException {
List<Node> nodes = new ArrayList<Node>(app.getNodes());
Node node = getNode();
int i = (node != null) ? nodes.indexOf(node) : -1;
if(i<0) {
throw new IOException("This slave appears to be removed while you were editing the configuration");
}
nodes.set(i, newNode);
app.setNodes(nodes);
return null;
}

nodes.set(i, newNode);
app.setNodes(nodes);
}
});
}

/**
Expand Down
5 changes: 3 additions & 2 deletions core/src/main/java/hudson/model/Slave.java
Expand Up @@ -127,7 +127,8 @@ public abstract class Slave extends Node implements Serializable {
*/
private String label="";

private /*almost final*/ DescribableList<NodeProperty<?>,NodePropertyDescriptor> nodeProperties = new DescribableList<NodeProperty<?>,NodePropertyDescriptor>(Jenkins.getInstance());
private /*almost final*/ DescribableList<NodeProperty<?>,NodePropertyDescriptor> nodeProperties =
new DescribableList<NodeProperty<?>,NodePropertyDescriptor>(Jenkins.getInstance().getNodesObject());

/**
* Lazily computed set of labels from {@link #label}.
Expand Down Expand Up @@ -408,7 +409,7 @@ protected Object readResolve() {
: new CommandLauncher(agentCommand);
}
if(nodeProperties==null)
nodeProperties = new DescribableList<NodeProperty<?>,NodePropertyDescriptor>(Jenkins.getInstance());
nodeProperties = new DescribableList<NodeProperty<?>,NodePropertyDescriptor>(Jenkins.getInstance().getNodesObject());
return this;
}

Expand Down
10 changes: 10 additions & 0 deletions core/src/main/java/jenkins/model/Jenkins.java
Expand Up @@ -1710,6 +1710,16 @@ public List<Node> getNodes() {
return nodes.getNodes();
}

/**
* Get the {@link Nodes} object that handles maintaining individual {@link Node}s.
* @return The Nodes object.
*/
@Restricted(NoExternalUse.class)
public Nodes getNodesObject() {
// TODO replace this with something better when we properly expose Nodes.
return nodes;
}

/**
* Adds one more {@link Node} to Jenkins.
*/
Expand Down

0 comments on commit 5e9492d

Please sign in to comment.