Skip to content

Commit 7d9ab3e

Browse files
authored
Turn Scan memory into passive Shared Cache memory (#12295)
1 parent d917bcb commit 7d9ab3e

15 files changed

+74
-45
lines changed

ydb/core/tablet_flat/flat_fwd_blobs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ namespace NFwd {
5454
Preload(head, upper);
5555
}
5656

57-
void Fill(NPageCollection::TLoadedPage& page, EPage) noexcept override
57+
void Fill(NPageCollection::TLoadedPage& page, NSharedCache::TSharedPageRef sharedPageRef, EPage) noexcept override
5858
{
5959
if (!Pages || page.PageId < Pages.front().PageId) {
6060
Y_ABORT("Blobs fwd cache got page below queue");
@@ -66,7 +66,7 @@ namespace NFwd {
6666

6767
Stat.Saved += page.Data.size();
6868
OnFetch -= page.Data.size();
69-
OnHold += Lookup(page.PageId).Settle(page);
69+
OnHold += Lookup(page.PageId).Settle(page, std::move(sharedPageRef));
7070

7171
Shrink(false /* do not drop loading pages */);
7272
}

ydb/core/tablet_flat/flat_fwd_cache.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ namespace NFwd {
160160
}
161161
}
162162

163-
void Fill(NPageCollection::TLoadedPage& page, EPage type) noexcept override
163+
void Fill(NPageCollection::TLoadedPage& page, NSharedCache::TSharedPageRef sharedPageRef, EPage type) noexcept override
164164
{
165165
Stat.Saved += page.Data.size();
166166

@@ -169,7 +169,7 @@ namespace NFwd {
169169
Y_ABORT_UNLESS(page.PageId == IndexPage.PageId);
170170
Index.emplace(page.Data);
171171
Iter = Index->LookupRow(BeginRowId);
172-
IndexPage.Settle(page);
172+
IndexPage.Settle(page, std::move(sharedPageRef));
173173
return;
174174
}
175175

@@ -180,7 +180,7 @@ namespace NFwd {
180180

181181
Y_ABORT_UNLESS(page.Data.size() <= OnFetch, "Forward cache ahead counters is out of sync");
182182
OnFetch -= page.Data.size();
183-
OnHold += it->Settle(page); // settle of a dropped page returns 0 and releases its data
183+
OnHold += it->Settle(page, std::move(sharedPageRef)); // settle of a dropped page returns 0 and releases its data
184184

185185
ShrinkPages();
186186
}
@@ -353,7 +353,7 @@ namespace NFwd {
353353
}
354354
}
355355

356-
void Fill(NPageCollection::TLoadedPage& page, EPage type) noexcept override
356+
void Fill(NPageCollection::TLoadedPage& page, NSharedCache::TSharedPageRef sharedPageRef, EPage type) noexcept override
357357
{
358358
Stat.Saved += page.Data.size();
359359

@@ -375,7 +375,7 @@ namespace NFwd {
375375
}
376376
}
377377

378-
it->Settle(page); // settle of a dropped page releases its data
378+
it->Settle(page, std::move(sharedPageRef)); // settle of a dropped page releases its data
379379

380380
AdvancePending(levelId);
381381
ShrinkPages(level);

ydb/core/tablet_flat/flat_fwd_conf.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,25 @@
33
#include <util/system/types.h>
44
#include <util/generic/array_ref.h>
55
#include <util/generic/vector.h>
6+
#include <util/stream/format.h>
67

78
namespace NKikimr {
89
namespace NTable {
910
namespace NFwd {
1011

1112
struct TConf {
13+
void Describe(IOutputStream &out) const noexcept
14+
{
15+
out
16+
<< "TConf{"
17+
<< "high=" << HumanReadableSize(AheadHi, SF_BYTES)
18+
<< ",low=" << HumanReadableSize(AheadLo, SF_BYTES)
19+
<< ",edge=" << Edge
20+
<< ",tablet=" << Tablet
21+
<< ",trace=" << Trace
22+
<< "}";
23+
}
24+
1225
/*_ Cache lines read ahead settings */
1326

1427
ui64 AheadHi = 1;

ydb/core/tablet_flat/flat_fwd_env.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ namespace NFwd {
150150
return Get(GetQueue(part, room), ref, EPage::Opaque);
151151
}
152152

153-
void DoSave(TIntrusiveConstPtr<IPageCollection> pageCollection, ui64 cookie, TArrayRef<NPageCollection::TLoadedPage> pages)
153+
void DoSave(TIntrusiveConstPtr<IPageCollection> pageCollection, ui64 cookie, TVector<NSharedCache::TEvResult::TLoaded> pages)
154154
{
155155
const ui32 epoch = ui32(cookie) - Salt;
156156
if (epoch < Epoch) {
@@ -167,12 +167,14 @@ namespace NFwd {
167167

168168
for (auto& page : pages) {
169169
auto type = EPage(pageCollection->Page(page.PageId).Type);
170+
auto data = NSharedCache::TPinnedPageRef(page.Page).GetData();
171+
NPageCollection::TLoadedPage loadedPage{page.PageId, std::move(data)};
170172
if (IsIndexPage(type)) {
171173
Y_ABORT_UNLESS(queue.IndexPageCollection->Label() == pageCollection->Label(), "TPart head storage doesn't match with fetch result");
172-
queue->Fill(page, type);
174+
queue->Fill(loadedPage, std::move(page.Page), type);
173175
} else {
174176
Y_ABORT_UNLESS(queue.GroupPageCollection->Label() == pageCollection->Label(), "TPart head storage doesn't match with fetch result");
175-
queue->Fill(page, type);
177+
queue->Fill(loadedPage, std::move(page.Page), type);
176178
}
177179
}
178180
}

ydb/core/tablet_flat/flat_fwd_iface.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "flat_page_iface.h"
44
#include "flat_sausage_fetch.h"
55
#include "flat_fwd_misc.h"
6+
#include "shared_handle.h"
67

78
namespace NKikimr {
89
namespace NTable {
@@ -32,7 +33,7 @@ namespace NFwd {
3233

3334
virtual TResult Get(IPageLoadingQueue *head, TPageId pageId, EPage type, ui64 lower) noexcept = 0;
3435
virtual void Forward(IPageLoadingQueue *head, ui64 upper) noexcept = 0;
35-
virtual void Fill(NPageCollection::TLoadedPage& page, EPage type) noexcept = 0;
36+
virtual void Fill(NPageCollection::TLoadedPage& page, NSharedCache::TSharedPageRef sharedPageRef, EPage type) noexcept = 0;
3637

3738
IPageLoadingQueue* Head = nullptr; /* will be set outside of IPageLoadingLogic impl */
3839
TStat Stat;

ydb/core/tablet_flat/flat_fwd_misc.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <util/stream/output.h>
4+
#include <util/stream/format.h>
45

56
namespace NKikimr {
67
namespace NTable {
@@ -18,11 +19,11 @@ namespace NFwd {
1819
{
1920
out
2021
<< "TFwd{"
21-
<< "fetch=" << Fetch
22-
<< ",saved=" << Saved
23-
<< ",usage=" << Usage
24-
<< ",after=" << After
25-
<< ",before=" << Before
22+
<< "fetch=" << HumanReadableSize(Fetch, SF_BYTES)
23+
<< ",saved=" << HumanReadableSize(Saved, SF_BYTES)
24+
<< ",usage=" << HumanReadableSize(Usage, SF_BYTES)
25+
<< ",after=" << HumanReadableSize(After, SF_BYTES)
26+
<< ",before=" << HumanReadableSize(Before, SF_BYTES)
2627
<< "}";
2728
}
2829

ydb/core/tablet_flat/flat_fwd_page.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "flat_part_iface.h"
44
#include "flat_sausage_fetch.h"
55
#include "flat_fwd_misc.h"
6+
#include "shared_handle.h"
67

78
namespace NKikimr {
89
namespace NTable {
@@ -31,6 +32,7 @@ namespace NFwd {
3132
~TPage()
3233
{
3334
Y_ABORT_UNLESS(!Data, "Forward cache page is still holds data");
35+
Y_ABORT_UNLESS(!SharedPageRef, "Forward cache page is still holds data");
3436
}
3537

3638
explicit operator bool() const
@@ -53,7 +55,7 @@ namespace NFwd {
5355
return Data ? &Data : nullptr;
5456
}
5557

56-
ui32 Settle(NPageCollection::TLoadedPage &page) noexcept
58+
ui32 Settle(NPageCollection::TLoadedPage &page, NSharedCache::TSharedPageRef ref) noexcept
5759
{
5860
const auto was = std::exchange(Fetch, EFetch::Done);
5961

@@ -67,6 +69,7 @@ namespace NFwd {
6769
Y_ABORT("Settling page that is not waiting for any data");
6870
} else {
6971
Data = std::move(page.Data);
72+
SharedPageRef = ref;
7073
}
7174

7275
return Data.size();
@@ -90,6 +93,8 @@ namespace NFwd {
9093
{
9194
Fetch = Max(Fetch, EFetch::Drop);
9295

96+
SharedPageRef.Drop();
97+
9398
return std::exchange(Data, { });
9499
}
95100

@@ -100,6 +105,7 @@ namespace NFwd {
100105
EUsage Usage = EUsage::None;
101106
EFetch Fetch = EFetch::None;
102107
TSharedData Data;
108+
NSharedCache::TSharedPageRef SharedPageRef;
103109
};
104110

105111
}

ydb/core/tablet_flat/flat_ops_compact.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ namespace NTabletFlatExecutor {
364364

365365
logl
366366
<< NFmt::Do(*this) << " end=" << ui32(abort)
367-
<< ", " << Blobs << "blobs " << WriteStats.Rows << "r"
367+
<< ", " << Blobs << " blobs " << WriteStats.Rows << "r"
368368
<< " (max " << Conf->Layout.MaxRows << ")"
369369
<< ", put " << NFmt::If(Spent.Get());
370370

ydb/core/tablet_flat/flat_part_loader.h

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,20 @@ namespace NTable {
5353
Y_ABORT_UNLESS(part == Part, "Unsupported part");
5454
Y_ABORT_UNLESS(groupId.IsMain(), "Unsupported column group");
5555

56-
if (auto* savedPage = SavedPages.FindPtr(pageId)) {
57-
return savedPage;
58-
} else if (auto* cached = Cache->Lookup(pageId)) {
59-
// Save page in case it's evicted on the next iteration
60-
SavedPages[pageId] = *cached;
61-
return cached;
56+
auto savedPage = SavedPages.find(pageId);
57+
58+
if (savedPage == SavedPages.end()) {
59+
if (auto cachedPage = Cache->GetPage(pageId); cachedPage) {
60+
if (auto sharedPageRef = cachedPage->SharedBody; sharedPageRef && sharedPageRef.Use()) {
61+
// Save page in case it's evicted on the next iteration
62+
AddSavedPage(pageId, std::move(sharedPageRef));
63+
savedPage = SavedPages.find(pageId);
64+
}
65+
}
66+
}
67+
68+
if (savedPage != SavedPages.end()) {
69+
return &savedPage->second;
6270
} else {
6371
NeedPages.insert(pageId);
6472
return nullptr;
@@ -86,15 +94,22 @@ namespace NTable {
8694
if (cookie == 0 && NeedPages.erase(loaded.PageId)) {
8795
auto pageType = Cache->GetPageType(loaded.PageId);
8896
bool sticky = NeedIn(pageType) || pageType == EPage::FlatIndex;
89-
SavedPages[loaded.PageId] = NSharedCache::TPinnedPageRef(loaded.Page).GetData();
97+
AddSavedPage(loaded.PageId, loaded.Page);
9098
Cache->Fill(loaded.PageId, std::move(loaded.Page), sticky);
9199
}
92100
}
93101

94102
private:
103+
void AddSavedPage(TPageId pageId, NSharedCache::TSharedPageRef page) noexcept
104+
{
105+
SavedPages[pageId] = NSharedCache::TPinnedPageRef(page).GetData();
106+
SavedPagesRefs.emplace_back(std::move(page));
107+
}
108+
95109
const TPart* Part = nullptr;
96110
TIntrusivePtr<TCache> Cache;
97111
THashMap<TPageId, TSharedData> SavedPages;
112+
TVector<NSharedCache::TSharedPageRef> SavedPagesRefs;
98113
THashSet<TPageId> NeedPages;
99114
};
100115

ydb/core/tablet_flat/flat_sausagecache.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,6 @@ class TPrivatePageCache {
9797
return PageMap.size();
9898
}
9999

100-
const TSharedData* Lookup(TPageId pageId) const noexcept {
101-
auto* page = GetPage(pageId);
102-
return page ? page->GetPinnedBody() : nullptr;
103-
}
104-
105100
TPage* GetPage(TPageId pageId) const noexcept {
106101
return PageMap[pageId].Get();
107102
}

0 commit comments

Comments
 (0)