Merge pull request #1071 from nmittler/flaky_test

Fixing flaky test Http2NettyTest.deadlineExceeded()
diff --git a/core/src/main/java/io/grpc/internal/AbstractClientStream.java b/core/src/main/java/io/grpc/internal/AbstractClientStream.java
index 98a71e5..666a86f 100644
--- a/core/src/main/java/io/grpc/internal/AbstractClientStream.java
+++ b/core/src/main/java/io/grpc/internal/AbstractClientStream.java
@@ -60,6 +60,7 @@
   private Status status;
   private Metadata trailers;
   private Runnable closeListenerTask;
+  private volatile boolean cancelled;
 
   protected AbstractClientStream(WritableBufferAllocator bufferAllocator,
                                  ClientStreamListener listener,
@@ -293,11 +294,16 @@
   @Override
   public final void cancel(Status reason) {
     checkArgument(CANCEL_REASONS.contains(reason.getCode()), "Invalid cancellation reason");
-    outboundPhase(Phase.STATUS);
+    cancelled = true;
     sendCancel(reason);
     dispose();
   }
 
+  @Override
+  public final boolean isReady() {
+    return !cancelled && super.isReady();
+  }
+
   /**
    * Cancel the stream and send a stream cancellation message to the remote server, if necessary.
    * Can be called by either the application or transport layers. This method is safe to be called
diff --git a/core/src/main/java/io/grpc/internal/AbstractStream.java b/core/src/main/java/io/grpc/internal/AbstractStream.java
index d209fa4..3611ef2 100644
--- a/core/src/main/java/io/grpc/internal/AbstractStream.java
+++ b/core/src/main/java/io/grpc/internal/AbstractStream.java
@@ -176,7 +176,7 @@
   }
 
   @Override
-  public final boolean isReady() {
+  public boolean isReady() {
     if (listener() != null && outboundPhase() != Phase.STATUS) {
       synchronized (onReadyLock) {
         return allocated && numSentBytesQueued < onReadyThreshold;