From f999b4aa63289cc5fb2941e9fa5f47e742e23fac Mon Sep 17 00:00:00 2001
From: "Shawn O. Pearce" <spearce@spearce.org>
Date: Thu, 13 May 2010 09:56:15 -0700
Subject: [PATCH] Fix interrupted write in StreamCopyThread

If a flush() gets delivered at the same time that we are blocking
while writing to an interruptable stream, the copy thread will
abort assuming its a stream error.  Instead ignore the interrupt,
and retry the write.

Change-Id: Icbf62d1b8abe0fabbb532dbee088020eecf4c6c2
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../eclipse/jgit/util/io/StreamCopyThread.java | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java
index 50f42ad4f..bf47d199a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/StreamCopyThread.java
@@ -100,11 +100,25 @@ public void run() {
 					try {
 						n = src.read(buf);
 					} catch (InterruptedIOException wakey) {
-						continue;
+						if (flushCounter.get() > 0)
+							continue;
+						else
+							throw wakey;
 					}
 					if (n < 0)
 						break;
-					dst.write(buf, 0, n);
+
+					for (;;) {
+						try {
+							dst.write(buf, 0, n);
+						} catch (InterruptedIOException wakey) {
+							if (flushCounter.get() > 0)
+								continue;
+							else
+								throw wakey;
+						}
+						break;
+					}
 				} catch (IOException e) {
 					break;
 				}
-- 
GitLab