@@ -48,7 +48,13 @@ impl BuildQueue {
48
48
registry : Option < & str > ,
49
49
) -> Result < ( ) > {
50
50
self . db . get ( ) ?. execute (
51
- "INSERT INTO queue (name, version, priority, registry) VALUES ($1, $2, $3, $4);" ,
51
+ "INSERT INTO queue (name, version, priority, registry)
52
+ VALUES ($1, $2, $3, $4)
53
+ ON CONFLICT (name, version) DO UPDATE
54
+ SET priority = EXCLUDED.priority,
55
+ registry = EXCLUDED.registry,
56
+ attempt = 0
57
+ ;" ,
52
58
& [ & name, & version, & priority, & registry] ,
53
59
) ?;
54
60
Ok ( ( ) )
@@ -281,6 +287,59 @@ impl BuildQueue {
281
287
mod tests {
282
288
use super :: * ;
283
289
290
+ #[ test]
291
+ fn test_add_duplicate_doesnt_fail_last_priority_wins ( ) {
292
+ crate :: test:: wrapper ( |env| {
293
+ let queue = env. build_queue ( ) ;
294
+
295
+ queue. add_crate ( "some_crate" , "0.1.1" , 0 , None ) ?;
296
+ queue. add_crate ( "some_crate" , "0.1.1" , 9 , None ) ?;
297
+
298
+ let queued_crates = queue. queued_crates ( ) ?;
299
+ assert_eq ! ( queued_crates. len( ) , 1 ) ;
300
+ assert_eq ! ( queued_crates[ 0 ] . priority, 9 ) ;
301
+
302
+ Ok ( ( ) )
303
+ } )
304
+ }
305
+
306
+ #[ test]
307
+ fn test_add_duplicate_resets_attempts_and_priority ( ) {
308
+ crate :: test:: wrapper ( |env| {
309
+ env. override_config ( |config| {
310
+ config. build_attempts = 5 ;
311
+ } ) ;
312
+
313
+ let queue = env. build_queue ( ) ;
314
+
315
+ let mut conn = env. db ( ) . conn ( ) ;
316
+ conn. execute (
317
+ "
318
+ INSERT INTO queue (name, version, priority, attempt )
319
+ VALUES ('failed_crate', '0.1.1', 0, 99)" ,
320
+ & [ ] ,
321
+ ) ?;
322
+
323
+ assert_eq ! ( queue. pending_count( ) ?, 0 ) ;
324
+
325
+ queue. add_crate ( "failed_crate" , "0.1.1" , 9 , None ) ?;
326
+
327
+ assert_eq ! ( queue. pending_count( ) ?, 1 ) ;
328
+
329
+ let row = conn
330
+ . query_opt (
331
+ "SELECT priority, attempt
332
+ FROM queue
333
+ WHERE name = $1 AND version = $2" ,
334
+ & [ & "failed_crate" , & "0.1.1" ] ,
335
+ ) ?
336
+ . unwrap ( ) ;
337
+ assert_eq ! ( row. get:: <_, i32 >( 0 ) , 9 ) ;
338
+ assert_eq ! ( row. get:: <_, i32 >( 1 ) , 0 ) ;
339
+ Ok ( ( ) )
340
+ } )
341
+ }
342
+
284
343
#[ test]
285
344
fn test_add_and_process_crates ( ) {
286
345
const MAX_ATTEMPTS : u16 = 3 ;
0 commit comments