Skip to content

Commit f341570

Browse files
committed
Restructure spk-solve for multiple solvers
Move `Solver` into a nested module and rename it publicly as `StepSolver` in order to make way for other solver implementations and for the name `Solver` to become available for repurposing it later. The name `StepSolver` was inspired by how the solver makes progress by calling the `step_state` function. The `solver_test` module has been separated from the `solver` module since this is destined to become a module of tests that are generic over the solver implementation. Signed-off-by: J Robert Ray <jrray@jrray.org>
1 parent 4a747a2 commit f341570

File tree

12 files changed

+147
-126
lines changed

12 files changed

+147
-126
lines changed

crates/spk-build/src/build/binary.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use spk_schema::{
3737
};
3838
use spk_solve::graph::Graph;
3939
use spk_solve::solution::Solution;
40-
use spk_solve::{BoxedResolverCallback, Named, ResolverCallback, Solver};
40+
use spk_solve::{BoxedResolverCallback, Named, ResolverCallback, StepSolver};
4141
use spk_storage as storage;
4242

4343
use crate::report::{BuildOutputReport, BuildReport, BuildSetupReport};
@@ -131,7 +131,7 @@ pub struct BinaryPackageBuilder<'a, Recipe> {
131131
prefix: PathBuf,
132132
recipe: Recipe,
133133
source: BuildSource,
134-
solver: Solver,
134+
solver: StepSolver,
135135
environment: HashMap<String, String>,
136136
source_resolver: BoxedResolverCallback<'a>,
137137
build_resolver: BoxedResolverCallback<'a>,
@@ -155,7 +155,7 @@ where
155155
recipe,
156156
source,
157157
prefix: PathBuf::from("/spfs"),
158-
solver: Solver::default(),
158+
solver: StepSolver::default(),
159159
environment: Default::default(),
160160
#[cfg(test)]
161161
source_resolver: Box::new(spk_solve::DecisionFormatter::new_testing()),

crates/spk-cli/cmd-test/src/test/build.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use spk_schema::foundation::option_map::OptionMap;
1515
use spk_schema::ident::{PkgRequest, PreReleasePolicy, RangeIdent, Request, RequestedBy};
1616
use spk_schema::{AnyIdent, Recipe, SpecRecipe};
1717
use spk_solve::solution::Solution;
18-
use spk_solve::{BoxedResolverCallback, DefaultResolver, ResolverCallback, Solver};
18+
use spk_solve::{BoxedResolverCallback, DefaultResolver, ResolverCallback, StepSolver};
1919
use spk_storage as storage;
2020

2121
use super::Tester;
@@ -117,7 +117,7 @@ impl<'a> PackageBuildTester<'a> {
117117
}
118118
}
119119

120-
let mut solver = Solver::default();
120+
let mut solver = StepSolver::default();
121121
solver.set_binary_only(true);
122122
solver.update_options(self.options.clone());
123123
for repo in self.repos.iter().cloned() {
@@ -154,7 +154,7 @@ impl<'a> PackageBuildTester<'a> {
154154
}
155155

156156
async fn resolve_source_package(&mut self, package: &AnyIdent) -> Result<Solution> {
157-
let mut solver = Solver::default();
157+
let mut solver = StepSolver::default();
158158
solver.update_options(self.options.clone());
159159
let local_repo: Arc<storage::RepositoryHandle> =
160160
Arc::new(storage::local_repository().await?.into());

crates/spk-cli/cmd-test/src/test/install.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use spk_schema::foundation::option_map::OptionMap;
1212
use spk_schema::ident::{PkgRequest, PreReleasePolicy, RangeIdent, Request, RequestedBy};
1313
use spk_schema::ident_build::Build;
1414
use spk_schema::{Recipe, SpecRecipe, Variant, VariantExt};
15-
use spk_solve::{BoxedResolverCallback, DefaultResolver, ResolverCallback, Solver};
15+
use spk_solve::{BoxedResolverCallback, DefaultResolver, ResolverCallback, StepSolver};
1616
use spk_storage as storage;
1717

1818
use super::Tester;
@@ -94,7 +94,7 @@ where
9494

9595
let requires_localization = rt.config.mount_backend.requires_localization();
9696

97-
let mut solver = Solver::default();
97+
let mut solver = StepSolver::default();
9898
solver.set_binary_only(true);
9999
solver.update_options(self.options.clone());
100100
for repo in self.repos.iter().cloned() {

crates/spk-cli/cmd-test/src/test/sources.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use spk_schema::foundation::ident_component::Component;
1313
use spk_schema::foundation::option_map::OptionMap;
1414
use spk_schema::ident::{PkgRequest, PreReleasePolicy, RangeIdent, Request, RequestedBy};
1515
use spk_schema::{Recipe, SpecRecipe};
16-
use spk_solve::{BoxedResolverCallback, DefaultResolver, ResolverCallback, Solver};
16+
use spk_solve::{BoxedResolverCallback, DefaultResolver, ResolverCallback, StepSolver};
1717
use spk_storage as storage;
1818

1919
use super::Tester;
@@ -92,7 +92,7 @@ impl<'a> PackageSourceTester<'a> {
9292

9393
let requires_localization = rt.config.mount_backend.requires_localization();
9494

95-
let mut solver = Solver::default();
95+
let mut solver = StepSolver::default();
9696
solver.set_binary_only(true);
9797
solver.update_options(self.options.clone());
9898
for repo in self.repos.iter().cloned() {

crates/spk-cli/common/src/flags.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,10 @@ pub struct Solver {
257257
}
258258

259259
impl Solver {
260-
pub async fn get_solver(&self, options: &Options) -> Result<solve::Solver> {
260+
pub async fn get_solver(&self, options: &Options) -> Result<solve::StepSolver> {
261261
let option_map = options.get_options()?;
262262

263-
let mut solver = solve::Solver::default();
263+
let mut solver = solve::StepSolver::default();
264264
solver.update_options(option_map);
265265

266266
for (name, repo) in self.repos.get_repos_for_non_destructive_operation().await? {

crates/spk-exec/src/exec_test.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ use rstest::{fixture, rstest};
99
use spk_cmd_build::build_package;
1010
use spk_schema::foundation::fixtures::*;
1111
use spk_schema::ident::build_ident;
12-
use spk_solve::{DecisionFormatterBuilder, Solver};
12+
use spk_solve::{DecisionFormatterBuilder, StepSolver};
1313
use spk_solve_macros::request;
1414
use spk_storage::fixtures::*;
1515

1616
use crate::solution_to_resolved_runtime_layers;
1717

1818
#[fixture]
19-
fn solver() -> Solver {
20-
Solver::default()
19+
fn solver() -> StepSolver {
20+
StepSolver::default()
2121
}
2222

2323
/// If two layers contribute files to the same subdirectory, the Manifest is
@@ -26,7 +26,7 @@ fn solver() -> Solver {
2626
#[tokio::test]
2727
async fn get_environment_filesystem_merges_directories(
2828
tmpdir: tempfile::TempDir,
29-
mut solver: Solver,
29+
mut solver: StepSolver,
3030
) {
3131
let rt = spfs_runtime().await;
3232

crates/spk-solve/src/io.rs

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,8 @@ use spk_solve_graph::{
4040
State,
4141
};
4242

43-
use crate::solver::ErrorFreq;
44-
use crate::{
45-
Error,
46-
ResolverCallback,
47-
Result,
48-
Solution,
49-
Solver,
50-
SolverRuntime,
51-
StatusLine,
52-
show_search_space_stats,
53-
};
43+
use crate::solvers::{ErrorFreq, StepSolver, StepSolverRuntime};
44+
use crate::{Error, ResolverCallback, Result, Solution, StatusLine, show_search_space_stats};
5445
#[cfg(feature = "statsd")]
5546
use crate::{
5647
SPK_SOLUTION_PACKAGE_COUNT_METRIC,
@@ -1101,15 +1092,15 @@ impl Display for MultiSolverKind {
11011092
}
11021093

11031094
struct SolverTaskSettings {
1104-
solver: Solver,
1095+
solver: StepSolver,
11051096
solver_kind: MultiSolverKind,
11061097
ignore_failure: bool,
11071098
}
11081099

11091100
struct SolverTaskDone {
11101101
pub(crate) start: Instant,
11111102
pub(crate) loop_outcome: LoopOutcome,
1112-
pub(crate) runtime: SolverRuntime,
1103+
pub(crate) runtime: StepSolverRuntime,
11131104
pub(crate) verbosity: u8,
11141105
pub(crate) solver_kind: MultiSolverKind,
11151106
pub(crate) can_ignore_failure: bool,
@@ -1119,7 +1110,7 @@ struct SolverTaskDone {
11191110
struct SolverResult {
11201111
pub(crate) solver_kind: MultiSolverKind,
11211112
pub(crate) solve_time: Duration,
1122-
pub(crate) solver: Solver,
1113+
pub(crate) solver: StepSolver,
11231114
pub(crate) result: Result<(Solution, Arc<tokio::sync::RwLock<spk_solve_graph::Graph>>)>,
11241115
}
11251116

@@ -1163,7 +1154,7 @@ impl DecisionFormatter {
11631154
/// result from the first to finish.
11641155
pub async fn run_and_print_resolve(
11651156
&self,
1166-
solver: &Solver,
1157+
solver: &StepSolver,
11671158
) -> Result<(Solution, Arc<tokio::sync::RwLock<Graph>>)> {
11681159
let solvers = self.setup_solvers(solver);
11691160
self.run_multi_solve(solvers, OutputKind::Println).await
@@ -1174,7 +1165,7 @@ impl DecisionFormatter {
11741165
/// won't benefit from running solvers in parallel.
11751166
pub async fn run_and_print_decisions(
11761167
&self,
1177-
runtime: &mut SolverRuntime,
1168+
runtime: &mut StepSolverRuntime,
11781169
) -> Result<(Solution, Arc<tokio::sync::RwLock<Graph>>)> {
11791170
// Note: this is only used directly by cmd_view/info when it
11801171
// runs a solve. Once 'spk info' no longer runs a solve we may
@@ -1196,7 +1187,7 @@ impl DecisionFormatter {
11961187
/// options) and takes the result from the first to finish.
11971188
pub async fn run_and_log_resolve(
11981189
&self,
1199-
solver: &Solver,
1190+
solver: &StepSolver,
12001191
) -> Result<(Solution, Arc<tokio::sync::RwLock<Graph>>)> {
12011192
let solvers = self.setup_solvers(solver);
12021193
self.run_multi_solve(solvers, OutputKind::Tracing).await
@@ -1208,7 +1199,7 @@ impl DecisionFormatter {
12081199
/// parallel.
12091200
pub async fn run_and_log_decisions(
12101201
&self,
1211-
runtime: &mut SolverRuntime,
1202+
runtime: &mut StepSolverRuntime,
12121203
) -> Result<(Solution, Arc<tokio::sync::RwLock<Graph>>)> {
12131204
// Note: this is not currently used directly. We may be able
12141205
// to remove this method.
@@ -1223,7 +1214,7 @@ impl DecisionFormatter {
12231214
.await
12241215
}
12251216

1226-
fn setup_solvers(&self, base_solver: &Solver) -> Vec<SolverTaskSettings> {
1217+
fn setup_solvers(&self, base_solver: &StepSolver) -> Vec<SolverTaskSettings> {
12271218
// Leave the first solver as is.
12281219
let solver_with_no_change = base_solver.clone();
12291220

@@ -1540,7 +1531,7 @@ impl DecisionFormatter {
15401531

15411532
async fn run_solver_loop(
15421533
&self,
1543-
runtime: &mut SolverRuntime,
1534+
runtime: &mut StepSolverRuntime,
15441535
mut output_location: OutputKind,
15451536
) -> LoopOutcome {
15461537
// This block exists to shorten the scope of `runtime`'s borrow.
@@ -1576,7 +1567,7 @@ impl DecisionFormatter {
15761567
&self,
15771568
loop_outcome: LoopOutcome,
15781569
solve_time: Duration,
1579-
runtime: &mut SolverRuntime,
1570+
runtime: &mut StepSolverRuntime,
15801571
mut output_location: OutputKind,
15811572
) -> Result<(Solution, Arc<tokio::sync::RwLock<Graph>>)> {
15821573
match loop_outcome {
@@ -1686,7 +1677,7 @@ impl DecisionFormatter {
16861677
async fn show_search_space_info(
16871678
&self,
16881679
solution: &Result<Solution>,
1689-
runtime: &SolverRuntime,
1680+
runtime: &StepSolverRuntime,
16901681
) -> Result<()> {
16911682
if let Ok(ref s) = *solution {
16921683
tracing::info!("Calculating search space stats. This may take some time...");
@@ -1713,7 +1704,7 @@ impl DecisionFormatter {
17131704
}
17141705

17151706
#[cfg(feature = "statsd")]
1716-
fn send_solver_start_metrics(&self, runtime: &SolverRuntime) {
1707+
fn send_solver_start_metrics(&self, runtime: &StepSolverRuntime) {
17171708
let Some(statsd_client) = get_metrics_client() else {
17181709
return;
17191710
};
@@ -1774,7 +1765,7 @@ impl DecisionFormatter {
17741765
#[cfg(feature = "sentry")]
17751766
fn add_details_to_next_sentry_event(
17761767
&self,
1777-
solver: &Solver,
1768+
solver: &StepSolver,
17781769
solve_duration: Duration,
17791770
) -> Vec<String> {
17801771
let seconds = solve_duration.as_secs_f64();
@@ -1831,7 +1822,7 @@ impl DecisionFormatter {
18311822
#[cfg(feature = "sentry")]
18321823
fn send_sentry_warning_message(
18331824
&self,
1834-
solver: &Solver,
1825+
solver: &StepSolver,
18351826
solve_duration: Duration,
18361827
sentry_warning: SentryWarning,
18371828
) {
@@ -1900,7 +1891,11 @@ impl DecisionFormatter {
19001891
FormattedDecisionsIter::new(decisions, self.settings.clone())
19011892
}
19021893

1903-
pub(crate) fn format_solve_stats(&self, solver: &Solver, solve_duration: Duration) -> String {
1894+
pub(crate) fn format_solve_stats(
1895+
&self,
1896+
solver: &StepSolver,
1897+
solve_duration: Duration,
1898+
) -> String {
19041899
// Show how long this solve took
19051900
let mut out: String = " Solver took: ".to_string();
19061901
let seconds = solve_duration.as_secs_f64();
@@ -2130,7 +2125,7 @@ impl DecisionFormatter {
21302125
impl ResolverCallback for &DecisionFormatter {
21312126
async fn solve<'s, 'a: 's>(
21322127
&'s self,
2133-
r: &'a Solver,
2128+
r: &'a StepSolver,
21342129
) -> Result<(Solution, Arc<tokio::sync::RwLock<Graph>>)> {
21352130
self.run_and_print_resolve(r).await
21362131
}
@@ -2140,7 +2135,7 @@ impl ResolverCallback for &DecisionFormatter {
21402135
impl ResolverCallback for DecisionFormatter {
21412136
async fn solve<'s, 'a: 's>(
21422137
&'s self,
2143-
r: &'a Solver,
2138+
r: &'a StepSolver,
21442139
) -> Result<(Solution, Arc<tokio::sync::RwLock<Graph>>)> {
21452140
self.run_and_print_resolve(r).await
21462141
}

crates/spk-solve/src/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ mod io;
77
#[cfg(feature = "statsd")]
88
mod metrics;
99
mod search_space;
10-
mod solver;
10+
mod solvers;
1111
mod status_line;
1212

1313
use std::sync::Arc;
@@ -34,7 +34,7 @@ pub use metrics::{
3434
get_metrics_client,
3535
};
3636
pub(crate) use search_space::show_search_space_stats;
37-
pub use solver::{Solver, SolverRuntime};
37+
pub use solvers::{StepSolver, StepSolverRuntime};
3838
pub use spk_schema::foundation::ident_build::Build;
3939
pub use spk_schema::foundation::ident_component::Component;
4040
pub use spk_schema::foundation::option_map;
@@ -62,11 +62,11 @@ pub use {
6262

6363
#[async_trait::async_trait]
6464
pub trait ResolverCallback: Send + Sync {
65-
/// Run a solve using the given [`crate::Solver`],
65+
/// Run a solve using the given [`crate::StepSolver`],
6666
/// producing a [`crate::Solution`].
6767
async fn solve<'s, 'a: 's>(
6868
&'s self,
69-
r: &'a Solver,
69+
r: &'a StepSolver,
7070
) -> Result<(Solution, Arc<tokio::sync::RwLock<Graph>>)>;
7171
}
7272

@@ -77,7 +77,7 @@ pub struct DefaultResolver {}
7777
impl ResolverCallback for DefaultResolver {
7878
async fn solve<'s, 'a: 's>(
7979
&'s self,
80-
r: &'a Solver,
80+
r: &'a StepSolver,
8181
) -> Result<(Solution, Arc<tokio::sync::RwLock<Graph>>)> {
8282
let mut runtime = r.run();
8383
let solution = runtime.solution().await;

crates/spk-solve/src/solvers/mod.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright (c) Contributors to the SPK project.
2+
// SPDX-License-Identifier: Apache-2.0
3+
// https://github.com/spkenv/spk
4+
5+
//! Spk package solver implementations.
6+
7+
pub(crate) mod step;
8+
9+
pub use step::{ErrorFreq, Solver as StepSolver, SolverRuntime as StepSolverRuntime};
10+
11+
// Public to allow other tests to use its macros
12+
#[cfg(test)]
13+
#[path = "./solver_test.rs"]
14+
mod solver_test;

0 commit comments

Comments
 (0)