@@ -48,7 +48,13 @@ impl BuildQueue {
4848 registry : Option < & str > ,
4949 ) -> Result < ( ) > {
5050 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+ ;" ,
5258 & [ & name, & version, & priority, & registry] ,
5359 ) ?;
5460 Ok ( ( ) )
@@ -281,6 +287,59 @@ impl BuildQueue {
281287mod tests {
282288 use super :: * ;
283289
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+
284343 #[ test]
285344 fn test_add_and_process_crates ( ) {
286345 const MAX_ATTEMPTS : u16 = 3 ;
0 commit comments