This is an automated email from the ASF dual-hosted git repository.
wangdan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pegasus-website.git
The following commit(s) were added to refs/heads/master by this push:
new 90dd3a2f Update CAS docs (#61)
90dd3a2f is described below
commit 90dd3a2fb9d7c30276066e0fc9e577071df055ad
Author: Yingchun Lai <[email protected]>
AuthorDate: Wed Jan 17 16:05:52 2024 +0800
Update CAS docs (#61)
---
_docs/en/api/single-atomic.md | 62 ++++++++++++++++++++++++++++++++++++++++++-
_docs/zh/api/single-atomic.md | 6 ++---
2 files changed, 64 insertions(+), 4 deletions(-)
diff --git a/_docs/en/api/single-atomic.md b/_docs/en/api/single-atomic.md
index 81a9b809..71fde1f9 100755
--- a/_docs/en/api/single-atomic.md
+++ b/_docs/en/api/single-atomic.md
@@ -2,4 +2,64 @@
permalink: api/single-atomic
---
-TRANSLATING
+Since v1.10.0, Pegasus supports single row atomic operations.
+> The **single row** here means all data in the same HashKey.
+
+# Principle
+
+Pegasus adopts a fixed hash sharding strategy for data distribution, where
data from the same HashKey is always stored in the same partition, while the
data is in the same Replica within a single node. Meanwhile, the write
operations of the same Replica are always executed serially on the server side.
Therefore, for data operations under the same HashKey, atomic semantics can be
implemented conveniently.
+
+For write operations, such as [multiSet](/clients/java-client#multiset) and
[multiDel](/clients/java-client#multidel), _set_ or _delete_ operate multiple
SortKeys simultaneously in a single operation, atomic semantics can be
comprehended easily, they are either successful or failed at the same time, so
these two operations are single row atomic operations.
+
+Here we focus on another type of operations: **read first, then write, and the
write operation depends on the result of the read operation**.
+
+The characteristic of this type of operations are **non-idempotent**, that is,
if the same operation is repeated, the results (including the actual updates of
data and the results returned to the user APIs) may be different. Atomic
increment and decrement operations, as well as CAS operations, belong to this
category. Pegasus can ensure the atomicity and consistency of such operations,
because:
+
+* The data of the same HashKey is always stored in the same Replica
+* The write operations of the same Replica are always executed serially on the
server side
+* One operation is guaranteed to be executed exactly once, even in the event
of data migration, downtime recovery, etc
+
+Due to non-idempotent properties, such operations may conflict with other
features of Pegasus, such as [Duplication](/administration/duplication). So
since 1.10.0, Pegasus provides an option to specify whether the cluster allows
non-idempotent operations. If setting as false, all non-idempotent operations
will return `ERR_OPERATION_DISABLED`:
+```ini
+[replication]
+ allow_non_idempotent_write = false
+```
+
+# Atomic increment and decrement operations
+
+Although Pegasus does not support schema in values, it still provides atomic
increment and decrement operations, similar to Redis's [incr
command](https://redis.io/commands/incr/), refer to Pegasus' interface
[incr](/clients/java-client#incr).
+
+## Description
+
+* Due to the fact that the storage engine RocksDB can only store values of
byte string type, when using `incr()`, the value byte string will be read and
converted to `int64` type (the conversion method is simple String-to-Int). For
example, the byte string `"12345"` will be converted to a number `12345`. After
completing the `incr()` operation, the obtained result will be converted back
into a byte string and stored as a new value
+* When converting a byte string to `int64`, it may encounter errors, such as
invalid numbers or overflow of `int64`, all of these cases will return a
failure status
+* If the original value does not exist, it is considered as `0` and then
`incr()` operation is executed normally
+* The operand `increment` can be positive or negative, so the `incr()`
interface can implement as atomic increment and decrement
+* TTL: If the original value exists, the TTL of the new value and the original
value remains the same. If the original value does not exist, the new value
will be stored without TTL
+
+# CAS operations
+
+Another useful type of atomic operations are the CAS (Compare-And-Swap)
operations. Based on CAS operations, many advanced distribute concurrency
features can be implemented, such as distributed locks.
+
+Pegasus provides _check_and_set_ CAS operations, the semantics are: whether to
update the value of one SortKey is depends on whether the value of another
SortKey of the same HashKey meets certain conditions.
+
+The SortKey which is used to determine the conditions is called
`CheckSortKey`, the SortKey which is used to set value is called `SetSortKey`.
Correspondingly, the value of `CheckSortKey` is called `CheckValue`, and the
value to be set by `SetSortKey` is called `SetValue`.
+
+See [checkAndSet](/clients/java-client#checkandset), as well as its extended
versions [checkAndMutate](/clients/java-client#checkandmutate) and
[compareExchange](/clients/java-client#compareexchange).
+
+## Description
+
+* The value of `SetSortKey` will be set only when `CheckValue` meets the
specified conditions
+* The condition types that need to be met are specified through `CheckType`,
and some `CheckType` also require the specified operand `CheckOperand`.
Currently, supporting:
+ * Determine the _existence_ of `CheckValue`: Whether it exists, or is an
empty byte string, etc
+ * Byte string comparison: Compare `CheckValue` and `CheckOperand` in byte
order to check if they meet the relationships of `<`, `<=`, `==`, `>=`, or `>=`
+ * Number comparison: similar to [Atomic increment and decrement
operations](#atomic-increment-and-decrement-operations), convert `CheckValue`
to int64, then compare the converted int64 value with `CheckOperand`, to check
if they meet the relationships of `<`, `<=`, `==`, `>=`, or `>=`
+* `CheckSortKey` and `SetSortKey` can be the same. If they are the same, it
means checking whether the old value meets the condition first. If it does, set
it to the new value for the same SortKey
+* You can enable the `CheckAndSetOptions.returnCheckValue` option if you want
to return the value of `CheckValue`
+* You can enable the `CheckAndSetOptions.setValueTTLSeconds` option if you
want to specify TTL
+
+For ease of use, Pegasus Java Client also provides _compare_exchange_
interface: When the value of a SortKey is equal to the user specified
`ExpectedValue` in byte string, its value will be updated to the user specified
`DesiredValue`. Semantically, _compare_exchange_ is a special form of
Compare-And-Swap. The interface can be found in
[compareExchange](/clients/java-client#compareexchange).
+
+Actually, _compare_exchange_ is a specialized form of _check_and_set_, namely:
+* `CheckSortKey` and `SetSortKey` are the same
+* `CheckType` is `CT_VALUE_BYTES_EQUAL`
diff --git a/_docs/zh/api/single-atomic.md b/_docs/zh/api/single-atomic.md
index 9678829c..12ba8575 100755
--- a/_docs/zh/api/single-atomic.md
+++ b/_docs/zh/api/single-atomic.md
@@ -24,7 +24,7 @@ Pegasus 的数据分布策略采用了固定 Hash 分片,同一个 HashKey 的
# 原子增减
-虽然 Pegasus 的 value 不支持 schema,但是我们依然提供了原子增减操作,类似 Redis 的
[incr命令](http://www.redis.cn/commands/incr.html),Pegasus 接口参见
[incr](/clients/java-client#incr)。
+虽然 Pegasus 的 value 不支持 schema,但是我们依然提供了原子增减操作,类似 Redis 的
[incr命令](https://redis.io/commands/incr/),Pegasus 接口参见
[incr](/clients/java-client#incr)。
## 语义解释
@@ -36,9 +36,9 @@ Pegasus 的数据分布策略采用了固定 Hash 分片,同一个 HashKey 的
# CAS 操作
-另一类很有用的原子操作就是 CAS(Compare-And-Swap)操作。基于 CAS
操作,可以实现很多高级的并发特性,譬如分布式锁。因此很多编程语言也原生地提供 CAS 操作。
+另一类很有用的原子操作就是 CAS(Compare-And-Swap)操作。基于 CAS 操作,可以实现很多高级的并发特性,譬如分布式锁。
-Pegasus 提供了 _check_and_set_ 的 CAS 操作,其语义就是:根据 HashKey 的某一个 SortKey 的 value
是否满足某种条件,来决定是否修改另一个 SortKey 的值。我们将用于判断条件的 SortKey 称之为`CheckSortKey`,将用于设置值的
SortKey 称之为`SetSortKey`。对应地,`CheckSortKey` 的 value 称之为`CheckValue`,`SetSortKey`
要设置的 value 称之为`SetValue`。参见
[checkAndSet](/clients/java-client#checkandset),以及其扩展版本
[checkAndMutate](/clients/java-client#checkandmutate) 和
[compareExchange](/clients/java-client#compareexchange)。
+Pegasus 提供了 _check_and_set_ 的 CAS 操作,其语义就是:根据 HashKey 的某一个 SortKey 的 value
是否满足某种条件,来决定是否修改另一个 SortKey 的值。将用于判断条件的 SortKey 称之为`CheckSortKey`,将用于设置值的
SortKey 称之为`SetSortKey`。对应地,`CheckSortKey` 的 value 称之为`CheckValue`,`SetSortKey`
要设置的 value 称之为`SetValue`。参见
[checkAndSet](/clients/java-client#checkandset),以及其扩展版本
[checkAndMutate](/clients/java-client#checkandmutate) 和
[compareExchange](/clients/java-client#compareexchange)。
## 语义解释
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]