backingstore: add option to disable retries

Summary:
EdenFS doesn't want to use retries while it has the hg import
fallback. Let's allow disabling them. Once there is a config that controls the hg
import fallback, we can enable retries when the fallback is disabled.

Reviewed By: xavierd

Differential Revision: D35020586

fbshipit-source-id: d51d7fb70d2627e55c1170f130c548d7b14a8e6e
This commit is contained in:
Durham Goode 2022-03-22 13:23:44 -07:00 committed by Facebook GitHub Bot
parent 6cbc0b6a9a
commit 21a3444dbf
7 changed files with 46 additions and 11 deletions

View File

@ -184,6 +184,7 @@ HgBackingStore::HgBackingStore(
repository,
useEdenApi_,
config->getEdenConfig()->useAuxMetadata.getValue(),
false, // allowRetries
config),
logger_(logger) {
HgImporter importer(repository, stats);
@ -208,7 +209,7 @@ HgBackingStore::HgBackingStore(
config_(std::move(config)),
serverThreadPool_{importThreadPool_.get()},
useEdenApi_{false},
datapackStore_(repository, false, false, config_),
datapackStore_(repository, false, false, false, config_),
logger_(nullptr) {
const auto& options = importer->getOptions();
repoName_ = options.repoName;

View File

@ -29,8 +29,9 @@ class HgDatapackStore {
AbsolutePathPiece repository,
bool useEdenApi,
bool useAuxData,
bool allowRetries,
std::shared_ptr<ReloadableConfig> config)
: store_{repository.stringPiece(), useEdenApi, useAuxData},
: store_{repository.stringPiece(), useEdenApi, useAuxData, allowRetries},
config_{std::move(config)} {}
/**

View File

@ -90,10 +90,15 @@ void getTreeBatchCallback(
HgNativeBackingStore::HgNativeBackingStore(
folly::StringPiece repository,
bool useEdenApi,
bool useAuxData) {
bool useAuxData,
bool allowRetries) {
RustCFallible<RustBackingStore> store(
rust_backingstore_new(
repository.data(), repository.size(), useEdenApi, useAuxData),
repository.data(),
repository.size(),
useEdenApi,
useAuxData,
allowRetries),
rust_backingstore_free);
if (store.isError()) {

View File

@ -23,7 +23,8 @@ class HgNativeBackingStore {
HgNativeBackingStore(
folly::StringPiece repository,
bool useEdenApi,
bool useAuxData);
bool useAuxData,
bool allowRetries);
std::unique_ptr<folly::IOBuf>
getBlob(folly::ByteRange name, folly::ByteRange node, bool local);

View File

@ -7,7 +7,7 @@
* This file is generated with cbindgen. Please run `./tools/cbindgen.sh` to
* update this file.
*
* @generated SignedSource<<bc02b8220fce28dacd7a4c231f794240>>
* @generated SignedSource<<4380fbbc83996f112bc08c3fae87beab>>
*
*/
@ -136,7 +136,8 @@ extern "C" {
RustCFallibleBase rust_backingstore_new(const char *repository,
size_t repository_len,
bool use_edenapi,
bool aux_data);
bool aux_data,
bool allow_retries);
void rust_backingstore_free(RustBackingStore *store);

View File

@ -27,9 +27,21 @@ pub enum BackingStore {
use BackingStore::*;
impl BackingStore {
pub fn new<P: AsRef<Path>>(repository: P, use_edenapi: bool, aux_data: bool) -> Result<Self> {
pub fn new<P: AsRef<Path>>(
repository: P,
use_edenapi: bool,
aux_data: bool,
allow_retries: bool,
) -> Result<Self> {
let hg = repository.as_ref().join(".hg");
let config = configparser::hg::load::<String, String>(Some(&hg), None)?;
let mut config = configparser::hg::load::<String, String>(Some(&hg), None)?;
if !allow_retries {
let source = configparser::config::Options::new().source("backingstore");
config.set("lfs", "backofftimes", Some("0"), &source);
config.set("lfs", "throttlebackofftimes", Some("0"), &source);
config.set("edenapi", "max-retry-per-request", Some("0"), &source);
}
Ok(if config.get_or_default("scmstore", "backingstore")? {
New(BackingScmStores::new(&config, &hg, use_edenapi, aux_data)?)

View File

@ -37,12 +37,18 @@ fn backingstore_new(
repository_len: size_t,
use_edenapi: bool,
aux_data: bool,
allow_retries: bool,
) -> Result<*mut BackingStore> {
super::init::backingstore_global_init();
let repository = stringpiece_to_slice(repository, repository_len)?;
let repo = str::from_utf8(repository)?;
let store = Box::new(BackingStore::new(repo, use_edenapi, aux_data)?);
let store = Box::new(BackingStore::new(
repo,
use_edenapi,
aux_data,
allow_retries,
)?);
Ok(Box::into_raw(store))
}
@ -53,8 +59,16 @@ pub extern "C" fn rust_backingstore_new(
repository_len: size_t,
use_edenapi: bool,
aux_data: bool,
allow_retries: bool,
) -> CFallible<BackingStore> {
backingstore_new(repository, repository_len, use_edenapi, aux_data).into()
backingstore_new(
repository,
repository_len,
use_edenapi,
aux_data,
allow_retries,
)
.into()
}
#[no_mangle]