add a test that verifies unloaded, unlinked trees don't leave orphaned data in the overlay

Summary:
I was worried we might leak data in the overlay in this particular
sequence of operations, so here's a test that shows we don't.

Reviewed By: simpkins

Differential Revision: D7663419

fbshipit-source-id: b4b0d08f863fe7b23501e9e4943d18ba0b746e42
This commit is contained in:
Chad Austin 2018-04-20 18:44:06 -07:00 committed by Facebook Github Bot
parent 42e2ffad76
commit d0256aa116

View File

@ -16,6 +16,7 @@
#include "eden/fs/inodes/EdenMount.h"
#include "eden/fs/inodes/FileInode.h"
#include "eden/fs/inodes/Overlay.h"
#include "eden/fs/inodes/TreeInode.h"
#include "eden/fs/testharness/FakeTreeBuilder.h"
#include "eden/fs/testharness/TestMount.h"
@ -280,6 +281,37 @@ TEST(InodeMap, renameDuringRecursiveLookupAndLoad) {
RelativePathPiece{"a/b/x/d/file.txt"}, fileInode->getPath().value());
}
TEST(InodeMap, unloadedUnlinkedTreesAreRemovedFromOverlay) {
FakeTreeBuilder builder;
builder.setFile("dir1/file.txt", "contents");
builder.setFile("dir2/file.txt", "contents");
TestMount mount{builder};
auto edenMount = mount.getEdenMount();
auto root = edenMount->getRootInode();
auto dir1 = edenMount->getInode(RelativePathPiece{"dir1"}).get().asTreePtr();
auto dir2 = edenMount->getInode(RelativePathPiece{"dir2"}).get().asTreePtr();
auto dir1ino = dir1->getNodeId();
auto dir2ino = dir2->getNodeId();
dir1->unlink(PathComponentPiece{"file.txt"}).get();
dir2->unlink(PathComponentPiece{"file.txt"}).get();
// Test both having a positive and zero fuse reference counts.
dir2->incFuseRefcount();
root->rmdir(PathComponentPiece{"dir1"});
root->rmdir(PathComponentPiece{"dir2"});
dir1.reset();
dir2.reset();
edenMount->getInodeMap()->decFuseRefcount(dir2ino);
EXPECT_FALSE(edenMount->getOverlay()->hasOverlayData(dir1ino));
EXPECT_FALSE(edenMount->getOverlay()->hasOverlayData(dir2ino));
}
struct InodePersistenceTreeTest : ::testing::Test {
InodePersistenceTreeTest() {
builder.setFile("dir/file1.txt", "contents1");