You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fluo.apache.org by kt...@apache.org on 2018/03/28 14:29:56 UTC
[fluo-website] branch gh-pages updated: Added read locks to tour
(#156)
This is an automated email from the ASF dual-hosted git repository.
kturner pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/fluo-website.git
The following commit(s) were added to refs/heads/gh-pages by this push:
new 8590b7a Added read locks to tour (#156)
8590b7a is described below
commit 8590b7a9d574e39303ce9d8daf1986b3d295b81a
Author: Keith Turner <ke...@deenlo.com>
AuthorDate: Wed Mar 28 10:29:54 2018 -0400
Added read locks to tour (#156)
---
_data/tour.yml | 2 ++
tour/read-lock-code.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++
tour/read-lock.md | 30 ++++++++++++++++++++++
tour/write-skew.md | 3 ++-
4 files changed, 101 insertions(+), 1 deletion(-)
diff --git a/_data/tour.yml b/_data/tour.yml
index 1f22c44..1b26bf7 100644
--- a/_data/tour.yml
+++ b/_data/tour.yml
@@ -11,6 +11,8 @@ docs:
- tx-logging
- write-skew
- write-skew-code
+ - read-lock
+ - read-lock-code
- scanning
- scanning-code
- multi-get
diff --git a/tour/read-lock-code.md b/tour/read-lock-code.md
new file mode 100644
index 0000000..4b64e6f
--- /dev/null
+++ b/tour/read-lock-code.md
@@ -0,0 +1,67 @@
+---
+title: Read Lock Code
+---
+
+```java
+ private static final Column WEIGHT_COL = new Column("stat", "weight");
+
+ private static void exercise(MiniFluo mini, FluoClient client) {
+ try (Transaction tx1 = client.newTransaction()) {
+ tx1.set("kerbalnaut0001", WEIGHT_COL, "90");
+ tx1.set("kerbalnaut0002", WEIGHT_COL, "70");
+ tx1.set("kerbalnaut0003", WEIGHT_COL, "80");
+ tx1.commit();
+ }
+
+ try (Transaction tx2 = client.newTransaction();
+ Transaction tx3 = client.newTransaction();
+ Transaction tx4 = client.newTransaction())
+ {
+ int f1w1 = Integer.parseInt(tx2.withReadLock().gets("kerbalnaut0001", WEIGHT_COL));
+ int f1w2 = Integer.parseInt(tx2.withReadLock().gets("kerbalnaut0003", WEIGHT_COL));
+ tx2.set("flight0001", WEIGHT_COL, f1w1 + f1w2 + "");
+
+ int f2w1 = Integer.parseInt(tx3.withReadLock().gets("kerbalnaut0001", WEIGHT_COL));
+ int f2w2 = Integer.parseInt(tx3.withReadLock().gets("kerbalnaut0002", WEIGHT_COL));
+ tx3.set("flight0002", WEIGHT_COL, f2w1 + f2w2 + "");
+
+ tx4.set("kerbalnaut0001", WEIGHT_COL, "95");
+
+ for(Transaction ctx : Arrays.asList(tx2,tx3,tx4)) {
+ try {
+ ctx.commit();
+ } catch (CommitException ce) {
+ System.out.println("commit failed: "+ce.getMessage());
+ }
+ }
+ }
+
+ try(Snapshot snap = client.newSnapshot()) {
+ snap.scanner().build().forEach(System.out::println);
+ }
+ }
+```
+
+Output :
+
+```
+commit failed: Collisions(1):kerbalnaut0001 stat weight
+flight0001 stat weight 170
+flight0002 stat weight 160
+kerbalnaut0001 stat weight 90
+kerbalnaut0002 stat weight 70
+kerbalnaut0003 stat weight 80
+```
+
+Output for commit order `Arrays.asList(tx4,tx2,tx3)` :
+
+```
+commit failed: Collisions(1):kerbalnaut0001 stat weight
+commit failed: Collisions(1):kerbalnaut0001 stat weight
+kerbalnaut0001 stat weight 95
+kerbalnaut0002 stat weight 70
+kerbalnaut0003 stat weight 80
+```
+
+With this commit order *tx4* gets a write lock on *kerbalnaut0001:stat:weight*
+which prevents *tx2* and *tx3* from getting read locks.
diff --git a/tour/read-lock.md b/tour/read-lock.md
new file mode 100644
index 0000000..6e3c524
--- /dev/null
+++ b/tour/read-lock.md
@@ -0,0 +1,30 @@
+---
+title: Read Locks
+---
+
+By default, reads do not acquire a lock which makes normal reads faster.
+Read locks can optionally be acquired via the [withReadLock] method. For
+example, if `tx` is a transaction then `tx.withReadLock().get(row,col)`
+reads with a lock.
+
+
+ * **Create transaction** *tx1*
+ * **Using** *tx1* **set** *kerbalnaut0001:stat:weight* **to** *90*
+ * **Using** *tx1* **set** *kerbalnaut0002:stat:weight* **to** *70*
+ * **Using** *tx1* **set** *kerbalnaut0003:stat:weight* **to** *80*
+ * **Commit** *tx1*
+ * **Create transaction** *tx2*
+ * **Create transaction** *tx3*
+ * **Create transaction** *tx4*
+ * **Using** *tx2* **set** *flight0001:stat:weight* **to the read locked values of** *kerbalnaut0001:stat:weight* **plus** *kerbalnaut0003:stat:weight*
+ * **Using** *tx3* **set** *flight0002:stat:weight* **to the read locked values of** *kerbalnaut0001:stat:weight* **plus** *kerbalnaut0002:stat:weight*
+ * **Using** *tx4* **set** *kerbalnaut0001:stat:weight* **to** *95*
+ * **Commit** *tx2*
+ * **Commit** *tx3*
+ * **Commit** *tx4*
+
+Both *tx2* and *tx3* get a read lock on *kerbalnaut0001:stat:weight* without
+interfering with each other. The read locks prevent *tx4* from committing.
+Try reordering the commits for *tx2*, *tx3*, and *tx4*.
+
+[withReadLock]: {{ site.fluo_api_static }}/{{ site.latest_fluo_release }}/org/apache/fluo/api/client/TransactionBase.html#withReadLock--
diff --git a/tour/write-skew.md b/tour/write-skew.md
index 7e457f4..ce5c0cf 100644
--- a/tour/write-skew.md
+++ b/tour/write-skew.md
@@ -27,4 +27,5 @@ different keys.
The changes made by *tx3* will not be seen by *tx2*. This behavior is OK if the update made by *tx3*
triggers a later update of *n0:data:sum*. Later pages in the tour will show that Observers can work
this way, so that eventually the changes made by *tx3* are incorporated. The [Weak Notification
-Exercise](/tour/weak-notifications/) later in the tour shows an example of this.
+Exercise](/tour/weak-notifications/) later in the tour shows an example of this. Another strategy
+for dealing with write skew is [read locks](/tour/read-lock/).
--
To stop receiving notification emails like this one, please contact
kturner@apache.org.