Skip to content

Commit ab52ea0

Browse files
authored
Merge pull request #2331 from Jamesbarford/fix/try-builds-non-ready-state
Post more precise message if a Try is queued multiple times
2 parents 10c2966 + b3bbd37 commit ab52ea0

File tree

6 files changed

+113
-52
lines changed

6 files changed

+113
-52
lines changed

database/src/lib.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,6 +1039,16 @@ impl BenchmarkRequest {
10391039
}
10401040
}
10411041

1042+
/// Result of inserting into the database
1043+
#[derive(Debug, Clone, PartialEq)]
1044+
pub enum BenchmarkRequestInsertResult {
1045+
/// The request was inserted into the database and is a unique instance
1046+
Inserted,
1047+
/// The request was not inserted into the database as something else already
1048+
/// existed that clashed with the unique clause
1049+
NothingInserted,
1050+
}
1051+
10421052
pub fn parse_backends(backends: &str) -> Result<Vec<CodegenBackend>, String> {
10431053
backends
10441054
.split(',')

database/src/pool.rs

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use crate::selector::CompileTestCase;
22
use crate::{
33
ArtifactCollection, ArtifactId, ArtifactIdNumber, BenchmarkJob, BenchmarkJobConclusion,
4-
BenchmarkJobKind, BenchmarkRequest, BenchmarkRequestIndex, BenchmarkRequestStatus,
5-
BenchmarkRequestWithErrors, BenchmarkSet, CodegenBackend, CollectorConfig, CompileBenchmark,
6-
PendingBenchmarkRequests, Target,
4+
BenchmarkJobKind, BenchmarkRequest, BenchmarkRequestIndex, BenchmarkRequestInsertResult,
5+
BenchmarkRequestStatus, BenchmarkRequestWithErrors, BenchmarkSet, CodegenBackend,
6+
CollectorConfig, CompileBenchmark, PendingBenchmarkRequests, Target,
77
};
88
use crate::{CollectionId, Index, Profile, QueuedCommit, Scenario, Step};
99
use chrono::{DateTime, Utc};
@@ -207,7 +207,7 @@ pub trait Connection: Send + Sync {
207207
async fn insert_benchmark_request(
208208
&self,
209209
benchmark_request: &BenchmarkRequest,
210-
) -> anyhow::Result<()>;
210+
) -> anyhow::Result<BenchmarkRequestInsertResult>;
211211

212212
/// Load all known benchmark request SHAs and all completed benchmark requests.
213213
async fn load_benchmark_request_index(&self) -> anyhow::Result<BenchmarkRequestIndex>;
@@ -538,9 +538,15 @@ mod tests {
538538
.await
539539
.unwrap();
540540

541-
db.insert_benchmark_request(&BenchmarkRequest::create_release("a-sha-1", Utc::now()))
542-
.await
543-
.expect_err("it was possible to insert a second commit with the same SHA");
541+
let result = db
542+
.insert_benchmark_request(&BenchmarkRequest::create_release("a-sha-1", Utc::now()))
543+
.await;
544+
545+
assert!(result.is_ok());
546+
assert_eq!(
547+
result.unwrap(),
548+
BenchmarkRequestInsertResult::NothingInserted
549+
);
544550

545551
Ok(ctx)
546552
})
@@ -566,12 +572,14 @@ mod tests {
566572
// This should be fine, because the previous request was already completed
567573
ctx.insert_try_request(42).await;
568574
// But this should fail, as we can't have two queued requests at once
569-
db.insert_benchmark_request(&BenchmarkRequest::create_try_without_artifacts(
570-
42, "", "",
571-
))
572-
.await
573-
.expect_err("It was possible to record two try benchmark requests without artifacts");
575+
let result = db
576+
.insert_benchmark_request(&BenchmarkRequest::create_try_without_artifacts(
577+
42, "", "",
578+
))
579+
.await
580+
.unwrap();
574581

582+
assert_eq!(result, BenchmarkRequestInsertResult::NothingInserted);
575583
Ok(ctx)
576584
})
577585
.await;
@@ -592,14 +600,17 @@ mod tests {
592600
.await
593601
.unwrap();
594602

595-
db.insert_benchmark_request(&BenchmarkRequest::create_master(
596-
"a-sha-2",
597-
"parent-sha-2",
598-
42,
599-
Utc::now(),
600-
))
601-
.await
602-
.expect_err("it was possible to insert a second master commit on the same PR");
603+
let result = db
604+
.insert_benchmark_request(&BenchmarkRequest::create_master(
605+
"a-sha-2",
606+
"parent-sha-2",
607+
42,
608+
Utc::now(),
609+
))
610+
.await
611+
.unwrap();
612+
613+
assert_eq!(result, BenchmarkRequestInsertResult::NothingInserted);
603614

604615
Ok(ctx)
605616
})

database/src/pool/postgres.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ use crate::selector::CompileTestCase;
55
use crate::{
66
ArtifactCollection, ArtifactId, ArtifactIdNumber, Benchmark, BenchmarkJob,
77
BenchmarkJobConclusion, BenchmarkJobKind, BenchmarkJobStatus, BenchmarkRequest,
8-
BenchmarkRequestIndex, BenchmarkRequestStatus, BenchmarkRequestType,
9-
BenchmarkRequestWithErrors, BenchmarkSet, CodegenBackend, CollectionId, CollectorConfig,
10-
Commit, CommitType, CompileBenchmark, Date, Index, PendingBenchmarkRequests, Profile,
11-
QueuedCommit, Scenario, Target, BENCHMARK_JOB_STATUS_FAILURE_STR,
8+
BenchmarkRequestIndex, BenchmarkRequestInsertResult, BenchmarkRequestStatus,
9+
BenchmarkRequestType, BenchmarkRequestWithErrors, BenchmarkSet, CodegenBackend, CollectionId,
10+
CollectorConfig, Commit, CommitType, CompileBenchmark, Date, Index, PendingBenchmarkRequests,
11+
Profile, QueuedCommit, Scenario, Target, BENCHMARK_JOB_STATUS_FAILURE_STR,
1212
BENCHMARK_JOB_STATUS_IN_PROGRESS_STR, BENCHMARK_JOB_STATUS_QUEUED_STR,
1313
BENCHMARK_JOB_STATUS_SUCCESS_STR, BENCHMARK_REQUEST_MASTER_STR, BENCHMARK_REQUEST_RELEASE_STR,
1414
BENCHMARK_REQUEST_STATUS_ARTIFACTS_READY_STR, BENCHMARK_REQUEST_STATUS_COMPLETED_STR,
@@ -1633,8 +1633,9 @@ where
16331633
async fn insert_benchmark_request(
16341634
&self,
16351635
benchmark_request: &BenchmarkRequest,
1636-
) -> anyhow::Result<()> {
1637-
self.conn()
1636+
) -> anyhow::Result<BenchmarkRequestInsertResult> {
1637+
let row_insert_count = self
1638+
.conn()
16381639
.execute(
16391640
r#"
16401641
INSERT INTO benchmark_request(
@@ -1648,7 +1649,8 @@ where
16481649
profiles,
16491650
commit_date
16501651
)
1651-
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9);
1652+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
1653+
ON CONFLICT DO NOTHING;
16521654
"#,
16531655
&[
16541656
&benchmark_request.tag(),
@@ -1664,7 +1666,13 @@ where
16641666
)
16651667
.await
16661668
.context("Failed to insert benchmark request")?;
1667-
Ok(())
1669+
if row_insert_count == 0 {
1670+
// Allows us to handle duplicated cases without the database auto
1671+
// erroring
1672+
Ok(BenchmarkRequestInsertResult::NothingInserted)
1673+
} else {
1674+
Ok(BenchmarkRequestInsertResult::Inserted)
1675+
}
16681676
}
16691677

16701678
async fn load_benchmark_request_index(&self) -> anyhow::Result<BenchmarkRequestIndex> {

database/src/pool/sqlite.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ use crate::pool::{
44
use crate::selector::CompileTestCase;
55
use crate::{
66
ArtifactCollection, ArtifactId, Benchmark, BenchmarkJob, BenchmarkJobConclusion,
7-
BenchmarkJobKind, BenchmarkRequest, BenchmarkRequestIndex, BenchmarkRequestStatus,
8-
BenchmarkRequestWithErrors, BenchmarkSet, CodegenBackend, CollectionId, CollectorConfig,
9-
Commit, CommitType, CompileBenchmark, Date, PendingBenchmarkRequests, Profile, Target,
7+
BenchmarkJobKind, BenchmarkRequest, BenchmarkRequestIndex, BenchmarkRequestInsertResult,
8+
BenchmarkRequestStatus, BenchmarkRequestWithErrors, BenchmarkSet, CodegenBackend, CollectionId,
9+
CollectorConfig, Commit, CommitType, CompileBenchmark, Date, PendingBenchmarkRequests, Profile,
10+
Target,
1011
};
1112
use crate::{ArtifactIdNumber, Index, QueuedCommit};
1213
use chrono::{DateTime, TimeZone, Utc};
@@ -1318,7 +1319,7 @@ impl Connection for SqliteConnection {
13181319
async fn insert_benchmark_request(
13191320
&self,
13201321
_benchmark_request: &BenchmarkRequest,
1321-
) -> anyhow::Result<()> {
1322+
) -> anyhow::Result<BenchmarkRequestInsertResult> {
13221323
no_queue_implementation_abort!()
13231324
}
13241325

site/src/job_queue/mod.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ use chrono::Utc;
88
use collector::benchmark_set::benchmark_set_count;
99
use database::pool::{JobEnqueueResult, Transaction};
1010
use database::{
11-
BenchmarkJobKind, BenchmarkRequest, BenchmarkRequestIndex, BenchmarkRequestStatus,
12-
BenchmarkRequestType, CodegenBackend, Connection, Date, PendingBenchmarkRequests, Profile,
13-
QueuedCommit, Target,
11+
BenchmarkJobKind, BenchmarkRequest, BenchmarkRequestIndex, BenchmarkRequestInsertResult,
12+
BenchmarkRequestStatus, BenchmarkRequestType, CodegenBackend, Connection, Date,
13+
PendingBenchmarkRequests, Profile, QueuedCommit, Target,
1414
};
1515
use parking_lot::RwLock;
1616
use std::sync::Arc;
@@ -29,7 +29,6 @@ pub fn should_use_job_queue(_pr: u32) -> bool {
2929

3030
/// Store the latest master commits or do nothing if all of them are
3131
/// already in the database.
32-
/// Returns `true` if at least one benchmark request was inserted.
3332
async fn create_benchmark_request_master_commits(
3433
ctxt: &SiteCtxt,
3534
conn: &dyn database::pool::Connection,
@@ -56,8 +55,16 @@ async fn create_benchmark_request_master_commits(
5655
);
5756
log::info!("Inserting master benchmark request {benchmark:?}");
5857

59-
if let Err(error) = conn.insert_benchmark_request(&benchmark).await {
60-
log::error!("Failed to insert master benchmark request: {error:?}");
58+
match conn.insert_benchmark_request(&benchmark).await {
59+
Ok(BenchmarkRequestInsertResult::NothingInserted) => {
60+
log::error!(
61+
"Failed to insert master benchmark request, request for PR`#{pr}` already exists",
62+
);
63+
}
64+
Ok(BenchmarkRequestInsertResult::Inserted) => {}
65+
Err(e) => {
66+
log::error!("Failed to insert master benchmark request: {e:?}");
67+
}
6168
}
6269
}
6370
}
@@ -87,8 +94,16 @@ async fn create_benchmark_request_releases(
8794
let release_request = BenchmarkRequest::create_release(&name, commit_date);
8895
log::info!("Inserting release benchmark request {release_request:?}");
8996

90-
if let Err(error) = conn.insert_benchmark_request(&release_request).await {
91-
log::error!("Failed to insert release benchmark request: {error}");
97+
match conn.insert_benchmark_request(&release_request).await {
98+
Ok(BenchmarkRequestInsertResult::NothingInserted) => {
99+
log::error!(
100+
"Failed to insert release benchmark request, release with tag `{name}` already exists"
101+
);
102+
}
103+
Ok(BenchmarkRequestInsertResult::Inserted) => {}
104+
Err(e) => {
105+
log::error!("Failed to insert release benchmark request: {e}");
106+
}
92107
}
93108
}
94109
}

site/src/request_handlers/github.rs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::github::{
66
use crate::job_queue::should_use_job_queue;
77
use crate::load::SiteCtxt;
88

9-
use database::{parse_backends, BenchmarkRequest, CodegenBackend};
9+
use database::{parse_backends, BenchmarkRequest, BenchmarkRequestInsertResult, CodegenBackend};
1010
use hashbrown::HashMap;
1111
use std::sync::Arc;
1212

@@ -76,18 +76,40 @@ async fn handle_issue(
7676
Ok(github::Response)
7777
}
7878

79+
fn get_awaiting_on_bors_message() -> String {
80+
format!(
81+
"Awaiting bors try build completion.
82+
83+
@rustbot label: +S-waiting-on-perf
84+
85+
{COMMENT_MARK_TEMPORARY}"
86+
)
87+
}
88+
7989
/// The try request does not have a `sha` or a `parent_sha` but we need to keep a record
8090
/// of this commit existing. The DB ensures that there is only one non-completed
8191
/// try benchmark request per `pr`.
8292
async fn record_try_benchmark_request_without_artifacts(
8393
conn: &dyn database::pool::Connection,
8494
pr: u32,
8595
backends: &str,
86-
) {
96+
) -> String {
8797
let try_request = BenchmarkRequest::create_try_without_artifacts(pr, backends, "");
8898
log::info!("Inserting try benchmark request {try_request:?}");
89-
if let Err(e) = conn.insert_benchmark_request(&try_request).await {
90-
log::error!("Failed to insert try benchmark request: {}", e);
99+
100+
match conn.insert_benchmark_request(&try_request).await {
101+
Ok(BenchmarkRequestInsertResult::NothingInserted) => {
102+
log::info!(
103+
"Failed to insert try benchmark request, a request for PR`#{pr}` already exists"
104+
);
105+
"This pull request was already queued before and is awaiting a try build to finish."
106+
.to_string()
107+
}
108+
Ok(BenchmarkRequestInsertResult::Inserted) => get_awaiting_on_bors_message(),
109+
Err(e) => {
110+
log::error!("Failed to insert release benchmark request: {e}");
111+
"Something went wrong! This is most likely an internal failure, please let us know on [Zulip](https://rust-lang.zulipchat.com/#narrow/channel/242791-t-infra)".to_string()
112+
}
91113
}
92114
}
93115

@@ -128,7 +150,7 @@ async fn handle_rust_timer(
128150
issue.number,
129151
cmd.params.backends.unwrap_or(""),
130152
)
131-
.await;
153+
.await
132154
} else {
133155
conn.queue_pr(
134156
issue.number,
@@ -138,14 +160,8 @@ async fn handle_rust_timer(
138160
cmd.params.backends,
139161
)
140162
.await;
163+
get_awaiting_on_bors_message()
141164
}
142-
format!(
143-
"Awaiting bors try build completion.
144-
145-
@rustbot label: +S-waiting-on-perf
146-
147-
{COMMENT_MARK_TEMPORARY}"
148-
)
149165
}
150166
Err(error) => {
151167
format!("Error occurred while parsing comment: {error}")

0 commit comments

Comments
 (0)