You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by dr...@apache.org on 2017/05/06 00:56:56 UTC

directory-kerby git commit: Improved default network transport in error handling

Repository: directory-kerby
Updated Branches:
  refs/heads/trunk 02f06c3cb -> d8528688f


Improved default network transport in error handling


Project: http://git-wip-us.apache.org/repos/asf/directory-kerby/repo
Commit: http://git-wip-us.apache.org/repos/asf/directory-kerby/commit/d8528688
Tree: http://git-wip-us.apache.org/repos/asf/directory-kerby/tree/d8528688
Diff: http://git-wip-us.apache.org/repos/asf/directory-kerby/diff/d8528688

Branch: refs/heads/trunk
Commit: d8528688ff2468155144067d6b4eb38c468a7802
Parents: 02f06c3
Author: Drankye <dr...@gmail.com>
Authored: Sat May 6 08:49:45 2017 +0800
Committer: Drankye <dr...@gmail.com>
Committed: Sat May 6 08:49:45 2017 +0800

----------------------------------------------------------------------
 .../kerberos/kerb/transport/KdcNetwork.java     | 46 +++++++++++++-------
 .../kerb/transport/KrbTcpTransport.java         |  7 ++-
 .../kerb/transport/KrbUdpTransport.java         |  2 +-
 3 files changed, 36 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/d8528688/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java
index d883774..926eec6 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KdcNetwork.java
@@ -23,11 +23,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketTimeoutException;
+import java.net.*;
 import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
 import java.nio.channels.DatagramChannel;
 import java.util.HashMap;
 import java.util.Map;
@@ -49,16 +47,18 @@ public abstract class KdcNetwork {
             new HashMap<InetSocketAddress, KdcUdpTransport>();
     private ByteBuffer recvBuffer;
 
-    public void init() {
+    public synchronized void init() {
         isStopped = false;
     }
 
-    public void listen(TransportPair tpair) throws IOException {
+    public synchronized void listen(TransportPair tpair) throws IOException {
         this.tpair = tpair;
 
-        tcpServer = new ServerSocket();
-        tcpServer.setSoTimeout(KDC_TCP_SERVER_TIMEOUT);
-        tcpServer.bind(tpair.tcpAddress);
+        if (tpair.tcpAddress != null) {
+            tcpServer = new ServerSocket();
+            tcpServer.setSoTimeout(KDC_TCP_SERVER_TIMEOUT);
+            tcpServer.bind(tpair.tcpAddress);
+        }
 
         if (tpair.udpAddress != null) {
             udpServer = DatagramChannel.open();
@@ -68,7 +68,7 @@ public abstract class KdcNetwork {
         }
     }
 
-    public void start() {
+    public synchronized void start() {
         new Thread(new Runnable() {
             @Override
             public void run() {
@@ -89,7 +89,7 @@ public abstract class KdcNetwork {
             if (tpair.tcpAddress != null) {
                 try {
                     checkAndAccept();
-                } catch (SocketTimeoutException e) { //NOPMD
+                } catch (SocketTimeoutException | ClosedChannelException | SocketException e) { //NOPMD
                     //NOOP as normal
                 } catch (IOException e) {
                     throw new RuntimeException("Error occured while checking tcp connections", e);
@@ -99,7 +99,7 @@ public abstract class KdcNetwork {
             if (tpair.udpAddress != null) {
                 try {
                     checkUdpMessage();
-                } catch (SocketTimeoutException e) { //NOPMD
+                } catch (SocketTimeoutException | ClosedChannelException | SocketException e) { //NOPMD
                     //NOOP as normal
                 } catch (IOException e) {
                     throw new RuntimeException("Error occured while checking udp connections", e);
@@ -110,16 +110,26 @@ public abstract class KdcNetwork {
     //CHECKSTYLE:ON
 
     public synchronized void stop() {
-        // TODO: waiting the network closed.
         try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-            LOG.warn("Interrupted when thread sleeping. " + e);
+            if (tcpServer != null) {
+                tcpServer.close();
+            }
+
+            if (udpServer != null) {
+                udpServer.close();
+            }
+        } catch (IOException e) {
+            LOG.warn("KDC network stopping error " + e);
         }
+
         isStopped = true;
     }
 
     private void checkAndAccept() throws IOException {
+        if (tcpServer.isClosed()) {
+            return;
+        }
+
         Socket socket;
         if ((socket = tcpServer.accept()) != null) {
             socket.setSoTimeout(KDC_TCP_TRANSPORT_TIMEOUT);
@@ -129,6 +139,10 @@ public abstract class KdcNetwork {
     }
 
     private void checkUdpMessage() throws IOException {
+        if (!udpServer.isOpen()) {
+            return;
+        }
+
         InetSocketAddress fromAddress = (InetSocketAddress) udpServer.receive(recvBuffer);
         if (fromAddress != null) {
             recvBuffer.flip();

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/d8528688/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
index 4a51611..50f8306 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
@@ -40,7 +40,7 @@ public class KrbTcpTransport
         this.socket = socket;
         this.outputStream = new DataOutputStream(socket.getOutputStream());
         this.inputStream = new DataInputStream(socket.getInputStream());
-        this.messageBuffer = new byte[1024 * 1024]; // TODO.
+        this.messageBuffer = new byte[4 * 1024 * 1024]; // TODO.
     }
 
 
@@ -53,6 +53,9 @@ public class KrbTcpTransport
     public ByteBuffer receiveMessage() throws IOException {
         int msgLen = inputStream.readInt();
         if (msgLen > 0) {
+            if (msgLen > messageBuffer.length) {
+                throw new IOException("Recv buffer overflowed, too large message?");
+            }
             inputStream.readFully(messageBuffer, 0, msgLen);
             return ByteBuffer.wrap(messageBuffer, 0, msgLen);
         }
@@ -75,7 +78,7 @@ public class KrbTcpTransport
         try {
             socket.close();
         } catch (IOException e) { //NOPMD
-            System.err.println(e); // NOOP
+            // System.err.println(e); // NOOP
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/d8528688/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbUdpTransport.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbUdpTransport.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbUdpTransport.java
index 72a3c2b..c8e83c8 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbUdpTransport.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbUdpTransport.java
@@ -77,7 +77,7 @@ public class KrbUdpTransport
         try {
             channel.close();
         } catch (IOException e) { //NOPMD
-            System.err.println(e); //NOOP
+            // System.err.println(e); //NOOP
         }
     }
 }