This is an automated email from the ASF dual-hosted git repository.

andor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new 57e8318  ZOOKEEPER-3335: Improve the usage of Collections
57e8318 is described below

commit 57e8318bc98dd3563085e08b0fcfcbc6a1c5fbcc
Author: Beluga Behr <[email protected]>
AuthorDate: Tue Apr 9 15:35:40 2019 +0200

    ZOOKEEPER-3335: Improve the usage of Collections
    
    Author: Beluga Behr <[email protected]>
    
    Reviewers: [email protected]
    
    Closes #870 from BELUGABEHR/ZOOKEEPER-3335 and squashes the following 
commits:
    
    2a1d80347 [Beluga Behr] Reverted variable name change to lessen diff
    384d46755 [Beluga Behr] ZOOKEEPER-3335: Improve the usage of Collections
---
 .../main/java/org/apache/zookeeper/ClientCnxn.java |  5 +++--
 .../org/apache/zookeeper/ClientCnxnSocket.java     |  4 ++--
 .../org/apache/zookeeper/ClientCnxnSocketNIO.java  |  6 ++---
 .../apache/zookeeper/ClientCnxnSocketNetty.java    |  6 ++---
 .../src/main/java/org/apache/zookeeper/ZKUtil.java | 13 +++++------
 .../zookeeper/server/PrepRequestProcessor.java     | 21 +++++++++--------
 .../org/apache/zookeeper/server/ZKDatabase.java    | 26 +++++++++++++---------
 .../apache/zookeeper/server/ZooKeeperServer.java   |  3 +--
 .../zookeeper/server/persistence/FileTxnLog.java   |  8 +++----
 .../zookeeper/server/quorum/CommitProcessor.java   | 20 ++++++++---------
 .../apache/zookeeper/server/quorum/Learner.java    |  7 +++---
 .../zookeeper/test/RestoreCommittedLogTest.java    |  3 ++-
 12 files changed, 64 insertions(+), 58 deletions(-)

diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxn.java 
b/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxn.java
index 0cae4a4..b155698 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxn.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxn.java
@@ -30,14 +30,15 @@ import java.net.SocketAddress;
 import java.net.SocketException;
 import java.nio.ByteBuffer;
 import java.util.HashSet;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
 import java.util.Map.Entry;
+import java.util.Queue;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.LinkedBlockingDeque;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -132,7 +133,7 @@ public class ClientCnxn {
     /**
      * These are the packets that have been sent and are waiting for a 
response.
      */
-    private final LinkedList<Packet> pendingQueue = new LinkedList<Packet>();
+    private final Queue<Packet> pendingQueue = new ArrayDeque<>();
 
     /**
      * These are the packets that need to be sent.
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocket.java 
b/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocket.java
index ba3806c..dc1c71a 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocket.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocket.java
@@ -23,7 +23,7 @@ import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.nio.ByteBuffer;
 import java.text.MessageFormat;
-import java.util.List;
+import java.util.Queue;
 import java.util.concurrent.LinkedBlockingDeque;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -208,7 +208,7 @@ abstract class ClientCnxnSocket {
      * @throws IOException
      * @throws InterruptedException
      */
-    abstract void doTransport(int waitTimeOut, List<Packet> pendingQueue,
+    abstract void doTransport(int waitTimeOut, Queue<Packet> pendingQueue,
             ClientCnxn cnxn)
             throws IOException, InterruptedException;
 
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocketNIO.java 
b/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocketNIO.java
index 4c97721..feb0e2f 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocketNIO.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocketNIO.java
@@ -27,7 +27,7 @@ import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
 import java.nio.channels.SocketChannel;
 import java.util.Iterator;
-import java.util.List;
+import java.util.Queue;
 import java.util.Set;
 import java.util.concurrent.LinkedBlockingDeque;
 
@@ -65,7 +65,7 @@ public class ClientCnxnSocketNIO extends ClientCnxnSocket {
      * @throws InterruptedException
      * @throws IOException
      */
-    void doIO(List<Packet> pendingQueue, ClientCnxn cnxn)
+    void doIO(Queue<Packet> pendingQueue, ClientCnxn cnxn)
       throws InterruptedException, IOException {
         SocketChannel sock = (SocketChannel) sockKey.channel();
         if (sock == null) {
@@ -340,7 +340,7 @@ public class ClientCnxnSocketNIO extends ClientCnxnSocket {
     }
     
     @Override
-    void doTransport(int waitTimeOut, List<Packet> pendingQueue, ClientCnxn 
cnxn)
+    void doTransport(int waitTimeOut, Queue<Packet> pendingQueue, ClientCnxn 
cnxn)
             throws IOException, InterruptedException {
         selector.select(waitTimeOut);
         Set<SelectionKey> selected;
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocketNetty.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocketNetty.java
index 2f000fc..9955075 100755
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocketNetty.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocketNetty.java
@@ -22,7 +22,7 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.util.Iterator;
-import java.util.List;
+import java.util.Queue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
@@ -262,7 +262,7 @@ public class ClientCnxnSocketNetty extends ClientCnxnSocket 
{
 
     @Override
     void doTransport(int waitTimeOut,
-                     List<Packet> pendingQueue,
+                     Queue<Packet> pendingQueue,
                      ClientCnxn cnxn)
             throws IOException, InterruptedException {
         try {
@@ -352,7 +352,7 @@ public class ClientCnxnSocketNetty extends ClientCnxnSocket 
{
     /**
      * doWrite handles writing the packets from outgoingQueue via network to 
server.
      */
-    private void doWrite(List<Packet> pendingQueue, Packet p, ClientCnxn cnxn) 
{
+    private void doWrite(Queue<Packet> pendingQueue, Packet p, ClientCnxn 
cnxn) {
         updateNow();
         boolean anyPacketsSent = false;
         while (true) {
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/ZKUtil.java 
b/zookeeper-server/src/main/java/org/apache/zookeeper/ZKUtil.java
index f9cfe4b..09aaf1b 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/ZKUtil.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ZKUtil.java
@@ -18,11 +18,11 @@
 package org.apache.zookeeper;
 
 import java.io.File;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Deque;
-import java.util.LinkedList;
 import java.util.List;
+import java.util.Queue;
 
 import org.apache.zookeeper.AsyncCallback.StringCallback;
 import org.apache.zookeeper.AsyncCallback.VoidCallback;
@@ -124,15 +124,12 @@ public class ZKUtil {
      */
     public static List<String> listSubTreeBFS(ZooKeeper zk, final String 
pathRoot) throws
         KeeperException, InterruptedException {
-        Deque<String> queue = new LinkedList<String>();
+        Queue<String> queue = new ArrayDeque<>();
         List<String> tree = new ArrayList<String>();
         queue.add(pathRoot);
         tree.add(pathRoot);
-        while (true) {
-            String node = queue.pollFirst();
-            if (node == null) {
-                break;
-            }
+        while (!queue.isEmpty()) {
+            String node = queue.poll();
             List<String> children = zk.getChildren(node, false);
             for (final String child : children) {
                 final String childPath = node + "/" + child;
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/PrepRequestProcessor.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/PrepRequestProcessor.java
index 6180f8b..d0a1ac9 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/PrepRequestProcessor.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/PrepRequestProcessor.java
@@ -71,9 +71,9 @@ import java.io.IOException;
 import java.io.StringReader;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -905,14 +905,17 @@ public class PrepRequestProcessor extends 
ZooKeeperCriticalThread implements
         nextProcessor.processRequest(request);
     }
 
-    private List<ACL> removeDuplicates(List<ACL> acl) {
+    private List<ACL> removeDuplicates(final List<ACL> acls) {
+        if (acls == null || acls.isEmpty()) {
+          return Collections.emptyList();
+        }
 
-        List<ACL> retval = new LinkedList<ACL>();
-        if (acl != null) {
-            for (ACL a : acl) {
-                if (!retval.contains(a)) {
-                    retval.add(a);
-                }
+        // This would be done better with a Set but ACL hashcode/equals do not
+        // allow for null values
+        final ArrayList<ACL> retval = new ArrayList<>(acls.size());
+        for (final ACL acl : acls) {
+            if (!retval.contains(acl)) {
+              retval.add(acl);
             }
         }
         return retval;
@@ -960,7 +963,7 @@ public class PrepRequestProcessor extends 
ZooKeeperCriticalThread implements
         if (uniqacls == null || uniqacls.size() == 0) {
             throw new KeeperException.InvalidACLException(path);
         }
-        List<ACL> rv = new LinkedList<ACL>();
+        List<ACL> rv = new ArrayList<>();
         for (ACL a: uniqacls) {
             LOG.debug("Processing ACL: {}", a);
             if (a == null) {
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZKDatabase.java 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZKDatabase.java
index 60ea98b..4ef43b4 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZKDatabase.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZKDatabase.java
@@ -21,11 +21,14 @@ package org.apache.zookeeper.server;
 import java.io.File;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Queue;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -84,7 +87,7 @@ public class ZKDatabase {
 
     public static final int commitLogCount = 500;
     protected static int commitLogBuffer = 700;
-    protected LinkedList<Proposal> committedLog = new LinkedList<Proposal>();
+    protected Queue<Proposal> committedLog = new ArrayDeque<>();
     protected ReentrantReadWriteLock logLock = new ReentrantReadWriteLock();
     volatile private boolean initialized = false;
 
@@ -187,18 +190,21 @@ public class ZKDatabase {
     }
 
 
-    public synchronized List<Proposal> getCommittedLog() {
+    public synchronized Collection<Proposal> getCommittedLog() {
+        final Collection<Proposal> result;
         ReadLock rl = logLock.readLock();
-        // only make a copy if this thread isn't already holding a lock
-        if(logLock.getReadHoldCount() <=0) {
+        // make a copy if this thread is not already holding a lock
+        if (logLock.getReadHoldCount() > 0) {
+          result = this.committedLog;
+        } else {
+            rl.lock();
             try {
-                rl.lock();
-                return new LinkedList<Proposal>(this.committedLog);
+                result = new ArrayList<>(this.committedLog);
             } finally {
                 rl.unlock();
             }
         }
-        return this.committedLog;
+        return Collections.unmodifiableCollection(result);
     }
 
     /**
@@ -281,8 +287,8 @@ public class ZKDatabase {
         try {
             wl.lock();
             if (committedLog.size() > commitLogCount) {
-                committedLog.removeFirst();
-                minCommittedLog = committedLog.getFirst().packet.getZxid();
+                committedLog.remove();
+                minCommittedLog = committedLog.peek().packet.getZxid();
             }
             if (committedLog.isEmpty()) {
                 minCommittedLog = request.zxid;
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServer.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServer.java
index 01f5f9a..315a62e 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServer.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ZooKeeperServer.java
@@ -30,7 +30,6 @@ 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;
@@ -348,7 +347,7 @@ public class ZooKeeperServer implements SessionExpirer, 
ServerStats.Provider {
         }
 
         // Clean up dead sessions
-        List<Long> deadSessions = new LinkedList<Long>();
+        List<Long> deadSessions = new ArrayList<>();
         for (Long session : zkDb.getSessions()) {
             if (zkDb.getSessionWithTimeOuts().get(session) == null) {
                 deadSessions.add(session);
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileTxnLog.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileTxnLog.java
index c739152..17b16cb 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileTxnLog.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileTxnLog.java
@@ -29,9 +29,10 @@ import java.io.InputStream;
 import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
-import java.util.LinkedList;
 import java.util.List;
+import java.util.Queue;
 import java.util.concurrent.TimeUnit;
 import java.util.zip.Adler32;
 import java.util.zip.Checksum;
@@ -148,8 +149,7 @@ public class FileTxnLog implements TxnLog {
     File logDir;
     private final boolean forceSync = 
!System.getProperty("zookeeper.forceSync", "yes").equals("no");
     long dbId;
-    private LinkedList<FileOutputStream> streamsToFlush =
-        new LinkedList<FileOutputStream>();
+    private final Queue<FileOutputStream> streamsToFlush = new ArrayDeque<>();
     File logFileWrite = null;
     private FilePadding filePadding = new FilePadding();
 
@@ -392,7 +392,7 @@ public class FileTxnLog implements TxnLog {
             }
         }
         while (streamsToFlush.size() > 1) {
-            streamsToFlush.removeFirst().close();
+            streamsToFlush.poll().close();
         }
 
         // Roll the log file if we exceed the size limit
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/CommitProcessor.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/CommitProcessor.java
index 9982f15..aef8771 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/CommitProcessor.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/CommitProcessor.java
@@ -20,9 +20,11 @@ package org.apache.zookeeper.server.quorum;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.IOException;
+import java.util.ArrayDeque;
+import java.util.Deque;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.Map;
+import java.util.Queue;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -96,8 +98,8 @@ public class CommitProcessor extends ZooKeeperCriticalThread 
implements
      * Requests that we are holding until commit comes in. Keys represent
      * session ids, each value is a linked list of the session's requests.
      */
-    protected final Map<Long, LinkedList<Request>> pendingRequests =
-            new HashMap<Long, LinkedList<Request>>(10000);
+    protected final Map<Long, Deque<Request>> pendingRequests =
+            new HashMap<>(10000);
 
     /** The number of requests currently being processed */
     protected final AtomicInteger numRequestsProcessing = new AtomicInteger(0);
@@ -200,13 +202,9 @@ public class CommitProcessor extends 
ZooKeeperCriticalThread implements
                     if (needCommit(request)
                             || pendingRequests.containsKey(request.sessionId)) 
{
                         // Add request to pending
-                        LinkedList<Request> requests = pendingRequests
-                                .get(request.sessionId);
-                        if (requests == null) {
-                            requests = new LinkedList<Request>();
-                            pendingRequests.put(request.sessionId, requests);
-                        }
-                        requests.addLast(request);
+                        pendingRequests
+                            .computeIfAbsent(request.sessionId, sid -> new 
ArrayDeque<>())
+                            .add(request);
                     }
                     else {
                         sendToNextProcessor(request);
@@ -248,7 +246,7 @@ public class CommitProcessor extends 
ZooKeeperCriticalThread implements
                     /*
                      * Check if request is pending, if so, update it with the 
committed info
                      */
-                    LinkedList<Request> sessionQueue = pendingRequests
+                    Deque<Request> sessionQueue = pendingRequests
                             .get(request.sessionId);
                     if (sessionQueue != null) {
                         // If session queue != null, then it is also not empty.
diff --git 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Learner.java
 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Learner.java
index 307b644..e4d83e9 100644
--- 
a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Learner.java
+++ 
b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Learner.java
@@ -28,7 +28,8 @@ import java.net.ConnectException;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.nio.ByteBuffer;
-import java.util.LinkedList;
+import java.util.ArrayDeque;
+import java.util.Deque;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
@@ -396,8 +397,8 @@ public class Learner {
         boolean snapshotNeeded = true;
         boolean syncSnapshot = false;
         readPacket(qp);
-        LinkedList<Long> packetsCommitted = new LinkedList<Long>();
-        LinkedList<PacketInFlight> packetsNotCommitted = new 
LinkedList<PacketInFlight>();
+        Deque<Long> packetsCommitted = new ArrayDeque<>();
+        Deque<PacketInFlight> packetsNotCommitted = new ArrayDeque<>();
         synchronized (zk) {
             if (qp.getType() == Leader.DIFF) {
                 LOG.info("Getting a diff from the leader 0x{}", 
Long.toHexString(qp.getZxid()));
diff --git 
a/zookeeper-server/src/test/java/org/apache/zookeeper/test/RestoreCommittedLogTest.java
 
b/zookeeper-server/src/test/java/org/apache/zookeeper/test/RestoreCommittedLogTest.java
index 1cd0337..951458e 100644
--- 
a/zookeeper-server/src/test/java/org/apache/zookeeper/test/RestoreCommittedLogTest.java
+++ 
b/zookeeper-server/src/test/java/org/apache/zookeeper/test/RestoreCommittedLogTest.java
@@ -19,6 +19,7 @@
 package org.apache.zookeeper.test;
 
 import java.io.File;
+import java.util.Collection;
 import java.util.List;
 
 import org.apache.zookeeper.CreateMode;
@@ -74,7 +75,7 @@ public class RestoreCommittedLogTest extends ZKTestCase{
         // start server again
         zks = new ZooKeeperServer(tmpDir, tmpDir, 3000);
         zks.startdata();
-        List<Proposal> committedLog = zks.getZKDatabase().getCommittedLog();
+        Collection<Proposal> committedLog = 
zks.getZKDatabase().getCommittedLog();
         int logsize = committedLog.size();
         LOG.info("committedLog size = {}", logsize);
         Assert.assertTrue("log size != 0", (logsize != 0));

Reply via email to