Do not ignore secondary failure
When another exception is thrown while handling another exception, that
exception can be attached to the original exception since Java 7
(Throwable#getSuppressed). Attach the secondary exception to the
original exception instead of throwing it away.
Change-Id: Ia093b8207714f2638e0343bc45a83d4342947505
Signed-off-by: Masaya Suzuki <masayasuzuki@google.com>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
index db0d267..926c35a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -1017,27 +1017,23 @@ else if (requestValidator instanceof AnyRequestValidator)
if (!err.isOutput() && err.getMessage() != null) {
try {
pckOut.writeString("ERR " + err.getMessage() + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
- err.setOutput();
- } catch (Throwable err2) {
- // Ignore this secondary failure (and not mark output).
+ } catch (IOException e) {
+ err.addSuppressed(e);
+ throw err;
}
+ err.setOutput();
}
throw err;
} catch (IOException | RuntimeException | Error err) {
- boolean output = false;
+ String msg = err instanceof PackProtocolException ? err.getMessage()
+ : JGitText.get().internalServerError;
try {
- String msg = err instanceof PackProtocolException
- ? err.getMessage()
- : JGitText.get().internalServerError;
pckOut.writeString("ERR " + msg + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
- output = true;
- } catch (Throwable err2) {
- // Ignore this secondary failure, leave output false.
+ } catch (IOException e) {
+ err.addSuppressed(e);
+ throw err;
}
- if (output) {
- throw new UploadPackInternalServerErrorException(err);
- }
- throw err;
+ throw new UploadPackInternalServerErrorException(err);
} finally {
if (!sendPack && !biDirectionalPipe) {
while (0 < rawIn.skip(2048) || 0 <= rawIn.read()) {
@@ -2077,31 +2073,26 @@ private void sendPack(PackStatistics.Accumulator accumulator,
// This was already reported on (below).
throw noPack;
} catch (IOException | RuntimeException | Error err) {
- if (reportInternalServerErrorOverSideband()) {
- throw new UploadPackInternalServerErrorException(err);
- } else {
+ try {
+ reportInternalServerErrorOverSideband();
+ } catch (IOException e) {
+ err.addSuppressed(e);
throw err;
}
+ throw new UploadPackInternalServerErrorException(err);
}
} else {
sendPack(false, req, accumulator, allTags, unshallowCommits, deepenNots);
}
}
- private boolean reportInternalServerErrorOverSideband() {
- try {
- @SuppressWarnings("resource" /* java 7 */)
- SideBandOutputStream err = new SideBandOutputStream(
- SideBandOutputStream.CH_ERROR,
- SideBandOutputStream.SMALL_BUF,
- rawOut);
- err.write(Constants.encode(JGitText.get().internalServerError));
- err.flush();
- return true;
- } catch (Throwable cannotReport) {
- // Ignore the reason. This is a secondary failure.
- return false;
- }
+ private void reportInternalServerErrorOverSideband() throws IOException {
+ @SuppressWarnings("resource" /* java 7 */)
+ SideBandOutputStream err = new SideBandOutputStream(
+ SideBandOutputStream.CH_ERROR, SideBandOutputStream.SMALL_BUF,
+ rawOut);
+ err.write(Constants.encode(JGitText.get().internalServerError));
+ err.flush();
}
/**