Skip to content

Commit 4d73090

Browse files
committed
Post more precise message if a Try is queued multiple times
1 parent f8a61f3 commit 4d73090

File tree

6 files changed

+118
-54
lines changed

6 files changed

+118
-54
lines changed

database/src/lib.rs

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

1042+
#[derive(Debug, Clone, PartialEq)]
1043+
pub enum BenchmarkRequestInsertResult {
1044+
Queued,
1045+
AlreadyQueued,
1046+
}
1047+
10421048
pub fn parse_backends(backends: &str) -> Result<Vec<CodegenBackend>, String> {
10431049
backends
10441050
.split(',')

database/src/pool.rs

Lines changed: 28 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,12 @@ 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!(result.unwrap(), BenchmarkRequestInsertResult::AlreadyQueued);
544547

545548
Ok(ctx)
546549
})
@@ -566,12 +569,14 @@ mod tests {
566569
// This should be fine, because the previous request was already completed
567570
ctx.insert_try_request(42).await;
568571
// 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");
572+
let result = db
573+
.insert_benchmark_request(&BenchmarkRequest::create_try_without_artifacts(
574+
42, "", "",
575+
))
576+
.await
577+
.unwrap();
574578

579+
assert_eq!(result, BenchmarkRequestInsertResult::AlreadyQueued);
575580
Ok(ctx)
576581
})
577582
.await;
@@ -592,14 +597,17 @@ mod tests {
592597
.await
593598
.unwrap();
594599

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");
600+
let result = db
601+
.insert_benchmark_request(&BenchmarkRequest::create_master(
602+
"a-sha-2",
603+
"parent-sha-2",
604+
42,
605+
Utc::now(),
606+
))
607+
.await
608+
.unwrap();
609+
610+
assert_eq!(result, BenchmarkRequestInsertResult::AlreadyQueued);
603611

604612
Ok(ctx)
605613
})

database/src/pool/postgres.rs

Lines changed: 18 additions & 9 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,9 +1633,10 @@ where
16331633
async fn insert_benchmark_request(
16341634
&self,
16351635
benchmark_request: &BenchmarkRequest,
1636-
) -> anyhow::Result<()> {
1637-
self.conn()
1638-
.execute(
1636+
) -> anyhow::Result<BenchmarkRequestInsertResult> {
1637+
let rows = self
1638+
.conn()
1639+
.query(
16391640
r#"
16401641
INSERT INTO benchmark_request(
16411642
tag,
@@ -1648,7 +1649,9 @@ 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
1654+
RETURNING id;
16521655
"#,
16531656
&[
16541657
&benchmark_request.tag(),
@@ -1664,7 +1667,13 @@ where
16641667
)
16651668
.await
16661669
.context("Failed to insert benchmark request")?;
1667-
Ok(())
1670+
if rows.is_empty() {
1671+
// Allows us to handle duplicated cases without the database auto
1672+
// erroring
1673+
Ok(BenchmarkRequestInsertResult::AlreadyQueued)
1674+
} else {
1675+
Ok(BenchmarkRequestInsertResult::Queued)
1676+
}
16681677
}
16691678

16701679
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::AlreadyQueued) => {
60+
log::error!(
61+
"Failed to insert master benchmark request, request for PR`#{pr}` already exists",
62+
);
63+
}
64+
Ok(BenchmarkRequestInsertResult::Queued) => {}
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::AlreadyQueued) => {
99+
log::error!(
100+
"Failed to insert release benchmark request, release with tag `{name}` already exists"
101+
);
102+
}
103+
Ok(BenchmarkRequestInsertResult::Queued) => {}
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: 38 additions & 13 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,19 +76,48 @@ 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(
93+
client: &client::Client,
8394
conn: &dyn database::pool::Connection,
8495
pr: u32,
8596
backends: &str,
86-
) {
97+
) -> ServerResult<github::Response> {
8798
let try_request = BenchmarkRequest::create_try_without_artifacts(pr, backends, "");
8899
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);
100+
101+
match conn.insert_benchmark_request(&try_request).await {
102+
Ok(BenchmarkRequestInsertResult::AlreadyQueued) => {
103+
log::error!(
104+
"Failed to insert try benchmark request, a request for PR`#{pr}` already exists"
105+
);
106+
client.post_comment(pr, format!("Failed to insert try benchmark request, a request for PR`#{pr}` already exists")).await;
107+
}
108+
Ok(BenchmarkRequestInsertResult::Queued) => {
109+
client
110+
.post_comment(pr, get_awaiting_on_bors_message())
111+
.await;
112+
}
113+
Err(e) => {
114+
log::error!("Failed to insert release benchmark request: {e}");
115+
client
116+
.post_comment(pr, "Something went wrong! This is most likely an internal failure, please message on Zulip".to_string())
117+
.await;
118+
}
91119
}
120+
return Ok(github::Response);
92121
}
93122

94123
async fn handle_rust_timer(
@@ -123,7 +152,8 @@ async fn handle_rust_timer(
123152
let conn = ctxt.conn().await;
124153

125154
if should_use_job_queue(issue.number) {
126-
record_try_benchmark_request_without_artifacts(
155+
return record_try_benchmark_request_without_artifacts(
156+
main_client,
127157
&*conn,
128158
issue.number,
129159
cmd.params.backends.unwrap_or(""),
@@ -139,13 +169,7 @@ async fn handle_rust_timer(
139169
)
140170
.await;
141171
}
142-
format!(
143-
"Awaiting bors try build completion.
144-
145-
@rustbot label: +S-waiting-on-perf
146-
147-
{COMMENT_MARK_TEMPORARY}"
148-
)
172+
get_awaiting_on_bors_message()
149173
}
150174
Err(error) => {
151175
format!("Error occurred while parsing comment: {error}")
@@ -177,7 +201,8 @@ async fn handle_rust_timer(
177201
let conn = ctxt.conn().await;
178202
for command in &valid_build_cmds {
179203
if should_use_job_queue(issue.number) {
180-
record_try_benchmark_request_without_artifacts(
204+
return record_try_benchmark_request_without_artifacts(
205+
main_client,
181206
&*conn,
182207
issue.number,
183208
command.params.backends.unwrap_or(""),

0 commit comments

Comments
 (0)