package lsr.paxos.idgen;
import static lsr.common.ProcessDescriptor.processDescriptor;
import java.util.concurrent.atomic.AtomicLong;
/**
* <p>
* A client id generator that starts by generating small numbers. Having small
* client ids can be convenient for debugging and for some specific situations.
*
* <p>
* If used correctly, this generator will ensure unique ids. If replicas are not
* allowed to recover, then it is enough to initialize the generator to:
*
* <code>new SimpleIdGenerator(replicaID, nReplicas)</code>
*
* <p>
* The generated ids will be of the form <code>replicaID + k*nReplicas</code>,
* which ensures that each replica generates its own unique stream of ids.
*
* <p>
* If replicas are allowed to recover, then ids are not guaranteed to be unique
* after recovery. To prevent this, the replica should keep on stable storage
* the last id that it generated and when recovering initialize this class to
* start from this id. This is not implemented.
*
*/
public class SimpleIdGenerator implements IdGenerator {
private final AtomicLong current;
/**
* Initialize new instance of <code>SimpleIdGenerator</code>.
*
* @param start - first number in generated sequence
* @param step - difference between next's id's
*
*/
public SimpleIdGenerator() {
current = new AtomicLong(processDescriptor.localId);
}
/**
* Generates next number from the sequence specified by this generator.
*
* This method is thread-safe.
*
* @return next unique number
*/
public long next() {
return current.getAndAdd(processDescriptor.numReplicas);
}
}