package com.ldbc.driver.runtime.scheduling; import com.ldbc.driver.Operation; import com.ldbc.driver.runtime.ConcurrentErrorReporter; import com.ldbc.driver.runtime.coordination.CompletionTimeException; import com.ldbc.driver.runtime.coordination.GlobalCompletionTimeReader; import com.ldbc.driver.temporal.TemporalUtil; import static java.lang.String.format; public class GctDependencyCheck implements SpinnerCheck { private static final TemporalUtil TEMPORAL_UTIL = new TemporalUtil(); private final GlobalCompletionTimeReader globalCompletionTimeReader; private final ConcurrentErrorReporter errorReporter; public GctDependencyCheck( GlobalCompletionTimeReader globalCompletionTimeReader, ConcurrentErrorReporter errorReporter ) { this.globalCompletionTimeReader = globalCompletionTimeReader; this.errorReporter = errorReporter; } @Override public SpinnerCheckResult doCheck( Operation operation ) { try { return (globalCompletionTimeReader.globalCompletionTimeAsMilli() >= operation.dependencyTimeStamp()) ? SpinnerCheckResult.PASSED : SpinnerCheckResult.STILL_CHECKING; } catch ( CompletionTimeException e ) { errorReporter.reportError( this, format( "Error encountered while reading GCT for query %s\n%s", operation.getClass().getSimpleName(), ConcurrentErrorReporter.stackTraceToString( e ) ) ); return SpinnerCheckResult.FAILED; } } @Override public boolean handleFailedCheck( Operation operation ) { try { // Note, GCT printed here may be a little later than GCT that was measured during check errorReporter.reportError( this, format( "GCT(%s) has not advanced sufficiently to execute operation\n" + "Operation: %s\n" + "Time Stamp: %s\n" + "Dependency Time Stamp: %s", TEMPORAL_UTIL.milliTimeToDateTimeString( globalCompletionTimeReader.globalCompletionTimeAsMilli() ), operation, operation.timeStamp(), operation.dependencyTimeStamp() ) ); return false; } catch ( CompletionTimeException e ) { errorReporter.reportError( this, format( "Error encountered in handleFailedCheck while reading GCT for query %s\n%s", operation.getClass().getSimpleName(), ConcurrentErrorReporter.stackTraceToString( e ) ) ); return false; } } }