@@ -10,6 +10,7 @@ use anyhow::Context;
10
10
use crates_index_diff:: Change ;
11
11
use tracing:: { debug, info, warn} ;
12
12
13
+ use std:: collections:: HashMap ;
13
14
use std:: sync:: Arc ;
14
15
use std:: thread;
15
16
use std:: time:: Duration ;
@@ -93,19 +94,32 @@ impl BuildQueue {
93
94
}
94
95
95
96
pub ( crate ) fn pending_count ( & self ) -> Result < usize > {
96
- let res = self . db . get ( ) ?. query (
97
- "SELECT COUNT(*) FROM queue WHERE attempt < $1;" ,
98
- & [ & self . max_attempts ] ,
99
- ) ?;
100
- Ok ( res[ 0 ] . get :: < _ , i64 > ( 0 ) as usize )
97
+ Ok ( self . pending_count_by_priority ( ) ?. values ( ) . sum :: < usize > ( ) )
101
98
}
102
99
103
100
pub ( crate ) fn prioritized_count ( & self ) -> Result < usize > {
101
+ Ok ( self
102
+ . pending_count_by_priority ( ) ?
103
+ . iter ( )
104
+ . filter ( |( & priority, _) | priority <= 0 )
105
+ . map ( |( _, count) | count)
106
+ . sum :: < usize > ( ) )
107
+ }
108
+
109
+ pub ( crate ) fn pending_count_by_priority ( & self ) -> Result < HashMap < i32 , usize > > {
104
110
let res = self . db . get ( ) ?. query (
105
- "SELECT COUNT(*) FROM queue WHERE attempt < $1 AND priority <= 0;" ,
111
+ "SELECT
112
+ priority,
113
+ COUNT(*)
114
+ FROM queue
115
+ WHERE attempt < $1
116
+ GROUP BY priority" ,
106
117
& [ & self . max_attempts ] ,
107
118
) ?;
108
- Ok ( res[ 0 ] . get :: < _ , i64 > ( 0 ) as usize )
119
+ Ok ( res
120
+ . iter ( )
121
+ . map ( |row| ( row. get :: < _ , i32 > ( 0 ) , row. get :: < _ , i64 > ( 1 ) as usize ) )
122
+ . collect ( ) )
109
123
}
110
124
111
125
pub ( crate ) fn failed_count ( & self ) -> Result < usize > {
@@ -656,6 +670,31 @@ mod tests {
656
670
} ) ;
657
671
}
658
672
673
+ #[ test]
674
+ fn test_count_by_priority ( ) {
675
+ crate :: test:: wrapper ( |env| {
676
+ let queue = env. build_queue ( ) ;
677
+
678
+ assert ! ( queue. pending_count_by_priority( ) ?. is_empty( ) ) ;
679
+
680
+ queue. add_crate ( "one" , "1.0.0" , 1 , None ) ?;
681
+ queue. add_crate ( "two" , "2.0.0" , 2 , None ) ?;
682
+ queue. add_crate ( "two_more" , "2.0.0" , 2 , None ) ?;
683
+
684
+ assert_eq ! (
685
+ queue. pending_count_by_priority( ) ?,
686
+ HashMap :: from_iter( vec![ ( 1 , 1 ) , ( 2 , 2 ) ] )
687
+ ) ;
688
+
689
+ while queue. pending_count ( ) ? > 0 {
690
+ queue. process_next_crate ( |_| Ok ( ( ) ) ) ?;
691
+ }
692
+ assert ! ( queue. pending_count_by_priority( ) ?. is_empty( ) ) ;
693
+
694
+ Ok ( ( ) )
695
+ } ) ;
696
+ }
697
+
659
698
#[ test]
660
699
fn test_failed_count ( ) {
661
700
const MAX_ATTEMPTS : u16 = 3 ;
0 commit comments