diff --git a/eden/mononoke/walker/Cargo.toml b/eden/mononoke/walker/Cargo.toml index f1c771a1dd..1c34fa6d5f 100644 --- a/eden/mononoke/walker/Cargo.toml +++ b/eden/mononoke/walker/Cargo.toml @@ -23,6 +23,7 @@ filenodes = { path = "../filenodes" } filestore = { path = "../filestore" } fsnodes = { path = "../derived_data/fsnodes" } manifest = { path = "../manifest" } +mercurial_derived_data = { path = "../derived_data/mercurial_derived_data" } mercurial_types = { path = "../mercurial/types" } metaconfig_types = { path = "../metaconfig/types" } mononoke_types = { path = "../mononoke_types" } diff --git a/eden/mononoke/walker/src/graph.rs b/eden/mononoke/walker/src/graph.rs index b613c6f85c..1d690bd7d6 100644 --- a/eden/mononoke/walker/src/graph.rs +++ b/eden/mononoke/walker/src/graph.rs @@ -17,6 +17,7 @@ use fsnodes::RootFsnodeId; use futures::stream::BoxStream; use hash_memo::EagerHashMemoizer; use internment::ArcIntern; +use mercurial_derived_data::MappedHgChangesetId; use mercurial_types::{ blobs::{BlobManifest, HgBlobChangeset}, FileBytes, HgChangesetId, HgFileEnvelope, HgFileNodeId, HgManifestId, @@ -146,14 +147,16 @@ impl NodeType { // Bonsai NodeType::Bookmark => None, NodeType::BonsaiChangeset => None, + // from filenodes/lib.rs: If hg changeset is not generated, then root filenode can't possible be generated + // therefore this is the same as MappedHgChangesetId + FilenodesOnlyPublic NodeType::BonsaiHgMapping => Some(FilenodesOnlyPublic::NAME), NodeType::BonsaiPhaseMapping => None, NodeType::PublishedBookmarks => None, // Hg - NodeType::HgBonsaiMapping => None, - NodeType::HgChangeset => None, - NodeType::HgManifest => None, - NodeType::HgFileEnvelope => None, + NodeType::HgBonsaiMapping => Some(MappedHgChangesetId::NAME), + NodeType::HgChangeset => Some(MappedHgChangesetId::NAME), + NodeType::HgManifest => Some(MappedHgChangesetId::NAME), + NodeType::HgFileEnvelope => Some(MappedHgChangesetId::NAME), NodeType::HgFileNode => Some(FilenodesOnlyPublic::NAME), // Content NodeType::FileContent => None, diff --git a/eden/mononoke/walker/src/walk.rs b/eden/mononoke/walker/src/walk.rs index 64c268a704..3780e10bff 100644 --- a/eden/mononoke/walker/src/walk.rs +++ b/eden/mononoke/walker/src/walk.rs @@ -30,6 +30,7 @@ use futures_ext::FutureExt as Future01Ext; use futures_old::{Future as Future01, Stream as Stream01}; use itertools::{Either, Itertools}; use manifest::{Entry, Manifest}; +use mercurial_derived_data::MappedHgChangesetId; use mercurial_types::{FileBytes, HgChangesetId, HgFileNodeId, HgManifestId, RepoPath}; use mononoke_types::{fsnode::FsnodeEntry, ChangesetId, ContentId, FsnodeId, MPath}; use phases::{HeadsFetcher, Phase, Phases}; @@ -397,89 +398,62 @@ fn file_content_metadata_step<'a, V: VisitOne>( .compat() } -fn bonsai_to_hg_mapping_step<'a, V: 'a + VisitOne>( +async fn bonsai_to_hg_mapping_step<'a, V: 'a + VisitOne>( ctx: &'a CoreContext, repo: &'a BlobRepo, checker: &'a Checker, bcs_id: ChangesetId, enable_derive: bool, -) -> impl Future> + 'a { - let hg_cs_id = if enable_derive { - let filenodes_derive = repo +) -> Result { + let has_filenode = if enable_derive { + let public = repo .get_phases() .get_public(ctx.clone(), vec![bcs_id], false /* ephemeral_derive */) - .and_then({ - cloned!(ctx, repo); - move |public| { - if public.contains(&bcs_id) { - FilenodesOnlyPublic::derive(ctx.clone(), repo.clone(), bcs_id) - .from_err() - .map(|_| ()) - .compat() - .left_future() - } else { - future::ok(()).right_future() - } - } - }) - .compat(); - - let hg_cs_derive = repo.get_hg_from_bonsai_changeset(ctx.clone(), bcs_id); - - filenodes_derive - .join(hg_cs_derive) - .map(|((), hg_cs_id)| Some(hg_cs_id)) - .left_future() - } else { - // Check that both filenodes and hg changesets are derived - { - async move { - FilenodesOnlyPublic::is_derived(&ctx, &repo, &bcs_id) - .map_err(Error::from) - .await - } + .await?; + // Even if enable_derive is set, only derive for public changesets + if public.contains(&bcs_id) { + let _ = FilenodesOnlyPublic::derive03(ctx, repo, bcs_id).await?; + Some(true) + } else { + None } - .boxed() - .compat() - .join(repo.get_bonsai_hg_mapping().get_hg_from_bonsai( - ctx.clone(), - repo.get_repoid(), - bcs_id, - )) - .map(|(filenodes_derived, maybe_hg_cs_id)| { - if filenodes_derived { - maybe_hg_cs_id - } else { - None - } - }) - .right_future() + } else { + None }; - hg_cs_id - .map(move |maybe_hg_cs_id| { - match maybe_hg_cs_id { - Some(hg_cs_id) => { - let mut edges = vec![]; - checker.add_edge(&mut edges, EdgeType::BonsaiHgMappingToHgChangeset, || { - Node::HgChangeset(hg_cs_id) - }); - StepOutput( - checker.step_data(NodeType::BonsaiHgMapping, || { - NodeData::BonsaiHgMapping(Some(hg_cs_id)) - }), - edges, - ) - } - None => StepOutput( - checker.step_data(NodeType::BonsaiHgMapping, || { - NodeData::BonsaiHgMapping(None) - }), - vec![], - ), - } - }) - .compat() + // We only want to walk to Hg step if filenode is present + let has_filenode = match has_filenode { + Some(v) => v, + None => FilenodesOnlyPublic::is_derived(&ctx, &repo, &bcs_id).await?, + }; + + let maybe_hg_cs_id = if has_filenode { + maybe_derived::(ctx, repo, bcs_id, enable_derive).await? + } else { + None + }; + + Ok(match maybe_hg_cs_id { + Some(hg_cs_id) => { + let hg_cs_id = hg_cs_id.0; + let mut edges = vec![]; + checker.add_edge(&mut edges, EdgeType::BonsaiHgMappingToHgChangeset, || { + Node::HgChangeset(hg_cs_id) + }); + StepOutput( + checker.step_data(NodeType::BonsaiHgMapping, || { + NodeData::BonsaiHgMapping(Some(hg_cs_id)) + }), + edges, + ) + } + None => StepOutput( + checker.step_data(NodeType::BonsaiHgMapping, || { + NodeData::BonsaiHgMapping(None) + }), + vec![], + ), + }) } fn hg_to_bonsai_mapping_step<'a, V: VisitOne>(