mononoke: allow binaries to specify a default for cachelib-only-blobstore

Summary: Reduces boilerplate for binaries usually run in this mode, notably the walker

Reviewed By: ikostia

Differential Revision: D25216883

fbshipit-source-id: e31d2a6aec7da3baafd8bcf208cf79cc696752c0
This commit is contained in:
Alex Hornby 2020-12-04 03:05:15 -08:00 committed by Facebook GitHub Bot
parent 54bda6537d
commit 591363e1c4
3 changed files with 34 additions and 10 deletions

View File

@ -10,14 +10,15 @@ use clap::{App, Arg, ArgMatches};
use fbinit::FacebookInit; use fbinit::FacebookInit;
use once_cell::sync::{Lazy, OnceCell}; use once_cell::sync::{Lazy, OnceCell};
use crate::args::MononokeMatches; use crate::args::{bool_as_str, MononokeMatches, BOOL_VALUES};
const CACHE_SIZE_GB: &str = "cache-size-gb"; const CACHE_SIZE_GB: &str = "cache-size-gb";
const USE_TUPPERWARE_SHRINKER: &str = "use-tupperware-shrinker"; const USE_TUPPERWARE_SHRINKER: &str = "use-tupperware-shrinker";
const MAX_PROCESS_SIZE: &str = "max-process-size"; const MAX_PROCESS_SIZE: &str = "max-process-size";
const MIN_PROCESS_SIZE: &str = "min-process-size"; const MIN_PROCESS_SIZE: &str = "min-process-size";
const SKIP_CACHING: &str = "skip-caching"; const SKIP_CACHING: &str = "skip-caching";
const CACHELIB_ONLY_BLOBSTORE: &str = "cachelib-only-blobstore"; const CACHELIB_ONLY_BLOBSTORE_OLD: &str = "cachelib-only-blobstore";
const CACHELIB_ONLY_BLOBSTORE_NEW: &str = "blobstore-cachelib-only";
const CACHELIB_SHARDS: &str = "cachelib-shards"; const CACHELIB_SHARDS: &str = "cachelib-shards";
const PHASES_CACHE_SIZE: &str = "phases-cache-size"; const PHASES_CACHE_SIZE: &str = "phases-cache-size";
@ -117,9 +118,17 @@ pub(crate) fn add_cachelib_args<'a, 'b>(
.help("do not init cachelib and disable caches (useful for tests)"), .help("do not init cachelib and disable caches (useful for tests)"),
) )
.arg( .arg(
Arg::with_name(CACHELIB_ONLY_BLOBSTORE) Arg::with_name(CACHELIB_ONLY_BLOBSTORE_OLD)
.long(CACHELIB_ONLY_BLOBSTORE) .long(CACHELIB_ONLY_BLOBSTORE_OLD)
.help("do not init memcache for blobstore"), .help("do not init memcache for blobstore. DEPRECATED, prefer --blobstore-cachelib-only=true"),
)
.arg(
Arg::with_name(CACHELIB_ONLY_BLOBSTORE_NEW)
.long(CACHELIB_ONLY_BLOBSTORE_NEW)
.possible_values(BOOL_VALUES)
.default_value(bool_as_str(defaults.blobstore_cachelib_only))
.takes_value(true)
.help("whether to run without memcache for blobstore"),
) )
.arg( .arg(
Arg::with_name(CACHELIB_SHARDS) Arg::with_name(CACHELIB_SHARDS)
@ -140,10 +149,22 @@ pub(crate) fn parse_cachelib_shards<'a>(matches: &ArgMatches<'a>) -> usize {
pub(crate) fn parse_caching<'a>(matches: &ArgMatches<'a>) -> Caching { pub(crate) fn parse_caching<'a>(matches: &ArgMatches<'a>) -> Caching {
if matches.is_present(SKIP_CACHING) { if matches.is_present(SKIP_CACHING) {
Caching::Disabled Caching::Disabled
} else if matches.is_present(CACHELIB_ONLY_BLOBSTORE) { } else if matches.is_present(CACHELIB_ONLY_BLOBSTORE_OLD) {
Caching::CachelibOnlyBlobstore(parse_cachelib_shards(matches)) Caching::CachelibOnlyBlobstore(parse_cachelib_shards(matches))
} else { } else {
Caching::Enabled(parse_cachelib_shards(matches)) let cachelib_only = matches
.value_of(CACHELIB_ONLY_BLOBSTORE_NEW)
.map_or(false, |v| {
v.parse().unwrap_or_else(|_| {
panic!("Provided {} is not bool", CACHELIB_ONLY_BLOBSTORE_NEW)
})
});
if cachelib_only {
Caching::CachelibOnlyBlobstore(parse_cachelib_shards(matches))
} else {
Caching::Enabled(parse_cachelib_shards(matches))
}
} }
} }
@ -238,6 +259,7 @@ pub struct CachelibSettings {
pub blob_cache_size: Option<usize>, pub blob_cache_size: Option<usize>,
pub phases_cache_size: Option<usize>, pub phases_cache_size: Option<usize>,
pub expected_item_size_bytes: Option<usize>, pub expected_item_size_bytes: Option<usize>,
pub blobstore_cachelib_only: bool,
} }
impl Default for CachelibSettings { impl Default for CachelibSettings {
@ -256,6 +278,7 @@ impl Default for CachelibSettings {
blob_cache_size: None, blob_cache_size: None,
phases_cache_size: None, phases_cache_size: None,
expected_item_size_bytes: None, expected_item_size_bytes: None,
blobstore_cachelib_only: false,
} }
} }
} }

View File

@ -995,11 +995,11 @@ fn add_mysql_options_args<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> {
) )
} }
fn bool_as_str(v: bool) -> &'static str { pub(crate) fn bool_as_str(v: bool) -> &'static str {
if v { "true" } else { "false" } if v { "true" } else { "false" }
} }
const BOOL_VALUES: &[&str] = &["false", "true"]; pub(crate) const BOOL_VALUES: &[&str] = &["false", "true"];
fn add_blobstore_args<'a, 'b>( fn add_blobstore_args<'a, 'b>(
app: App<'a, 'b>, app: App<'a, 'b>,
@ -1088,7 +1088,7 @@ fn add_blobstore_args<'a, 'b>(
.arg( .arg(
Arg::with_name(READONLY_STORAGE_OLD_ARG) Arg::with_name(READONLY_STORAGE_OLD_ARG)
.long(READONLY_STORAGE_OLD_ARG) .long(READONLY_STORAGE_OLD_ARG)
.help("Error on any attempts to write to storage (deprecated, use --with-readonly-storage=<true|false>)"), .help("Error on any attempts to write to storage. DEPRECATED, prefer --with-readonly-storage=<true|false>"),
) )
.arg( .arg(
Arg::with_name(READONLY_STORAGE_NEW_ARG) Arg::with_name(READONLY_STORAGE_NEW_ARG)

View File

@ -40,6 +40,7 @@ fn main(fb: FacebookInit) -> Result<(), Error> {
let app_name = "walker"; let app_name = "walker";
let cachelib_defaults = CachelibSettings { let cachelib_defaults = CachelibSettings {
cache_size: 2 * 1024 * 1024 * 1024, cache_size: 2 * 1024 * 1024 * 1024,
blobstore_cachelib_only: true,
..Default::default() ..Default::default()
}; };
let matches = setup::setup_toplevel_app(app_name, cachelib_defaults.clone()).get_matches(); let matches = setup::setup_toplevel_app(app_name, cachelib_defaults.clone()).get_matches();