From b13454d54b32b555a8972d723721421814bd8084 Mon Sep 17 00:00:00 2001 From: Andrey Chursin Date: Wed, 23 Jun 2021 14:50:31 -0700 Subject: [PATCH] segmented_changelog: introduce SegmentedChangelog::pull_fast_forward_master Summary: The naming is used in other parts of dag crate - this introduce mononoke side binding for corresponding functions on dag side Reviewed By: quark-zju Differential Revision: D29318722 fbshipit-source-id: e9eea5536b041b6ab2ce578914817bca43a10d48 --- eden/mononoke/segmented_changelog/src/lib.rs | 21 +++++++++++++++++++ .../segmented_changelog/src/on_demand.rs | 14 +++++++++++++ .../segmented_changelog/src/read_only.rs | 9 ++++++++ .../mononoke/segmented_changelog/types/lib.rs | 8 +++++++ 4 files changed, 52 insertions(+) diff --git a/eden/mononoke/segmented_changelog/src/lib.rs b/eden/mononoke/segmented_changelog/src/lib.rs index e315cc404e..f458c84a1b 100644 --- a/eden/mononoke/segmented_changelog/src/lib.rs +++ b/eden/mononoke/segmented_changelog/src/lib.rs @@ -80,6 +80,17 @@ impl SegmentedChangelog for DisabledSegmentedChangelog { )) } + async fn pull_fast_forward_master( + &self, + _ctx: &CoreContext, + _old_master: ChangesetId, + _new_master: ChangesetId, + ) -> Result> { + Err(format_err!( + "Segmented Changelog is not enabled for this repo", + )) + } + async fn full_idmap_clone_data( &self, _ctx: &CoreContext, @@ -127,6 +138,16 @@ macro_rules! segmented_changelog_delegate { delegate.clone_data($ctx).await } + async fn pull_fast_forward_master( + &$self, + $ctx: &CoreContext, + old_master: ChangesetId, + new_master: ChangesetId, + ) -> Result> { + let delegate = $delegate; + delegate.pull_fast_forward_master($ctx, old_master, new_master).await + } + async fn full_idmap_clone_data( &$self, $ctx: &CoreContext, diff --git a/eden/mononoke/segmented_changelog/src/on_demand.rs b/eden/mononoke/segmented_changelog/src/on_demand.rs index cf47414e27..b2f3d50918 100644 --- a/eden/mononoke/segmented_changelog/src/on_demand.rs +++ b/eden/mononoke/segmented_changelog/src/on_demand.rs @@ -390,6 +390,20 @@ impl SegmentedChangelog for OnDemandUpdateSegmentedChangelog { read_dag.clone_data(ctx).await } + async fn pull_fast_forward_master( + &self, + ctx: &CoreContext, + old_master: ChangesetId, + new_master: ChangesetId, + ) -> Result> { + // Might need to wait here for segmented changelog to catch up + let iddag = self.iddag.read().await; + let read_dag = ReadOnlySegmentedChangelog::new(&iddag, self.idmap.clone()); + read_dag + .pull_fast_forward_master(ctx, old_master, new_master) + .await + } + async fn full_idmap_clone_data( &self, ctx: &CoreContext, diff --git a/eden/mononoke/segmented_changelog/src/read_only.rs b/eden/mononoke/segmented_changelog/src/read_only.rs index c66f88893e..8ab8d42121 100644 --- a/eden/mononoke/segmented_changelog/src/read_only.rs +++ b/eden/mononoke/segmented_changelog/src/read_only.rs @@ -138,6 +138,15 @@ impl<'a> SegmentedChangelog for ReadOnlySegmentedChangelog<'a> { Ok(clone_data) } + async fn pull_fast_forward_master( + &self, + _ctx: &CoreContext, + _old_master: ChangesetId, + _new_master: ChangesetId, + ) -> Result> { + unimplemented!() + } + async fn full_idmap_clone_data( &self, ctx: &CoreContext, diff --git a/eden/mononoke/segmented_changelog/types/lib.rs b/eden/mononoke/segmented_changelog/types/lib.rs index eb13705494..a09e09f536 100644 --- a/eden/mononoke/segmented_changelog/types/lib.rs +++ b/eden/mononoke/segmented_changelog/types/lib.rs @@ -104,6 +104,14 @@ pub trait SegmentedChangelog: Send + Sync { /// only needs one head. async fn clone_data(&self, ctx: &CoreContext) -> Result>; + /// Uses segmented changelog fast forward master pull fastpath. + async fn pull_fast_forward_master( + &self, + ctx: &CoreContext, + old_master: ChangesetId, + new_master: ChangesetId, + ) -> Result>; + /// An intermediate step in the quest for Segmented Changelog clones requires the server to /// send over the full idmap. For every commit (in master) we send the id that it corresponds /// to in the iddag.