Merge remote-tracking branch 'upstream/v1.8.x' into merge_18x
diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc
index 2c26b60..c227f5a 100644
--- a/src/core/lib/iomgr/tcp_uv.cc
+++ b/src/core/lib/iomgr/tcp_uv.cc
@@ -65,7 +65,18 @@
   grpc_pollset* pollset;
 } grpc_tcp;
 
-static void tcp_free(grpc_tcp* tcp) {
+static grpc_error* tcp_annotate_error(grpc_error* src_error, grpc_tcp* tcp) {
+  return grpc_error_set_str(
+      grpc_error_set_int(
+          src_error,
+          /* All tcp errors are marked with UNAVAILABLE so that application may
+           * choose to retry. */
+          GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE),
+      GRPC_ERROR_STR_TARGET_ADDRESS,
+      grpc_slice_from_copied_string(tcp->peer_string));
+}
+
+static void tcp_free(grpc_exec_ctx* exec_ctx, grpc_tcp* tcp) {
   grpc_resource_user_unref(tcp->resource_user);
   gpr_free(tcp->handle);
   gpr_free(tcp->peer_string);
@@ -162,7 +173,8 @@
   // TODO(murgatroid99): figure out what the return value here means
   uv_read_stop(stream);
   if (nread == UV_EOF) {
-    error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("EOF");
+    error =
+        tcp_annotate_error(GRPC_ERROR_CREATE_FROM_STATIC_STRING("EOF"), tcp);
     grpc_slice_buffer_reset_and_unref_internal(tcp->read_slices);
   } else if (nread > 0) {
     // Successful read
@@ -177,7 +189,8 @@
     }
   } else {
     // nread < 0: Error
-    error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("TCP Read failed");
+    error = tcp_annotate_error(
+        GRPC_ERROR_CREATE_FROM_STATIC_STRING("TCP Read failed"), tcp);
     grpc_slice_buffer_reset_and_unref_internal(tcp->read_slices);
   }
   call_read_cb(tcp, error);
@@ -194,7 +207,9 @@
     status =
         uv_read_start((uv_stream_t*)tcp->handle, alloc_uv_buf, read_callback);
     if (status != 0) {
-      error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("TCP Read failed at start");
+      error = tcp_annotate_error(
+          GRPC_ERROR_CREATE_FROM_STATIC_STRING("TCP Read failed at start"),
+          tcp);
       error = grpc_error_set_str(
           error, GRPC_ERROR_STR_OS_ERROR,
           grpc_slice_from_static_string(uv_strerror(status)));
@@ -235,7 +250,8 @@
   if (status == 0) {
     error = GRPC_ERROR_NONE;
   } else {
-    error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("TCP Write failed");
+    error = tcp_annotate_error(
+        GRPC_ERROR_CREATE_FROM_STATIC_STRING("TCP Write failed"), tcp);
   }
   if (grpc_tcp_trace.enabled()) {
     const char* str = grpc_error_string(error);
@@ -268,8 +284,10 @@
   }
 
   if (tcp->shutting_down) {
-    GRPC_CLOSURE_SCHED(cb, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
-                               "TCP socket is shutting down"));
+    GRPC_CLOSURE_SCHED(cb,
+                       tcp_annotate_error(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+                                              "TCP socket is shutting down"),
+                                          tcp));
     return;
   }