From 0785fa25426d99b8a08c52243c523a7c21af6897 Mon Sep 17 00:00:00 2001
From: Dmitriy Koltsov <dkoltsov@picodata.io>
Date: Fri, 4 Oct 2024 13:11:14 +0300
Subject: [PATCH] fix(http_server): consider timeout for establishin TCP
 connections in HTTP server

Due to the bug in RPC (see https://git.picodata.io/picodata/picodata/picodata/-/issues/991)
RPC call timeout does not account TCP connection establishment.
So a request to a peer without a connection was not aborted
due to timeout.
Force a timeout directly for a future returned by RPC to avoid this

Closes #991
---
 src/http_server.rs | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/http_server.rs b/src/http_server.rs
index 11899a09ad..baed97ee8b 100644
--- a/src/http_server.rs
+++ b/src/http_server.rs
@@ -3,6 +3,7 @@ use serde::{Deserialize, Serialize};
 use std::{collections::HashMap, error::Error};
 
 use ::tarantool::fiber;
+use tarantool::fiber::r#async::timeout::IntoTimeout;
 
 use crate::info::{RuntimeInfo, VersionInfo};
 use crate::instance::{Instance, InstanceId, StateVariant};
@@ -14,7 +15,7 @@ use crate::traft::network::ConnectionPool;
 use crate::util::Uppercase;
 use crate::{tlog, unwrap_ok_or};
 
-const DEFAULT_TIMEOUT: Option<std::time::Duration> = Some(std::time::Duration::from_secs(1));
+const DEFAULT_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(1);
 
 /// Response from instances:
 /// - `raft_id`: instance raft_id to find Instance to store data
@@ -200,7 +201,11 @@ async fn get_instances_data(
                 tlog!(Error, "webui: error on calling .proc_runtime_info on instance {}: {e}", instance.instance_id);
                 continue;
             }
-        );
+        // we have to add timeout directly to future due
+        // to the bug in connection pool that does not consider
+        // timeout when establishing TCP connection
+        // See https://git.picodata.io/picodata/picodata/picodata/-/issues/943 
+        ).timeout(DEFAULT_TIMEOUT);
         fs.push({
             async move {
                 let mut data = InstanceDataResponse {
-- 
GitLab