package com.ldbc.driver.runtime.executor;
import com.ldbc.driver.ChildOperationGenerator;
import com.ldbc.driver.Operation;
import com.ldbc.driver.OperationHandlerRunnableContext;
import com.ldbc.driver.runtime.ConcurrentErrorReporter;
import com.ldbc.driver.runtime.QueueEventFetcher;
import java.util.Queue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import static java.lang.String.format;
public class SingleThreadOperationExecutorThread extends Thread
{
private final QueueEventFetcher<Operation> operationQueueEventFetcher;
private final ConcurrentErrorReporter errorReporter;
private final AtomicLong uncompletedHandlers;
private final AtomicBoolean forcedShutdownRequested = new AtomicBoolean( false );
private final OperationHandlerRunnableContextRetriever operationHandlerRunnableContextRetriever;
private final ChildOperationGenerator childOperationGenerator;
private final ChildOperationExecutor childOperationExecutor;
SingleThreadOperationExecutorThread( Queue<Operation> operationHandlerRunnerQueue,
ConcurrentErrorReporter errorReporter,
AtomicLong uncompletedHandlers,
OperationHandlerRunnableContextRetriever operationHandlerRunnableContextRetriever,
ChildOperationGenerator childOperationGenerator )
{
super( SingleThreadOperationExecutorThread.class.getSimpleName() + "-" + System.currentTimeMillis() );
this.childOperationExecutor = new ChildOperationExecutor();
this.operationQueueEventFetcher = QueueEventFetcher.queueEventFetcherFor( operationHandlerRunnerQueue );
this.errorReporter = errorReporter;
this.uncompletedHandlers = uncompletedHandlers;
this.operationHandlerRunnableContextRetriever = operationHandlerRunnableContextRetriever;
this.childOperationGenerator = childOperationGenerator;
}
@Override
public void run()
{
Operation operation = null;
OperationHandlerRunnableContext operationHandlerRunnableContext = null;
try
{
operation = operationQueueEventFetcher.fetchNextEvent();
while ( operation != SingleThreadOperationExecutor.TERMINATE_OPERATION &&
false == forcedShutdownRequested.get() )
{
operationHandlerRunnableContext =
operationHandlerRunnableContextRetriever.getInitializedHandlerFor( operation );
operationHandlerRunnableContext.run();
childOperationExecutor.execute(
childOperationGenerator,
operationHandlerRunnableContext.operation(),
operationHandlerRunnableContext.resultReporter().result(),
operationHandlerRunnableContext.resultReporter().actualStartTimeAsMilli(),
operationHandlerRunnableContext.resultReporter().runDurationAsNano(),
operationHandlerRunnableContextRetriever
);
operation = operationQueueEventFetcher.fetchNextEvent();
}
}
catch ( Throwable e )
{
errorReporter.reportError(
this,
format( "Error retrieving handler\nOperation: %s\n%s",
operation,
ConcurrentErrorReporter.stackTraceToString( e ) )
);
}
finally
{
uncompletedHandlers.decrementAndGet();
operationHandlerRunnableContext.cleanup();
}
}
void forceShutdown()
{
forcedShutdownRequested.set( true );
}
}