diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc
index 4032039ea1064d5919295985c2933b4df28de2c4..396d308e2a51be5fff281eb43dc538ad7b5917b4 100644
--- a/test/cpp/qps/client_async.cc
+++ b/test/cpp/qps/client_async.cc
@@ -112,7 +112,9 @@ class ClientRpcContextUnaryImpl : public ClientRpcContext {
         next_state_ = State::RESP_DONE;
         return true;
       case State::RESP_DONE:
-        entry->set_value((UsageTimer::Now() - start_) * 1e9);
+        if (status_.ok()) {
+          entry->set_value((UsageTimer::Now() - start_) * 1e9);
+        }
         callback_(status_, &response_, entry);
         next_state_ = State::INVALID;
         return false;
diff --git a/test/cpp/qps/client_sync.cc b/test/cpp/qps/client_sync.cc
index 498416c64a1a8b073f0820d1a3f48fce7fb8e4ab..a944c4549602c95cdbd57dad9acb3331cabdcfea 100644
--- a/test/cpp/qps/client_sync.cc
+++ b/test/cpp/qps/client_sync.cc
@@ -129,7 +129,9 @@ class SynchronousUnaryClient final : public SynchronousClient {
     grpc::ClientContext context;
     grpc::Status s =
         stub->UnaryCall(&context, request_, &responses_[thread_idx]);
-    entry->set_value((UsageTimer::Now() - start) * 1e9);
+    if (s.ok()) {
+      entry->set_value((UsageTimer::Now() - start) * 1e9);
+    }
     entry->set_status(s.error_code());
     return true;
   }
@@ -154,7 +156,7 @@ class SynchronousStreamingClient final : public SynchronousClient {
         (*stream)->WritesDone();
         Status s = (*stream)->Finish();
         if (!s.ok()) {
-          gpr_log(GPR_ERROR, "Stream %zu received an error %s", i,
+          gpr_log(GPR_ERROR, "Stream %" PRIuPTR " received an error %s", i,
                   s.error_message().c_str());
         }
       }
@@ -170,8 +172,17 @@ class SynchronousStreamingClient final : public SynchronousClient {
     if (stream_[thread_idx]->Write(request_) &&
         stream_[thread_idx]->Read(&responses_[thread_idx])) {
       entry->set_value((UsageTimer::Now() - start) * 1e9);
+      // don't set the status since there isn't one yet
       return true;
     }
+    stream_[thread_idx]->WritesDone();
+    Status s = stream_[thread_idx]->Finish();
+    // don't set the value since the stream is failed and shouldn't be timed
+    entry->set_status(s.error_code());
+    if (!s.ok()) {
+      gpr_log(GPR_ERROR, "Stream %" PRIuPTR " received an error %s", thread_idx,
+              s.error_message().c_str());
+    }
     auto* stub = channels_[thread_idx % channels_.size()].get_stub();
     context_[thread_idx].~ClientContext();
     new (&context_[thread_idx]) ClientContext();
diff --git a/test/cpp/qps/server_sync.cc b/test/cpp/qps/server_sync.cc
index 8076a4a6b9abb7374781cb84fa812c2ffb0bbb3d..f79284d2254b04f952aed145a088f135e7d9e142 100644
--- a/test/cpp/qps/server_sync.cc
+++ b/test/cpp/qps/server_sync.cc
@@ -74,7 +74,9 @@ class BenchmarkServiceImpl final : public BenchmarkService::Service {
           return Status(grpc::StatusCode::INTERNAL, "Error creating payload.");
         }
       }
-      stream->Write(response);
+      if (!stream->Write(response)) {
+        return Status(StatusCode::INTERNAL, "Server couldn't respond");
+      }
     }
     return Status::OK;
   }