/*
* 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.facebook.presto.Session;
import com.facebook.presto.execution.StateMachine.StateChangeListener;
import com.facebook.presto.memory.VersionedMemoryPoolId;
import com.facebook.presto.metadata.Metadata;
import com.facebook.presto.spi.QueryId;
import com.facebook.presto.spi.resourceGroups.ResourceGroupId;
import com.facebook.presto.transaction.TransactionManager;
import io.airlift.units.Duration;
import java.net.URI;
import java.util.Optional;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import static com.facebook.presto.memory.LocalMemoryManager.GENERAL_POOL;
import static java.util.Objects.requireNonNull;
public class FailedQueryExecution
implements QueryExecution
{
private final QueryInfo queryInfo;
private final Session session;
private final Executor executor;
private final Optional<ResourceGroupId> resourceGroup;
public FailedQueryExecution(QueryId queryId, String query, Optional<ResourceGroupId> resourceGroup, Session session, URI self, TransactionManager transactionManager, Executor executor, Metadata metadata, Throwable cause)
{
requireNonNull(cause, "cause is null");
this.session = requireNonNull(session, "session is null");
this.executor = requireNonNull(executor, "executor is null");
QueryStateMachine queryStateMachine = QueryStateMachine.failed(queryId, query, session, self, transactionManager, executor, metadata, cause);
queryInfo = queryStateMachine.updateQueryInfo(Optional.empty());
this.resourceGroup = requireNonNull(resourceGroup, "resourceGroup is null");
}
@Override
public QueryId getQueryId()
{
return queryInfo.getQueryId();
}
@Override
public QueryInfo getQueryInfo()
{
return queryInfo;
}
@Override
public QueryState getState()
{
return queryInfo.getState();
}
@Override
public VersionedMemoryPoolId getMemoryPool()
{
return new VersionedMemoryPoolId(GENERAL_POOL, 0);
}
@Override
public void setMemoryPool(VersionedMemoryPoolId poolId)
{
// no-op
}
@Override
public long getTotalMemoryReservation()
{
return 0;
}
@Override
public Duration getTotalCpuTime()
{
return new Duration(0, TimeUnit.SECONDS);
}
@Override
public Session getSession()
{
return session;
}
@Override
public void start()
{
// no-op
}
@Override
public Duration waitForStateChange(QueryState currentState, Duration maxWait)
throws InterruptedException
{
return maxWait;
}
@Override
public void addStateChangeListener(StateChangeListener<QueryState> stateChangeListener)
{
executor.execute(() -> stateChangeListener.stateChanged(QueryState.FAILED));
}
@Override
public void addFinalQueryInfoListener(StateChangeListener<QueryInfo> stateChangeListener)
{
executor.execute(() -> stateChangeListener.stateChanged(queryInfo));
}
@Override
public void fail(Throwable cause)
{
// no-op
}
@Override
public void cancelQuery()
{
// no-op
}
@Override
public void cancelStage(StageId stageId)
{
// no-op
}
@Override
public void recordHeartbeat()
{
// no-op
}
@Override
public void pruneInfo()
{
// no-op
}
@Override
public Optional<ResourceGroupId> getResourceGroup()
{
return resourceGroup;
}
@Override
public void setResourceGroup(ResourceGroupId resourceGroupId)
{
throw new UnsupportedOperationException("setResouceGroup is not supported for FailedQueryExecution");
}
}