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:
Zeyi (Rice) Fan 2021-06-08 10:13:06 -07:00 committed by Facebook GitHub Bot
parent f89dbebae8
commit d6a52d1789
6 changed files with 40 additions and 3 deletions

View File

@ -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

View File

@ -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) {

View File

@ -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,

View File

@ -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);

View File

@ -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.

View File

@ -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;