@@ -10,6 +10,7 @@ use anyhow::Context;
1010use crates_index_diff:: Change ;
1111use tracing:: { debug, info, warn} ;
1212
13+ use std:: collections:: HashMap ;
1314use std:: sync:: Arc ;
1415use std:: thread;
1516use std:: time:: Duration ;
@@ -93,19 +94,32 @@ impl BuildQueue {
9394 }
9495
9596 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 > ( ) )
10198 }
10299
103100 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 > > {
104110 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" ,
106117 & [ & self . max_attempts ] ,
107118 ) ?;
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 ( ) )
109123 }
110124
111125 pub ( crate ) fn failed_count ( & self ) -> Result < usize > {
@@ -656,6 +670,31 @@ mod tests {
656670 } ) ;
657671 }
658672
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+
659698 #[ test]
660699 fn test_failed_count ( ) {
661700 const MAX_ATTEMPTS : u16 = 3 ;
0 commit comments