From 09586654484f6a923adc0d2d5a6fa32d3cd6d6e2 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Sun, 28 Jun 2020 21:56:24 -0400 Subject: [PATCH 1/2] Fix panics due to incorrect types This fixes the following panic found in production: ``` Jun 29 00:30:34 docsrs cratesfyi[14484]: 2020/06/29 00:30:34 [DEBUG] cratesfyi::utils::daemon: Checking build queue Jun 29 00:30:34 docsrs cratesfyi[14484]: 2020/06/29 00:30:34 [INFO] cratesfyi::utils::daemon: Starting build with 102 crates in queue (currently on a 0 crate streak) Jun 29 00:30:34 docsrs cratesfyi[14484]: 2020/06/29 00:30:34 [DEBUG] cratesfyi::docbuilder: Loading cache Jun 29 00:30:34 docsrs cratesfyi[14484]: 2020/06/29 00:30:34 [DEBUG] cratesfyi::docbuilder: Loading database cache Jun 29 00:30:34 docsrs cratesfyi[14484]: thread 'build queue reader' panicked at 'error retrieving column "id": Error(Conversion(WrongType(Type(Int4))))', /home/ubuntu/.carg Jun 29 00:30:34 docsrs cratesfyi[14484]: stack backtrace: Jun 29 00:30:34 docsrs cratesfyi[14484]: 0: backtrace::backtrace::libunwind::trace Jun 29 00:30:34 docsrs cratesfyi[14484]: at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/libunwind.rs:88 Jun 29 00:30:34 docsrs cratesfyi[14484]: 1: backtrace::backtrace::trace_unsynchronized Jun 29 00:30:34 docsrs cratesfyi[14484]: at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/mod.rs:66 Jun 29 00:30:34 docsrs cratesfyi[14484]: 2: std::sys_common::backtrace::_print_fmt Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libstd/sys_common/backtrace.rs:77 Jun 29 00:30:34 docsrs cratesfyi[14484]: 3: ::fmt Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libstd/sys_common/backtrace.rs:61 Jun 29 00:30:34 docsrs cratesfyi[14484]: 4: core::fmt::write Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libcore/fmt/mod.rs:1028 Jun 29 00:30:34 docsrs cratesfyi[14484]: 5: std::io::Write::write_fmt Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libstd/io/mod.rs:1412 Jun 29 00:30:34 docsrs cratesfyi[14484]: 6: std::sys_common::backtrace::_print Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libstd/sys_common/backtrace.rs:65 Jun 29 00:30:34 docsrs cratesfyi[14484]: 7: std::sys_common::backtrace::print Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libstd/sys_common/backtrace.rs:50 Jun 29 00:30:34 docsrs cratesfyi[14484]: 8: std::panicking::default_hook::{{closure}} Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libstd/panicking.rs:188 Jun 29 00:30:34 docsrs cratesfyi[14484]: 9: std::panicking::default_hook Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libstd/panicking.rs:205 Jun 29 00:30:34 docsrs cratesfyi[14484]: 10: std::panicking::rust_panic_with_hook Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libstd/panicking.rs:464 Jun 29 00:30:34 docsrs cratesfyi[14484]: 11: std::panicking::continue_panic_fmt Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libstd/panicking.rs:373 Jun 29 00:30:34 docsrs cratesfyi[14484]: 12: std::panicking::begin_panic_fmt Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libstd/panicking.rs:328 Jun 29 00:30:34 docsrs cratesfyi[14484]: 13: postgres::rows::Row::get Jun 29 00:30:34 docsrs cratesfyi[14484]: 14: cratesfyi::docbuilder::queue::::build_next_queue_package Jun 29 00:30:34 docsrs cratesfyi[14484]: 15: as core::ops::function::FnOnce<()>>::call_once Jun 29 00:30:34 docsrs cratesfyi[14484]: 16: std::panicking::try::do_call Jun 29 00:30:34 docsrs cratesfyi[14484]: 17: __rust_maybe_catch_panic Jun 29 00:30:34 docsrs cratesfyi[14484]: at src/libpanic_unwind/lib.rs:78 Jun 29 00:30:34 docsrs cratesfyi[14484]: 18: cratesfyi::utils::daemon::start_daemon::{{closure}} Jun 29 00:30:34 docsrs cratesfyi[14484]: note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. Jun 29 00:30:34 docsrs cratesfyi[14484]: 2020/06/29 00:30:34 [ERROR] cratesfyi::utils::daemon: GRAVE ERROR Building new crates panicked: Any Jun 29 00:30:43 docsrs cratesfyi[14484]: 2020/06/29 00:30:43 [DEBUG] cratesfyi::utils::daemon: Checking new crates Jun 29 00:30:56 docsrs cratesfyi[14484]: 2020/06/29 00:30:56 [DEBUG] cratesfyi::utils::daemon: 0 crates added to queue ``` --- src/docbuilder/queue.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docbuilder/queue.rs b/src/docbuilder/queue.rs index 559425f14..2892d6200 100644 --- a/src/docbuilder/queue.rs +++ b/src/docbuilder/queue.rs @@ -79,7 +79,7 @@ impl DocBuilder { ) -> Result { // This is in a nested scope to drop the connection before build_package is called, // otherwise the borrow checker will complain. - let (id, name, version): (i64, String, String) = { + let (id, name, version): (i32, String, String) = { let conn = self.db.get()?; let query = conn.query( From 6da8435ae638e0cfb5f1e3a86edbba8560398a09 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Sun, 28 Jun 2020 21:56:39 -0400 Subject: [PATCH 2/2] Cleanup the queue builder a bit --- src/docbuilder/queue.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/docbuilder/queue.rs b/src/docbuilder/queue.rs index 2892d6200..5dc9aed6e 100644 --- a/src/docbuilder/queue.rs +++ b/src/docbuilder/queue.rs @@ -72,7 +72,9 @@ impl DocBuilder { .get(0)) } - /// Builds the top package from the queue. Returns whether the queue was empty. + /// Builds the top package from the queue. Returns whether there was a package in the queue. + /// + /// Note that this will return `Ok(true)` even if the package failed to build. pub(crate) fn build_next_queue_package( &mut self, builder: &mut RustwideBuilder, @@ -84,10 +86,10 @@ impl DocBuilder { let query = conn.query( "SELECT id, name, version - FROM queue - WHERE attempt < 5 - ORDER BY priority ASC, attempt ASC, id ASC - LIMIT 1", + FROM queue + WHERE attempt < 5 + ORDER BY priority ASC, attempt ASC, id ASC + LIMIT 1", &[], )?; @@ -105,7 +107,6 @@ impl DocBuilder { let conn = self.db.get()?; let _ = conn.execute("DELETE FROM queue WHERE id = $1", &[&id]); - crate::web::metrics::TOTAL_BUILDS.inc(); } Err(e) => { let conn = self.db.get()?; @@ -118,7 +119,6 @@ impl DocBuilder { let attempt: i32 = rows.get(0).get(0); if attempt >= 5 { crate::web::metrics::FAILED_BUILDS.inc(); - crate::web::metrics::TOTAL_BUILDS.inc(); } error!( "Failed to build package {}-{} from queue: {}\nBacktrace: {}", @@ -130,6 +130,7 @@ impl DocBuilder { } } + crate::web::metrics::TOTAL_BUILDS.inc(); Ok(true) } }