Fix too many idle servers (#140)

* Fix too many idle servers

* oops
This commit is contained in:
Lev Kokotov
2022-08-22 11:52:34 -07:00
committed by GitHub
parent 069d76029f
commit d0e8171b1b

View File

@@ -73,6 +73,9 @@ pub struct Client<S, T> {
/// Last server process id we talked to. /// Last server process id we talked to.
last_server_id: Option<i32>, last_server_id: Option<i32>,
/// Connected to server
connected_to_server: bool,
/// Name of the server pool for this client (This comes from the database name in the connection string) /// Name of the server pool for this client (This comes from the database name in the connection string)
target_pool_name: String, target_pool_name: String,
@@ -429,6 +432,7 @@ where
target_pool_name: target_pool_name.clone(), target_pool_name: target_pool_name.clone(),
target_user_name: target_user_name.clone(), target_user_name: target_user_name.clone(),
shutdown_event_receiver: shutdown_event_receiver, shutdown_event_receiver: shutdown_event_receiver,
connected_to_server: false,
}); });
} }
@@ -461,6 +465,7 @@ where
target_pool_name: String::from("undefined"), target_pool_name: String::from("undefined"),
target_user_name: String::from("undefined"), target_user_name: String::from("undefined"),
shutdown_event_receiver: shutdown_event_receiver, shutdown_event_receiver: shutdown_event_receiver,
connected_to_server: false,
}); });
} }
@@ -652,6 +657,7 @@ where
// Server is assigned to the client in case the client wants to // Server is assigned to the client in case the client wants to
// cancel a query later. // cancel a query later.
server.claim(self.process_id, self.secret_key); server.claim(self.process_id, self.secret_key);
self.connected_to_server = true;
// Update statistics. // Update statistics.
if let Some(last_address_id) = self.last_address_id { if let Some(last_address_id) = self.last_address_id {
@@ -875,6 +881,7 @@ where
// The server is no longer bound to us, we can't cancel it's queries anymore. // The server is no longer bound to us, we can't cancel it's queries anymore.
debug!("Releasing server back into the pool"); debug!("Releasing server back into the pool");
self.stats.server_idle(server.process_id(), address.id); self.stats.server_idle(server.process_id(), address.id);
self.connected_to_server = false;
self.release(); self.release();
self.stats.client_idle(self.process_id, address.id); self.stats.client_idle(self.process_id, address.id);
} }
@@ -1002,7 +1009,9 @@ impl<S, T> Drop for Client<S, T> {
let mut guard = self.client_server_map.lock(); let mut guard = self.client_server_map.lock();
guard.remove(&(self.process_id, self.secret_key)); guard.remove(&(self.process_id, self.secret_key));
// Update statistics. // Dirty shutdown
// TODO: refactor, this is not the best way to handle state management.
if self.connected_to_server {
if let Some(address_id) = self.last_address_id { if let Some(address_id) = self.last_address_id {
self.stats.client_disconnecting(self.process_id, address_id); self.stats.client_disconnecting(self.process_id, address_id);
@@ -1010,7 +1019,6 @@ impl<S, T> Drop for Client<S, T> {
self.stats.server_idle(process_id, address_id); self.stats.server_idle(process_id, address_id);
} }
} }
}
// self.release();
} }
} }