package com.ldbc.driver.runtime.coordination;
import com.ldbc.driver.temporal.TemporalUtil;
abstract class CompletionTimeEvent {
public enum CompletionTimeEventType {
// Operation started executing
WRITE_LOCAL_INITIATED_TIME,
// Operation completed scheduling
WRITE_LOCAL_COMPLETED_TIME,
// GCT came in from other process
WRITE_EXTERNAL_COMPLETION_TIME,
// Instruction to terminate when all results have arrived
TERMINATE_SERVICE,
// Request for future to GCT value (value will only be available once event is processed)
READ_GCT_FUTURE,
// Request a new local completion time writer
NEW_LOCAL_COMPLETION_TIME_WRITER
}
public static LocalInitiatedTimeEvent writeLocalInitiatedTime(int localCompletionTimeWriterId, long timeAsMilli) {
return new LocalInitiatedTimeEvent(localCompletionTimeWriterId, timeAsMilli);
}
public static LocalCompletedTimeEvent writeLocalCompletedTime(int localCompletionTimeWriterId, long timeAsMilli) {
return new LocalCompletedTimeEvent(localCompletionTimeWriterId, timeAsMilli);
}
public static ExternalCompletionTimeEvent writeExternalCompletionTime(String peerId, long timeAsMilli) {
return new ExternalCompletionTimeEvent(peerId, timeAsMilli);
}
public static TerminationServiceEvent terminateService(long expectedEventCount) {
return new TerminationServiceEvent(expectedEventCount);
}
public static GlobalCompletionTimeFutureEvent globalCompletionTimeFuture(ThreadedQueuedCompletionTimeService.GlobalCompletionTimeFuture future) {
return new GlobalCompletionTimeFutureEvent(future);
}
public static NewLocalCompletionTimeWriterEvent newLocalCompletionTimeWriter(ThreadedQueuedCompletionTimeService.LocalCompletionTimeWriterFuture future) {
return new NewLocalCompletionTimeWriterEvent(future);
}
abstract CompletionTimeEventType type();
static class LocalInitiatedTimeEvent extends CompletionTimeEvent {
private static final TemporalUtil TEMPORAL_UTIL = new TemporalUtil();
private final int localCompletionTimeWriterId;
private final long timeAsMilli;
private LocalInitiatedTimeEvent(int localCompletionTimeWriterId, long timeAsMilli) {
this.localCompletionTimeWriterId = localCompletionTimeWriterId;
this.timeAsMilli = timeAsMilli;
}
@Override
CompletionTimeEventType type() {
return CompletionTimeEventType.WRITE_LOCAL_INITIATED_TIME;
}
int localCompletionTimeWriterId() {
return localCompletionTimeWriterId;
}
long timeAsMilli() {
return timeAsMilli;
}
@Override
public String toString() {
return "InitiatedEvent{" +
"localCompletionTimeWriterId=" + localCompletionTimeWriterId +
", timeAsMilli=" + timeAsMilli +
", time=" + TEMPORAL_UTIL.milliTimeToTimeString(timeAsMilli) +
'}';
}
}
static class LocalCompletedTimeEvent extends CompletionTimeEvent {
private static final TemporalUtil TEMPORAL_UTIL = new TemporalUtil();
private final int localCompletionTimeWriterId;
private final long timeAsMilli;
private LocalCompletedTimeEvent(int localCompletionTimeWriterId, long timeAsMilli) {
this.localCompletionTimeWriterId = localCompletionTimeWriterId;
this.timeAsMilli = timeAsMilli;
}
@Override
CompletionTimeEventType type() {
return CompletionTimeEventType.WRITE_LOCAL_COMPLETED_TIME;
}
int localCompletionTimeWriterId() {
return localCompletionTimeWriterId;
}
long timeAsMilli() {
return timeAsMilli;
}
@Override
public String toString() {
return "InitiatedEvent{" +
"localCompletionTimeWriterId=" + localCompletionTimeWriterId +
", timeAsMilli=" + timeAsMilli +
", time=" + TEMPORAL_UTIL.milliTimeToTimeString(timeAsMilli) +
'}';
}
}
static class ExternalCompletionTimeEvent extends CompletionTimeEvent {
private static final TemporalUtil TEMPORAL_UTIL = new TemporalUtil();
private final long timeAsMilli;
private final String peerId;
private ExternalCompletionTimeEvent(String peerId, long timeAsMilli) {
this.timeAsMilli = timeAsMilli;
this.peerId = peerId;
}
@Override
CompletionTimeEventType type() {
return CompletionTimeEventType.WRITE_EXTERNAL_COMPLETION_TIME;
}
long timeAsMilli() {
return timeAsMilli;
}
String peerId() {
return peerId;
}
@Override
public String toString() {
return "ExternalCompletionTimeEvent{" +
"timeAsMilli=" + timeAsMilli +
", time=" + TEMPORAL_UTIL.milliTimeToTimeString(timeAsMilli) +
", peerId='" + peerId + '\'' +
'}';
}
}
static class TerminationServiceEvent extends CompletionTimeEvent {
private final long expectedEventCount;
private TerminationServiceEvent(long expectedEventCount) {
this.expectedEventCount = expectedEventCount;
}
@Override
CompletionTimeEventType type() {
return CompletionTimeEventType.TERMINATE_SERVICE;
}
long expectedEventCount() {
return expectedEventCount;
}
@Override
public String toString() {
return "TerminationServiceEvent{" +
"expectedEventCount=" + expectedEventCount +
'}';
}
}
static class GlobalCompletionTimeFutureEvent extends CompletionTimeEvent {
private final ThreadedQueuedCompletionTimeService.GlobalCompletionTimeFuture future;
private GlobalCompletionTimeFutureEvent(ThreadedQueuedCompletionTimeService.GlobalCompletionTimeFuture future) {
this.future = future;
}
@Override
CompletionTimeEventType type() {
return CompletionTimeEventType.READ_GCT_FUTURE;
}
ThreadedQueuedCompletionTimeService.GlobalCompletionTimeFuture future() {
return future;
}
@Override
public String toString() {
return "FutureEvent{" +
"future=" + future +
'}';
}
}
static class NewLocalCompletionTimeWriterEvent extends CompletionTimeEvent {
private final ThreadedQueuedCompletionTimeService.LocalCompletionTimeWriterFuture future;
private NewLocalCompletionTimeWriterEvent(ThreadedQueuedCompletionTimeService.LocalCompletionTimeWriterFuture future) {
this.future = future;
}
@Override
CompletionTimeEventType type() {
return CompletionTimeEventType.NEW_LOCAL_COMPLETION_TIME_WRITER;
}
ThreadedQueuedCompletionTimeService.LocalCompletionTimeWriterFuture future() {
return future;
}
@Override
public String toString() {
return "NewLocalCompletionTimeWriterEvent{" +
"future=" + future +
'}';
}
}
}