com.hazelcast.crdt.pncounter

## Interface PNCounter

- All Superinterfaces:
    DistributedObject
  All Known Implementing Classes:
    ClientPNCounterProxy, PNCounterProxy

      public interface PNCounter
      extends DistributedObject

  PN (Positive-Negative) CRDT counter.

  The counter supports adding and subtracting values as well as retrieving the current counter value. Each replica of this counter can perform operations locally without coordination with the other replicas, thus increasing availability. The counter guarantees that whenever two nodes have received the same set of updates, possibly in a different order, their state is identical, and any conflicting updates are merged automatically. If no new updates are made to the shared state, all nodes that can communicate will eventually have the same data.

  The updates to this counter are applied locally when invoked on a CRDT replica. A replica can be any hazelcast instance which is not a client or a lite member. The number of replicas in the cluster is determined by the `PNCounterConfig.getReplicaCount()` configuration value.

  When invoking updates from non-replica instance, the invocation is remote. This may lead to indeterminate state - the update may be applied but the response has not been received. In this case, the caller will be notified with a `TargetDisconnectedException` when invoking from a client or a `MemberLeftException` when invoked from a member.

  The read and write methods provide monotonic read and RYW (read-your-write) guarantees. These guarantees are session guarantees which means that if no replica with the previously observed state is reachable, the session guarantees are lost and the method invocation will throw a `ConsistencyLostException`. This does not mean that an update is lost. All of the updates are part of some replica and will be eventually reflected in the state of all other replicas. This exception just means that you cannot observe your own writes because all replicas that contain your updates are currently unreachable. After you have received a `ConsistencyLostException`, you can either wait for a sufficiently up-to-date replica to become reachable in which case the session can be continued or you can reset the session by calling the `reset()` method. If you have called the `reset()` method, a new session is started with the next invocation to a CRDT replica.

  NOTE: The CRDT state is kept entirely on non-lite (data) members. If there aren't any and the methods here are invoked on a lite member, they will fail with an `NoDataMemberInClusterException`.

  Since:
    3.10

- - ### Method Summary

    All Methods Instance Methods Abstract Methods
    Modifier and Type | Method and Description
    --- | ---
    `long` | `addAndGet(long delta)` Adds the given value to the current value.
    `long` | `decrementAndGet()` Decrements by one the current value.
    `long` | `get()` Returns the current value of the counter.
    `long` | `getAndAdd(long delta)` Adds the given value to the current value.
    `long` | `getAndDecrement()` Decrements by one the current value.
    `long` | `getAndIncrement()` Increments by one the current value.
    `long` | `getAndSubtract(long delta)` Subtracts the given value from the current value.
    `long` | `incrementAndGet()` Increments by one the current value.
    `void` | `reset()` Resets the observed state by this PN counter.
    `long` | `subtractAndGet(long delta)` Subtracts the given value from the current value.

    - ### Methods inherited from interface com.hazelcast.core.DistributedObject

      `destroy, getName, getPartitionKey, getServiceName`

- - ### Method Detail

    - #### get

          long get()

      Returns the current value of the counter.
      Throws:
        `NoDataMemberInClusterException` - if the cluster does not contain any data members
        `UnsupportedOperationException` - if the cluster version is less than 3.10
        `ConsistencyLostException` - if the session guarantees have been lost (see class level javadoc)
      See Also:
        `Cluster.getClusterVersion()`

    - #### getAndAdd

          long getAndAdd(long delta)

      Adds the given value to the current value.
      Parameters:
        `delta` - the value to add
      Returns:
        the previous value
      Throws:
        `NoDataMemberInClusterException` - if the cluster does not contain any data members
        `UnsupportedOperationException` - if the cluster version is less than 3.10
        `ConsistencyLostException` - if the session guarantees have been lost (see class level javadoc)
      See Also:
        `Cluster.getClusterVersion()`

    - #### addAndGet

          long addAndGet(long delta)

      Adds the given value to the current value.
      Parameters:
        `delta` - the value to add
      Returns:
        the updated value
      Throws:
        `NoDataMemberInClusterException` - if the cluster does not contain any data members
        `UnsupportedOperationException` - if the cluster version is less than 3.10
        `ConsistencyLostException` - if the session guarantees have been lost (see class level javadoc)
      See Also:
        `Cluster.getClusterVersion()`

    - #### getAndSubtract

          long getAndSubtract(long delta)

      Subtracts the given value from the current value.
      Parameters:
        `delta` - the value to add
      Returns:
        the previous value
      Throws:
        `NoDataMemberInClusterException` - if the cluster does not contain any data members
        `UnsupportedOperationException` - if the cluster version is less than 3.10
        `ConsistencyLostException` - if the session guarantees have been lost (see class level javadoc)
      See Also:
        `Cluster.getClusterVersion()`

    - #### subtractAndGet

          long subtractAndGet(long delta)

      Subtracts the given value from the current value.
      Parameters:
        `delta` - the value to subtract
      Returns:
        the updated value
      Throws:
        `NoDataMemberInClusterException` - if the cluster does not contain any data members
        `UnsupportedOperationException` - if the cluster version is less than 3.10
        `ConsistencyLostException` - if the session guarantees have been lost (see class level javadoc)
      See Also:
        `Cluster.getClusterVersion()`

    - #### decrementAndGet

          long decrementAndGet()

      Decrements by one the current value.
      Returns:
        the updated value
      Throws:
        `NoDataMemberInClusterException` - if the cluster does not contain any data members
        `UnsupportedOperationException` - if the cluster version is less than 3.10
        `ConsistencyLostException` - if the session guarantees have been lost (see class level javadoc)
      See Also:
        `Cluster.getClusterVersion()`

    - #### incrementAndGet

          long incrementAndGet()

      Increments by one the current value.
      Returns:
        the updated value
      Throws:
        `NoDataMemberInClusterException` - if the cluster does not contain any data members
        `UnsupportedOperationException` - if the cluster version is less than 3.10
        `ConsistencyLostException` - if the session guarantees have been lost (see class level javadoc)
      See Also:
        `Cluster.getClusterVersion()`

    - #### getAndDecrement

          long getAndDecrement()

      Decrements by one the current value.
      Returns:
        the previous value
      Throws:
        `NoDataMemberInClusterException` - if the cluster does not contain any data members
        `UnsupportedOperationException` - if the cluster version is less than 3.10
        `ConsistencyLostException` - if the session guarantees have been lost (see class level javadoc)
      See Also:
        `Cluster.getClusterVersion()`

    - #### getAndIncrement

          long getAndIncrement()

      Increments by one the current value.
      Returns:
        the previous value
      Throws:
        `NoDataMemberInClusterException` - if the cluster does not contain any data members
        `UnsupportedOperationException` - if the cluster version is less than 3.10
        `ConsistencyLostException` - if the session guarantees have beenlost (see class level javadoc)
      See Also:
        `Cluster.getClusterVersion()`

    - #### reset

          void reset()

      Resets the observed state by this PN counter. This method may be used after a method invocation has thrown a `ConsistencyLostException` to reset the proxy and to be able to start a new session.

Copyright © 2019. All rights reserved.