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() {