function for checking if segmented changelog has certain commit indexed

Summary:
This can be used by slow bookmark mover to check if the certain commits were indexed by segmented changelog.

The current implementation has to instantiate the SC but in the future we don't need to do it.

Reviewed By: farnz

Differential Revision: D35744724

fbshipit-source-id: d694a135db0b9af6493477b31d7c1e4277471e8c
This commit is contained in:
Mateusz Kwapich 2022-04-26 05:56:48 -07:00 committed by Facebook GitHub Bot
parent 60e2ca6c55
commit 073e1a5da8
2 changed files with 55 additions and 0 deletions

View File

@ -186,6 +186,26 @@ impl SegmentedChangelogManager {
)
})?)
}
/// Checks if given changeset is indexed by given segmented changelog version.
#[cfg(test)]
pub async fn check_if_changeset_indexed(
&self,
ctx: &CoreContext,
sc_version: &SegmentedChangelogVersion,
cs_id: ChangesetId,
) -> Result<bool> {
let iddag = self
.iddag_save_store
.load(ctx, sc_version.iddag_version)
.await
.with_context(|| format!("repo {}: failed to load iddag", self.repo_id))?;
let idmap = self
.idmap_factory
.for_server(ctx, sc_version.idmap_version, &iddag)?;
let result = idmap.find_dag_id(ctx, cs_id).await?;
Ok(result.is_some())
}
}
segmented_changelog_delegate!(SegmentedChangelogManager, |&self, ctx: &CoreContext| {

View File

@ -1049,6 +1049,41 @@ async fn test_periodic_reload(fb: FacebookInit) -> Result<()> {
Ok(())
}
#[fbinit::test]
async fn test_manager_check_if_indexed(fb: FacebookInit) -> Result<()> {
let ctx = CoreContext::test_mock(fb);
let blobrepo = Arc::new(Linear::getrepo(fb).await);
let conns = SegmentedChangelogSqlConnections::with_sqlite_in_memory()?;
let start_cs_id =
resolve_cs_id(&ctx, &blobrepo, "607314ef579bd2407752361ba1b0c1729d08b281").await?;
let master = resolve_cs_id(&ctx, &blobrepo, "79a13814c5ce7330173ec04d279bf95ab3f652fb").await?;
seed(&ctx, &blobrepo, &conns, start_cs_id).await?;
tokio::time::pause();
let manager = get_manager(&blobrepo, &conns, vec![], SegmentedChangelogType::Owned).await?;
// Changeset is not part of segmented changelog before tailer run.
let version = manager.latest_version(&ctx).await?;
assert!(
!manager
.check_if_changeset_indexed(&ctx, &version, master)
.await?
);
let tailer = new_tailer_for_tailing(&blobrepo, &conns).await?;
let _ = tailer.once(&ctx, false).await?;
// Changeset is part of segmented changelog after tailer run.
let version = manager.latest_version(&ctx).await?;
assert!(
manager
.check_if_changeset_indexed(&ctx, &version, master)
.await?
);
Ok(())
}
#[fbinit::test]
async fn test_mismatched_heads(fb: FacebookInit) -> Result<()> {
let ctx = CoreContext::test_mock(fb);