You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2014/09/29 21:50:52 UTC

git commit: THRIFT-2654 reduce number of server exceptions Client: C# Patch: Craig Peterson

Repository: thrift
Updated Branches:
  refs/heads/master 4606d7db9 -> eb8e5ad87


THRIFT-2654 reduce number of server exceptions
Client: C#
Patch: Craig Peterson

This closes #177


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

Branch: refs/heads/master
Commit: eb8e5ad87fc8d715a40416f789774da2856a6d69
Parents: 4606d7d
Author: Jens Geyer <je...@apache.org>
Authored: Mon Sep 29 21:50:15 2014 +0200
Committer: Jens Geyer <je...@apache.org>
Committed: Mon Sep 29 21:50:15 2014 +0200

----------------------------------------------------------------------
 lib/csharp/src/Server/TSimpleServer.cs     |  3 ++
 lib/csharp/src/Server/TThreadPoolServer.cs |  3 ++
 lib/csharp/src/Server/TThreadedServer.cs   |  3 ++
 lib/csharp/src/Transport/TTransport.cs     | 60 +++++++++++++++++--------
 4 files changed, 50 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/eb8e5ad8/lib/csharp/src/Server/TSimpleServer.cs
----------------------------------------------------------------------
diff --git a/lib/csharp/src/Server/TSimpleServer.cs b/lib/csharp/src/Server/TSimpleServer.cs
index 75f8241..42e0cbe 100644
--- a/lib/csharp/src/Server/TSimpleServer.cs
+++ b/lib/csharp/src/Server/TSimpleServer.cs
@@ -118,6 +118,9 @@ namespace Thrift.Server
                   //Process client requests until client disconnects
                   while (true)
                   {
+                    if (!inputTransport.Peek()) 
+                      break;
+
                     //Fire processContext server event
                     //N.B. This is the pattern implemented in C++ and the event fires provisionally.
                     //That is to say it may be many minutes between the event firing and the client request

http://git-wip-us.apache.org/repos/asf/thrift/blob/eb8e5ad8/lib/csharp/src/Server/TThreadPoolServer.cs
----------------------------------------------------------------------
diff --git a/lib/csharp/src/Server/TThreadPoolServer.cs b/lib/csharp/src/Server/TThreadPoolServer.cs
index f26a683..8542b6d 100644
--- a/lib/csharp/src/Server/TThreadPoolServer.cs
+++ b/lib/csharp/src/Server/TThreadPoolServer.cs
@@ -172,6 +172,9 @@ namespace Thrift.Server
         //Process client requests until client disconnects
         while (true)
         {
+          if (!inputTransport.Peek()) 
+            break;
+
           //Fire processContext server event
           //N.B. This is the pattern implemented in C++ and the event fires provisionally.
           //That is to say it may be many minutes between the event firing and the client request

http://git-wip-us.apache.org/repos/asf/thrift/blob/eb8e5ad8/lib/csharp/src/Server/TThreadedServer.cs
----------------------------------------------------------------------
diff --git a/lib/csharp/src/Server/TThreadedServer.cs b/lib/csharp/src/Server/TThreadedServer.cs
index 5e707f5..87bff31 100644
--- a/lib/csharp/src/Server/TThreadedServer.cs
+++ b/lib/csharp/src/Server/TThreadedServer.cs
@@ -204,6 +204,9 @@ namespace Thrift.Server
             //Process client requests until client disconnects
             while (true)
             {
+              if (!inputTransport.Peek()) 
+                break;
+
               //Fire processContext server event
               //N.B. This is the pattern implemented in C++ and the event fires provisionally.
               //That is to say it may be many minutes between the event firing and the client request

http://git-wip-us.apache.org/repos/asf/thrift/blob/eb8e5ad8/lib/csharp/src/Transport/TTransport.cs
----------------------------------------------------------------------
diff --git a/lib/csharp/src/Transport/TTransport.cs b/lib/csharp/src/Transport/TTransport.cs
index 745aa78..5bb8f9e 100644
--- a/lib/csharp/src/Transport/TTransport.cs
+++ b/lib/csharp/src/Transport/TTransport.cs
@@ -32,10 +32,27 @@ namespace Thrift.Transport
 			get;
 		}
 
-		public bool Peek()
-		{
-			return IsOpen;
-		}
+		private byte[] _peekBuffer = new byte[1];
+        private bool _hasPeekByte = false;
+
+        public bool Peek()
+        {
+            //If we already have a byte read but not consumed, do nothing.
+            if (_hasPeekByte) 
+                return true;
+
+            //If transport closed we can't peek.
+            if (!IsOpen) 
+                return false;
+
+            //Try to read one byte. If succeeds we will need to store it for the next read.
+            int bytes = Read(_peekBuffer, 0, 1);
+            if (bytes == 0)
+                return false;
+
+            _hasPeekByte = true;
+            return true;
+        }
 
 		public abstract void Open();
 
@@ -46,21 +63,26 @@ namespace Thrift.Transport
 		public int ReadAll(byte[] buf, int off, int len)
 		{
 			int got = 0;
-			int ret = 0;
-
-			while (got < len)
-			{
-				ret = Read(buf, off + got, len - got);
-				if (ret <= 0)
-				{
-					throw new TTransportException(
-						TTransportException.ExceptionType.EndOfFile,
-						"Cannot read, Remote side has closed");
-				}
-				got += ret;
-			}
-
-			return got;
+
+            //If we previously peeked a byte, we need to use that first.
+            if (_hasPeekByte)
+            {
+                buf[off + got++] = _peekBuffer[0];
+                _hasPeekByte = false;
+            }
+
+            while (got < len)
+            {
+                int ret = Read(buf, off + got, len - got);
+                if (ret <= 0)
+                {
+                    throw new TTransportException(
+                        TTransportException.ExceptionType.EndOfFile,
+                        "Cannot read, Remote side has closed");
+                }
+                got += ret;
+            }
+            return got;
 		}
 
 		public virtual void Write(byte[] buf)