diff --git a/src/core/surface/call.c b/src/core/surface/call.c
index ad55ef6601cbded799238b9adba90a1d03488071..6e2714db0b0a9b8d3e10258d646e60d69d64a967 100644
--- a/src/core/surface/call.c
+++ b/src/core/surface/call.c
@@ -405,6 +405,8 @@ void grpc_call_internal_unref(grpc_call *c, int allow_immediate_deletion) {
 
 static void set_status_code(grpc_call *call, status_source source,
                             gpr_uint32 status) {
+  if (call->status[source].is_set) return;
+
   call->status[source].is_set = 1;
   call->status[source].code = status;