mononoke: add --all-types to backfill_derive_data single

Summary: It's useful to derive all enabled derived data at once

Reviewed By: krallin

Differential Revision: D22336338

fbshipit-source-id: 54bc27ab2c23c175913fc02e6bf05d18a54c249c
This commit is contained in:
Stanislau Hlebik 2020-07-03 00:17:34 -07:00 committed by Facebook GitHub Bot
parent 2a54f281f2
commit 2d24ddf2e1
2 changed files with 102 additions and 33 deletions

View File

@ -63,6 +63,7 @@ define_stats! {
derivation_time_ms: dynamic_timeseries("{}.derivation_time_ms", (reponame: String); Average, Sum), derivation_time_ms: dynamic_timeseries("{}.derivation_time_ms", (reponame: String); Average, Sum),
} }
const ARG_ALL_TYPES: &str = "all-types";
const ARG_DERIVED_DATA_TYPE: &str = "derived-data-type"; const ARG_DERIVED_DATA_TYPE: &str = "derived-data-type";
const ARG_DRY_RUN: &str = "dry-run"; const ARG_DRY_RUN: &str = "dry-run";
const ARG_OUT_FILENAME: &str = "out-filename"; const ARG_OUT_FILENAME: &str = "out-filename";
@ -158,7 +159,7 @@ fn main(fb: FacebookInit) -> Result<(), Error> {
.about("tail public commits and fill derived data") .about("tail public commits and fill derived data")
.arg( .arg(
Arg::with_name(ARG_DERIVED_DATA_TYPE) Arg::with_name(ARG_DERIVED_DATA_TYPE)
.required(true) .required(false)
.multiple(true) .multiple(true)
.index(1) .index(1)
.possible_values(POSSIBLE_DERIVED_TYPES) .possible_values(POSSIBLE_DERIVED_TYPES)
@ -181,17 +182,25 @@ fn main(fb: FacebookInit) -> Result<(), Error> {
SubCommand::with_name(SUBCOMMAND_SINGLE) SubCommand::with_name(SUBCOMMAND_SINGLE)
.about("backfill single changeset (mainly for performance testing purposes)") .about("backfill single changeset (mainly for performance testing purposes)")
.arg( .arg(
Arg::with_name(ARG_DERIVED_DATA_TYPE) Arg::with_name(ARG_ALL_TYPES)
.required(true) .long(ARG_ALL_TYPES)
.index(1) .required(false)
.possible_values(POSSIBLE_DERIVED_TYPES) .takes_value(false)
.help("derived data type for which backfill will be run"), .help("derive all derived data types enabled for this repo"),
) )
.arg( .arg(
Arg::with_name(ARG_CHANGESET) Arg::with_name(ARG_CHANGESET)
.required(true) .required(true)
.index(2) .index(1)
.help("changeset by {hd|bonsai} hash or bookmark"), .help("changeset by {hd|bonsai} hash or bookmark"),
)
.arg(
Arg::with_name(ARG_DERIVED_DATA_TYPE)
.required(false)
.index(2)
.conflicts_with(ARG_ALL_TYPES)
.possible_values(POSSIBLE_DERIVED_TYPES)
.help("derived data type for which backfill will be run"),
), ),
); );
let matches = app.get_matches(); let matches = app.get_matches();
@ -339,17 +348,47 @@ async fn run_subcmd<'a>(
.value_of_lossy(ARG_CHANGESET) .value_of_lossy(ARG_CHANGESET)
.ok_or_else(|| format_err!("missing required argument: {}", ARG_CHANGESET))? .ok_or_else(|| format_err!("missing required argument: {}", ARG_CHANGESET))?
.to_string(); .to_string();
let derived_data_type = sub_m let all = sub_m.is_present(ARG_ALL_TYPES);
.value_of(ARG_DERIVED_DATA_TYPE) let derived_data_type = sub_m.value_of(ARG_DERIVED_DATA_TYPE);
.ok_or_else(|| format_err!("missing required argument: {}", ARG_DERIVED_DATA_TYPE))? let (repo, types): (_, Vec<String>) = match (all, derived_data_type) {
.to_string(); (true, None) => {
let repo = open_repo_maybe_unredacted(fb, &logger, &matches, &derived_data_type) let repo = args::open_repo_unredacted(fb, logger, matches)
.compat() .compat()
.await?; .await?;
let types = repo
.get_derived_data_config()
.derived_data_types
.clone()
.into_iter()
.collect();
(repo, types)
}
(false, Some(derived_data_type)) => {
let repo =
open_repo_maybe_unredacted(fb, &logger, &matches, &derived_data_type)
.compat()
.await?;
(repo, vec![derived_data_type.to_string()])
}
(true, Some(_)) => {
return Err(format_err!(
"{} and {} can't be specified",
ARG_ALL_TYPES,
ARG_DERIVED_DATA_TYPE
));
}
(false, None) => {
return Err(format_err!(
"{} or {} should be specified",
ARG_ALL_TYPES,
ARG_DERIVED_DATA_TYPE
));
}
};
let csid = helpers::csid_resolve(ctx.clone(), repo.clone(), hash_or_bookmark) let csid = helpers::csid_resolve(ctx.clone(), repo.clone(), hash_or_bookmark)
.compat() .compat()
.await?; .await?;
subcommand_single(&ctx, &repo, csid, &derived_data_type).await subcommand_single(&ctx, &repo, csid, types).await
} }
(name, _) => Err(format_err!("unhandled subcommand: {}", name)), (name, _) => Err(format_err!("unhandled subcommand: {}", name)),
} }
@ -540,25 +579,36 @@ async fn subcommand_single(
ctx: &CoreContext, ctx: &CoreContext,
repo: &BlobRepo, repo: &BlobRepo,
csid: ChangesetId, csid: ChangesetId,
derived_data_type: &str, derived_data_types: Vec<String>,
) -> Result<(), Error> { ) -> Result<(), Error> {
let repo = repo.dangerous_override(|_| Arc::new(DummyLease {}) as Arc<dyn LeaseOps>); let repo = repo.dangerous_override(|_| Arc::new(DummyLease {}) as Arc<dyn LeaseOps>);
let derived_utils = derived_data_utils(repo.clone(), derived_data_type)?; let mut derived_utils = vec![];
derived_utils.regenerate(&vec![csid]); for ty in derived_data_types {
derived_utils let utils = derived_data_utils(repo.clone(), ty)?;
.derive(ctx.clone(), repo, csid) utils.regenerate(&vec![csid]);
.timed({ derived_utils.push(utils);
cloned!(ctx); }
move |stats, result| { stream::iter(derived_utils)
info!( .map(Ok)
ctx.logger(), .try_for_each_concurrent(100, |derived_utils| {
"derived in {:?}: {:?}", stats.completion_time, result derived_utils
); .derive(ctx.clone(), repo.clone(), csid)
Ok(()) .timed({
} cloned!(ctx);
move |stats, result| {
info!(
ctx.logger(),
"derived {} in {:?}: {:?}",
derived_utils.name(),
stats.completion_time,
result
);
Ok(())
}
})
.map(|_| ())
.compat()
}) })
.map(|_| ())
.compat()
.await .await
} }
@ -602,10 +652,22 @@ mod tests {
let counting_blobstore = counting_blobstore.unwrap(); let counting_blobstore = counting_blobstore.unwrap();
let master = resolve_cs_id(&ctx, &repo, "master").await?; let master = resolve_cs_id(&ctx, &repo, "master").await?;
subcommand_single(&ctx, &repo, master, RootUnodeManifestId::NAME).await?; subcommand_single(
&ctx,
&repo,
master,
vec![RootUnodeManifestId::NAME.to_string()],
)
.await?;
let writes_count = counting_blobstore.writes_count(); let writes_count = counting_blobstore.writes_count();
subcommand_single(&ctx, &repo, master, RootUnodeManifestId::NAME).await?; subcommand_single(
&ctx,
&repo,
master,
vec![RootUnodeManifestId::NAME.to_string()],
)
.await?;
assert!(counting_blobstore.writes_count() > writes_count); assert!(counting_blobstore.writes_count() > writes_count);
Ok(()) Ok(())
} }

View File

@ -33,3 +33,10 @@ backfill derived data
$ mononoke_admin --log-level ERROR derived-data exists "$DERIVED_DATA_TYPE" master_bookmark $ mononoke_admin --log-level ERROR derived-data exists "$DERIVED_DATA_TYPE" master_bookmark
Derived: c3384961b16276f2db77df9d7c874bbe981cf0525bd6f84a502f919044f2dabd Derived: c3384961b16276f2db77df9d7c874bbe981cf0525bd6f84a502f919044f2dabd
$ backfill_derived_data single c3384961b16276f2db77df9d7c874bbe981cf0525bd6f84a502f919044f2dabd "$DERIVED_DATA_TYPE"
* using repo "repo" repoid RepositoryId(0) (glob)
* changeset resolved as: * (glob)
* derived fsnodes in * (glob)
$ backfill_derived_data single c3384961b16276f2db77df9d7c874bbe981cf0525bd6f84a502f919044f2dabd --all-types 2>&1 | grep derived | wc -l
8