package lsr.paxos.events; import lsr.paxos.Snapshot; import lsr.paxos.storage.Storage; public class AfterCatchupSnapshotEvent implements Runnable { private final Snapshot snapshot; private final Storage storage; private final Object snapshotLock; private boolean finished; public AfterCatchupSnapshotEvent(Snapshot snapshot, Storage storage, Object snapshotLock) { this.snapshot = snapshot; this.snapshotLock = snapshotLock; this.storage = storage; this.finished = false; } public void run() { Snapshot lastSnapshot = storage.getLastSnapshot(); if (lastSnapshot != null && lastSnapshot.getNextInstanceId() >= snapshot.getNextInstanceId()) { finished = true; synchronized (snapshotLock) { snapshotLock.notify(); } return; } storage.setLastSnapshot(snapshot); if (lastSnapshot != null) { storage.getLog().truncateBelow(lastSnapshot.getNextInstanceId()); } storage.getLog().clearUndecidedBelow(snapshot.getNextInstanceId()); storage.updateFirstUncommitted(); finished = true; synchronized (snapshotLock) { snapshotLock.notify(); } } public boolean isFinished() { return finished; } }