/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.presto.execution; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableList; import io.airlift.units.DataSize; import java.net.URI; import java.util.List; import static com.facebook.presto.execution.TaskState.PLANNED; import static com.google.common.base.MoreObjects.toStringHelper; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static io.airlift.units.DataSize.Unit.BYTE; import static java.util.Objects.requireNonNull; public class TaskStatus { /** * The first valid version that will be returned for a remote task. */ public static final long STARTING_VERSION = 1; /** * A value lower than {@link #STARTING_VERSION}. This value can be used to * create an initial local task that is always older than any remote task. */ private static final long MIN_VERSION = 0; /** * A value larger than any valid value. This value can be used to create * a final local task that is always newer than any remote task. */ private static final long MAX_VERSION = Long.MAX_VALUE; private final TaskId taskId; private final String taskInstanceId; private final long version; private final TaskState state; private final URI self; private final int queuedPartitionedDrivers; private final int runningPartitionedDrivers; private final DataSize memoryReservation; private final List<ExecutionFailureInfo> failures; @JsonCreator public TaskStatus(@JsonProperty("taskId") TaskId taskId, @JsonProperty("taskInstanceId") String taskInstanceId, @JsonProperty("version") long version, @JsonProperty("state") TaskState state, @JsonProperty("self") URI self, @JsonProperty("failures") List<ExecutionFailureInfo> failures, @JsonProperty("queuedPartitionedDrivers") int queuedPartitionedDrivers, @JsonProperty("runningPartitionedDrivers") int runningPartitionedDrivers, @JsonProperty("memoryReservation") DataSize memoryReservation) { this.taskId = requireNonNull(taskId, "taskId is null"); this.taskInstanceId = requireNonNull(taskInstanceId, "taskInstanceId is null"); checkState(version >= MIN_VERSION, "version must be >= MIN_VERSION"); this.version = version; this.state = requireNonNull(state, "state is null"); this.self = requireNonNull(self, "self is null"); checkArgument(queuedPartitionedDrivers >= 0, "queuedPartitionedDrivers must be positive"); this.queuedPartitionedDrivers = queuedPartitionedDrivers; checkArgument(runningPartitionedDrivers >= 0, "runningPartitionedDrivers must be positive"); this.runningPartitionedDrivers = runningPartitionedDrivers; this.memoryReservation = requireNonNull(memoryReservation, "memoryReservation is null"); this.failures = ImmutableList.copyOf(requireNonNull(failures, "failures is null")); } @JsonProperty public TaskId getTaskId() { return taskId; } @JsonProperty public String getTaskInstanceId() { return taskInstanceId; } @JsonProperty public long getVersion() { return version; } @JsonProperty public TaskState getState() { return state; } @JsonProperty public URI getSelf() { return self; } @JsonProperty public List<ExecutionFailureInfo> getFailures() { return failures; } @JsonProperty public int getQueuedPartitionedDrivers() { return queuedPartitionedDrivers; } @JsonProperty public int getRunningPartitionedDrivers() { return runningPartitionedDrivers; } @JsonProperty public DataSize getMemoryReservation() { return memoryReservation; } @Override public String toString() { return toStringHelper(this) .add("taskId", taskId) .add("state", state) .toString(); } public static TaskStatus initialTaskStatus(TaskId taskId, URI location) { return new TaskStatus(taskId, "", MIN_VERSION, PLANNED, location, ImmutableList.of(), 0, 0, new DataSize(0, BYTE)); } public static TaskStatus failWith(TaskStatus taskStatus, TaskState state, List<ExecutionFailureInfo> exceptions) { return new TaskStatus( taskStatus.getTaskId(), taskStatus.getTaskInstanceId(), MAX_VERSION, state, taskStatus.getSelf(), exceptions, taskStatus.getQueuedPartitionedDrivers(), taskStatus.getRunningPartitionedDrivers(), taskStatus.getMemoryReservation()); } }