Skip to content

Commit

Permalink
tweaks + support priority level freeze
Browse files Browse the repository at this point in the history
  • Loading branch information
tpetr committed May 23, 2016
1 parent 1f991eb commit 3913b7d
Show file tree
Hide file tree
Showing 11 changed files with 200 additions and 68 deletions.
Expand Up @@ -5,22 +5,22 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.Optional;
import com.hubspot.singularity.api.SingularityPriorityKillRequest;
import com.hubspot.singularity.api.SingularityPriorityRequest;

public class SingularityPriorityKillRequestParent {
private final SingularityPriorityKillRequest priorityKillRequest;
public class SingularityPriorityRequestParent {
private final SingularityPriorityRequest priorityRequest;
private final long timestamp;
private final Optional<String> user;

@JsonCreator
public SingularityPriorityKillRequestParent(@JsonProperty("priorityKillRequest") SingularityPriorityKillRequest priorityKillRequest, @JsonProperty("timestamp") long timestamp, @JsonProperty("user") Optional<String> user) {
this.priorityKillRequest = priorityKillRequest;
public SingularityPriorityRequestParent(@JsonProperty("priorityRequest") SingularityPriorityRequest priorityRequest, @JsonProperty("timestamp") long timestamp, @JsonProperty("user") Optional<String> user) {
this.priorityRequest = priorityRequest;
this.timestamp = timestamp;
this.user = user;
}

public SingularityPriorityKillRequest getPriorityKillRequest() {
return priorityKillRequest;
public SingularityPriorityRequest getPriorityRequest() {
return priorityRequest;
}

public long getTimestamp() {
Expand All @@ -39,21 +39,21 @@ public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
SingularityPriorityKillRequestParent that = (SingularityPriorityKillRequestParent) o;
SingularityPriorityRequestParent that = (SingularityPriorityRequestParent) o;
return timestamp == that.timestamp &&
Objects.equals(priorityKillRequest, that.priorityKillRequest) &&
Objects.equals(priorityRequest, that.priorityRequest) &&
Objects.equals(user, that.user);
}

@Override
public int hashCode() {
return Objects.hash(priorityKillRequest, timestamp, user);
return Objects.hash(priorityRequest, timestamp, user);
}

@Override
public String toString() {
return "SingularityPriorityKillRequestParent[" +
"priorityKillRequest=" + priorityKillRequest +
return "SingularityPriorityRequestParent[" +
"priorityRequest=" + priorityRequest +
", timestamp=" + timestamp +
", user=" + user +
']';
Expand Down
Expand Up @@ -50,6 +50,8 @@ public class SingularityState {

private final Optional<Boolean> authDatastoreHealthy;

private final Optional<Double> activePriorityLevelFreeze;

@JsonCreator
public SingularityState(@JsonProperty("activeTasks") int activeTasks, @JsonProperty("activeRequests") int activeRequests, @JsonProperty("cooldownRequests") int cooldownRequests,
@JsonProperty("pausedRequests") int pausedRequests, @JsonProperty("scheduledTasks") int scheduledTasks, @JsonProperty("pendingRequests") int pendingRequests, @JsonProperty("lbCleanupTasks") int lbCleanupTasks,
Expand All @@ -59,7 +61,7 @@ public SingularityState(@JsonProperty("activeTasks") int activeTasks, @JsonPrope
@JsonProperty("lateTasks") int lateTasks, @JsonProperty("futureTasks") int futureTasks, @JsonProperty("maxTaskLag") long maxTaskLag, @JsonProperty("generatedAt") long generatedAt,
@JsonProperty("overProvisionedRequestIds") List<String> overProvisionedRequestIds, @JsonProperty("underProvisionedRequestIds") List<String> underProvisionedRequestIds,
@JsonProperty("overProvisionedRequests") int overProvisionedRequests, @JsonProperty("underProvisionedRequests") int underProvisionedRequests, @JsonProperty("finishedRequests") int finishedRequests,
@JsonProperty("unknownRacks") int unknownRacks, @JsonProperty("unknownSlaves") int unknownSlaves, @JsonProperty("authDatastoreHealthy") Optional<Boolean> authDatastoreHealthy) {
@JsonProperty("unknownRacks") int unknownRacks, @JsonProperty("unknownSlaves") int unknownSlaves, @JsonProperty("authDatastoreHealthy") Optional<Boolean> authDatastoreHealthy, @JsonProperty("activePriorityLevelFreeze") Optional<Double> activePriorityLevelFreeze) {
this.activeTasks = activeTasks;
this.activeRequests = activeRequests;
this.pausedRequests = pausedRequests;
Expand Down Expand Up @@ -91,6 +93,7 @@ public SingularityState(@JsonProperty("activeTasks") int activeTasks, @JsonPrope
this.overProvisionedRequestIds = overProvisionedRequestIds;
this.underProvisionedRequestIds = underProvisionedRequestIds;
this.authDatastoreHealthy = authDatastoreHealthy;
this.activePriorityLevelFreeze = activePriorityLevelFreeze;
}

public int getFinishedRequests() {
Expand Down Expand Up @@ -231,6 +234,10 @@ public Optional<Boolean> getAuthDatastoreHealthy() {
return authDatastoreHealthy;
}

public Optional<Double> getActivePriorityLevelFreeze() {
return activePriorityLevelFreeze;
}

@Override
public String toString() {
return "SingularityState [activeTasks=" + activeTasks + ", pausedRequests=" + pausedRequests + ", activeRequests=" + activeRequests + ", cooldownRequests=" + cooldownRequests + ", scheduledTasks=" + scheduledTasks
Expand All @@ -239,7 +246,7 @@ public String toString() {
+ activeSlaves + ", deadSlaves=" + deadSlaves + ", decommissioningSlaves=" + decommissioningSlaves + ", unknownSlaves=" + unknownSlaves + ", activeRacks=" + activeRacks + ", deadRacks="
+ deadRacks + ", decommissioningRacks=" + decommissioningRacks + ", unknownRacks=" + unknownRacks + ", oldestDeploy=" + oldestDeploy + ", numDeploys=" + numDeploys + ", generatedAt="
+ generatedAt + ", hostStates=" + hostStates + ", overProvisionedRequestIds=" + overProvisionedRequestIds + ", underProvisionedRequestIds=" + underProvisionedRequestIds
+ ", overProvisionedRequests=" + overProvisionedRequests + ", underProvisionedRequests=" + underProvisionedRequests + ", authDatastoreHealthy=" + authDatastoreHealthy + "]";
+ ", overProvisionedRequests=" + overProvisionedRequests + ", underProvisionedRequests=" + underProvisionedRequests + ", authDatastoreHealthy=" + authDatastoreHealthy + ", activePriorityLevelFreeze=" + activePriorityLevelFreeze + "]";
}

}
Expand Up @@ -6,13 +6,13 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.Optional;

public class SingularityPriorityKillRequest {
public class SingularityPriorityRequest {
private final double minimumPriorityLevel;
private final Optional<String> message;
private final Optional<String> actionId;

@JsonCreator
public SingularityPriorityKillRequest(@JsonProperty("minimumPriorityLevel") double minimumPriorityLevel, @JsonProperty("message") Optional<String> message, @JsonProperty("actionId") Optional<String> actionId) {
public SingularityPriorityRequest(@JsonProperty("minimumPriorityLevel") double minimumPriorityLevel, @JsonProperty("message") Optional<String> message, @JsonProperty("actionId") Optional<String> actionId) {
this.minimumPriorityLevel = minimumPriorityLevel;
this.message = message;
this.actionId = actionId;
Expand All @@ -38,7 +38,7 @@ public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
SingularityPriorityKillRequest that = (SingularityPriorityKillRequest) o;
SingularityPriorityRequest that = (SingularityPriorityRequest) o;
return Double.compare(that.minimumPriorityLevel, minimumPriorityLevel) == 0 &&
Objects.equals(message, that.message) &&
Objects.equals(actionId, that.actionId);
Expand All @@ -51,7 +51,7 @@ public int hashCode() {

@Override
public String toString() {
return "SingularityPriorityKillRequest[" +
return "SingularityPriorityRequest[" +
"minimumPriorityLevel=" + minimumPriorityLevel +
", message=" + message +
", actionId=" + actionId +
Expand Down
Expand Up @@ -8,33 +8,46 @@
import com.google.inject.Singleton;
import com.hubspot.singularity.SingularityCreateResult;
import com.hubspot.singularity.SingularityDeleteResult;
import com.hubspot.singularity.SingularityPriorityKillRequestParent;
import com.hubspot.singularity.SingularityPriorityRequestParent;
import com.hubspot.singularity.config.SingularityConfiguration;
import com.hubspot.singularity.data.transcoders.Transcoder;

@Singleton
public class PriorityManager extends CuratorAsyncManager {
private static final String PRIORITY_ROOT = "/priority";
private static final String PRIORITY_KILL = PRIORITY_ROOT + "/kill";
private static final String PRIORITY_FREEZE = PRIORITY_ROOT + "/freeze";

private final Transcoder<SingularityPriorityKillRequestParent> priorityKillTranscoder;
private final Transcoder<SingularityPriorityRequestParent> priorityRequestParentTranscoder;

@Inject
public PriorityManager(CuratorFramework curator, SingularityConfiguration configuration,
MetricRegistry metricRegistry, Transcoder<SingularityPriorityKillRequestParent> priorityKillTranscoder) {
MetricRegistry metricRegistry, Transcoder<SingularityPriorityRequestParent> priorityRequestParentTranscoder) {
super(curator, configuration, metricRegistry);
this.priorityKillTranscoder = priorityKillTranscoder;
this.priorityRequestParentTranscoder = priorityRequestParentTranscoder;
}

public Optional<SingularityPriorityKillRequestParent> getPriorityKill() {
return getData(PRIORITY_KILL, priorityKillTranscoder);
public Optional<SingularityPriorityRequestParent> getActivePriorityKill() {
return getData(PRIORITY_KILL, priorityRequestParentTranscoder);
}

public SingularityCreateResult createPriorityKill(SingularityPriorityKillRequestParent priorityKill) {
return save(PRIORITY_KILL, priorityKill, priorityKillTranscoder);
public SingularityCreateResult createPriorityKill(SingularityPriorityRequestParent priorityKill) {
return save(PRIORITY_KILL, priorityKill, priorityRequestParentTranscoder);
}

public SingularityDeleteResult deletePriorityKill() {
public SingularityDeleteResult deleteActivePriorityKill() {
return delete(PRIORITY_KILL);
}

public Optional<SingularityPriorityRequestParent> getActivePriorityFreeze() {
return getData(PRIORITY_FREEZE, priorityRequestParentTranscoder);
}

public SingularityCreateResult createPriorityFreeze(SingularityPriorityRequestParent priorityFreeze) {
return save(PRIORITY_FREEZE, priorityFreeze, priorityRequestParentTranscoder);
}

public SingularityDeleteResult deleteActivePriorityFreeze() {
return delete(PRIORITY_FREEZE);
}
}
Expand Up @@ -34,7 +34,7 @@
import com.hubspot.singularity.SingularityRequest;
import com.hubspot.singularity.WebExceptions;
import com.hubspot.singularity.SingularityWebhook;
import com.hubspot.singularity.api.SingularityPriorityKillRequest;
import com.hubspot.singularity.api.SingularityPriorityRequest;
import com.hubspot.singularity.config.SingularityConfiguration;
import com.hubspot.singularity.data.history.DeployHistoryHelper;

Expand Down Expand Up @@ -416,14 +416,14 @@ private boolean isValidInteger(String strValue) {
}
}

public SingularityPriorityKillRequest checkSingularityPriorityKillRequest(SingularityPriorityKillRequest priorityKillRequest) {
checkBadRequest(priorityKillRequest.getMinimumPriorityLevel() >= 0 && priorityKillRequest.getMinimumPriorityLevel() <= 1, "minimumPriorityLevel %s is invalid, must be between 0 and 1 (inclusive)", priorityKillRequest.getMinimumPriorityLevel());
public SingularityPriorityRequest checkSingularityPriorityRequest(SingularityPriorityRequest priorityRequest) {
checkBadRequest(priorityRequest.getMinimumPriorityLevel() >= 0 && priorityRequest.getMinimumPriorityLevel() <= 1, "minimumPriorityLevel %s is invalid, must be between 0 and 1 (inclusive)", priorityRequest.getMinimumPriorityLevel());

// auto-generate actionId if not set
if (!priorityKillRequest.getActionId().isPresent()) {
priorityKillRequest = new SingularityPriorityKillRequest(priorityKillRequest.getMinimumPriorityLevel(), priorityKillRequest.getMessage(), Optional.of(UUID.randomUUID().toString()));
if (!priorityRequest.getActionId().isPresent()) {
priorityRequest = new SingularityPriorityRequest(priorityRequest.getMinimumPriorityLevel(), priorityRequest.getMessage(), Optional.of(UUID.randomUUID().toString()));
}

return priorityKillRequest;
return priorityRequest;
}
}
Expand Up @@ -24,6 +24,7 @@
import com.hubspot.singularity.SingularityHostState;
import com.hubspot.singularity.SingularityPendingDeploy;
import com.hubspot.singularity.SingularityPendingTaskId;
import com.hubspot.singularity.SingularityPriorityRequestParent;
import com.hubspot.singularity.SingularityRack;
import com.hubspot.singularity.SingularityRequestDeployState;
import com.hubspot.singularity.SingularityRequestWithState;
Expand Down Expand Up @@ -52,11 +53,12 @@ public class StateManager extends CuratorManager {
private final Transcoder<SingularityHostState> hostStateTranscoder;
private final SingularityConfiguration singularityConfiguration;
private final SingularityAuthDatastore authDatastore;
private final PriorityManager priorityManager;

@Inject
public StateManager(CuratorFramework curatorFramework, SingularityConfiguration configuration, MetricRegistry metricRegistry, RequestManager requestManager, TaskManager taskManager,
DeployManager deployManager, SlaveManager slaveManager, RackManager rackManager, Transcoder<SingularityState> stateTranscoder, Transcoder<SingularityHostState> hostStateTranscoder,
SingularityConfiguration singularityConfiguration, SingularityAuthDatastore authDatastore) {
SingularityConfiguration singularityConfiguration, SingularityAuthDatastore authDatastore, PriorityManager priorityManager) {
super(curatorFramework, configuration, metricRegistry);

this.requestManager = requestManager;
Expand All @@ -68,6 +70,7 @@ public StateManager(CuratorFramework curatorFramework, SingularityConfiguration
this.deployManager = deployManager;
this.singularityConfiguration = singularityConfiguration;
this.authDatastore = authDatastore;
this.priorityManager = priorityManager;
}

public void save(SingularityHostState hostState) throws InterruptedException {
Expand Down Expand Up @@ -291,9 +294,18 @@ public SingularityState generateState(boolean includeRequestIds) {

final Optional<Boolean> authDatastoreHealthy = authDatastore.isHealthy();

final Optional<SingularityPriorityRequestParent> maybePriorityFreeze = priorityManager.getActivePriorityFreeze();
final Optional<Double> activePriorityLevelFreeze;

if (maybePriorityFreeze.isPresent()) {
activePriorityLevelFreeze = Optional.of(maybePriorityFreeze.get().getPriorityRequest().getMinimumPriorityLevel());
} else {
activePriorityLevelFreeze = Optional.absent();
}

return new SingularityState(activeTasks, numActiveRequests, cooldownRequests, numPausedRequests, scheduledTasks, pendingRequests, lbCleanupTasks, lbCleanupRequests, cleaningRequests, activeSlaves,
deadSlaves, decommissioningSlaves, activeRacks, deadRacks, decommissioningRacks, cleaningTasks, states, oldestDeploy, numDeploys, scheduledTasksInfo.getNumLateTasks(),
scheduledTasksInfo.getNumFutureTasks(), scheduledTasksInfo.getMaxTaskLag(), System.currentTimeMillis(), includeRequestIds ? overProvisionedRequestIds : null,
includeRequestIds ? underProvisionedRequestIds : null, overProvisionedRequestIds.size(), underProvisionedRequestIds.size(), numFinishedRequests, unknownRacks, unknownSlaves, authDatastoreHealthy);
includeRequestIds ? underProvisionedRequestIds : null, overProvisionedRequestIds.size(), underProvisionedRequestIds.size(), numFinishedRequests, unknownRacks, unknownSlaves, authDatastoreHealthy, activePriorityLevelFreeze);
}
}
Expand Up @@ -19,7 +19,7 @@
import com.hubspot.singularity.SingularityPendingRequest;
import com.hubspot.singularity.SingularityPendingTask;
import com.hubspot.singularity.SingularityPendingTaskId;
import com.hubspot.singularity.SingularityPriorityKillRequestParent;
import com.hubspot.singularity.SingularityPriorityRequestParent;
import com.hubspot.singularity.SingularityRack;
import com.hubspot.singularity.SingularityRequest;
import com.hubspot.singularity.SingularityRequestCleanup;
Expand Down Expand Up @@ -93,6 +93,6 @@ public void configure(final Binder binder) {
bindTranscoder(binder).asCompressedJson(SingularityTask.class);
bindTranscoder(binder).asCompressedJson(SingularityTaskMetadata.class);

bindTranscoder(binder).asJson(SingularityPriorityKillRequestParent.class);
bindTranscoder(binder).asJson(SingularityPriorityRequestParent.class);
}
}

0 comments on commit 3913b7d

Please sign in to comment.