Navigation Menu

Skip to content

Commit

Permalink
[JENKINS-30269] Use the global static resources state
Browse files Browse the repository at this point in the history
  • Loading branch information
amuniz committed Mar 10, 2016
1 parent 5240818 commit c716299
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 25 deletions.
Expand Up @@ -5,19 +5,15 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import javax.annotation.Nonnull;

import org.jenkins.plugins.lockableresources.queue.LockableResourcesStruct;
import org.jenkinsci.plugins.workflow.steps.AbstractStepExecutionImpl;
import org.jenkinsci.plugins.workflow.steps.BodyExecution;
import org.jenkinsci.plugins.workflow.steps.BodyExecutionCallback;
import org.jenkinsci.plugins.workflow.steps.StepContext;
import org.jenkinsci.plugins.workflow.steps.StepContextParameter;
import org.jenkinsci.plugins.workflow.steps.StepExecution;

import com.google.common.base.Function;
import com.google.inject.Inject;

import hudson.Util;
import hudson.model.Run;
import hudson.model.TaskListener;
import jenkins.util.Timer;
Expand All @@ -34,36 +30,31 @@ public class LockStepExecution extends AbstractStepExecutionImpl {
private transient TaskListener listener;

private transient volatile ScheduledFuture<?> task;

private BodyExecution body;
private final String id = UUID.randomUUID().toString();


@Override
public boolean start() throws Exception {
tryLock();
tryLock(0);
return false;
}

private void tryLock() {
getContext().saveState();
private void tryLock(long delay) {
Timer.get().schedule(new Runnable() {
@Override
public void run() {
LockableResource resource = new LockableResource(step.resource);
if (!proceed()) {
tryLock();
tryLock(1000); // try to lock every second
}
}
}, 1000, TimeUnit.MILLISECONDS);
}, delay, TimeUnit.MILLISECONDS);
}

private boolean proceed() {
LockableResource resource = new LockableResource(step.resource);
if (LockableResourcesManager.get().lock(Arrays.asList(new LockableResource[] { resource }), run)) {
LockableResourcesStruct resourceHolder = new LockableResourcesStruct(step.resource);
if (LockableResourcesManager.get().lock(resourceHolder.required, run)) {
listener.getLogger().println("Lock aquired on [" + step.resource + "]");
body = getContext().newBodyInvoker().
withCallback(new Callback(resource, run)).
withCallback(new Callback(resourceHolder, run)).
withDisplayName(null).
start();
return true;
Expand All @@ -74,24 +65,28 @@ private boolean proceed() {

private static final class Callback extends BodyExecutionCallback.TailCall {

private final LockableResource resource;
private final LockableResourcesStruct resourceHolder;
private final Run<?, ?> run;

Callback(LockableResource resource, Run<?, ?> run) {
this.resource = resource;
Callback(LockableResourcesStruct resourceHolder, Run<?, ?> run) {
this.resourceHolder = resourceHolder;
this.run = run;
}

@Override
protected void finished(StepContext context) throws Exception {
LockableResourcesManager.get().unlock(Arrays.asList(new LockableResource[] { resource }), run);
LockableResourcesManager.get().unlock(resourceHolder.required, run);
}

private static final long serialVersionUID = 1L;

}

@Override
public void stop(Throwable cause) throws Exception {
// TODO does it need implementation?
if (body != null) {
body.cancel(cause);
}
}

private static final long serialVersionUID = 1L;
Expand Down
Expand Up @@ -46,6 +46,14 @@ public LockableResourcesStruct(RequiredResourcesProperty property,
requiredNumber = null;
}

public LockableResourcesStruct(String resource) {
required = new ArrayList<LockableResource>();
LockableResource r = LockableResourcesManager.get().fromName(resource);
if (r != null) {
this.required.add(r);
}
}

public String toString() {
return "Required resources: " + this.required +
", Required label: " + this.label +
Expand Down
Expand Up @@ -26,6 +26,8 @@


import hudson.model.AbstractBuild;
import hudson.model.Run;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
Expand Down Expand Up @@ -177,8 +179,8 @@ public void testIsLocked() {
@Test
public void testGetBuild() {
System.out.println("getBuild");
AbstractBuild expResult = null;
AbstractBuild result = instance.getBuild();
Run<?, ?> expResult = null;
Run<?, ?> result = instance.getBuild();
assertEquals(expResult, result);
}

Expand Down

0 comments on commit c716299

Please sign in to comment.