|  | @@ -65,6 +65,17 @@ typedef struct {
 | 
	
		
			
				|  |  |    grpc_pollset* pollset;
 | 
	
		
			
				|  |  |  } grpc_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(exec_ctx, tcp->resource_user);
 | 
	
		
			
				|  |  |    gpr_free(tcp->handle);
 | 
	
	
		
			
				|  | @@ -166,7 +177,8 @@ static void read_callback(uv_stream_t* stream, ssize_t nread,
 | 
	
		
			
				|  |  |    // 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(&exec_ctx, tcp->read_slices);
 | 
	
		
			
				|  |  |    } else if (nread > 0) {
 | 
	
		
			
				|  |  |      // Successful read
 | 
	
	
		
			
				|  | @@ -181,7 +193,8 @@ static void read_callback(uv_stream_t* stream, ssize_t nread,
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    } 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(&exec_ctx, tcp->read_slices);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    call_read_cb(&exec_ctx, tcp, error);
 | 
	
	
		
			
				|  | @@ -200,7 +213,9 @@ static void tcp_read_allocation_done(grpc_exec_ctx* exec_ctx, void* tcpp,
 | 
	
		
			
				|  |  |      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)));
 | 
	
	
		
			
				|  | @@ -241,7 +256,8 @@ static void write_callback(uv_write_t* req, int status) {
 | 
	
		
			
				|  |  |    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);
 | 
	
	
		
			
				|  | @@ -275,9 +291,10 @@ static void uv_endpoint_write(grpc_exec_ctx* exec_ctx, grpc_endpoint* ep,
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (tcp->shutting_down) {
 | 
	
		
			
				|  |  | -    GRPC_CLOSURE_SCHED(
 | 
	
		
			
				|  |  | -        exec_ctx, cb,
 | 
	
		
			
				|  |  | -        GRPC_ERROR_CREATE_FROM_STATIC_STRING("TCP socket is shutting down"));
 | 
	
		
			
				|  |  | +    GRPC_CLOSURE_SCHED(exec_ctx, cb,
 | 
	
		
			
				|  |  | +                       tcp_annotate_error(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
 | 
	
		
			
				|  |  | +                                              "TCP socket is shutting down"),
 | 
	
		
			
				|  |  | +                                          tcp));
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 |