Skip to content

Commit b4a3e24

Browse files
committed
Merge remote-tracking branch 'nihlus/manual-rescheduling'
2 parents 47c3e7d + a9d065e commit b4a3e24

File tree

9 files changed

+116
-23
lines changed

9 files changed

+116
-23
lines changed

common/src/api/v1/mod.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,95 @@ use async_trait::async_trait;
66
pub use models::*;
77
use std::borrow::Cow;
88

9+
#[cfg(feature = "diesel")]
10+
use diesel::{
11+
deserialize::FromSql,
12+
serialize::{IsNull, Output, ToSql},
13+
sql_types::Integer,
14+
sqlite::{Sqlite, SqliteValue},
15+
{AsExpression, FromSqlRow},
16+
};
17+
use serde::{Deserialize, Serialize};
18+
19+
/// Represents the priority of an enqueued rebuild job. The job queue is sorted based on priority and
20+
/// time, so the lower this number is, the more prioritized the job is. It's a little backwards, but
21+
/// hey.
22+
///
23+
/// There are some utility functions on the type for accessing default values for well-defined use
24+
/// cases. These map to constants in the same namespace as this type, and you can use either one.
25+
/// ```
26+
/// use rebuilderd_common::api::v1::Priority;
27+
///
28+
/// assert_eq!(Priority::from(1), Priority::default());
29+
/// assert_eq!(Priority::from(2), Priority::retry());
30+
/// assert_eq!(Priority::from(0), Priority::manual());
31+
/// ```
32+
///
33+
/// You can also set a completely custom priority. This is mostly useful for external API calls that
34+
/// orchestrate rebuilds.
35+
/// ```
36+
/// use rebuilderd_common::api::v1::Priority;
37+
///
38+
/// let custom = Priority::from(10);
39+
/// assert_eq!(custom, Priority::from(10));
40+
///
41+
/// ```
42+
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Copy, Clone)]
43+
#[cfg_attr(feature = "diesel", derive(FromSqlRow, AsExpression))]
44+
#[cfg_attr(feature = "diesel", diesel(sql_type = Integer))]
45+
#[cfg_attr(feature = "diesel", diesel(check_for_backend(diesel::sqlite::Sqlite)))]
46+
pub struct Priority(i32);
47+
48+
impl Priority {
49+
/// The default priority for enqueued rebuilds. The job queue is sorted based on priority and time,
50+
/// so the lower this number is, the more prioritized the job is. It's a little backwards, but hey.
51+
const DEFAULT_QUEUE_PRIORITY: i32 = 1;
52+
53+
/// The default priority used for automatically requeued jobs. This priority is lower than the one
54+
/// for untested packages.
55+
const DEFAULT_RETRY_PRIORITY: i32 = Self::DEFAULT_QUEUE_PRIORITY + 1;
56+
57+
/// The default priority used for manually retried jobs. This priority is higher than the one for
58+
/// untested packages.
59+
const DEFAULT_MANUAL_PRIORITY: i32 = Self::DEFAULT_QUEUE_PRIORITY - 1;
60+
61+
pub fn retry() -> Self {
62+
Priority(Self::DEFAULT_RETRY_PRIORITY)
63+
}
64+
65+
pub fn manual() -> Self {
66+
Priority(Self::DEFAULT_MANUAL_PRIORITY)
67+
}
68+
}
69+
70+
impl Default for Priority {
71+
fn default() -> Self {
72+
Priority(Self::DEFAULT_QUEUE_PRIORITY)
73+
}
74+
}
75+
76+
#[cfg(feature = "diesel")]
77+
impl FromSql<Integer, Sqlite> for Priority {
78+
fn from_sql(bytes: SqliteValue) -> diesel::deserialize::Result<Self> {
79+
let value = <i32 as FromSql<Integer, Sqlite>>::from_sql(bytes)?;
80+
Ok(Priority(value))
81+
}
82+
}
83+
84+
#[cfg(feature = "diesel")]
85+
impl ToSql<Integer, Sqlite> for Priority {
86+
fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, Sqlite>) -> diesel::serialize::Result {
87+
out.set_value(self.0);
88+
Ok(IsNull::No)
89+
}
90+
}
91+
92+
impl From<i32> for Priority {
93+
fn from(value: i32) -> Self {
94+
Priority(value)
95+
}
96+
}
97+
998
#[async_trait]
1099
pub trait BuildRestApi {
11100
async fn get_builds(

common/src/api/v1/models/queue.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::api::v1::BuildStatus;
1+
use crate::api::v1::{BuildStatus, Priority};
22
use chrono::NaiveDateTime;
33
#[cfg(feature = "diesel")]
44
use diesel::Queryable;
@@ -13,7 +13,7 @@ pub struct QueueJobRequest {
1313
pub version: Option<String>,
1414
pub architecture: Option<String>,
1515
pub status: Option<BuildStatus>,
16-
pub priority: Option<i32>,
16+
pub priority: Option<Priority>,
1717
}
1818

1919
#[derive(Debug, Serialize, Deserialize)]

daemon/src/api/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ use rebuilderd_common::utils::{is_zstd_compressed, zstd_decompress};
77
pub mod v0;
88
pub mod v1;
99

10-
const DEFAULT_QUEUE_PRIORITY: i32 = 1;
11-
1210
pub async fn forward_compressed_data(
1311
request: HttpRequest,
1412
content_type: &str,

daemon/src/api/v1/build.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
use crate::api::forward_compressed_data;
12
use crate::api::v1::util::auth;
23
use crate::api::v1::util::filters::{IntoIdentityFilter, IntoOriginFilter};
34
use crate::api::v1::util::friends::get_build_input_friends;
45
use crate::api::v1::util::pagination::PaginateDsl;
5-
use crate::api::{forward_compressed_data, DEFAULT_QUEUE_PRIORITY};
66
use crate::config::Config;
77
use crate::db::Pool;
88
use crate::models::{
@@ -24,7 +24,7 @@ use diesel::{OptionalExtension, RunQueryDsl};
2424
use in_toto::crypto::PrivateKey;
2525
use rebuilderd_common::api;
2626
use rebuilderd_common::api::v1::{
27-
BuildStatus, IdentityFilter, OriginFilter, Page, Rebuild, RebuildReport, ResultPage,
27+
BuildStatus, IdentityFilter, OriginFilter, Page, Priority, Rebuild, RebuildReport, ResultPage,
2828
};
2929
use rebuilderd_common::errors::Error;
3030
use rebuilderd_common::utils::{is_zstd_compressed, zstd_compress};
@@ -236,7 +236,7 @@ pub async fn submit_rebuild_report(
236236
// only requeue this build ID
237237
let new_queue = NewQueued {
238238
build_input_id: queued.build_input_id,
239-
priority: DEFAULT_QUEUE_PRIORITY + 1,
239+
priority: Priority::retry(),
240240
queued_at: now.naive_utc(),
241241
};
242242

daemon/src/api/v1/package.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use crate::api::v1::util::auth;
22
use crate::api::v1::util::filters::IntoOriginFilter;
33
use crate::api::v1::util::filters::{IntoFilter, IntoIdentityFilter};
44
use crate::api::v1::util::pagination::PaginateDsl;
5-
use crate::api::DEFAULT_QUEUE_PRIORITY;
65
use crate::config::Config;
76
use crate::db::{Pool, SqliteConnectionWrap};
87
use crate::models::{BuildInput, NewBinaryPackage, NewBuildInput, NewQueued, NewSourcePackage};
@@ -20,8 +19,8 @@ use diesel::{
2019
OptionalExtension, QueryDsl, RunQueryDsl, SqliteConnection, SqliteExpressionMethods,
2120
};
2221
use rebuilderd_common::api::v1::{
23-
BuildStatus, FreshnessFilter, IdentityFilter, OriginFilter, PackageReport, Page, ResultPage,
24-
SourcePackageReport,
22+
BuildStatus, FreshnessFilter, IdentityFilter, OriginFilter, PackageReport, Page, Priority,
23+
ResultPage, SourcePackageReport,
2524
};
2625
use rebuilderd_common::errors::Error;
2726

@@ -244,8 +243,8 @@ pub async fn submit_package_report(
244243

245244
if current_status != BuildStatus::Good && !has_queued_friend {
246245
let priority = match current_status {
247-
BuildStatus::Bad => DEFAULT_QUEUE_PRIORITY + 1,
248-
_ => DEFAULT_QUEUE_PRIORITY,
246+
BuildStatus::Bad => Priority::retry(),
247+
_ => Priority::default(),
249248
};
250249

251250
let new_queued_job = NewQueued {

daemon/src/api/v1/queue.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use crate::api::v1::util::auth;
22
use crate::api::v1::util::filters::{IntoIdentityFilter, IntoOriginFilter};
33
use crate::api::v1::util::pagination::PaginateDsl;
4-
use crate::api::DEFAULT_QUEUE_PRIORITY;
54
use crate::config::Config;
65
use crate::db::Pool;
76
use crate::models::NewQueued;
@@ -14,7 +13,7 @@ use diesel::{define_sql_function, ExpressionMethods, SqliteExpressionMethods};
1413
use diesel::{BoolExpressionMethods, JoinOnDsl};
1514
use diesel::{Connection, OptionalExtension, QueryDsl, RunQueryDsl};
1615
use rebuilderd_common::api::v1::{
17-
BuildStatus, IdentityFilter, JobAssignment, OriginFilter, Page, PopQueuedJobRequest,
16+
BuildStatus, IdentityFilter, JobAssignment, OriginFilter, Page, PopQueuedJobRequest, Priority,
1817
QueueJobRequest, QueuedJob, QueuedJobArtifact, QueuedJobWithArtifacts, ResultPage,
1918
};
2019
use rebuilderd_common::config::PING_DEADLINE;
@@ -142,11 +141,18 @@ pub async fn request_rebuild(
142141
.get_results::<i32>(connection.as_mut())
143142
.map_err(Error::from)?;
144143

144+
let now = Utc::now();
145145
for build_input_id in build_input_ids {
146+
diesel::update(build_inputs::table)
147+
.filter(build_inputs::id.eq(build_input_id))
148+
.set(build_inputs::next_retry.eq((now - Duration::minutes(1)).naive_utc()))
149+
.execute(connection.as_mut())
150+
.map_err(Error::from)?;
151+
146152
let new_queued_job = NewQueued {
147153
build_input_id,
148-
priority: queue_request.priority.unwrap_or(DEFAULT_QUEUE_PRIORITY),
149-
queued_at: Utc::now().naive_utc(),
154+
priority: queue_request.priority.unwrap_or(Priority::manual()),
155+
queued_at: now.naive_utc(),
150156
};
151157

152158
new_queued_job.upsert(connection.as_mut())?;

daemon/src/models/queue.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::schema::*;
22
use chrono::prelude::*;
33
use diesel::prelude::*;
44
use diesel::upsert::excluded;
5+
use rebuilderd_common::api::v1::Priority;
56
use rebuilderd_common::errors::*;
67
use serde::{Deserialize, Serialize};
78

@@ -12,7 +13,7 @@ use serde::{Deserialize, Serialize};
1213
pub struct Queued {
1314
pub id: i32,
1415
pub build_input_id: i32,
15-
pub priority: i32,
16+
pub priority: Priority,
1617
pub queued_at: NaiveDateTime,
1718
pub started_at: Option<NaiveDateTime>,
1819
pub worker: Option<i32>,
@@ -31,7 +32,7 @@ impl Queued {
3132
#[diesel(table_name = queue)]
3233
pub struct NewQueued {
3334
pub build_input_id: i32,
34-
pub priority: i32,
35+
pub priority: Priority,
3536
pub queued_at: NaiveDateTime,
3637
}
3738

tests/src/main.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use rebuilderd::db;
1313
use rebuilderd::schema::{attestation_logs, rebuild_artifacts};
1414
use rebuilderd_common::api::v1::{
1515
ArtifactStatus, BinaryPackage, BinaryPackageReport, BuildRestApi, BuildStatus, JobAssignment,
16-
MetaRestApi, PackageReport, PackageRestApi, PopQueuedJobRequest, QueueJobRequest, QueueRestApi,
17-
RebuildArtifactReport, RebuildReport, RegisterWorkerRequest, SourcePackageReport,
16+
MetaRestApi, PackageReport, PackageRestApi, PopQueuedJobRequest, Priority, QueueJobRequest,
17+
QueueRestApi, RebuildArtifactReport, RebuildReport, RegisterWorkerRequest, SourcePackageReport,
1818
WorkerRestApi,
1919
};
2020
use rebuilderd_common::api::Client;
@@ -298,7 +298,7 @@ async fn main() -> Result<()> {
298298
version: None,
299299
architecture: None,
300300
status: Some(BuildStatus::Bad),
301-
priority: Some(2),
301+
priority: Some(Priority::manual()),
302302
})
303303
.await?;
304304

tools/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use glob::Pattern;
99
use nom::AsBytes;
1010
use rebuilderd_common::api::v1::{
1111
ArtifactStatus, BinaryPackage, BuildRestApi, IdentityFilter, OriginFilter, PackageReport,
12-
PackageRestApi, Page, QueueJobRequest, QueueRestApi, WorkerRestApi,
12+
PackageRestApi, Page, Priority, QueueJobRequest, QueueRestApi, WorkerRestApi,
1313
};
1414
use rebuilderd_common::api::Client;
1515
use rebuilderd_common::errors::*;
@@ -410,7 +410,7 @@ async fn main() -> Result<()> {
410410
version: push.version,
411411
architecture: push.architecture,
412412
status: None, // TODO: push.status
413-
priority: Some(push.priority),
413+
priority: Some(Priority::from(push.priority)),
414414
})
415415
.await?;
416416
}

0 commit comments

Comments
 (0)