mirror of
https://github.com/facebook/sapling.git
synced 2024-10-06 14:58:03 +03:00
overlay: allow creation of in-memory overlay
Summary: As we need to debugging a IO related performance issue. We want to see if writes in overlay has caused any issues. This diff adds an option to allow us to create in-memory overlays. Reviewed By: chadaustin Differential Revision: D28951905 fbshipit-source-id: 9ef1da183771ee69b855b49bbabc2ef02a7ec9ac
This commit is contained in:
parent
f89dbebae8
commit
d6a52d1789
@ -616,6 +616,16 @@ class EdenConfig : private ConfigSettingManager {
|
||||
"overlay:enable_tree_overlay",
|
||||
false,
|
||||
this};
|
||||
|
||||
/**
|
||||
* DANGER: this option is to help investigating performances issues with
|
||||
* EdenFS. Turning this option on in non-debugging environment will result
|
||||
* data loss.
|
||||
*/
|
||||
ConfigSetting<bool> unsafeInMemoryOverlay{
|
||||
"overlay:unsafe-in-memory-overlay",
|
||||
false,
|
||||
this};
|
||||
};
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -210,8 +210,7 @@ EdenMount::EdenMount(
|
||||
overlay_{Overlay::create(
|
||||
checkoutConfig_->getOverlayPath(),
|
||||
checkoutConfig_->getCaseSensitive(),
|
||||
static_cast<Overlay::OverlayType>(
|
||||
checkoutConfig_->getEnableTreeOverlay()),
|
||||
getOverlayType(),
|
||||
serverState_->getStructuredLogger())},
|
||||
#ifndef _WIN32
|
||||
overlayFileAccess_{overlay_.get()},
|
||||
@ -225,6 +224,17 @@ EdenMount::EdenMount(
|
||||
clock_{serverState_->getClock()} {
|
||||
}
|
||||
|
||||
Overlay::OverlayType EdenMount::getOverlayType() {
|
||||
if (checkoutConfig_->getEnableTreeOverlay()) {
|
||||
if (getEdenConfig()->unsafeInMemoryOverlay.getValue()) {
|
||||
return Overlay::OverlayType::TreeInMemory;
|
||||
}
|
||||
return Overlay::OverlayType::Tree;
|
||||
} else {
|
||||
return Overlay::OverlayType::Legacy;
|
||||
}
|
||||
}
|
||||
|
||||
FOLLY_NODISCARD folly::Future<folly::Unit> EdenMount::initialize(
|
||||
OverlayChecker::ProgressCallback&& progressCallback,
|
||||
const std::optional<SerializedInodeMap>& takeover) {
|
||||
|
@ -697,6 +697,11 @@ class EdenMount {
|
||||
*/
|
||||
void transitionToFuseInitializationErrorState();
|
||||
|
||||
/**
|
||||
* Returns overlay type based on settings.
|
||||
*/
|
||||
Overlay::OverlayType getOverlayType();
|
||||
|
||||
EdenMount(
|
||||
std::unique_ptr<CheckoutConfig> checkoutConfig,
|
||||
std::shared_ptr<ObjectStore> objectStore,
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "eden/fs/inodes/InodeBase.h"
|
||||
#include "eden/fs/inodes/TreeInode.h"
|
||||
#include "eden/fs/inodes/treeoverlay/TreeOverlay.h"
|
||||
#include "eden/fs/sqlite/SqliteDatabase.h"
|
||||
#include "eden/fs/utils/Bug.h"
|
||||
#include "eden/fs/utils/PathFuncs.h"
|
||||
|
||||
@ -43,6 +44,10 @@ std::unique_ptr<IOverlay> makeOverlay(
|
||||
Overlay::OverlayType overlayType) {
|
||||
if (overlayType == Overlay::OverlayType::Tree) {
|
||||
return std::make_unique<TreeOverlay>(localDir);
|
||||
} else if (overlayType == Overlay::OverlayType::TreeInMemory) {
|
||||
XLOG(WARN) << "In-memory overlay requested. This will cause data loss.";
|
||||
return std::make_unique<TreeOverlay>(
|
||||
std::make_unique<SqliteDatabase>(SqliteDatabase::inMemory));
|
||||
}
|
||||
#ifdef _WIN32
|
||||
return std::make_unique<SqliteOverlay>(localDir);
|
||||
|
@ -70,7 +70,11 @@ class OverlayFile;
|
||||
*/
|
||||
class Overlay : public std::enable_shared_from_this<Overlay> {
|
||||
public:
|
||||
enum class OverlayType : bool { Legacy = false, Tree = true };
|
||||
enum class OverlayType : uint8_t {
|
||||
Legacy = 0,
|
||||
Tree = 1,
|
||||
TreeInMemory = 2,
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a new Overlay object.
|
||||
|
@ -28,6 +28,9 @@ class TreeOverlay : public IOverlay {
|
||||
public:
|
||||
explicit TreeOverlay(AbsolutePathPiece path);
|
||||
|
||||
explicit TreeOverlay(std::unique_ptr<SqliteDatabase> store)
|
||||
: store_(std::move(store)) {}
|
||||
|
||||
~TreeOverlay() override {}
|
||||
|
||||
TreeOverlay(const TreeOverlay&) = delete;
|
||||
|
Loading…
Reference in New Issue
Block a user