Przeglądaj źródła

ZOOKEEPER-3240: Close socket on Learner shutdown to avoid dangling so…

…cket

Author: Brian Nixon <nixon@fb.com>

Reviewers: hanm@apache.org, andor@apache.org

Closes #767 from enixon/learner-close-socket
Brian Nixon 6 lat temu
rodzic
commit
de7b87cd69

+ 1 - 5
zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Follower.java

@@ -114,11 +114,7 @@ public class Follower extends Learner{
                 }
             } catch (Exception e) {
                 LOG.warn("Exception when following the leader", e);
-                try {
-                    sock.close();
-                } catch (IOException e1) {
-                    e1.printStackTrace();
-                }
+                closeSocket();
     
                 // clear pending revalidations
                 pendingRevalidations.clear();

+ 11 - 0
zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Learner.java

@@ -673,6 +673,7 @@ public class Learner {
         self.setZooKeeperServer(null);
         self.closeAllConnections();
         self.adminServer.setZooKeeperServer(null);
+        closeSocket();
         // shutdown previous zookeeper
         if (zk != null) {
             zk.shutdown();
@@ -682,4 +683,14 @@ public class Learner {
     boolean isRunning() {
         return self.isRunning() && zk.isRunning();
     }
+
+    void closeSocket() {
+        try {
+            if (sock != null && !sock.isClosed()) {
+                sock.close();
+            }
+        } catch (IOException e) {
+            LOG.warn("Ignoring error closing connection to leader", e);
+        }
+    }
 }

+ 1 - 5
zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/Observer.java

@@ -107,11 +107,7 @@ public class Observer extends Learner{
                 }
             } catch (Exception e) {
                 LOG.warn("Exception when observing the leader", e);
-                try {
-                    sock.close();
-                } catch (IOException e1) {
-                    e1.printStackTrace();
-                }
+                closeSocket();
 
                 // clear pending revalidations
                 pendingRevalidations.clear();