mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 16:31:02 +03:00
8fc9f7159a
Summary: Split the `BonsaiDerived` type in two: * `BonsaiDerived` is now just the interface which is used by callers who want to derive some derived data type. It will be implemented by both old and new derivation. * `BonsaiDerivedOld` is the interface that old derivation uses to determine the default mapping for derivation. This will not be implemented by new derivation, and will be removed once migration is complete. Reviewed By: yancouto Differential Revision: D30944566 fbshipit-source-id: 5d30a44da22bcf290ed3123844eb712c7b37dea4
76 lines
2.4 KiB
Rust
76 lines
2.4 KiB
Rust
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This software may be used and distributed according to the terms of the
|
|
* GNU General Public License version 2.
|
|
*/
|
|
|
|
use super::{IsWarmFn, Warmer, WarmerFn};
|
|
use anyhow::Error;
|
|
use context::CoreContext;
|
|
use derived_data::BonsaiDerived;
|
|
use futures::future::{FutureExt, TryFutureExt};
|
|
use futures_ext::FutureExt as OldFutureExt;
|
|
use futures_watchdog::WatchdogExt;
|
|
use mononoke_api_types::InnerRepo;
|
|
use mononoke_types::ChangesetId;
|
|
use phases::Phases;
|
|
use slog::{info, o};
|
|
|
|
pub fn create_derived_data_warmer<D: BonsaiDerived>(ctx: &CoreContext) -> Warmer {
|
|
info!(ctx.logger(), "Warming {}", D::DERIVABLE_NAME);
|
|
let warmer: Box<WarmerFn> =
|
|
Box::new(|ctx: CoreContext, repo: InnerRepo, cs_id: ChangesetId| {
|
|
async move {
|
|
D::derive(&ctx, &repo.blob_repo, cs_id).await?;
|
|
Ok(())
|
|
}
|
|
.boxed()
|
|
.compat()
|
|
.boxify()
|
|
});
|
|
|
|
let is_warm: Box<IsWarmFn> =
|
|
Box::new(|ctx: &CoreContext, repo: &InnerRepo, cs_id: &ChangesetId| {
|
|
let logger = ctx.logger().new(o!("type" => D::DERIVABLE_NAME));
|
|
D::is_derived(&ctx, &repo.blob_repo, &cs_id)
|
|
.watched(logger)
|
|
.map_err(Error::from)
|
|
.boxed()
|
|
});
|
|
Warmer { warmer, is_warm }
|
|
}
|
|
|
|
pub fn create_public_phase_warmer(ctx: &CoreContext) -> Warmer {
|
|
info!(ctx.logger(), "Warming public phases");
|
|
let warmer: Box<WarmerFn> =
|
|
Box::new(|ctx: CoreContext, repo: InnerRepo, cs_id: ChangesetId| {
|
|
async move {
|
|
repo.blob_repo
|
|
.get_phases()
|
|
.add_reachable_as_public(ctx, vec![cs_id])
|
|
.await?;
|
|
Ok(())
|
|
}
|
|
.boxed()
|
|
.compat()
|
|
.boxify()
|
|
});
|
|
|
|
let is_warm: Box<IsWarmFn> =
|
|
Box::new(|ctx: &CoreContext, repo: &InnerRepo, cs_id: &ChangesetId| {
|
|
async move {
|
|
let maybe_public = repo
|
|
.blob_repo
|
|
.get_phases()
|
|
.get_store()
|
|
.get_public(ctx.clone(), vec![*cs_id], false /* ephemeral derive */)
|
|
.await?;
|
|
|
|
Ok(maybe_public.contains(cs_id))
|
|
}
|
|
.boxed()
|
|
});
|
|
Warmer { warmer, is_warm }
|
|
}
|