Repository: zookeeper Updated Branches: refs/heads/branch-3.5 6db5229eb -> 48614f828
ZOOKEEPER-3063: Track outstanding changes with ArrayDeque Changed outstandingChanges from ArrayList to ArrayDeque. Author: Yisong Yue <[email protected]> Reviewers: Michael Han <[email protected]> Closes #543 from yisong-yue/ZOOKEEPER-3063 (cherry picked from commit d6490d590725345638b5973a97e6e8d8bee67d22) Signed-off-by: Michael Han <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/zookeeper/repo Commit: http://git-wip-us.apache.org/repos/asf/zookeeper/commit/48614f82 Tree: http://git-wip-us.apache.org/repos/asf/zookeeper/tree/48614f82 Diff: http://git-wip-us.apache.org/repos/asf/zookeeper/diff/48614f82 Branch: refs/heads/branch-3.5 Commit: 48614f8288e8041010952bea0d1fc1f1db940d6a Parents: 6db5229 Author: Yisong Yue <[email protected]> Authored: Thu Jun 14 22:41:07 2018 -0700 Committer: Michael Han <[email protected]> Committed: Thu Jun 14 22:41:19 2018 -0700 ---------------------------------------------------------------------- .../apache/zookeeper/server/FinalRequestProcessor.java | 4 ++-- .../org/apache/zookeeper/server/PrepRequestProcessor.java | 10 +++++----- .../main/org/apache/zookeeper/server/ZooKeeperServer.java | 7 +++++-- 3 files changed, 12 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zookeeper/blob/48614f82/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java b/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java index 921febd..345184c 100644 --- a/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java +++ b/src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java @@ -110,8 +110,8 @@ public class FinalRequestProcessor implements RequestProcessor { Record txn = request.getTxn(); long zxid = hdr.getZxid(); while (!zks.outstandingChanges.isEmpty() - && zks.outstandingChanges.get(0).zxid <= zxid) { - ChangeRecord cr = zks.outstandingChanges.remove(0); + && zks.outstandingChanges.peek().zxid <= zxid) { + ChangeRecord cr = zks.outstandingChanges.remove(); if (cr.zxid < zxid) { LOG.warn("Zxid outstanding " + cr.zxid + " is less than current " + zxid); http://git-wip-us.apache.org/repos/asf/zookeeper/blob/48614f82/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java b/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java index a8cb048..df8ac74 100644 --- a/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java +++ b/src/java/main/org/apache/zookeeper/server/PrepRequestProcessor.java @@ -72,9 +72,9 @@ import java.io.StringReader; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.ListIterator; import java.util.Locale; import java.util.Map; import java.util.Properties; @@ -247,9 +247,9 @@ public class PrepRequestProcessor extends ZooKeeperCriticalThread implements void rollbackPendingChanges(long zxid, Map<String, ChangeRecord>pendingChangeRecords) { synchronized (zks.outstandingChanges) { // Grab a list iterator starting at the END of the list so we can iterate in reverse - ListIterator<ChangeRecord> iter = zks.outstandingChanges.listIterator(zks.outstandingChanges.size()); - while (iter.hasPrevious()) { - ChangeRecord c = iter.previous(); + Iterator<ChangeRecord> iter = zks.outstandingChanges.descendingIterator(); + while (iter.hasNext()) { + ChangeRecord c = iter.next(); if (c.zxid == zxid) { iter.remove(); // Remove all outstanding changes for paths of this multi. @@ -265,7 +265,7 @@ public class PrepRequestProcessor extends ZooKeeperCriticalThread implements return; } - long firstZxid = zks.outstandingChanges.get(0).zxid; + long firstZxid = zks.outstandingChanges.peek().zxid; for (ChangeRecord c : pendingChangeRecords.values()) { // Don't apply any prior change records less than firstZxid. http://git-wip-us.apache.org/repos/asf/zookeeper/blob/48614f82/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java ---------------------------------------------------------------------- diff --git a/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java b/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java index 5e18b44..7dc72b8 100644 --- a/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java +++ b/src/java/main/org/apache/zookeeper/server/ZooKeeperServer.java @@ -24,16 +24,19 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.nio.ByteBuffer; + +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; +import java.util.Deque; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; +import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import java.util.Set; import javax.security.sasl.SaslException; @@ -113,7 +116,7 @@ public class ZooKeeperServer implements SessionExpirer, ServerStats.Provider { static final private long superSecret = 0XB3415C00L; private final AtomicInteger requestsInProcess = new AtomicInteger(0); - final List<ChangeRecord> outstandingChanges = new ArrayList<ChangeRecord>(); + final Deque<ChangeRecord> outstandingChanges = new ArrayDeque<>(); // this data structure must be accessed under the outstandingChanges lock final HashMap<String, ChangeRecord> outstandingChangesForPath = new HashMap<String, ChangeRecord>();
