Skip to content

Commit 5f1f09f

Browse files
committed
fix duplicate error when adding a version to the build-queue
1 parent c86fbce commit 5f1f09f

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

src/build_queue.rs

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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 {
281287
mod 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

Comments
 (0)