package com.ldbc.driver.runtime.executor; import com.ldbc.driver.Db; import com.ldbc.driver.DbException; 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.CompletionTimeException; import com.ldbc.driver.runtime.coordination.DummyLocalCompletionTimeWriter; 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.GctDependencyCheck; import com.ldbc.driver.runtime.scheduling.Spinner; import com.ldbc.driver.temporal.TimeSource; import java.util.Set; import static java.lang.String.format; // TODO test class OperationHandlerRunnableContextRetriever { private static final LocalCompletionTimeWriter DUMMY_LOCAL_COMPLETION_TIME_WRITER = new DummyLocalCompletionTimeWriter(); private final Db db; private final LocalCompletionTimeWriter localCompletionTimeWriter; private final GlobalCompletionTimeReader globalCompletionTimeReader; private final Spinner spinner; private final TimeSource timeSource; private final ConcurrentErrorReporter errorReporter; private final MetricsService metricsService; private final Set<Class<? extends Operation>> dependencyOperationTypes; private final Set<Class<? extends Operation>> dependentOperationTypes; private final GctDependencyCheck gctDependencyCheck; OperationHandlerRunnableContextRetriever( WorkloadStreams.WorkloadStreamDefinition streamDefinition, Db db, LocalCompletionTimeWriter localCompletionTimeWriter, GlobalCompletionTimeReader globalCompletionTimeReader, Spinner spinner, TimeSource timeSource, ConcurrentErrorReporter errorReporter, MetricsService metricsService ) { this.db = db; this.localCompletionTimeWriter = localCompletionTimeWriter; this.globalCompletionTimeReader = globalCompletionTimeReader; this.spinner = spinner; this.timeSource = timeSource; this.errorReporter = errorReporter; this.metricsService = metricsService; this.dependentOperationTypes = streamDefinition.dependentOperationTypes(); this.dependencyOperationTypes = streamDefinition.dependencyOperationTypes(); this.gctDependencyCheck = new GctDependencyCheck( globalCompletionTimeReader, errorReporter ); } public OperationHandlerRunnableContext getInitializedHandlerFor( Operation operation ) throws OperationExecutorException, CompletionTimeException, DbException { OperationHandlerRunnableContext operationHandlerRunnableContext; try { operationHandlerRunnableContext = db.getOperationHandlerRunnableContext( operation ); } catch ( Exception e ) { throw new OperationExecutorException( format( "Error while retrieving handler for operation\nOperation: %s", operation ), e ); } LocalCompletionTimeWriter localCompletionTimeWriterForHandler; // TODO this should really be a Set<Integer> --> even PrimitiveIntSet if ( dependencyOperationTypes.contains( operation.getClass() ) ) { localCompletionTimeWriterForHandler = localCompletionTimeWriter; } else { localCompletionTimeWriterForHandler = DUMMY_LOCAL_COMPLETION_TIME_WRITER; } try { operationHandlerRunnableContext.init( timeSource, spinner, operation, localCompletionTimeWriterForHandler, errorReporter, metricsService ); } catch ( Exception e ) { throw new OperationExecutorException( format( "Error while initializing handler for operation\nOperation: %s", operation ), e ); } if ( dependentOperationTypes.contains( operation.getClass() ) ) { operationHandlerRunnableContext.setBeforeExecuteCheck( gctDependencyCheck ); } return operationHandlerRunnableContext; } }