package lsr.paxos.storage;
import lsr.paxos.Snapshot;
/**
* Represents the storage with state of the Paxos protocol like view number,
* list of consensus instances and snapshots.
*/
public interface Storage {
/**
* Updates value of first undecided instance id. This method should be
* called every time log has been updated.
*/
void updateFirstUncommitted();
/**
* Returns first consensus instance for which there is yet no decision. That
* is, <code>topDecided + 1</code> is the first instance for which this
* process doesn't know the decision.
*
* @return the id of first undecided instance
*/
int getFirstUncommitted();
/**
* Returns the log from paxos protocol, containing list of consensus
* instances.
*
* @return the log
*/
Log getLog();
/**
* Returns true if the instance is inside the window.
*
* @param instanceId - the id of consensus instance
* @return true if the consensus instance id is inside a window
*/
boolean isInWindow(int instanceId);
/** Number of instances from lowest not yet decided to highest known */
int getWindowUsed();
/**
* returns true if the window is full, i.e., we reached maximum number of
* open parallel instances
*/
boolean isWindowFull();
/**
* Returns true if there are no undecided consensus instances.
*
* @return true if there are no undecided consensus instances
*/
public boolean isIdle();
/**
* Returns the last snapshot.
*
* @return the last snapshot
*/
Snapshot getLastSnapshot();
/**
* Sets the last snapshot to given value.
*
* @param snapshot - the new snapshot
*/
void setLastSnapshot(Snapshot snapshot);
/**
* Returns the view number.
*
* @return the view number
*/
int getView();
/**
* Returns the epoch array - known epoch number of every process.
*
* @return the array with epoch numbers
*/
long[] getEpoch();
/**
* Sets the new epoch array.
*
* @param epoch - the new epoch array
*/
void setEpoch(long[] epoch);
/**
* Sets the view number. The new view number has to be greater than actual
* one.
*
* @param view - the new view number
* @throws IllegalArgumentException if new view is lower or equal than
* actual one
*/
void setView(int view);
/**
* Updates the epoch vector inside this storage by taking maximum from
* specified epoch and epoh inside this storage.
*
* <p>
* The length of given epoch has to match the epoch vector inside this
* storage.
* <p>
* Example:
*
* <pre>
* storage.setEpoch(new long[] {1, 2, 3});
* storage.updateEpoch(new long[] {2, 1, 4});
* storage.getEpoch(); // {2, 2, 4}
* </pre>
*
* @param epoch - the new epoch vector
* @throws IllegalArgumentException when size of epoch is different than one
* stored inside this class
*/
void updateEpoch(long[] epoch);
/**
* Updates the epoch for one process inside this storage by taking maximum
* from specified epoch and epoch inside this storage.
*
* <p>
* The length of give epoch has to match the epoch vector inside this
* storage
* <p>
* Example:
*
* <pre>
* storage.setEpoch(new long[] {1, 2, 3});
* storage.updateEpoch(2, 0);
* storage.getEpoch(); // {2, 2, 3}
* </pre>
*
* @param epoch - the new epoch vector
* @throws IllegalArgumentException when sender is less than zero or greater
* or equal than size of current epoch
*/
void updateEpoch(long epoch, int sender);
/** Interface for monitoring view (leader) changes */
static interface ViewChangeListener {
/**
* Called upon each change of the view.
*
* Called from time-critical thread. Use with care.
*/
void viewChanged(int newView, int newLeader);
}
boolean addViewChangeListener(ViewChangeListener l);
boolean removeViewChangeListener(ViewChangeListener l);
/**
* Returns an ID that:
*
* - may change in runtime, may stay unchanged
*
* - is strictly greater than before previous crash
*
* - other replica may return the same ID
*/
long getRunUniqueId();
}