From 00fe090ac1e421c393277f8554b851c542319c98 Mon Sep 17 00:00:00 2001 From: Vladimir Gordiychuk Date: Wed, 26 Jul 2017 00:35:26 +0300 Subject: [PATCH] context: Create TimeoutException only when deadline occurs Use deadline on client calls lead to create TimeoutException even if deadline not occurs yet. fillStacktrack very expensive operation that allocate many unnecessary objects in heap. Now exception creates only when deadline occurs. Close #3272 --- context/src/main/java/io/grpc/Context.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/context/src/main/java/io/grpc/Context.java b/context/src/main/java/io/grpc/Context.java index 7501f46f65..b8c4fb2c5d 100644 --- a/context/src/main/java/io/grpc/Context.java +++ b/context/src/main/java/io/grpc/Context.java @@ -700,7 +700,6 @@ public class Context { ScheduledExecutorService scheduler) { super(parent, deriveDeadline(parent, deadline), true); if (DEADLINE_KEY.get(this) == deadline) { - final TimeoutException cause = new TimeoutException("context timed out"); if (!deadline.isExpired()) { // The parent deadline was after the new deadline so we need to install a listener // on the new earlier deadline to trigger expiration for this context. @@ -708,7 +707,7 @@ public class Context { @Override public void run() { try { - cancel(cause); + cancel(new TimeoutException("context timed out")); } catch (Throwable t) { log.log(Level.SEVERE, "Cancel threw an exception, which should not happen", t); } @@ -716,7 +715,7 @@ public class Context { }, scheduler); } else { // Cancel immediately if the deadline is already expired. - cancel(cause); + cancel(new TimeoutException("context timed out")); } } uncancellableSurrogate = new Context(this, EMPTY_ENTRIES);