You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by da...@apache.org on 2017/05/31 21:00:01 UTC

[50/52] [abbrv] incubator-trafficcontrol git commit: [TC-361] Added a read timeout to TCP DNS listener, and transaction timeout to both UDP and TCP. Also split thread pool so we have one per protocol.

[TC-361] Added a read timeout to TCP DNS listener, and transaction timeout to both UDP and TCP. Also split thread pool so we have one per protocol.

(cherry picked from commit 738c10fa1b5861e4cc3944dc7c3065d16f4a708c)


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/5b92126d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/5b92126d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/5b92126d

Branch: refs/heads/1.8.x
Commit: 5b92126d4abb86b734ba7c6c3e0cc78f1f638693
Parents: 97f15e8
Author: Jeff Elsloo <je...@cable.comcast.com>
Authored: Wed Apr 12 09:13:11 2017 -0600
Committer: Dan Kirkwood <da...@gmail.com>
Committed: Wed May 31 13:18:44 2017 -0600

----------------------------------------------------------------------
 .../core/dns/protocol/AbstractProtocol.java     | 28 +++++++++++++++++---
 .../traffic_router/core/dns/protocol/TCP.java   | 21 ++++++++++++---
 .../main/webapp/WEB-INF/applicationContext.xml  | 14 +++++++---
 .../core/dns/protocol/TCPTest.java              | 11 ++++++--
 4 files changed, 63 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/5b92126d/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/AbstractProtocol.java
----------------------------------------------------------------------
diff --git a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/AbstractProtocol.java b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/AbstractProtocol.java
index 7671b02..ea0bccc 100644
--- a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/AbstractProtocol.java
+++ b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/AbstractProtocol.java
@@ -25,7 +25,11 @@ import org.xbill.DNS.Section;
 import org.xbill.DNS.WireParseException;
 
 import java.net.InetAddress;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 public abstract class AbstractProtocol implements Protocol {
     private static final Logger ACCESS = Logger.getLogger("com.comcast.cdn.traffic_control.traffic_router.core.access");
@@ -34,6 +38,7 @@ public abstract class AbstractProtocol implements Protocol {
     protected boolean shutdownRequested;
     private ExecutorService executorService;
     private NameServer nameServer;
+    private int taskTimeout = 5000; // default
 
     /**
      * Gets executorService.
@@ -138,9 +143,18 @@ public abstract class AbstractProtocol implements Protocol {
      * @param job
      *            the handler to be executed
      */
-    protected void submit(final Runnable job) {
-        executorService.submit(job);
-    }
+	protected void submit(final Runnable job) {
+		final Future<?> handler = executorService.submit(job);
+		executorService.submit(new Runnable() {
+			public void run() {
+				try {
+					handler.get(getTaskTimeout(), TimeUnit.MILLISECONDS);
+				} catch (InterruptedException | ExecutionException | TimeoutException e) {
+					handler.cancel(true);
+				}
+			}
+		});
+	}
 
     private Message createServerFail(final Message query) {
         final Message response = new Message();
@@ -155,4 +169,12 @@ public abstract class AbstractProtocol implements Protocol {
         response.getHeader().setRcode(Rcode.SERVFAIL);
         return response;
     }
+
+	public int getTaskTimeout() {
+		return taskTimeout;
+	}
+
+	public void setTaskTimeout(final int taskTimeout) {
+		this.taskTimeout = taskTimeout;
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/5b92126d/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/TCP.java
----------------------------------------------------------------------
diff --git a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/TCP.java b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/TCP.java
index 604024d..595fc7c 100644
--- a/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/TCP.java
+++ b/traffic_router/core/src/main/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/TCP.java
@@ -18,9 +18,11 @@ package com.comcast.cdn.traffic_control.traffic_router.core.dns.protocol;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.InetAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
+import java.nio.channels.Channels;
 
 import org.apache.log4j.Logger;
 import org.xbill.DNS.Message;
@@ -28,6 +30,7 @@ import org.xbill.DNS.WireParseException;
 
 public class TCP extends AbstractProtocol {
     private static final Logger LOGGER = Logger.getLogger(TCP.class);
+    private int readTimeout = 3000; // default
 
     private ServerSocket serverSocket;
 
@@ -87,11 +90,12 @@ public class TCP extends AbstractProtocol {
         @SuppressWarnings("PMD.EmptyCatchBlock")
         public void run() {
             try {
+                socket.setSoTimeout(getReadTimeout());
                 final InetAddress client = socket.getInetAddress();
 
-                final DataInputStream is = new DataInputStream(socket.getInputStream());
+                final InputStream iis = Channels.newInputStream(Channels.newChannel(socket.getInputStream()));
+                final DataInputStream is = new DataInputStream(iis);
                 final DataOutputStream os = new DataOutputStream(socket.getOutputStream());
-
                 final int length = is.readUnsignedShort();
                 final byte[] request = new byte[length];
                 is.readFully(request);
@@ -121,5 +125,16 @@ public class TCP extends AbstractProtocol {
 		} catch (IOException e) {
 			LOGGER.warn("error on shutdown", e);
 		}
-    }
+	}
+
+
+	public int getReadTimeout() {
+		return readTimeout;
+	}
+
+	public void setReadTimeout(final int readTimeout) {
+		this.readTimeout = readTimeout;
+	}
+
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/5b92126d/traffic_router/core/src/main/webapp/WEB-INF/applicationContext.xml
----------------------------------------------------------------------
diff --git a/traffic_router/core/src/main/webapp/WEB-INF/applicationContext.xml b/traffic_router/core/src/main/webapp/WEB-INF/applicationContext.xml
index b8d8824..38450ab 100644
--- a/traffic_router/core/src/main/webapp/WEB-INF/applicationContext.xml
+++ b/traffic_router/core/src/main/webapp/WEB-INF/applicationContext.xml
@@ -242,7 +242,12 @@
 		<property name="trafficRouterManager" ref="trafficRouterManager" />
 	</bean>
 
-	<bean id="RequestHandlerExecutorService" class="java.util.concurrent.Executors"
+	<bean id="UDPRequestHandlerExecutorService" class="java.util.concurrent.Executors"
+		factory-method="newFixedThreadPool">
+		<constructor-arg index="0" value="$[dns.max-threads:1000]" />
+	</bean>
+
+	<bean id="TCPRequestHandlerExecutorService" class="java.util.concurrent.Executors"
 		factory-method="newFixedThreadPool">
 		<constructor-arg index="0" value="$[dns.max-threads:1000]" />
 	</bean>
@@ -254,8 +259,10 @@
 
 	<bean id="TCP" class="com.comcast.cdn.traffic_control.traffic_router.core.dns.protocol.TCP">
 		<property name="serverSocket" ref="ServerSocket" />
-		<property name="executorService" ref="RequestHandlerExecutorService" />
+		<property name="executorService" ref="TCPRequestHandlerExecutorService" />
 		<property name="nameServer" ref="NameServer" />
+		<property name="readTimeout" value="$[dns.tcp.timeout.read:3000]" />
+		<property name="taskTimeout" value="$[dns.tcp.timeout.task:5000]" />
 	</bean>
 
 	<bean id="DatagramSocket" class="java.net.DatagramSocket">
@@ -264,8 +271,9 @@
 
 	<bean id="UDP" class="com.comcast.cdn.traffic_control.traffic_router.core.dns.protocol.UDP">
 		<property name="datagramSocket" ref="DatagramSocket" />
-		<property name="executorService" ref="RequestHandlerExecutorService" />
+		<property name="executorService" ref="UDPRequestHandlerExecutorService" />
 		<property name="nameServer" ref="NameServer" />
+		<property name="taskTimeout" value="$[dns.udp.timeout.task:5000]" />
 	</bean>
 
 	<bean id="ProtocolExecutorService" class="java.util.concurrent.Executors"

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/5b92126d/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/TCPTest.java
----------------------------------------------------------------------
diff --git a/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/TCPTest.java b/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/TCPTest.java
index af35f4f..6e963d3 100644
--- a/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/TCPTest.java
+++ b/traffic_router/core/src/test/java/com/comcast/cdn/traffic_control/traffic_router/core/dns/protocol/TCPTest.java
@@ -19,7 +19,6 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
-
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -130,11 +129,12 @@ public class TCPTest {
         final DataOutputStream dos = new DataOutputStream(baos);
         dos.writeShort(wireRequest.length);
         dos.write(wireRequest);
+        in = new ByteArrayInputStream(baos.toByteArray());
+        when(socket.getInputStream()).thenReturn(in);
 
         final ByteArrayOutputStream out = new ByteArrayOutputStream();
 
         when(socket.getOutputStream()).thenReturn(out);
-
         handler.run();
         assertThat(out.toByteArray().length, equalTo(0));
     }
@@ -147,6 +147,13 @@ public class TCPTest {
         final Record question = Record.newRecord(name, Type.A, DClass.IN);
         final Message request = Message.newQuery(question);
 
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final DataOutputStream dos = new DataOutputStream(baos);
+        dos.writeShort(request.toWire().length);
+        dos.write(request.toWire());
+        in = new ByteArrayInputStream(baos.toByteArray());
+        when(socket.getInputStream()).thenReturn(in);
+
         final Message response = new Message();
         response.setHeader(request.getHeader());