mirror of
https://github.com/aljazceru/cdk.git
synced 2025-12-19 05:35:18 +01:00
Fixed bug with postgres reconnection in the connection pool (#1078)
This commit is contained in:
@@ -142,14 +142,10 @@ impl DatabasePool for PgConnectionPool {
|
||||
|
||||
fn new_resource(
|
||||
config: &Self::Config,
|
||||
still_valid: Arc<AtomicBool>,
|
||||
stale: Arc<AtomicBool>,
|
||||
timeout: Duration,
|
||||
) -> Result<Self::Connection, cdk_sql_common::pool::Error<Self::Error>> {
|
||||
Ok(PostgresConnection::new(
|
||||
config.to_owned(),
|
||||
timeout,
|
||||
still_valid,
|
||||
))
|
||||
Ok(PostgresConnection::new(config.to_owned(), timeout, stale))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,7 +160,7 @@ pub struct PostgresConnection {
|
||||
|
||||
impl PostgresConnection {
|
||||
/// Creates a new instance
|
||||
pub fn new(config: PgConfig, timeout: Duration, still_valid: Arc<AtomicBool>) -> Self {
|
||||
pub fn new(config: PgConfig, timeout: Duration, stale: Arc<AtomicBool>) -> Self {
|
||||
let failed = Arc::new(Mutex::new(None));
|
||||
let result = Arc::new(OnceLock::new());
|
||||
let notify = Arc::new(Notify::new());
|
||||
@@ -191,22 +187,22 @@ impl PostgresConnection {
|
||||
Err(err) => {
|
||||
*error_clone.lock().await =
|
||||
Some(cdk_common::database::Error::Database(Box::new(err)));
|
||||
still_valid.store(false, std::sync::atomic::Ordering::Release);
|
||||
stale.store(false, std::sync::atomic::Ordering::Release);
|
||||
notify_clone.notify_waiters();
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
let still_valid_for_spawn = still_valid.clone();
|
||||
let stale_for_spawn = stale.clone();
|
||||
tokio::spawn(async move {
|
||||
let _ = connection.await;
|
||||
still_valid_for_spawn.store(false, std::sync::atomic::Ordering::Release);
|
||||
stale_for_spawn.store(true, std::sync::atomic::Ordering::Release);
|
||||
});
|
||||
|
||||
if let Some(schema) = config.schema.as_ref() {
|
||||
if let Err(err) = select_schema(&client, schema).await {
|
||||
*error_clone.lock().await = Some(err);
|
||||
still_valid.store(false, std::sync::atomic::Ordering::Release);
|
||||
stale.store(false, std::sync::atomic::Ordering::Release);
|
||||
notify_clone.notify_waiters();
|
||||
return;
|
||||
}
|
||||
@@ -221,22 +217,22 @@ impl PostgresConnection {
|
||||
Err(err) => {
|
||||
*error_clone.lock().await =
|
||||
Some(cdk_common::database::Error::Database(Box::new(err)));
|
||||
still_valid.store(false, std::sync::atomic::Ordering::Release);
|
||||
stale.store(false, std::sync::atomic::Ordering::Release);
|
||||
notify_clone.notify_waiters();
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
let still_valid_for_spawn = still_valid.clone();
|
||||
let stale_for_spawn = stale.clone();
|
||||
tokio::spawn(async move {
|
||||
let _ = connection.await;
|
||||
still_valid_for_spawn.store(false, std::sync::atomic::Ordering::Release);
|
||||
stale_for_spawn.store(true, std::sync::atomic::Ordering::Release);
|
||||
});
|
||||
|
||||
if let Some(schema) = config.schema.as_ref() {
|
||||
if let Err(err) = select_schema(&client, schema).await {
|
||||
*error_clone.lock().await = Some(err);
|
||||
still_valid.store(false, std::sync::atomic::Ordering::Release);
|
||||
stale.store(true, std::sync::atomic::Ordering::Release);
|
||||
notify_clone.notify_waiters();
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user