13
13
// limitations under the License.
14
14
15
15
use std:: collections:: HashMap ;
16
+ use std:: fmt:: Display ;
16
17
use std:: future:: Future ;
17
18
use std:: hash:: Hash ;
18
19
use std:: pin:: Pin ;
@@ -30,6 +31,11 @@ use databend_common_catalog::table_context::TableContext;
30
31
use databend_common_exception:: ErrorCode ;
31
32
use databend_common_exception:: Result ;
32
33
use databend_common_meta_app:: principal:: UserInfo ;
34
+ use databend_common_metrics:: session:: incr_session_queue_abort_count;
35
+ use databend_common_metrics:: session:: incr_session_queue_acquire_error_count;
36
+ use databend_common_metrics:: session:: incr_session_queue_acquire_timeout_count;
37
+ use databend_common_metrics:: session:: record_session_queue_acquire_duration_ms;
38
+ use databend_common_metrics:: session:: set_session_queued_queries;
33
39
use log:: info;
34
40
use parking_lot:: Mutex ;
35
41
use pin_project_lite:: pin_project;
@@ -41,7 +47,7 @@ use tokio::time::error::Elapsed;
41
47
use crate :: sessions:: QueryContext ;
42
48
43
49
pub trait QueueData : Send + Sync + ' static {
44
- type Key : Send + Sync + Eq + Hash + Clone + ' static ;
50
+ type Key : Send + Sync + Eq + Hash + Display + Clone + ' static ;
45
51
46
52
fn get_key ( & self ) -> Self :: Key ;
47
53
@@ -91,12 +97,14 @@ impl<Data: QueueData> QueueManager<Data> {
91
97
pub fn remove ( & self , key : Data :: Key ) -> bool {
92
98
let mut queue = self . queue . lock ( ) ;
93
99
if let Some ( inner) = queue. remove ( & key) {
100
+ set_session_queued_queries ( queue. len ( ) ) ;
94
101
inner. waker . wake ( ) ;
95
102
inner. is_abort . store ( true , Ordering :: SeqCst ) ;
96
- return true ;
103
+ true
104
+ } else {
105
+ set_session_queued_queries ( queue. len ( ) ) ;
106
+ false
97
107
}
98
-
99
- false
100
108
}
101
109
102
110
pub async fn acquire ( self : & Arc < Self > , data : Data ) -> Result < AcquireQueueGuard > {
@@ -106,20 +114,43 @@ impl<Data: QueueData> QueueManager<Data> {
106
114
tokio:: time:: timeout ( timeout, self . semaphore . clone ( ) . acquire_owned ( ) ) ,
107
115
self . clone ( ) ,
108
116
) ;
117
+ let start_time = SystemTime :: now ( ) ;
109
118
110
- future. await
119
+ match future. await {
120
+ Ok ( v) => {
121
+ record_session_queue_acquire_duration_ms ( start_time. elapsed ( ) . unwrap_or_default ( ) ) ;
122
+ Ok ( v)
123
+ }
124
+ Err ( e) => {
125
+ match e. code ( ) {
126
+ ErrorCode :: ABORTED_QUERY => {
127
+ incr_session_queue_abort_count ( ) ;
128
+ }
129
+ ErrorCode :: TIMEOUT => {
130
+ incr_session_queue_acquire_timeout_count ( ) ;
131
+ }
132
+ _ => {
133
+ incr_session_queue_acquire_error_count ( ) ;
134
+ }
135
+ }
136
+ Err ( e)
137
+ }
138
+ }
111
139
}
112
140
113
141
pub ( crate ) fn add_entity ( & self , inner : Inner < Data > ) -> Data :: Key {
114
142
let key = inner. data . get_key ( ) ;
115
143
let mut queue = self . queue . lock ( ) ;
116
144
queue. insert ( key. clone ( ) , inner) ;
145
+ set_session_queued_queries ( queue. len ( ) ) ;
117
146
key
118
147
}
119
148
120
149
pub ( crate ) fn remove_entity ( & self , key : & Data :: Key ) -> Option < Arc < Data > > {
121
150
let mut queue = self . queue . lock ( ) ;
122
- queue. remove ( key) . map ( |inner| inner. data . clone ( ) )
151
+ let data = queue. remove ( key) . map ( |inner| inner. data . clone ( ) ) ;
152
+ set_session_queued_queries ( queue. len ( ) ) ;
153
+ data
123
154
}
124
155
}
125
156
0 commit comments