Skip to content

Commit f5eda6d

Browse files
committed
wip: revert ApplyItemsLimit
1 parent 32a0c34 commit f5eda6d

File tree

2 files changed

+60
-66
lines changed

2 files changed

+60
-66
lines changed

ydb/core/tablet_flat/flat_page_btree_index.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,13 @@ namespace NKikimr::NTable::NPage {
101101

102102
auto operator<=>(const TChild&) const = default;
103103

104-
TString ToString() const noexcept
105-
{
104+
TString ToString() const noexcept {
106105
return TStringBuilder() << "PageId: " << PageId << " RowCount: " << RowCount << " DataSize: " << DataSize << " ErasedRowCount: " << ErasedRowCount;
107106
}
107+
108+
TRowId GetNonErasedRowCount() const noexcept {
109+
return RowCount - ErasedRowCount;
110+
}
108111
} Y_PACKED;
109112

110113
static_assert(sizeof(TChild) == 28, "Invalid TBtreeIndexNode TChild size");

ydb/core/tablet_flat/flat_part_charge_btree_index.h

+55-64
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,27 @@ class TChargeBTreeIndex : public ICharge {
1313
using TGroupId = NPage::TGroupId;
1414
using TChild = TBtreeIndexNode::TChild;
1515

16-
// TODO: store PageId only instead of TChild?
17-
struct TChildState : TChild {
16+
// TODO: store PageId only?
17+
struct TChildState {
18+
TPageId PageId;
1819
TRowId BeginRowId;
1920
TRowId EndRowId;
21+
TRowId RowCount;
22+
ui64 DataSize;
2023

21-
TChildState(TChild meta, TRowId beginRowId, TRowId endRowId)
22-
: TChild(meta)
24+
TChildState(TPageId pageId, TRowId beginRowId, TRowId endRowId, TRowId rowCount, ui64 dataSize)
25+
: PageId(pageId)
2326
, BeginRowId(beginRowId)
2427
, EndRowId(endRowId)
28+
, RowCount(rowCount)
29+
, DataSize(dataSize)
2530
{
2631
}
2732
};
2833

2934
struct TNodeState : TChildState, TBtreeIndexNode {
30-
TNodeState(TSharedData data, TChild meta, TRowId beginRowId, TRowId endRowId)
31-
: TChildState(meta, beginRowId, endRowId)
35+
TNodeState(TSharedData data, TPageId pageId, TRowId beginRowId, TRowId endRowId, TRowId rowCount, ui64 dataSize)
36+
: TChildState(pageId, beginRowId, endRowId, rowCount, dataSize)
3237
, TBtreeIndexNode(data)
3338
{
3439
}
@@ -62,14 +67,15 @@ class TChargeBTreeIndex : public ICharge {
6267

6368
public:
6469
TResult Do(TCells key1, TCells key2, TRowId beginRowId, TRowId endRowId,
65-
const TKeyCellDefaults &keyDefaults, ui64 itemsLimit, ui64 bytesLimit) const noexcept override {
70+
const TKeyCellDefaults &keyDefaults, ui64 rowCountLimit, ui64 dataSizeLimit) const noexcept override {
6671
endRowId++; // current interface accepts inclusive row2 bound
6772
Y_ABORT_UNLESS(beginRowId < endRowId);
6873

6974
bool ready = true, overshot = true;
7075
bool chargeGroups = bool(Groups); // false value means that beginRowId, endRowId are invalid and shouldn't be used
76+
ui64 rowCount = 0, dataSize = 0;
7177

72-
Y_UNUSED(bytesLimit);
78+
Y_UNUSED(rowCountLimit, dataSizeLimit, rowCount, dataSize);
7379

7480
const auto& meta = Part->IndexPages.BTreeGroups[0];
7581
Y_ABORT_UNLESS(endRowId <= meta.RowCount);
@@ -80,10 +86,6 @@ class TChargeBTreeIndex : public ICharge {
8086
chargeGroups = false;
8187
}
8288

83-
if (!key1) {
84-
ApplyItemsLimit(beginRowId, endRowId, itemsLimit, overshot);
85-
}
86-
8789
TVector<TNodeState> level, nextLevel(::Reserve(3));
8890
TPageId key1PageId = key1 ? meta.PageId : Max<TPageId>();
8991
TPageId key2PageId = key2 ? meta.PageId : Max<TPageId>();
@@ -106,16 +108,22 @@ class TChargeBTreeIndex : public ICharge {
106108
}
107109
for (TRecIdx pos : xrange(from, to)) {
108110
auto child = node.GetChild(pos);
109-
TRowId beginRowId = pos ? node.GetChild(pos - 1).RowCount : node.BeginRowId;
110-
TRowId endRowId = child.RowCount;
111-
ready &= tryHandleChild(TChildState(child, beginRowId, endRowId));
111+
if (pos) {
112+
auto prev = node.GetChild(pos - 1);
113+
ready &= tryHandleChild(TChildState(child.PageId, prev.RowCount, child.RowCount,
114+
child.GetNonErasedRowCount() - prev.GetNonErasedRowCount(),
115+
child.DataSize - prev.DataSize));
116+
} else {
117+
ready &= tryHandleChild(TChildState(child.PageId, 0, child.RowCount,
118+
child.GetNonErasedRowCount(),
119+
child.DataSize));
120+
}
112121
}
113122
}
114123
};
115124

116-
const auto skipUnloadedRows = [&](TChildState child) {
125+
const auto skipUnloadedRows = [&](const TChildState& child) {
117126
if (child.PageId == key1PageId) {
118-
ApplyItemsLimit(Max(beginRowId, child.BeginRowId), endRowId, itemsLimit, overshot);
119127
beginRowId = Max(beginRowId, child.EndRowId);
120128
}
121129
if (child.PageId == key2PageId) {
@@ -133,7 +141,6 @@ class TChargeBTreeIndex : public ICharge {
133141
if (pos) {
134142
beginRowId = Max(beginRowId, node.GetShortChild(pos - 1).RowCount); // move beginRowId to the first key >= key1
135143
}
136-
ApplyItemsLimit(node.GetShortChild(pos).RowCount, endRowId, itemsLimit, overshot);
137144
}
138145
if (child.PageId == key2PageId) {
139146
TRecIdx pos = node.Seek(ESeek::Lower, key2, Scheme.Groups[0].ColsKeyIdx, &keyDefaults);
@@ -161,7 +168,6 @@ class TChargeBTreeIndex : public ICharge {
161168
if (child.PageId == key1PageId) {
162169
TRowId key1RowId = data.BaseRow() + data.LookupKey(key1, Scheme.Groups[0], ESeek::Lower, &keyDefaults).Off();
163170
beginRowId = Max(beginRowId, key1RowId);
164-
ApplyItemsLimit(beginRowId, endRowId, itemsLimit, overshot);
165171
}
166172
if (child.PageId == key2PageId) {
167173
TRowId key2RowId = data.BaseRow() + data.LookupKey(key2, Scheme.Groups[0], ESeek::Upper, &keyDefaults).Off();
@@ -173,16 +179,13 @@ class TChargeBTreeIndex : public ICharge {
173179
return false;
174180
}
175181
} else {
176-
if (child.PageId == key1PageId) {
177-
ApplyItemsLimit(child.EndRowId, endRowId, itemsLimit, overshot);
178-
}
179182
return HasDataPage(child.PageId, { });
180183
}
181184
};
182185

183186
for (ui32 height = 0; height < meta.LevelCount && ready; height++) {
184187
if (height == 0) {
185-
ready &= tryHandleNode(TChildState(meta, 0, meta.RowCount));
188+
ready &= tryHandleNode(TChildState(meta.PageId, 0, meta.RowCount, meta.GetNonErasedRowCount(), meta.DataSize));
186189
} else {
187190
iterateLevel(tryHandleNode);
188191
}
@@ -200,7 +203,7 @@ class TChargeBTreeIndex : public ICharge {
200203
overshot &= endRowId == sliceEndRowId;
201204

202205
if (meta.LevelCount == 0) {
203-
ready &= tryHandleDataPage(TChildState(meta, 0, meta.RowCount));
206+
ready &= tryHandleDataPage(TChildState(meta.PageId, 0, meta.RowCount, meta.GetNonErasedRowCount(), meta.DataSize));
204207
} else {
205208
iterateLevel(tryHandleDataPage);
206209
}
@@ -211,15 +214,15 @@ class TChargeBTreeIndex : public ICharge {
211214
}
212215

213216
TResult DoReverse(TCells key1, TCells key2, TRowId endRowId, TRowId beginRowId,
214-
const TKeyCellDefaults &keyDefaults, ui64 itemsLimit, ui64 bytesLimit) const noexcept override {
217+
const TKeyCellDefaults &keyDefaults, ui64 rowCountLimit, ui64 dataSizeLimit) const noexcept override {
215218
endRowId++; // current interface accepts inclusive row1 bound
216219
Y_ABORT_UNLESS(beginRowId < endRowId);
217220

218221
bool ready = true, overshot = true;
219222
bool chargeGroups = bool(Groups); // false value means that beginRowId, endRowId are invalid and shouldn't be used
223+
ui64 rowCount = 0, dataSize = 0;
220224

221-
Y_UNUSED(itemsLimit);
222-
Y_UNUSED(bytesLimit);
225+
Y_UNUSED(rowCountLimit, dataSizeLimit, rowCount, dataSize);
223226

224227
const auto& meta = Part->IndexPages.BTreeGroups[0];
225228
Y_ABORT_UNLESS(endRowId <= meta.RowCount);
@@ -230,10 +233,6 @@ class TChargeBTreeIndex : public ICharge {
230233
chargeGroups = false;
231234
}
232235

233-
if (!key1) {
234-
ApplyItemsLimitReverse(beginRowId, endRowId, itemsLimit, overshot);
235-
}
236-
237236
TVector<TNodeState> level, nextLevel(::Reserve(3));
238237
TPageId key1PageId = key1 ? meta.PageId : Max<TPageId>();
239238
TPageId key2PageId = key2 ? meta.PageId : Max<TPageId>();
@@ -256,16 +255,22 @@ class TChargeBTreeIndex : public ICharge {
256255
}
257256
for (TRecIdx pos : xrange(from, to)) {
258257
auto child = node.GetChild(pos);
259-
TRowId beginRowId = pos ? node.GetChild(pos - 1).RowCount : node.BeginRowId;
260-
TRowId endRowId = child.RowCount;
261-
ready &= tryHandleChild(TChildState(child, beginRowId, endRowId));
258+
if (pos) {
259+
auto prev = node.GetChild(pos - 1);
260+
ready &= tryHandleChild(TChildState(child.PageId, prev.RowCount, child.RowCount,
261+
child.GetNonErasedRowCount() - prev.GetNonErasedRowCount(),
262+
child.DataSize - prev.DataSize));
263+
} else {
264+
ready &= tryHandleChild(TChildState(child.PageId, 0, child.RowCount,
265+
child.GetNonErasedRowCount(),
266+
child.DataSize));
267+
}
262268
}
263269
}
264270
};
265271

266272
const auto skipUnloadedRows = [&](TChildState child) {
267273
if (child.PageId == key1PageId) {
268-
ApplyItemsLimitReverse(beginRowId, Min(endRowId, child.EndRowId), itemsLimit, overshot);
269274
endRowId = Min(endRowId, child.BeginRowId);
270275
}
271276
if (child.PageId == key2PageId) {
@@ -281,9 +286,6 @@ class TChargeBTreeIndex : public ICharge {
281286
TRecIdx pos = node.SeekReverse(ESeek::Lower, key1, Scheme.Groups[0].ColsKeyIdx, &keyDefaults);
282287
key1PageId = node.GetShortChild(pos).PageId;
283288
endRowId = Min(endRowId, node.GetShortChild(pos).RowCount); // move endRowId - 1 to the last key <= key1
284-
if (pos) {
285-
ApplyItemsLimitReverse(beginRowId, node.GetShortChild(pos - 1).RowCount, itemsLimit, overshot);
286-
}
287289
}
288290
if (child.PageId == key2PageId) {
289291
TRecIdx pos = node.Seek(ESeek::Lower, key2, Scheme.Groups[0].ColsKeyIdx, &keyDefaults);
@@ -318,7 +320,6 @@ class TChargeBTreeIndex : public ICharge {
318320
} else {
319321
endRowId = Min(endRowId, child.BeginRowId);
320322
}
321-
ApplyItemsLimitReverse(beginRowId, endRowId, itemsLimit, overshot);
322323
}
323324
if (child.PageId == key2PageId) {
324325
auto iter = data.LookupKeyReverse(key2, Scheme.Groups[0], ESeek::Upper, &keyDefaults);
@@ -335,16 +336,13 @@ class TChargeBTreeIndex : public ICharge {
335336
return false;
336337
}
337338
} else {
338-
if (child.PageId == key1PageId) {
339-
ApplyItemsLimitReverse(beginRowId, child.BeginRowId, itemsLimit, overshot);
340-
}
341339
return HasDataPage(child.PageId, { });
342340
}
343341
};
344342

345343
for (ui32 height = 0; height < meta.LevelCount && ready; height++) {
346344
if (height == 0) {
347-
ready &= tryHandleNode(TChildState(meta, 0, meta.RowCount));
345+
ready &= tryHandleNode(TChildState(meta.PageId, 0, meta.RowCount, meta.GetNonErasedRowCount(), meta.DataSize));
348346
} else {
349347
iterateLevel(tryHandleNode);
350348
}
@@ -362,7 +360,7 @@ class TChargeBTreeIndex : public ICharge {
362360
overshot &= beginRowId == sliceBeginRowId;
363361

364362
if (meta.LevelCount == 0) {
365-
ready &= tryHandleDataPage(TChildState(meta, 0, meta.RowCount));
363+
ready &= tryHandleDataPage(TChildState(meta.PageId, 0, meta.RowCount, meta.GetNonErasedRowCount(), meta.DataSize));
366364
} else {
367365
iterateLevel(tryHandleDataPage);
368366
}
@@ -403,9 +401,16 @@ class TChargeBTreeIndex : public ICharge {
403401
}
404402
for (TRecIdx pos : xrange(from, to)) {
405403
auto child = node.GetChild(pos);
406-
TRowId beginRowId = pos ? node.GetChild(pos - 1).RowCount : node.BeginRowId;
407-
TRowId endRowId = child.RowCount;
408-
ready &= tryHandleChild(TChildState(child, beginRowId, endRowId));
404+
if (pos) {
405+
auto prev = node.GetChild(pos - 1);
406+
ready &= tryHandleChild(TChildState(child.PageId, prev.RowCount, child.RowCount,
407+
child.GetNonErasedRowCount() - prev.GetNonErasedRowCount(),
408+
child.DataSize - prev.DataSize));
409+
} else {
410+
ready &= tryHandleChild(TChildState(child.PageId, 0, child.RowCount,
411+
child.GetNonErasedRowCount(),
412+
child.DataSize));
413+
}
409414
}
410415
}
411416
};
@@ -420,7 +425,7 @@ class TChargeBTreeIndex : public ICharge {
420425

421426
for (ui32 height = 0; height < meta.LevelCount && ready; height++) {
422427
if (height == 0) {
423-
ready &= tryHandleNode(TChildState(meta, 0, meta.RowCount));
428+
ready &= tryHandleNode(TChildState(meta.PageId, 0, meta.RowCount, meta.RowCount, meta.DataSize));
424429
} else {
425430
iterateLevel(tryHandleNode);
426431
}
@@ -433,7 +438,7 @@ class TChargeBTreeIndex : public ICharge {
433438
}
434439

435440
if (meta.LevelCount == 0) {
436-
ready &= tryHandleDataPage(TChildState(meta, 0, meta.RowCount));
441+
ready &= tryHandleDataPage(TChildState(meta.PageId, 0, meta.RowCount, meta.RowCount, meta.DataSize));
437442
} else {
438443
iterateLevel(tryHandleDataPage);
439444
}
@@ -442,20 +447,6 @@ class TChargeBTreeIndex : public ICharge {
442447
}
443448

444449
private:
445-
void ApplyItemsLimit(TRowId beginRowId, TRowId &endRowId, ui64 itemsLimit, bool &overshot) const noexcept {
446-
if (itemsLimit && endRowId > beginRowId && endRowId - beginRowId - 1 >= itemsLimit) {
447-
endRowId = beginRowId + itemsLimit + 1;
448-
overshot = false;
449-
}
450-
}
451-
452-
void ApplyItemsLimitReverse(TRowId& beginRowId, TRowId endRowId, ui64 itemsLimit, bool &overshot) const noexcept {
453-
if (itemsLimit && endRowId > beginRowId && endRowId - beginRowId - 1 >= itemsLimit) {
454-
beginRowId = endRowId - itemsLimit - 1;
455-
overshot = false;
456-
}
457-
}
458-
459450
const TSharedData* TryGetDataPage(TPageId pageId, TGroupId groupId) const noexcept {
460451
return Env->TryGetPage(Part, pageId, groupId);
461452
};
@@ -474,7 +465,7 @@ class TChargeBTreeIndex : public ICharge {
474465
return true;
475466
}
476467

477-
int Compare(TCells left, TCells right, const TKeyCellDefaults &keyDefaults) const noexcept
468+
int Compare(TCells left, TCells right, const TKeyCellDefaults& keyDefaults) const noexcept
478469
{
479470
Y_DEBUG_ABORT_UNLESS(left, "Empty keys should be handled separately");
480471
Y_DEBUG_ABORT_UNLESS(right, "Empty keys should be handled separately");

0 commit comments

Comments
 (0)