establish connection before using QuicConnection
This commit is contained in:
parent
41ae03e8f5
commit
4b51dc0460
|
@ -29,6 +29,7 @@ pub struct QuicConnection {
|
||||||
connection_params: QuicConnectionParameters,
|
connection_params: QuicConnectionParameters,
|
||||||
exit_signal: Arc<AtomicBool>,
|
exit_signal: Arc<AtomicBool>,
|
||||||
timeout_counters: Arc<AtomicU64>,
|
timeout_counters: Arc<AtomicU64>,
|
||||||
|
has_connected_once: Arc<AtomicBool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl QuicConnection {
|
impl QuicConnection {
|
||||||
|
@ -48,6 +49,7 @@ impl QuicConnection {
|
||||||
connection_params,
|
connection_params,
|
||||||
exit_signal,
|
exit_signal,
|
||||||
timeout_counters: Arc::new(AtomicU64::new(0)),
|
timeout_counters: Arc::new(AtomicU64::new(0)),
|
||||||
|
has_connected_once: Arc::new(AtomicBool::new(false)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +66,7 @@ impl QuicConnection {
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_connection(&self) -> Option<Connection> {
|
pub async fn get_connection(&self) -> Option<Connection> {
|
||||||
// get new connection reset if necessary
|
// get new connection reset if necessary
|
||||||
let last_stable_id = self.last_stable_id.load(Ordering::Relaxed) as usize;
|
let last_stable_id = self.last_stable_id.load(Ordering::Relaxed) as usize;
|
||||||
let conn = self.connection.read().await.clone();
|
let conn = self.connection.read().await.clone();
|
||||||
|
@ -95,6 +97,7 @@ impl QuicConnection {
|
||||||
None => {
|
None => {
|
||||||
let connection = self.connect().await;
|
let connection = self.connect().await;
|
||||||
*self.connection.write().await = connection.clone();
|
*self.connection.write().await = connection.clone();
|
||||||
|
self.has_connected_once.store(true, Ordering::Relaxed);
|
||||||
connection
|
connection
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,10 +114,6 @@ impl QuicConnection {
|
||||||
let mut do_retry = false;
|
let mut do_retry = false;
|
||||||
let connection = self.get_connection().await;
|
let connection = self.get_connection().await;
|
||||||
|
|
||||||
if self.exit_signal.load(Ordering::Relaxed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(connection) = connection {
|
if let Some(connection) = connection {
|
||||||
let current_stable_id = connection.stable_id() as u64;
|
let current_stable_id = connection.stable_id() as u64;
|
||||||
match QuicConnectionUtils::open_unistream(
|
match QuicConnectionUtils::open_unistream(
|
||||||
|
@ -175,6 +174,10 @@ impl QuicConnection {
|
||||||
pub fn reset_timeouts(&self) {
|
pub fn reset_timeouts(&self) {
|
||||||
self.timeout_counters.store(0, Ordering::Relaxed);
|
self.timeout_counters.store(0, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn has_connected_atleast_once(&self) -> bool {
|
||||||
|
self.has_connected_once.load(Ordering::Relaxed)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
@ -232,11 +235,14 @@ impl QuicConnectionPool {
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
drop(_others);
|
drop(_others);
|
||||||
|
|
||||||
|
// establish a connection if the connection has not yet been used
|
||||||
|
let connection = self.connections[index].clone();
|
||||||
|
if !connection.has_connected_atleast_once() {
|
||||||
|
connection.get_connection().await;
|
||||||
|
}
|
||||||
let permit = permit.context("Cannot aquire permit, connection pool erased")?;
|
let permit = permit.context("Cannot aquire permit, connection pool erased")?;
|
||||||
Ok(PooledConnection {
|
Ok(PooledConnection { connection, permit })
|
||||||
connection: self.connections[index].clone(),
|
|
||||||
permit,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn len(&self) -> usize {
|
pub fn len(&self) -> usize {
|
||||||
|
|
|
@ -80,16 +80,14 @@ impl ActiveConnection {
|
||||||
let mut exit_oneshot_channel = exit_oneshot_channel;
|
let mut exit_oneshot_channel = exit_oneshot_channel;
|
||||||
let identity = self.identity;
|
let identity = self.identity;
|
||||||
|
|
||||||
let number_of_transactions_per_unistream = self
|
|
||||||
.connection_parameters
|
|
||||||
.number_of_transactions_per_unistream;
|
|
||||||
let max_number_of_connections = self.connection_parameters.max_number_of_connections;
|
let max_number_of_connections = self.connection_parameters.max_number_of_connections;
|
||||||
|
|
||||||
let max_uni_stream_connections = compute_max_allowed_uni_streams(
|
let max_uni_stream_connections = compute_max_allowed_uni_streams(
|
||||||
identity_stakes.peer_type,
|
identity_stakes.peer_type,
|
||||||
identity_stakes.stakes,
|
identity_stakes.stakes,
|
||||||
identity_stakes.total_stakes,
|
identity_stakes.total_stakes,
|
||||||
);
|
)
|
||||||
|
.saturating_sub(1);
|
||||||
let exit_signal = self.exit_signal.clone();
|
let exit_signal = self.exit_signal.clone();
|
||||||
let connection_pool = QuicConnectionPool::new(
|
let connection_pool = QuicConnectionPool::new(
|
||||||
identity,
|
identity,
|
||||||
|
@ -114,7 +112,7 @@ impl ActiveConnection {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
let first_tx: Vec<u8> = match tx {
|
let tx: Vec<u8> = match tx {
|
||||||
Ok((sig, tx)) => {
|
Ok((sig, tx)) => {
|
||||||
if Self::check_for_confirmation(&txs_sent_store, sig) {
|
if Self::check_for_confirmation(&txs_sent_store, sig) {
|
||||||
// transaction is already confirmed/ no need to send
|
// transaction is already confirmed/ no need to send
|
||||||
|
@ -131,31 +129,22 @@ impl ActiveConnection {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut txs = vec![first_tx];
|
|
||||||
for _ in 1..number_of_transactions_per_unistream {
|
|
||||||
if let Ok((sig, tx)) = transaction_reciever.try_recv() {
|
|
||||||
if Self::check_for_confirmation(&txs_sent_store, sig) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
txs.push(tx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let connection_pool = match connection_pool.get_pooled_connection().await {
|
|
||||||
Ok(connection_pool) => connection_pool,
|
|
||||||
Err(_) => break,
|
|
||||||
};
|
|
||||||
tokio::spawn(async move {
|
|
||||||
let PooledConnection {
|
let PooledConnection {
|
||||||
connection,
|
connection,
|
||||||
permit
|
permit
|
||||||
} = connection_pool;
|
} = match connection_pool.get_pooled_connection().await {
|
||||||
|
Ok(connection_pool) => connection_pool,
|
||||||
|
Err(e) => {
|
||||||
|
error!("error getting pooled connection {e:?}");
|
||||||
|
break;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
tokio::spawn(async move {
|
||||||
// permit will be used to send all the transaction and then destroyed
|
// permit will be used to send all the transaction and then destroyed
|
||||||
let _permit = permit;
|
let _permit = permit;
|
||||||
NB_QUIC_TASKS.inc();
|
NB_QUIC_TASKS.inc();
|
||||||
for tx in txs {
|
|
||||||
connection.send_transaction(tx).await;
|
connection.send_transaction(tx).await;
|
||||||
}
|
|
||||||
NB_QUIC_TASKS.dec();
|
NB_QUIC_TASKS.dec();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue