@@ -667,7 +667,6 @@ where
667
667
. client_disconnecting ( self . process_id , last_address_id) ;
668
668
}
669
669
self . stats . client_active ( self . process_id , address. id ) ;
670
- self . stats . server_active ( server. process_id ( ) , address. id ) ;
671
670
672
671
self . last_address_id = Some ( address. id ) ;
673
672
self . last_server_id = Some ( server. process_id ( ) ) ;
@@ -731,52 +730,23 @@ where
731
730
'Q' => {
732
731
debug ! ( "Sending query to server" ) ;
733
732
734
- self . send_server_message (
735
- server ,
733
+ self . send_and_receive_loop (
734
+ code ,
736
735
original,
736
+ server,
737
737
& address,
738
738
query_router. shard ( ) ,
739
739
& pool,
740
740
)
741
741
. await ?;
742
742
743
- // Read all data the server has to offer, which can be multiple messages
744
- // buffered in 8196 bytes chunks.
745
- loop {
746
- let response = self
747
- . receive_server_message (
748
- server,
749
- & address,
750
- query_router. shard ( ) ,
751
- & pool,
752
- )
753
- . await ?;
754
-
755
- // Send server reply to the client.
756
- match write_all_half ( & mut self . write , response) . await {
757
- Ok ( _) => ( ) ,
758
- Err ( err) => {
759
- server. mark_bad ( ) ;
760
- return Err ( err) ;
761
- }
762
- } ;
763
-
764
- if !server. is_data_available ( ) {
765
- break ;
766
- }
767
- }
768
-
769
- // Report query executed statistics.
770
- self . stats . query ( self . process_id , address. id ) ;
771
-
772
743
if !server. in_transaction ( ) {
773
744
// Report transaction executed statistics.
774
745
self . stats . transaction ( self . process_id , address. id ) ;
775
746
776
747
// Release server back to the pool if we are in transaction mode.
777
748
// If we are in session mode, we keep the server until the client disconnects.
778
749
if self . transaction_mode {
779
- self . stats . server_idle ( server. process_id ( ) , address. id ) ;
780
750
break ;
781
751
}
782
752
}
@@ -830,9 +800,10 @@ where
830
800
831
801
self . buffer . put ( & original[ ..] ) ;
832
802
833
- self . send_server_message (
834
- server ,
803
+ self . send_and_receive_loop (
804
+ code ,
835
805
self . buffer . clone ( ) ,
806
+ server,
836
807
& address,
837
808
query_router. shard ( ) ,
838
809
& pool,
@@ -841,41 +812,12 @@ where
841
812
842
813
self . buffer . clear ( ) ;
843
814
844
- // Read all data the server has to offer, which can be multiple messages
845
- // buffered in 8196 bytes chunks.
846
- loop {
847
- let response = self
848
- . receive_server_message (
849
- server,
850
- & address,
851
- query_router. shard ( ) ,
852
- & pool,
853
- )
854
- . await ?;
855
-
856
- match write_all_half ( & mut self . write , response) . await {
857
- Ok ( _) => ( ) ,
858
- Err ( err) => {
859
- server. mark_bad ( ) ;
860
- return Err ( err) ;
861
- }
862
- } ;
863
-
864
- if !server. is_data_available ( ) {
865
- break ;
866
- }
867
- }
868
-
869
- // Report query executed statistics.
870
- self . stats . query ( self . process_id , address. id ) ;
871
-
872
815
if !server. in_transaction ( ) {
873
816
self . stats . transaction ( self . process_id , address. id ) ;
874
817
875
818
// Release server back to the pool if we are in transaction mode.
876
819
// If we are in session mode, we keep the server until the client disconnects.
877
820
if self . transaction_mode {
878
- self . stats . server_idle ( server. process_id ( ) , address. id ) ;
879
821
break ;
880
822
}
881
823
}
@@ -925,7 +867,6 @@ where
925
867
// Release server back to the pool if we are in transaction mode.
926
868
// If we are in session mode, we keep the server until the client disconnects.
927
869
if self . transaction_mode {
928
- self . stats . server_idle ( server. process_id ( ) , address. id ) ;
929
870
break ;
930
871
}
931
872
}
@@ -941,6 +882,7 @@ where
941
882
942
883
// The server is no longer bound to us, we can't cancel it's queries anymore.
943
884
debug ! ( "Releasing server back into the pool" ) ;
885
+ self . stats . server_idle ( server. process_id ( ) , address. id ) ;
944
886
self . release ( ) ;
945
887
self . stats . client_idle ( self . process_id , address. id ) ;
946
888
}
@@ -952,6 +894,46 @@ where
952
894
guard. remove ( & ( self . process_id , self . secret_key ) ) ;
953
895
}
954
896
897
+ async fn send_and_receive_loop (
898
+ & mut self ,
899
+ code : char ,
900
+ message : BytesMut ,
901
+ server : & mut Server ,
902
+ address : & Address ,
903
+ shard : usize ,
904
+ pool : & ConnectionPool ,
905
+ ) -> Result < ( ) , Error > {
906
+ debug ! ( "Sending {} to server" , code) ;
907
+
908
+ self . send_server_message ( server, message, & address, shard, & pool)
909
+ . await ?;
910
+
911
+ // Read all data the server has to offer, which can be multiple messages
912
+ // buffered in 8196 bytes chunks.
913
+ loop {
914
+ let response = self
915
+ . receive_server_message ( server, & address, shard, & pool)
916
+ . await ?;
917
+
918
+ match write_all_half ( & mut self . write , response) . await {
919
+ Ok ( _) => ( ) ,
920
+ Err ( err) => {
921
+ server. mark_bad ( ) ;
922
+ return Err ( err) ;
923
+ }
924
+ } ;
925
+
926
+ if !server. is_data_available ( ) {
927
+ break ;
928
+ }
929
+ }
930
+
931
+ // Report query executed statistics.
932
+ self . stats . query ( self . process_id , address. id ) ;
933
+
934
+ Ok ( ( ) )
935
+ }
936
+
955
937
async fn send_server_message (
956
938
& self ,
957
939
server : & mut Server ,
0 commit comments