mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 23:38:50 +03:00
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:
parent
42e2ffad76
commit
d0256aa116
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user