ORSet

org.apache.pekko.cluster.ddata.ORSet
See theORSet companion object

Implements a 'Observed Remove Set' CRDT, also called a 'OR-Set'. Elements can be added and removed any number of times. Concurrent add wins over remove.

It is not implemented as in the paper A comprehensive study of Convergent and Commutative Replicated Data Types. This is more space efficient and doesn't accumulate garbage for removed elements. It is described in the paper An optimized conflict-free replicated set The implementation is inspired by the Riak DT riak_dt_orswot.

The ORSet has a version vector that is incremented when an element is added to the set. The node -> count pair for that increment is stored against the element as its "birth dot". Every time the element is re-added to the set, its "birth dot" is updated to that of the node -> count version vector entry resulting from the add. When an element is removed, we simply drop it, no tombstones.

When an element exists in replica A and not replica B, is it because A added it and B has not yet seen that, or that B removed it and A has not yet seen that? In this implementation we compare the dot of the present element to the version vector in the Set it is absent from. If the element dot is not "seen" by the Set version vector, that means the other set has yet to see this add, and the item is in the merged Set. If the Set version vector dominates the dot, that means the other Set has removed this element already, and the item is not in the merged Set.

This class is immutable, i.e. "modifying" methods return a new instance.

Attributes

Companion
object
Source
ORSet.scala
Graph
Supertypes
trait Serializable
class Object
trait Matchable
class Any
Show all

Members list

Type members

Types

type D = DeltaOp

The type of the delta. To be specified by subclass. It may be the same type as T or a different type if needed. For example GSet uses the same type and ORSet uses different types.

The type of the delta. To be specified by subclass. It may be the same type as T or a different type if needed. For example GSet uses the same type and ORSet uses different types.

Attributes

Source
ORSet.scala
type T = ORSet[A]

The type of the concrete implementation, e.g. GSet[A]. To be specified by subclass.

The type of the concrete implementation, e.g. GSet[A]. To be specified by subclass.

Attributes

Source
ORSet.scala

Value members

Concrete methods

def :+(element: A)(implicit node: SelfUniqueAddress): ORSet[A]

Adds an element to the set.

Adds an element to the set.

Attributes

Source
ORSet.scala
def add(node: SelfUniqueAddress, element: A): ORSet[A]

Adds an element to the set.

Adds an element to the set.

Attributes

Source
ORSet.scala
def clear(node: SelfUniqueAddress): ORSet[A]

Removes all elements from the set, but keeps the history. This has the same result as using ORSet#remove for each element, but it is more efficient.

Removes all elements from the set, but keeps the history. This has the same result as using ORSet#remove for each element, but it is more efficient.

Attributes

Source
ORSet.scala
def contains(a: A): Boolean

Attributes

Source
ORSet.scala
def elements: Set[A]

Scala API

Scala API

Attributes

Source
ORSet.scala
override def equals(o: Any): Boolean

Compares the receiver object (this) with the argument object (that) for equivalence.

Compares the receiver object (this) with the argument object (that) for equivalence.

Any implementation of this method should be an equivalence relation:

  • It is reflexive: for any instance x of type Any, x.equals(x) should return true.
  • It is symmetric: for any instances x and y of type Any, x.equals(y) should return true if and only if y.equals(x) returns true.
  • It is transitive: for any instances x, y, and z of type Any if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.

If you override this method, you should verify that your implementation remains an equivalence relation. Additionally, when overriding this method it is usually necessary to override hashCode to ensure that objects which are "equal" (o1.equals(o2) returns true) hash to the same scala.Int. (o1.hashCode.equals(o2.hashCode)).

Value parameters

that

the object to compare against this object for equality.

Attributes

Returns

true if the receiver object is equivalent to the argument; false otherwise.

Definition Classes
Any
Source
ORSet.scala
def getElements(): Set[A]

Java API

Java API

Attributes

Source
ORSet.scala
override def hashCode: Int

Calculate a hash code value for the object.

Calculate a hash code value for the object.

The default hashing algorithm is platform dependent.

Note that it is allowed for two objects to have identical hash codes (o1.hashCode.equals(o2.hashCode)) yet not be equal (o1.equals(o2) returns false). A degenerate implementation could always return 0. However, it is required that if two objects are equal (o1.equals(o2) returns true) that they have identical hash codes (o1.hashCode.equals(o2.hashCode)). Therefore, when overriding this method, be sure to verify that the behavior is consistent with the equals method.

Attributes

Returns

the hash code value for this object.

Definition Classes
Any
Source
ORSet.scala

Attributes

Source
ORSet.scala
override def merge(that: ORSet[A]): ORSet[A]

When element is in this Set but not in that Set: Compare the "birth dot" of the present element to the version vector in the Set it is absent from. If the element dot is not "seen" by other Set version vector, that means the other set has yet to see this add, and the element is to be in the merged Set. If the other Set version vector dominates the dot, that means the other Set has removed the element already, and the element is not to be in the merged Set.

When element is in this Set but not in that Set: Compare the "birth dot" of the present element to the version vector in the Set it is absent from. If the element dot is not "seen" by other Set version vector, that means the other set has yet to see this add, and the element is to be in the merged Set. If the other Set version vector dominates the dot, that means the other Set has removed the element already, and the element is not to be in the merged Set.

When element in both this Set and in that Set: Some dots may still need to be shed. If this Set has dots that the other Set does not have, and the other Set version vector dominates those dots, then we need to drop those dots. Keep only common dots, and dots that are not dominated by the other sides version vector

Attributes

Definition Classes
Source
ORSet.scala
override def mergeDelta(thatDelta: DeltaOp): ORSet[A]

When delta is merged into the full state this method is used. When the type D of the delta is of the same type as the full state T this method can be implemented by delegating to merge.

When delta is merged into the full state this method is used. When the type D of the delta is of the same type as the full state T this method can be implemented by delegating to merge.

Attributes

Definition Classes
Source
ORSet.scala

The nodes that have changed the state for this data and would need pruning when such node is no longer part of the cluster.

The nodes that have changed the state for this data and would need pruning when such node is no longer part of the cluster.

Attributes

Definition Classes
Source
ORSet.scala
override def needPruningFrom(removedNode: UniqueAddress): Boolean

Does it have any state changes from a specific node, which has been removed from the cluster.

Does it have any state changes from a specific node, which has been removed from the cluster.

Attributes

Definition Classes
Source
ORSet.scala
override def prune(removedNode: UniqueAddress, collapseInto: UniqueAddress): ORSet[A]

When the removed node has been removed from the cluster the state changes from that node will be pruned by collapsing the data entries to another node.

When the removed node has been removed from the cluster the state changes from that node will be pruned by collapsing the data entries to another node.

Attributes

Definition Classes
Source
ORSet.scala
override def pruningCleanup(removedNode: UniqueAddress): ORSet[A]

Remove data entries from a node that has been removed from the cluster and already been pruned.

Remove data entries from a node that has been removed from the cluster and already been pruned.

Attributes

Definition Classes
Source
ORSet.scala
def remove(element: A)(implicit node: SelfUniqueAddress): ORSet[A]

Scala API Removes an element from the set.

Scala API Removes an element from the set.

Attributes

Source
ORSet.scala
def remove(node: SelfUniqueAddress, element: A): ORSet[A]

Java API Removes an element from the set.

Java API Removes an element from the set.

Attributes

Source
ORSet.scala
override def resetDelta: ORSet[A]

Reset collection of deltas from mutator operations. When the Replicator invokes the modify function of the Update message the delta is always "reset" and when the user code is invoking one or more mutator operations the data is collecting the delta of the operations and makes it available for the Replicator with the delta accessor. When the Replicator has grabbed the delta it will invoke this method to get a clean data instance without the delta.

Reset collection of deltas from mutator operations. When the Replicator invokes the modify function of the Update message the delta is always "reset" and when the user code is invoking one or more mutator operations the data is collecting the delta of the operations and makes it available for the Replicator with the delta accessor. When the Replicator has grabbed the delta it will invoke this method to get a clean data instance without the delta.

Attributes

Definition Classes
Source
ORSet.scala
def size: Int

Attributes

Source
ORSet.scala
override def toString: String

Returns a string representation of the object.

Returns a string representation of the object.

The default representation is platform dependent.

Attributes

Returns

a string representation of the object.

Definition Classes
Any
Source
ORSet.scala

Deprecated methods

def +(element: A)(implicit node: Cluster): ORSet[A]

Attributes

Deprecated
[Since version Akka 2.5.20]
Source
ORSet.scala
def -(element: A)(implicit node: Cluster): ORSet[A]

Removes an element from the set.

Removes an element from the set.

Attributes

Deprecated
[Since version Akka 2.5.20]
Source
ORSet.scala
def add(node: Cluster, element: A): ORSet[A]

Attributes

Deprecated
[Since version Akka 2.5.20]
Source
ORSet.scala
def clear(node: Cluster): ORSet[A]

Attributes

Deprecated
[Since version Akka 2.5.20]
Source
ORSet.scala
def remove(node: Cluster, element: A): ORSet[A]

Removes an element from the set.

Removes an element from the set.

Attributes

Deprecated
[Since version Akka 2.5.20]
Source
ORSet.scala

Concrete fields

override val delta: Option[DeltaOp]

The accumulated delta of mutator operations since previous resetDelta. When the Replicator invokes the modify function of the Update message and the user code is invoking one or more mutator operations the data is collecting the delta of the operations and makes it available for the Replicator with the delta accessor. The modify function shall still return the full state in the same way as ReplicatedData without support for deltas.

The accumulated delta of mutator operations since previous resetDelta. When the Replicator invokes the modify function of the Update message and the user code is invoking one or more mutator operations the data is collecting the delta of the operations and makes it available for the Replicator with the delta accessor. The modify function shall still return the full state in the same way as ReplicatedData without support for deltas.

Attributes

Source
ORSet.scala