You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2016/06/11 19:38:05 UTC

[06/15] lucene-solr:branch_6x: sequence numbers: removed synchronized in DocumentsWriterDeleteQueue.add

sequence numbers: removed synchronized in DocumentsWriterDeleteQueue.add


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/818ed490
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/818ed490
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/818ed490

Branch: refs/heads/branch_6x
Commit: 818ed49098165229ac9ce093977184a1d4175b6f
Parents: 4ee0b49
Author: Mike McCandless <mi...@apache.org>
Authored: Thu May 26 05:39:12 2016 -0400
Committer: Mike McCandless <mi...@apache.org>
Committed: Sat Jun 11 14:06:30 2016 -0400

----------------------------------------------------------------------
 .../index/DocumentsWriterDeleteQueue.java       | 29 +++++++++++++++++---
 1 file changed, 25 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/818ed490/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java b/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java
index abb735d..f14c783 100644
--- a/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java
+++ b/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java
@@ -150,10 +150,31 @@ final class DocumentsWriterDeleteQueue implements Accountable {
     return seqNo;
   }
 
-  synchronized long add(Node<?> newNode) {
-    tail.next = newNode;
-    tail = newNode;
-    return seqNo.getAndIncrement();
+  long add(Node<?> newNode) {
+    /*
+     * this non-blocking / 'wait-free' linked list add was inspired by Apache
+     * Harmony's ConcurrentLinkedQueue Implementation.
+     */
+    while (true) {
+      final Node<?> currentTail = tail;
+      final Node<?> tailNext = currentTail.next;
+      if (tail == currentTail && tailNext == null) {
+        /*
+         * we are in quiescent state and can try to insert the newNode to the
+         * current tail if we fail to insert we just retry the operation since
+         * somebody else has already added its newNode
+         */
+        if (currentTail.casNext(null, newNode)) {
+          /*
+           * now that we are done we need to advance the tail
+           */
+          long mySeqNo = seqNo.getAndIncrement();
+          boolean result = tailUpdater.compareAndSet(this, currentTail, newNode);
+          assert result;
+          return mySeqNo;
+        }
+      }
+    }
   }
 
   boolean anyChanges() {