1
- use crate :: cdn;
2
1
use crate :: db:: { delete_crate, delete_version, update_latest_version_id, Pool } ;
3
2
use crate :: docbuilder:: PackageKind ;
4
3
use crate :: error:: Result ;
5
4
use crate :: storage:: Storage ;
6
5
use crate :: utils:: { get_config, get_crate_priority, report_error, retry, set_config, ConfigName } ;
7
6
use crate :: Context ;
7
+ use crate :: { cdn, BuildPackageSummary } ;
8
8
use crate :: { Config , Index , InstanceMetrics , RustwideBuilder } ;
9
9
use anyhow:: Context as _;
10
10
use fn_error_context:: context;
@@ -168,7 +168,10 @@ impl BuildQueue {
168
168
. is_some ( ) )
169
169
}
170
170
171
- fn process_next_crate ( & self , f : impl FnOnce ( & QueuedCrate ) -> Result < ( ) > ) -> Result < ( ) > {
171
+ fn process_next_crate (
172
+ & self ,
173
+ f : impl FnOnce ( & QueuedCrate ) -> Result < BuildPackageSummary > ,
174
+ ) -> Result < ( ) > {
172
175
let mut conn = self . db . get ( ) ?;
173
176
let mut transaction = conn. transaction ( ) ?;
174
177
@@ -204,44 +207,56 @@ impl BuildQueue {
204
207
None => return Ok ( ( ) ) ,
205
208
} ;
206
209
207
- let res = self . metrics . build_time . observe_closure_duration ( || {
208
- f ( & to_process) . with_context ( || {
209
- format ! (
210
- "Failed to build package {}-{} from queue" ,
211
- to_process. name, to_process. version
212
- )
213
- } )
214
- } ) ;
210
+ let res = self
211
+ . metrics
212
+ . build_time
213
+ . observe_closure_duration ( || f ( & to_process) ) ;
214
+
215
215
self . metrics . total_builds . inc ( ) ;
216
216
if let Err ( err) =
217
217
cdn:: queue_crate_invalidation ( & mut transaction, & self . config , & to_process. name )
218
218
{
219
219
report_error ( & err) ;
220
220
}
221
221
222
- match res {
223
- Ok ( ( ) ) => {
224
- transaction. execute ( "DELETE FROM queue WHERE id = $1;" , & [ & to_process. id ] ) ?;
225
- }
226
- Err ( e) => {
227
- // Increase attempt count
228
- let attempt: i32 = transaction
229
- . query_one (
230
- "UPDATE queue
222
+ let mut increase_attempt_count = || -> Result < ( ) > {
223
+ let attempt: i32 = transaction
224
+ . query_one (
225
+ "UPDATE queue
231
226
SET
232
227
attempt = attempt + 1,
233
228
last_attempt = NOW()
234
229
WHERE id = $1
235
230
RETURNING attempt;" ,
236
- & [ & to_process. id ] ,
237
- ) ?
238
- . get ( 0 ) ;
231
+ & [ & to_process. id ] ,
232
+ ) ?
233
+ . get ( 0 ) ;
239
234
240
- if attempt >= self . max_attempts {
241
- self . metrics . failed_builds . inc ( ) ;
242
- }
235
+ if attempt >= self . max_attempts {
236
+ self . metrics . failed_builds . inc ( ) ;
237
+ }
238
+ Ok ( ( ) )
239
+ } ;
243
240
244
- report_error ( & e) ;
241
+ match res {
242
+ Ok ( BuildPackageSummary {
243
+ should_reattempt : false ,
244
+ successful : _,
245
+ } ) => {
246
+ transaction. execute ( "DELETE FROM queue WHERE id = $1;" , & [ & to_process. id ] ) ?;
247
+ }
248
+ Ok ( BuildPackageSummary {
249
+ should_reattempt : true ,
250
+ successful : _,
251
+ } ) => {
252
+ increase_attempt_count ( ) ?;
253
+ }
254
+ Err ( e) => {
255
+ increase_attempt_count ( ) ?;
256
+ report_error ( & e. context ( format ! (
257
+ "Failed to build package {}-{} from queue" ,
258
+ to_process. name, to_process. version
259
+ ) ) )
245
260
}
246
261
}
247
262
@@ -521,8 +536,7 @@ impl BuildQueue {
521
536
return Err ( err) ;
522
537
}
523
538
524
- builder. build_package ( & krate. name , & krate. version , kind) ?;
525
- Ok ( ( ) )
539
+ builder. build_package ( & krate. name , & krate. version , kind)
526
540
} ) ?;
527
541
528
542
Ok ( processed)
@@ -644,7 +658,7 @@ mod tests {
644
658
queue. process_next_crate ( |krate| {
645
659
assert_eq ! ( krate. name, "krate" ) ;
646
660
handled = true ;
647
- Ok ( ( ) )
661
+ Ok ( BuildPackageSummary :: default ( ) )
648
662
} ) ?;
649
663
650
664
assert ! ( handled) ;
@@ -680,7 +694,7 @@ mod tests {
680
694
let assert_next = |name| -> Result < ( ) > {
681
695
queue. process_next_crate ( |krate| {
682
696
assert_eq ! ( name, krate. name) ;
683
- Ok ( ( ) )
697
+ Ok ( BuildPackageSummary :: default ( ) )
684
698
} ) ?;
685
699
Ok ( ( ) )
686
700
} ;
@@ -720,7 +734,7 @@ mod tests {
720
734
let mut called = false ;
721
735
queue. process_next_crate ( |_| {
722
736
called = true ;
723
- Ok ( ( ) )
737
+ Ok ( BuildPackageSummary :: default ( ) )
724
738
} ) ?;
725
739
assert ! ( !called, "there were still items in the queue" ) ;
726
740
@@ -755,7 +769,7 @@ mod tests {
755
769
756
770
queue. process_next_crate ( |krate| {
757
771
assert_eq ! ( "will_succeed" , krate. name) ;
758
- Ok ( ( ) )
772
+ Ok ( BuildPackageSummary :: default ( ) )
759
773
} ) ?;
760
774
761
775
let queued_invalidations = cdn:: queued_or_active_crate_invalidations ( & mut * conn) ?;
@@ -793,7 +807,7 @@ mod tests {
793
807
794
808
queue. process_next_crate ( |krate| {
795
809
assert_eq ! ( "foo" , krate. name) ;
796
- Ok ( ( ) )
810
+ Ok ( BuildPackageSummary :: default ( ) )
797
811
} ) ?;
798
812
assert_eq ! ( queue. pending_count( ) ?, 1 ) ;
799
813
@@ -816,7 +830,7 @@ mod tests {
816
830
817
831
queue. process_next_crate ( |krate| {
818
832
assert_eq ! ( "bar" , krate. name) ;
819
- Ok ( ( ) )
833
+ Ok ( BuildPackageSummary :: default ( ) )
820
834
} ) ?;
821
835
assert_eq ! ( queue. prioritized_count( ) ?, 1 ) ;
822
836
@@ -841,7 +855,7 @@ mod tests {
841
855
) ;
842
856
843
857
while queue. pending_count ( ) ? > 0 {
844
- queue. process_next_crate ( |_| Ok ( ( ) ) ) ?;
858
+ queue. process_next_crate ( |_| Ok ( BuildPackageSummary :: default ( ) ) ) ?;
845
859
}
846
860
assert ! ( queue. pending_count_by_priority( ) ?. is_empty( ) ) ;
847
861
@@ -850,7 +864,44 @@ mod tests {
850
864
}
851
865
852
866
#[ test]
853
- fn test_failed_count ( ) {
867
+ fn test_failed_count_for_reattempts ( ) {
868
+ const MAX_ATTEMPTS : u16 = 3 ;
869
+ crate :: test:: wrapper ( |env| {
870
+ env. override_config ( |config| {
871
+ config. build_attempts = MAX_ATTEMPTS ;
872
+ config. delay_between_build_attempts = Duration :: ZERO ;
873
+ } ) ;
874
+ let queue = env. build_queue ( ) ;
875
+
876
+ assert_eq ! ( queue. failed_count( ) ?, 0 ) ;
877
+ queue. add_crate ( "foo" , "1.0.0" , -100 , None ) ?;
878
+ assert_eq ! ( queue. failed_count( ) ?, 0 ) ;
879
+ queue. add_crate ( "bar" , "1.0.0" , 0 , None ) ?;
880
+
881
+ for _ in 0 ..MAX_ATTEMPTS {
882
+ assert_eq ! ( queue. failed_count( ) ?, 0 ) ;
883
+ queue. process_next_crate ( |krate| {
884
+ assert_eq ! ( "foo" , krate. name) ;
885
+ Ok ( BuildPackageSummary {
886
+ should_reattempt : true ,
887
+ ..Default :: default ( )
888
+ } )
889
+ } ) ?;
890
+ }
891
+ assert_eq ! ( queue. failed_count( ) ?, 1 ) ;
892
+
893
+ queue. process_next_crate ( |krate| {
894
+ assert_eq ! ( "bar" , krate. name) ;
895
+ Ok ( BuildPackageSummary :: default ( ) )
896
+ } ) ?;
897
+ assert_eq ! ( queue. failed_count( ) ?, 1 ) ;
898
+
899
+ Ok ( ( ) )
900
+ } ) ;
901
+ }
902
+
903
+ #[ test]
904
+ fn test_failed_count_after_error ( ) {
854
905
const MAX_ATTEMPTS : u16 = 3 ;
855
906
crate :: test:: wrapper ( |env| {
856
907
env. override_config ( |config| {
@@ -875,7 +926,7 @@ mod tests {
875
926
876
927
queue. process_next_crate ( |krate| {
877
928
assert_eq ! ( "bar" , krate. name) ;
878
- Ok ( ( ) )
929
+ Ok ( BuildPackageSummary :: default ( ) )
879
930
} ) ?;
880
931
assert_eq ! ( queue. failed_count( ) ?, 1 ) ;
881
932
0 commit comments