package com.ldbc.driver.runtime.coordination; public class GlobalCompletionTimeStateManager implements LocalCompletionTimeWriter, ExternalCompletionTimeWriter, GlobalCompletionTimeReader { private final LocalCompletionTimeReader localCompletionTimeReader; private final LocalCompletionTimeWriter localCompletionTimeWriter; private final ExternalCompletionTimeReader externalCompletionTimeReader; private final ExternalCompletionTimeWriter externalCompletionTimeWriter; GlobalCompletionTimeStateManager( LocalCompletionTimeReader localCompletionTimeReader, LocalCompletionTimeWriter localCompletionTimeWriter, ExternalCompletionTimeReader externalCompletionTimeReader, ExternalCompletionTimeWriter externalCompletionTimeWriter) { this.localCompletionTimeReader = localCompletionTimeReader; this.localCompletionTimeWriter = localCompletionTimeWriter; this.externalCompletionTimeReader = externalCompletionTimeReader; this.externalCompletionTimeWriter = externalCompletionTimeWriter; } @Override public void submitPeerCompletionTime(String peerId, long peerCompletionTimeAsMilli) throws CompletionTimeException { externalCompletionTimeWriter.submitPeerCompletionTime(peerId, peerCompletionTimeAsMilli); } @Override public void submitLocalInitiatedTime(long timeAsMilli) throws CompletionTimeException { localCompletionTimeWriter.submitLocalInitiatedTime(timeAsMilli); } @Override public void submitLocalCompletedTime(long timeAsMilli) throws CompletionTimeException { localCompletionTimeWriter.submitLocalCompletedTime(timeAsMilli); } @Override public long globalCompletionTimeAsMilli() throws CompletionTimeException { long localCompletionTimeValue = localCompletionTimeReader.localCompletionTimeAsMilli(); if (-1 == localCompletionTimeValue) // Until we know what our local completion time is there is no way of knowing what GCT is return -1; long externalCompletionTimeValue = externalCompletionTimeReader.externalCompletionTimeAsMilli(); if (-1 == externalCompletionTimeValue) // One or more of our peers have not replied yet -> no way of knowing what GCT is return -1; // Return min(localCompletionTime,externalCompletionTime) return (localCompletionTimeValue < externalCompletionTimeValue) ? localCompletionTimeValue : externalCompletionTimeValue; } }