package com.ldbc.driver.runtime.coordination; import com.ldbc.driver.runtime.ConcurrentErrorReporter; import com.ldbc.driver.runtime.scheduling.Spinner; import com.ldbc.driver.temporal.TimeSource; import java.util.List; import java.util.Set; public class CompletionTimeServiceAssistant { public void writeInitiatedAndCompletedTimesToAllWriters( CompletionTimeService completionTimeService, long timeAsMilli ) throws CompletionTimeException { List<LocalCompletionTimeWriter> writers = completionTimeService.getAllWriters(); for ( LocalCompletionTimeWriter writer : writers ) { writer.submitLocalInitiatedTime( timeAsMilli ); writer.submitLocalCompletedTime( timeAsMilli ); } } public boolean waitForGlobalCompletionTime( TimeSource timeSource, long globalCompletionTimeToWaitForAsMilli, long timeoutDurationAsMilli, CompletionTimeService completionTimeService, ConcurrentErrorReporter errorReporter ) throws CompletionTimeException { long sleepDurationAsMilli = 100; long timeoutTimeAsMilli = timeSource.nowAsMilli() + timeoutDurationAsMilli; while ( timeSource.nowAsMilli() < timeoutTimeAsMilli ) { long currentGlobalCompletionTimeAsMilli = completionTimeService.globalCompletionTimeAsMilli(); if ( -1 == currentGlobalCompletionTimeAsMilli ) { continue; } if ( globalCompletionTimeToWaitForAsMilli <= currentGlobalCompletionTimeAsMilli ) { return true; } if ( errorReporter.errorEncountered() ) { throw new CompletionTimeException( "Encountered error while waiting for GCT" ); } Spinner.powerNap( sleepDurationAsMilli ); } return false; } public SynchronizedCompletionTimeService newSynchronizedConcurrentCompletionTimeServiceFromPeerIds( Set<String> peerIds ) throws CompletionTimeException { return new SynchronizedCompletionTimeService( peerIds ); } public ThreadedQueuedCompletionTimeService newThreadedQueuedConcurrentCompletionTimeServiceFromPeerIds( TimeSource timeSource, Set<String> peerIds, ConcurrentErrorReporter errorReporter ) throws CompletionTimeException { return new ThreadedQueuedCompletionTimeService( timeSource, peerIds, errorReporter ); } }