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)