sapling/eden/mononoke/bookmarks/warm_bookmarks_cache/warmers.rs
Mark Juggurnauth-Thomas 8fc9f7159a derived_data: split BonsaiDerived trait
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
2021-09-20 03:23:17 -07:00

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 }
}