package com.ldbc.driver.runtime.executor; import com.ldbc.driver.ChildOperationGenerator; import com.ldbc.driver.Db; import com.ldbc.driver.Operation; import com.ldbc.driver.OperationHandlerRunnableContext; import com.ldbc.driver.WorkloadStreams; import com.ldbc.driver.runtime.ConcurrentErrorReporter; import com.ldbc.driver.runtime.coordination.GlobalCompletionTimeReader; import com.ldbc.driver.runtime.coordination.LocalCompletionTimeWriter; import com.ldbc.driver.runtime.metrics.MetricsService; import com.ldbc.driver.runtime.scheduling.Spinner; import com.ldbc.driver.temporal.TimeSource; import java.util.concurrent.atomic.AtomicLong; import static java.lang.String.format; public class SameThreadOperationExecutor implements OperationExecutor { private final AtomicLong uncompletedHandlers = new AtomicLong( 0 ); private final OperationHandlerRunnableContextRetriever operationHandlerRunnableContextRetriever; private final ChildOperationGenerator childOperationGenerator; private final ChildOperationExecutor childOperationExecutor; public SameThreadOperationExecutor( Db db, WorkloadStreams.WorkloadStreamDefinition streamDefinition, LocalCompletionTimeWriter localCompletionTimeWriter, GlobalCompletionTimeReader globalCompletionTimeReader, Spinner spinner, TimeSource timeSource, ConcurrentErrorReporter errorReporter, MetricsService metricsService, ChildOperationGenerator childOperationGenerator ) { this.childOperationExecutor = new ChildOperationExecutor(); this.childOperationGenerator = childOperationGenerator; this.operationHandlerRunnableContextRetriever = new OperationHandlerRunnableContextRetriever( streamDefinition, db, localCompletionTimeWriter, globalCompletionTimeReader, spinner, timeSource, errorReporter, metricsService ); } @Override public final void execute( Operation operation ) throws OperationExecutorException { uncompletedHandlers.incrementAndGet(); OperationHandlerRunnableContext operationHandlerRunnableContext = null; try { operationHandlerRunnableContext = operationHandlerRunnableContextRetriever.getInitializedHandlerFor( operation ); operationHandlerRunnableContext.run(); childOperationExecutor.execute( childOperationGenerator, operationHandlerRunnableContext.operation(), operationHandlerRunnableContext.resultReporter().result(), operationHandlerRunnableContext.resultReporter().actualStartTimeAsMilli(), operationHandlerRunnableContext.resultReporter().runDurationAsNano(), operationHandlerRunnableContextRetriever ); } catch ( Throwable e ) { throw new OperationExecutorException( format( "Error retrieving or executing handler\n" + "Operation: %s\n" + "Handler Context:%s", operation, operationHandlerRunnableContext ), e ); } finally { uncompletedHandlers.decrementAndGet(); operationHandlerRunnableContext.cleanup(); } } @Override synchronized public final void shutdown( long waitAsMilli ) throws OperationExecutorException { } @Override public long uncompletedOperationHandlerCount() { return uncompletedHandlers.get(); } }