package com.ldbc.driver.runtime.executor;
import com.ldbc.driver.Operation;
import com.ldbc.driver.WorkloadStreams.WorkloadStreamDefinition;
import com.ldbc.driver.runtime.ConcurrentErrorReporter;
import com.ldbc.driver.runtime.coordination.LocalCompletionTimeWriter;
import com.ldbc.driver.runtime.scheduling.Spinner;
import java.util.concurrent.atomic.AtomicBoolean;
class OperationStreamExecutorServiceThread extends Thread
{
private static final long POLL_INTERVAL_WHILE_WAITING_FOR_LAST_HANDLER_TO_FINISH_AS_MILLI = 100;
private final OperationExecutor operationExecutor;
private final ConcurrentErrorReporter errorReporter;
private final AtomicBoolean hasFinished;
private final AtomicBoolean forcedTerminate;
private final InitiatedTimeSubmittingOperationRetriever initiatedTimeSubmittingOperationRetriever;
public OperationStreamExecutorServiceThread( OperationExecutor operationExecutor,
ConcurrentErrorReporter errorReporter,
WorkloadStreamDefinition streamDefinition,
AtomicBoolean hasFinished,
AtomicBoolean forcedTerminate,
LocalCompletionTimeWriter localCompletionTimeWriter )
{
super( OperationStreamExecutorServiceThread.class.getSimpleName() + "-" + System.currentTimeMillis() );
this.operationExecutor = operationExecutor;
this.errorReporter = errorReporter;
this.hasFinished = hasFinished;
this.forcedTerminate = forcedTerminate;
this.initiatedTimeSubmittingOperationRetriever = new InitiatedTimeSubmittingOperationRetriever(
streamDefinition,
localCompletionTimeWriter
);
}
@Override
public void run()
{
try
{
while ( initiatedTimeSubmittingOperationRetriever.hasNextOperation() && !forcedTerminate.get() )
{
Operation operation = initiatedTimeSubmittingOperationRetriever.nextOperation();
// --- BLOCKING CALL (when bounded queue is full) ---
operationExecutor.execute( operation );
}
}
catch ( Throwable e )
{
errorReporter.reportError( this, ConcurrentErrorReporter.stackTraceToString( e ) );
}
finally
{
while ( 0 < operationExecutor.uncompletedOperationHandlerCount() && !forcedTerminate.get() )
{
Spinner.powerNap( POLL_INTERVAL_WHILE_WAITING_FOR_LAST_HANDLER_TO_FINISH_AS_MILLI );
}
this.hasFinished.set( true );
}
}
}