@@ -244,6 +244,21 @@ class BTreeGeneric : public leanstore::storage::BufferManagedTree {
244
244
return findParent<false >(btree, bfToFind);
245
245
}
246
246
247
+ // / Removes a btree from disk, reclaim all the buffer frames in memory and
248
+ // / pages in disk used by it.
249
+ // /
250
+ // / @param btree The tree to free.
251
+ static void FreeAndReclaim (BTreeGeneric& btree) {
252
+ HybridPageGuard<BTreeNode> guardedMetaNode (btree.mMetaNodeSwip );
253
+ HybridPageGuard<BTreeNode> guardedRootNode (
254
+ guardedMetaNode, guardedMetaNode->mRightMostChildSwip );
255
+ BTreeGeneric::freeBTreeNodesRecursive (guardedRootNode);
256
+
257
+ auto exclusiveGuardedMetaNode =
258
+ ExclusivePageGuard (std::move (guardedMetaNode));
259
+ exclusiveGuardedMetaNode.reclaim ();
260
+ }
261
+
247
262
static rapidjson::Document ToJSON (BTreeGeneric& btree) {
248
263
HybridPageGuard<BTreeNode> guardedMetaNode (btree.mMetaNodeSwip );
249
264
HybridPageGuard<BTreeNode> guardedRootNode (
@@ -252,6 +267,8 @@ class BTreeGeneric : public leanstore::storage::BufferManagedTree {
252
267
}
253
268
254
269
private:
270
+ static void freeBTreeNodesRecursive (HybridPageGuard<BTreeNode>& guardedNode);
271
+
255
272
static rapidjson::Document ToJSONRecursive (
256
273
HybridPageGuard<BTreeNode>& guardedNode) {
257
274
auto bfDoc = guardedNode.mBf ->ToJSON ();
@@ -282,6 +299,20 @@ class BTreeGeneric : public leanstore::storage::BufferManagedTree {
282
299
static constexpr std::string META_PAGE_ID = " metaPageId" ;
283
300
};
284
301
302
+ inline void BTreeGeneric::freeBTreeNodesRecursive (
303
+ HybridPageGuard<BTreeNode>& guardedNode) {
304
+ if (!guardedNode->mIsLeaf ) {
305
+ for (auto i = 0u ; i <= guardedNode->mNumSeps ; ++i) {
306
+ auto childSwip = guardedNode->GetChildIncludingRightMost (i);
307
+ HybridPageGuard<BTreeNode> guardedChild (guardedNode, childSwip);
308
+ freeBTreeNodesRecursive (guardedChild);
309
+ }
310
+ }
311
+
312
+ auto exclusiveGuardedNode = ExclusivePageGuard (std::move (guardedNode));
313
+ exclusiveGuardedNode.reclaim ();
314
+ }
315
+
285
316
inline void BTreeGeneric::IterateChildSwips (
286
317
BufferFrame& bf, std::function<bool (Swip<BufferFrame>&)> callback) {
287
318
// Pre: bf is read locked
0 commit comments