Skip to content

Commit 7a686d9

Browse files
chadaustinfacebook-github-bot
authored andcommitted
don't pass next inode number through thrift
Summary: The desired end state for how next inode number gets passed across takeover. This should not land as is - the prior diffs need to land and wait for a while until everyone transitions. Reviewed By: simpkins Differential Revision: D8195550 fbshipit-source-id: 2fc40f881cc1a331df95ef99f7e9e4f2e69c8643
1 parent f87e6bc commit 7a686d9

File tree

5 files changed

+25
-34
lines changed

5 files changed

+25
-34
lines changed

eden/fs/inodes/EdenMount.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,15 @@ folly::Future<folly::Unit> EdenMount::initialize(
196196
<< "; max existing inode number is " << maxInodeNumber;
197197
} else {
198198
XLOG(DBG2) << "Initializing eden mount " << getPath() << " from takeover";
199-
overlay_->setNextInodeNumber(
200-
InodeNumber::fromThrift(takeover->nextInodeNumber));
199+
if (!overlay_->hasInitializedNextInodeNumber()) {
200+
XLOG(WARN) << "A clean shutdown before takeover did not leave an "
201+
"initialized inode number! Rescanning...";
202+
overlay_->scanForNextInodeNumber();
203+
}
201204
}
202205

206+
CHECK(overlay_->hasInitializedNextInodeNumber());
207+
203208
return createRootInode(*parents).then(
204209
[this, parents, takeover](TreeInodePtr initTreeNode) {
205210
if (takeover) {
@@ -367,10 +372,8 @@ EdenMount::shutdownImpl(bool doTakeover) {
367372
// Close the Overlay object to make sure we have released its lock.
368373
// This is important during graceful restart to ensure that we have
369374
// released the lock before the new edenfs process begins to take over
370-
// the mount piont.
371-
inodeMap.nextInodeNumber = overlay_->close();
372-
CHECK(inodeMap.nextInodeNumber)
373-
<< "nextInodeNumber should always be nonzero";
375+
// the mount point.
376+
overlay_->close();
374377
state_.store(State::SHUT_DOWN);
375378
return std::make_tuple(fileHandleMap, inodeMap);
376379
});

eden/fs/inodes/InodeMap.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,6 @@ Future<SerializedInodeMap> InodeMap::shutdown(bool doTakeover) {
614614
}
615615

616616
SerializedInodeMap result;
617-
XLOG(DBG5) << "InodeMap::save nextInodeNumber: " << result.nextInodeNumber;
618617
result.unloadedInodes.reserve(data->unloadedInodes_.size());
619618
for (const auto& it : data->unloadedInodes_) {
620619
const auto& entry = it.second;

eden/fs/inodes/Overlay.cpp

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,11 @@ Overlay::~Overlay() {
9595
close();
9696
}
9797

98-
uint64_t Overlay::close() {
98+
void Overlay::close() {
9999
CHECK_NE(std::this_thread::get_id(), gcThread_.get_id());
100100

101101
if (!infoFile_) {
102-
return nextInodeNumber_.load(std::memory_order_relaxed);
102+
return;
103103
}
104104

105105
// Make sure everything is shut down in reverse of construction order.
@@ -113,8 +113,12 @@ uint64_t Overlay::close() {
113113
inodeMetadataTable_.reset();
114114
dirFile_.close();
115115
infoFile_.close();
116+
}
116117

117-
return nextInodeNumber_.load(std::memory_order_relaxed);
118+
bool Overlay::hasInitializedNextInodeNumber() const {
119+
// nextInodeNumber_ is either 0 (uninitialized) or nonzero (initialized).
120+
// It's only initialized on one thread, so relaxed loads are okay.
121+
return 0 != nextInodeNumber_.load(std::memory_order_relaxed);
118122
}
119123

120124
void Overlay::initOverlay() {
@@ -207,6 +211,8 @@ void Overlay::tryLoadNextInodeNumber() {
207211
}
208212

209213
void Overlay::saveNextInodeNumber() {
214+
// nextInodeNumber_ is either 0 (uninitialized) or nonzero (initialized).
215+
// It's only initialized on one thread, so relaxed loads are okay.
210216
auto nextInodeNumber = nextInodeNumber_.load(std::memory_order_relaxed);
211217
if (!nextInodeNumber) {
212218
return;
@@ -292,7 +298,7 @@ void Overlay::initNewOverlay() {
292298
infoPath.stringPiece(), ByteRange(infoHeader.data(), infoHeader.size()));
293299

294300
// kRootNodeId is reserved - start at the next one. No scan is necessary.
295-
setNextInodeNumber(InodeNumber{kRootNodeId.get() + 1});
301+
nextInodeNumber_.store(kRootNodeId.get() + 1, std::memory_order_relaxed);
296302
}
297303

298304
void Overlay::ensureTmpDirectoryIsCreated() {
@@ -314,22 +320,6 @@ void Overlay::ensureTmpDirectoryIsCreated() {
314320
}
315321
}
316322

317-
void Overlay::setNextInodeNumber(InodeNumber nextInodeNumber) {
318-
if (auto ino = nextInodeNumber_.load(std::memory_order_relaxed)) {
319-
// It's okay to allow setNextInodeNumber as long as the values are
320-
// consistent. This code path will disappear when takeover transitions to
321-
// relying on the Overlay efficiently remembering the next inode number
322-
// itself.
323-
DCHECK_EQ(ino, nextInodeNumber.get())
324-
<< "Overlay nextInodeNumber already initialized with " << ino
325-
<< " so it should not be initialized with " << nextInodeNumber;
326-
return;
327-
}
328-
329-
DCHECK_GT(nextInodeNumber, kRootNodeId);
330-
nextInodeNumber_.store(nextInodeNumber.get(), std::memory_order_relaxed);
331-
}
332-
333323
InodeNumber Overlay::allocateInodeNumber() {
334324
// InodeNumber should generally be 64-bits wide, in which case it isn't even
335325
// worth bothering to handle the case where nextInodeNumber_ wraps. We don't
@@ -558,7 +548,7 @@ InodeNumber Overlay::scanForNextInodeNumber() {
558548
}
559549
}
560550

561-
setNextInodeNumber(InodeNumber{maxInode.get() + 1});
551+
nextInodeNumber_.store(maxInode.get() + 1, std::memory_order_relaxed);
562552

563553
return maxInode;
564554
}

eden/fs/inodes/Overlay.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,14 @@ class Overlay {
7676
* Returns the next available InodeNumber to be passed to any process taking
7777
* over an Eden mount.
7878
*/
79-
uint64_t close();
79+
void close();
8080

8181
/**
82-
* For now, this method exists to populate the next inode number from takeover
83-
* data. Eventually, it will be unnecessary - the Overlay, upon a clean
84-
* shutdown, will remember its next inode number in a file on disk.
82+
* Returns true if the next inode number was initialized, either upon
83+
* construction by loading the file left by a cleanly-closed Overlay, or by
84+
* calling scanForNextInodeNumber().
8585
*/
86-
void setNextInodeNumber(InodeNumber nextInodeNumber);
86+
bool hasInitializedNextInodeNumber() const;
8787

8888
/**
8989
* Scans the Overlay for all inode numbers currently in use and sets the next

eden/fs/takeover/takeover.thrift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ struct SerializedInodeMapEntry {
1818
}
1919

2020
struct SerializedInodeMap {
21-
1: i64 nextInodeNumber
2221
2: list<SerializedInodeMapEntry> unloadedInodes,
2322
}
2423

0 commit comments

Comments
 (0)