/*
* 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());
}
}