From dae47a5ab1d274781018502995c82c82d5103303 Mon Sep 17 00:00:00 2001 From: Stephen Salinas Date: Wed, 27 Jan 2016 16:40:54 -0500 Subject: [PATCH 1/3] add a default bounce expiration --- .../config/SingularityConfiguration.java | 10 ++++ .../resources/RequestResource.java | 47 ++++++++++--------- .../hubspot/singularity/views/IndexView.java | 7 +++ SingularityUI/app/assets/_index.mustache | 1 + SingularityUI/app/models/Request.coffee | 4 +- .../app/templates/vex/requestBounce.hbs | 2 +- SingularityUI/config.coffee | 1 + 7 files changed, 48 insertions(+), 24 deletions(-) diff --git a/SingularityService/src/main/java/com/hubspot/singularity/config/SingularityConfiguration.java b/SingularityService/src/main/java/com/hubspot/singularity/config/SingularityConfiguration.java index 0e9b08611c..e29ebd36a4 100644 --- a/SingularityService/src/main/java/com/hubspot/singularity/config/SingularityConfiguration.java +++ b/SingularityService/src/main/java/com/hubspot/singularity/config/SingularityConfiguration.java @@ -73,6 +73,8 @@ public class SingularityConfiguration extends Configuration { @JsonProperty("database") private DataSourceFactory databaseConfiguration; + private int defaultBounceExpirationMinutes = 60; + @NotNull private SlavePlacement defaultSlavePlacement = SlavePlacement.GREEDY; @@ -339,6 +341,14 @@ public Optional getDatabaseConfiguration() { return Optional.fromNullable(databaseConfiguration); } + public int getDefaultBounceExpirationMinutes() { + return defaultBounceExpirationMinutes; + } + + public void setDefaultBounceExpirationMinutes(int defaultBounceExpirationMinutes) { + this.defaultBounceExpirationMinutes = defaultBounceExpirationMinutes; + } + public SlavePlacement getDefaultSlavePlacement() { return defaultSlavePlacement; } diff --git a/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java b/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java index 712733e26b..bb557d8ba0 100644 --- a/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java +++ b/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.TimeUnit; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; @@ -151,7 +152,7 @@ public SingularityRequestParent bounce(@PathParam("requestId") String requestId) @ApiOperation(value="Bounce a specific Singularity request. A bounce launches replacement task(s), and then kills the original task(s) if the replacement(s) are healthy.", response=SingularityRequestParent.class) public SingularityRequestParent bounce(@ApiParam("The request ID to bounce") @PathParam("requestId") String requestId, - @ApiParam("Bounce request options") Optional bounceRequest) { + @ApiParam("Bounce request options") Optional maybeBounceRequest) { SingularityRequestWithState requestWithState = fetchRequestWithState(requestId); authorizationHelper.checkForAuthorization(requestWithState.getRequest(), user, SingularityAuthorizationScope.WRITE); @@ -162,7 +163,25 @@ public SingularityRequestParent bounce(@ApiParam("The request ID to bounce") @Pa SlavePlacement placement = requestWithState.getRequest().getSlavePlacement().or(configuration.getDefaultSlavePlacement()); - final boolean isIncrementalBounce = bounceRequest.isPresent() && bounceRequest.get().getIncremental().or(false); + SingularityBounceRequest bounceRequest; + + if (maybeBounceRequest.isPresent()) { + bounceRequest = new SingularityBounceRequest( + maybeBounceRequest.get().getIncremental(), + maybeBounceRequest.get().getSkipHealthchecks(), + maybeBounceRequest.get().getDurationMillis().or(Optional.of(TimeUnit.MINUTES.toMillis(configuration.getDefaultBounceExpirationMinutes()))), + maybeBounceRequest.get().getActionId().or(Optional.of(UUID.randomUUID().toString())), + maybeBounceRequest.get().getMessage()); + } else { + bounceRequest = new SingularityBounceRequest( + Optional.absent(), + Optional.absent(), + Optional.of(TimeUnit.MINUTES.toMillis(configuration.getDefaultBounceExpirationMinutes())), + Optional.of(UUID.randomUUID().toString()), + Optional.absent()); + } + + final boolean isIncrementalBounce = bounceRequest.getIncremental().or(false); if (placement != SlavePlacement.GREEDY && placement != SlavePlacement.OPTIMISTIC) { int currentActiveSlaveCount = slaveManager.getNumObjectsAtState(MachineState.ACTIVE); @@ -171,34 +190,18 @@ public SingularityRequestParent bounce(@ApiParam("The request ID to bounce") @Pa checkBadRequest(currentActiveSlaveCount >= requiredSlaveCount, "Not enough active slaves to successfully complete a bounce of request %s (minimum required: %s, current: %s). Consider deploying, or changing the slave placement strategy instead.", requestId, requiredSlaveCount, currentActiveSlaveCount); } - final Optional skipHealthchecks = bounceRequest.isPresent() ? bounceRequest.get().getSkipHealthchecks() : Optional. absent(); - - Optional message = Optional.absent(); - Optional actionId = Optional.absent(); - - if (bounceRequest.isPresent()) { - actionId = bounceRequest.get().getActionId(); - message = bounceRequest.get().getMessage(); - - if (bounceRequest.get().getDurationMillis().isPresent() && !actionId.isPresent()) { - actionId = Optional.of(UUID.randomUUID().toString()); - } - } - final String deployId = getAndCheckDeployId(requestId); SingularityCreateResult createResult = requestManager.createCleanupRequest( new SingularityRequestCleanup(JavaUtils.getUserEmail(user), isIncrementalBounce ? RequestCleanupType.INCREMENTAL_BOUNCE : RequestCleanupType.BOUNCE, - System.currentTimeMillis(), Optional. absent(), requestId, Optional.of(deployId), skipHealthchecks, message, actionId)); + System.currentTimeMillis(), Optional. absent(), requestId, Optional.of(deployId), bounceRequest.getSkipHealthchecks(), bounceRequest.getMessage(), bounceRequest.getActionId())); checkConflict(createResult != SingularityCreateResult.EXISTED, "%s is already bouncing", requestId); - requestManager.bounce(requestWithState.getRequest(), System.currentTimeMillis(), JavaUtils.getUserEmail(user), message); + requestManager.bounce(requestWithState.getRequest(), System.currentTimeMillis(), JavaUtils.getUserEmail(user), bounceRequest.getMessage()); - if (bounceRequest.isPresent() && bounceRequest.get().getDurationMillis().isPresent()) { - requestManager.saveExpiringObject(new SingularityExpiringBounce(requestId, deployId, JavaUtils.getUserEmail(user), - System.currentTimeMillis(), bounceRequest.get(), actionId.get())); - } + requestManager.saveExpiringObject(new SingularityExpiringBounce(requestId, deployId, JavaUtils.getUserEmail(user), + System.currentTimeMillis(), bounceRequest, bounceRequest.getActionId().get())); return fillEntireRequest(requestWithState); } diff --git a/SingularityService/src/main/java/com/hubspot/singularity/views/IndexView.java b/SingularityService/src/main/java/com/hubspot/singularity/views/IndexView.java index 9a4cef1c1c..cbf93dedcb 100644 --- a/SingularityService/src/main/java/com/hubspot/singularity/views/IndexView.java +++ b/SingularityService/src/main/java/com/hubspot/singularity/views/IndexView.java @@ -32,6 +32,7 @@ public class IndexView extends View { private final Integer slaveHttpPort; private final Integer slaveHttpsPort; + private final int defaultBounceExpirationMinutes; private final long defaultHealthcheckIntervalSeconds; private final long defaultHealthcheckTimeoutSeconds; private final long defaultDeployHealthTimeoutSeconds; @@ -77,6 +78,7 @@ public IndexView(String singularityUriBase, String appRoot, SingularityConfigura this.navColor = configuration.getUiConfiguration().getNavColor(); + this.defaultBounceExpirationMinutes = configuration.getDefaultBounceExpirationMinutes(); this.defaultHealthcheckIntervalSeconds = configuration.getHealthcheckIntervalSeconds(); this.defaultHealthcheckTimeoutSeconds = configuration.getHealthcheckTimeoutSeconds(); this.defaultDeployHealthTimeoutSeconds = configuration.getDeployHealthyBySeconds(); @@ -154,6 +156,10 @@ public Boolean getLoadBalancingEnabled() { return loadBalancingEnabled; } + public int getDefaultBounceExpirationMinutes() { + return defaultBounceExpirationMinutes; + } + public long getDefaultHealthcheckIntervalSeconds() { return defaultHealthcheckIntervalSeconds; } @@ -213,6 +219,7 @@ public String toString() { ", title='" + title + '\'' + ", slaveHttpPort=" + slaveHttpPort + ", slaveHttpsPort=" + slaveHttpsPort + + ", defaultBounceExpirationMinutes=" + defaultBounceExpirationMinutes + ", defaultHealthcheckIntervalSeconds=" + defaultHealthcheckIntervalSeconds + ", defaultHealthcheckTimeoutSeconds=" + defaultHealthcheckTimeoutSeconds + ", defaultDeployHealthTimeoutSeconds=" + defaultDeployHealthTimeoutSeconds + diff --git a/SingularityUI/app/assets/_index.mustache b/SingularityUI/app/assets/_index.mustache index c585c30df6..ae41c56066 100644 --- a/SingularityUI/app/assets/_index.mustache +++ b/SingularityUI/app/assets/_index.mustache @@ -23,6 +23,7 @@ loadBalancingEnabled: {{{loadBalancingEnabled}}}, defaultCpus: {{{defaultCpus}}}, defaultMemory: {{{defaultMemory}}}, + defaultBounceExpirationMinutes: {{{defaultBounceExpirationMinutes}}}, defaultHealthcheckIntervalSeconds: {{{defaultHealthcheckIntervalSeconds}}}, defaultHealthcheckTimeoutSeconds: {{{defaultHealthcheckTimeoutSeconds}}}, defaultDeployHealthTimeoutSeconds: {{{defaultDeployHealthTimeoutSeconds}}}, diff --git a/SingularityUI/app/models/Request.coffee b/SingularityUI/app/models/Request.coffee index 21515f2887..101d4346d2 100644 --- a/SingularityUI/app/models/Request.coffee +++ b/SingularityUI/app/models/Request.coffee @@ -432,7 +432,9 @@ class Request extends Model promptBounce: (callback) => vex.dialog.confirm - message: bounceTemplate id: @get "id" + message: bounceTemplate + id: @get "id" + config: config input: """ """ diff --git a/SingularityUI/app/templates/vex/requestBounce.hbs b/SingularityUI/app/templates/vex/requestBounce.hbs index d6cff89c91..8b2ff1f17d 100644 --- a/SingularityUI/app/templates/vex/requestBounce.hbs +++ b/SingularityUI/app/templates/vex/requestBounce.hbs @@ -12,6 +12,6 @@ Skip healthchecks during bounce
- +
If an expiration duration is specified, this bounce will be aborted if not finished. Accepts any english time duration. (Days, Hr, Min...) diff --git a/SingularityUI/config.coffee b/SingularityUI/config.coffee index 61642f5ef1..c6ab48885b 100644 --- a/SingularityUI/config.coffee +++ b/SingularityUI/config.coffee @@ -45,6 +45,7 @@ exports.config = navColor: process.env.SINGULARITY_NAV_COLOR defaultCpus: process.env.SINGUALRITY_DEFAULT_CPUS ? 1 defaultMemory: process.env.SINGULARITY_DEFAULT_MEMORY ? 128 + defaultBounceExpirationMinutes: process.env.SINGULARITY_DEFAULT_BOUNCE_EXPIRATION_MINUTES ? 60 defaultHealthcheckIntervalSeconds: process.env.SINGULARITY_DEFAULT_HEALTHCHECK_INTERVAL_SECONDS ? 5 defaultHealthcheckTimeoutSeconds: process.env.SINGULARITY_HEALTHCHECK_TIMEOUT_SECONDS ? 5 defaultDeployHealthTimeoutSeconds: process.env.SINGULARITY_DEPLOY_HEALTH_TIMEOUT_SECONDS ? 120 From e4b8a401cad73a8dca2de09ee1dd8a939ea9e415 Mon Sep 17 00:00:00 2001 From: Stephen Salinas Date: Thu, 28 Jan 2016 10:12:16 -0500 Subject: [PATCH 2/3] rework default expiration for bounce --- .../api/SingularityBounceRequest.java | 6 +++ .../config/SingularityConfiguration.java | 1 + .../resources/RequestResource.java | 39 +++++++------------ .../SingularityExpiringUserActionPoller.java | 15 ++++++- .../app/views/requestActionExpirations.coffee | 23 ++++++----- 5 files changed, 49 insertions(+), 35 deletions(-) diff --git a/SingularityBase/src/main/java/com/hubspot/singularity/api/SingularityBounceRequest.java b/SingularityBase/src/main/java/com/hubspot/singularity/api/SingularityBounceRequest.java index 6604201ff9..d5f62fca11 100644 --- a/SingularityBase/src/main/java/com/hubspot/singularity/api/SingularityBounceRequest.java +++ b/SingularityBase/src/main/java/com/hubspot/singularity/api/SingularityBounceRequest.java @@ -1,5 +1,7 @@ package com.hubspot.singularity.api; +import java.util.UUID; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Optional; @@ -18,6 +20,10 @@ public SingularityBounceRequest(@JsonProperty("incremental") Optional i this.skipHealthchecks = skipHealthchecks; } + public static SingularityBounceRequest defaultRequest() { + return new SingularityBounceRequest(Optional.absent(), Optional.absent(), Optional.absent(), Optional.of(UUID.randomUUID().toString()), Optional.absent()); + } + @ApiModelProperty(required=false, value="If present and set to true, old tasks will be killed as soon as replacement tasks are available, instead of waiting for all replacement tasks to be healthy") public Optional getIncremental() { return incremental; diff --git a/SingularityService/src/main/java/com/hubspot/singularity/config/SingularityConfiguration.java b/SingularityService/src/main/java/com/hubspot/singularity/config/SingularityConfiguration.java index e29ebd36a4..deb3edb8e3 100644 --- a/SingularityService/src/main/java/com/hubspot/singularity/config/SingularityConfiguration.java +++ b/SingularityService/src/main/java/com/hubspot/singularity/config/SingularityConfiguration.java @@ -73,6 +73,7 @@ public class SingularityConfiguration extends Configuration { @JsonProperty("database") private DataSourceFactory databaseConfiguration; + @Min(value = 1, message = "Must be positive and non-zero") private int defaultBounceExpirationMinutes = 60; @NotNull diff --git a/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java b/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java index bb557d8ba0..690e1a267c 100644 --- a/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java +++ b/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java @@ -8,7 +8,6 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.concurrent.TimeUnit; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; @@ -152,7 +151,7 @@ public SingularityRequestParent bounce(@PathParam("requestId") String requestId) @ApiOperation(value="Bounce a specific Singularity request. A bounce launches replacement task(s), and then kills the original task(s) if the replacement(s) are healthy.", response=SingularityRequestParent.class) public SingularityRequestParent bounce(@ApiParam("The request ID to bounce") @PathParam("requestId") String requestId, - @ApiParam("Bounce request options") Optional maybeBounceRequest) { + @ApiParam("Bounce request options") Optional bounceRequest) { SingularityRequestWithState requestWithState = fetchRequestWithState(requestId); authorizationHelper.checkForAuthorization(requestWithState.getRequest(), user, SingularityAuthorizationScope.WRITE); @@ -163,25 +162,7 @@ public SingularityRequestParent bounce(@ApiParam("The request ID to bounce") @Pa SlavePlacement placement = requestWithState.getRequest().getSlavePlacement().or(configuration.getDefaultSlavePlacement()); - SingularityBounceRequest bounceRequest; - - if (maybeBounceRequest.isPresent()) { - bounceRequest = new SingularityBounceRequest( - maybeBounceRequest.get().getIncremental(), - maybeBounceRequest.get().getSkipHealthchecks(), - maybeBounceRequest.get().getDurationMillis().or(Optional.of(TimeUnit.MINUTES.toMillis(configuration.getDefaultBounceExpirationMinutes()))), - maybeBounceRequest.get().getActionId().or(Optional.of(UUID.randomUUID().toString())), - maybeBounceRequest.get().getMessage()); - } else { - bounceRequest = new SingularityBounceRequest( - Optional.absent(), - Optional.absent(), - Optional.of(TimeUnit.MINUTES.toMillis(configuration.getDefaultBounceExpirationMinutes())), - Optional.of(UUID.randomUUID().toString()), - Optional.absent()); - } - - final boolean isIncrementalBounce = bounceRequest.getIncremental().or(false); + final boolean isIncrementalBounce = bounceRequest.isPresent() && bounceRequest.get().getIncremental().or(false); if (placement != SlavePlacement.GREEDY && placement != SlavePlacement.OPTIMISTIC) { int currentActiveSlaveCount = slaveManager.getNumObjectsAtState(MachineState.ACTIVE); @@ -190,18 +171,28 @@ public SingularityRequestParent bounce(@ApiParam("The request ID to bounce") @Pa checkBadRequest(currentActiveSlaveCount >= requiredSlaveCount, "Not enough active slaves to successfully complete a bounce of request %s (minimum required: %s, current: %s). Consider deploying, or changing the slave placement strategy instead.", requestId, requiredSlaveCount, currentActiveSlaveCount); } + final Optional skipHealthchecks = bounceRequest.isPresent() ? bounceRequest.get().getSkipHealthchecks() : Optional. absent(); + + Optional message = Optional.absent(); + Optional actionId = Optional.absent(); + + if (bounceRequest.isPresent()) { + actionId = bounceRequest.get().getActionId(); + message = bounceRequest.get().getMessage(); + } + final String deployId = getAndCheckDeployId(requestId); SingularityCreateResult createResult = requestManager.createCleanupRequest( new SingularityRequestCleanup(JavaUtils.getUserEmail(user), isIncrementalBounce ? RequestCleanupType.INCREMENTAL_BOUNCE : RequestCleanupType.BOUNCE, - System.currentTimeMillis(), Optional. absent(), requestId, Optional.of(deployId), bounceRequest.getSkipHealthchecks(), bounceRequest.getMessage(), bounceRequest.getActionId())); + System.currentTimeMillis(), Optional. absent(), requestId, Optional.of(deployId), skipHealthchecks, message, actionId)); checkConflict(createResult != SingularityCreateResult.EXISTED, "%s is already bouncing", requestId); - requestManager.bounce(requestWithState.getRequest(), System.currentTimeMillis(), JavaUtils.getUserEmail(user), bounceRequest.getMessage()); + requestManager.bounce(requestWithState.getRequest(), System.currentTimeMillis(), JavaUtils.getUserEmail(user), message); requestManager.saveExpiringObject(new SingularityExpiringBounce(requestId, deployId, JavaUtils.getUserEmail(user), - System.currentTimeMillis(), bounceRequest, bounceRequest.getActionId().get())); + System.currentTimeMillis(), bounceRequest.or(SingularityBounceRequest.defaultRequest()), actionId.or(UUID.randomUUID().toString()))); return fillEntireRequest(requestWithState); } diff --git a/SingularityService/src/main/java/com/hubspot/singularity/scheduler/SingularityExpiringUserActionPoller.java b/SingularityService/src/main/java/com/hubspot/singularity/scheduler/SingularityExpiringUserActionPoller.java index cd4a0ea544..f7754483cd 100644 --- a/SingularityService/src/main/java/com/hubspot/singularity/scheduler/SingularityExpiringUserActionPoller.java +++ b/SingularityService/src/main/java/com/hubspot/singularity/scheduler/SingularityExpiringUserActionPoller.java @@ -46,6 +46,7 @@ public class SingularityExpiringUserActionPoller extends SingularityLeaderOnlyPo private final SingularityMailer mailer; private final RequestHelper requestHelper; private final List> handlers; + private final SingularityConfiguration configuration; @Inject SingularityExpiringUserActionPoller(SingularityConfiguration configuration, RequestManager requestManager, TaskManager taskManager, @@ -56,6 +57,7 @@ public class SingularityExpiringUserActionPoller extends SingularityLeaderOnlyPo this.requestHelper = requestHelper; this.mailer = mailer; this.taskManager = taskManager; + this.configuration = configuration; List> tempHandlers = Lists.newArrayList(); tempHandlers.add(new SingularityExpiringBounceHandler()); @@ -85,18 +87,22 @@ private boolean isExpiringDue(T expiringObject) { final long now = System.currentTimeMillis(); final long duration = now - expiringObject.getStartMillis(); - return duration > expiringObject.getExpiringAPIRequestObject().getDurationMillis().get(); + return duration > getDurationMillis(expiringObject); } protected String getMessage(T expiringObject) { String msg = String.format("%s expired after %s", getActionName(), - JavaUtils.durationFromMillis(expiringObject.getExpiringAPIRequestObject().getDurationMillis().get())); + JavaUtils.durationFromMillis(getDurationMillis(expiringObject))); if (expiringObject.getExpiringAPIRequestObject().getMessage().isPresent() && expiringObject.getExpiringAPIRequestObject().getMessage().get().length() > 0) { msg = String.format("%s (%s)", msg, expiringObject.getExpiringAPIRequestObject().getMessage().get()); } return msg; } + protected long getDurationMillis(T expiringObject) { + return expiringObject.getExpiringAPIRequestObject().getDurationMillis().get(); + } + protected void checkExpiringObjects() { for (T expiringObject : requestManager.getExpiringObjects(clazz)) { if (isExpiringDue(expiringObject)) { @@ -130,6 +136,11 @@ protected String getActionName() { return "Bounce"; } + @Override + protected long getDurationMillis(SingularityExpiringBounce expiringBounce) { + return expiringBounce.getExpiringAPIRequestObject().getDurationMillis().or(TimeUnit.MINUTES.toMillis(configuration.getDefaultBounceExpirationMinutes())); + } + @Override protected void handleExpiringObject(SingularityExpiringBounce expiringObject, SingularityRequestWithState requestWithState, String message) { for (SingularityTaskCleanup taskCleanup : taskManager.getCleanupTasks()) { diff --git a/SingularityUI/app/views/requestActionExpirations.coffee b/SingularityUI/app/views/requestActionExpirations.coffee index 3ee49dc7bc..b5734a48f8 100644 --- a/SingularityUI/app/views/requestActionExpirations.coffee +++ b/SingularityUI/app/views/requestActionExpirations.coffee @@ -29,15 +29,20 @@ class requestActionExpirations extends View revertParam: request.expiringScale.revertToInstances message: request.expiringScale.expiringAPIRequestObject.message - if request.expiringBounce and (request.expiringBounce.startMillis + request.expiringBounce.expiringAPIRequestObject.durationMillis) > new Date().getTime() - expirations.push - action: 'Bounce' - user: if request.expiringBounce.user then request.expiringBounce.user.split('@')[0] else "" - endMillis: request.expiringBounce.startMillis + request.expiringBounce.expiringAPIRequestObject.durationMillis - canRevert: false - cancelText: 'Cancel' - cancelAction: 'cancelBounce' - message: request.expiringBounce.expiringAPIRequestObject.message + if request.expiringBounce + if request.expiringBounce.expiringAPIRequestObject.durationMillis + endMillis = request.expiringBounce.startMillis + request.expiringBounce.expiringAPIRequestObject.durationMillis + else + endMillis = request.expiringBounce.startMillis + (config.defaultBounceExpirationMinutes * 60 * 1000) + if endMillis > new Date().getTime() + expirations.push + action: 'Bounce' + user: if request.expiringBounce.user then request.expiringBounce.user.split('@')[0] else "" + endMillis: endMillis + canRevert: false + cancelText: 'Cancel' + cancelAction: 'cancelBounce' + message: request.expiringBounce.expiringAPIRequestObject.message if request.expiringPause and (request.expiringPause.startMillis + request.expiringPause.expiringAPIRequestObject.durationMillis) > new Date().getTime() expirations.push From 30f4e510f2a93fce86c813efeb5e0d1f51bb0f05 Mon Sep 17 00:00:00 2001 From: Stephen Salinas Date: Thu, 28 Jan 2016 16:48:07 -0500 Subject: [PATCH 3/3] make sure actionId gets set --- .../com/hubspot/singularity/resources/RequestResource.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java b/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java index 690e1a267c..6ae365a0e1 100644 --- a/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java +++ b/SingularityService/src/main/java/com/hubspot/singularity/resources/RequestResource.java @@ -181,6 +181,10 @@ public SingularityRequestParent bounce(@ApiParam("The request ID to bounce") @Pa message = bounceRequest.get().getMessage(); } + if (!actionId.isPresent()) { + actionId = Optional.of(UUID.randomUUID().toString()); + } + final String deployId = getAndCheckDeployId(requestId); SingularityCreateResult createResult = requestManager.createCleanupRequest( @@ -192,7 +196,7 @@ public SingularityRequestParent bounce(@ApiParam("The request ID to bounce") @Pa requestManager.bounce(requestWithState.getRequest(), System.currentTimeMillis(), JavaUtils.getUserEmail(user), message); requestManager.saveExpiringObject(new SingularityExpiringBounce(requestId, deployId, JavaUtils.getUserEmail(user), - System.currentTimeMillis(), bounceRequest.or(SingularityBounceRequest.defaultRequest()), actionId.or(UUID.randomUUID().toString()))); + System.currentTimeMillis(), bounceRequest.or(SingularityBounceRequest.defaultRequest()), actionId.get())); return fillEntireRequest(requestWithState); }