@@ -73,6 +73,9 @@ pub struct Client<S, T> {
73
73
/// Last server process id we talked to.
74
74
last_server_id : Option < i32 > ,
75
75
76
+ /// Connected to server
77
+ connected_to_server : bool ,
78
+
76
79
/// Name of the server pool for this client (This comes from the database name in the connection string)
77
80
target_pool_name : String ,
78
81
@@ -429,6 +432,7 @@ where
429
432
target_pool_name : target_pool_name. clone ( ) ,
430
433
target_user_name : target_user_name. clone ( ) ,
431
434
shutdown_event_receiver : shutdown_event_receiver,
435
+ connected_to_server : false ,
432
436
} ) ;
433
437
}
434
438
@@ -461,6 +465,7 @@ where
461
465
target_pool_name : String :: from ( "undefined" ) ,
462
466
target_user_name : String :: from ( "undefined" ) ,
463
467
shutdown_event_receiver : shutdown_event_receiver,
468
+ connected_to_server : false ,
464
469
} ) ;
465
470
}
466
471
@@ -652,6 +657,7 @@ where
652
657
// Server is assigned to the client in case the client wants to
653
658
// cancel a query later.
654
659
server. claim ( self . process_id , self . secret_key ) ;
660
+ self . connected_to_server = true ;
655
661
656
662
// Update statistics.
657
663
if let Some ( last_address_id) = self . last_address_id {
@@ -875,6 +881,7 @@ where
875
881
// The server is no longer bound to us, we can't cancel it's queries anymore.
876
882
debug ! ( "Releasing server back into the pool" ) ;
877
883
self . stats . server_idle ( server. process_id ( ) , address. id ) ;
884
+ self . connected_to_server = false ;
878
885
self . release ( ) ;
879
886
self . stats . client_idle ( self . process_id , address. id ) ;
880
887
}
@@ -1002,15 +1009,16 @@ impl<S, T> Drop for Client<S, T> {
1002
1009
let mut guard = self . client_server_map . lock ( ) ;
1003
1010
guard. remove ( & ( self . process_id , self . secret_key ) ) ;
1004
1011
1005
- // Update statistics.
1006
- if let Some ( address_id) = self . last_address_id {
1007
- self . stats . client_disconnecting ( self . process_id , address_id) ;
1012
+ // Dirty shutdown
1013
+ // TODO: refactor, this is not the best way to handle state management.
1014
+ if self . connected_to_server {
1015
+ if let Some ( address_id) = self . last_address_id {
1016
+ self . stats . client_disconnecting ( self . process_id , address_id) ;
1008
1017
1009
- if let Some ( process_id) = self . last_server_id {
1010
- self . stats . server_idle ( process_id, address_id) ;
1018
+ if let Some ( process_id) = self . last_server_id {
1019
+ self . stats . server_idle ( process_id, address_id) ;
1020
+ }
1011
1021
}
1012
1022
}
1013
-
1014
- // self.release();
1015
1023
}
1016
1024
}
0 commit comments