@@ -39,6 +39,14 @@ namespace NKikimr::NTable::NPage {
39
39
Y_ABORT_UNLESS (!End);
40
40
}
41
41
42
+ void Reset () {
43
+ Keys.clear ();
44
+ KeysSize = 0 ;
45
+ Children.clear ();
46
+ Ptr = 0 ;
47
+ End = 0 ;
48
+ }
49
+
42
50
TString SerializeKey (TCellsRef cells) {
43
51
Y_ABORT_UNLESS (cells.size () <= GroupInfo.KeyTypes .size ());
44
52
@@ -115,6 +123,10 @@ namespace NKikimr::NTable::NPage {
115
123
return Keys.size ();
116
124
}
117
125
126
+ TPgSize CalcKeySizeWithMeta (TCellsRef cells) const noexcept {
127
+ return sizeof (TRecordsEntry) + CalcKeySize (cells) + sizeof (TChild);
128
+ }
129
+
118
130
private:
119
131
TPgSize CalcKeySize (TCellsRef cells) const noexcept
120
132
{
@@ -256,15 +268,15 @@ namespace NKikimr::NTable::NPage {
256
268
return result;
257
269
}
258
270
259
- size_t GetKeysSize () {
271
+ size_t GetKeysSize () const {
260
272
return KeysSize;
261
273
}
262
274
263
- size_t GetKeysCount () {
275
+ size_t GetKeysCount () const {
264
276
return Keys.size ();
265
277
}
266
278
267
- size_t GetChildrenCount () {
279
+ size_t GetChildrenCount () const {
268
280
return Children.size ();
269
281
}
270
282
@@ -288,6 +300,19 @@ namespace NKikimr::NTable::NPage {
288
300
Y_ABORT_UNLESS (NodeKeysMax >= NodeKeysMin);
289
301
}
290
302
303
+ TPgSize CalcSize (TCellsRef cells) const {
304
+ return Writer.CalcKeySizeWithMeta (cells);
305
+ }
306
+
307
+ // returns approximate value, doesn't include new child creation on Flush step
308
+ ui64 EstimateBytesUsed () const {
309
+ ui64 result = IndexSize; // written bytes
310
+ for (const auto &lvl : Levels) {
311
+ result += CalcPageSize (lvl);
312
+ }
313
+ return result;
314
+ }
315
+
291
316
void AddKey (TCellsRef cells) {
292
317
Levels[0 ].PushKey (Writer.SerializeKey (cells));
293
318
}
@@ -296,7 +321,7 @@ namespace NKikimr::NTable::NPage {
296
321
// aggregate in order to perform search by row id from any leaf node
297
322
child.Count = (ChildrenCount += child.Count );
298
323
child.ErasedCount = (ChildrenErasedCount += child.ErasedCount );
299
- child.Size = (ChildrenSize += child.Size );
324
+ child.DataSize = (ChildrenSize += child.DataSize );
300
325
301
326
Levels[0 ].PushChild (child);
302
327
}
@@ -305,7 +330,7 @@ namespace NKikimr::NTable::NPage {
305
330
for (size_t levelIndex = 0 ; levelIndex < Levels.size (); levelIndex++) {
306
331
if (last && !Levels[levelIndex].GetKeysCount ()) {
307
332
Y_ABORT_UNLESS (Levels[levelIndex].GetChildrenCount () == 1 , " Should be root" );
308
- return TBtreeIndexMeta{ Levels[levelIndex].PopChild (), levelIndex };
333
+ return TBtreeIndexMeta{ Levels[levelIndex].PopChild (), levelIndex, IndexSize };
309
334
}
310
335
311
336
if (!TryFlush (levelIndex, pager, last)) {
@@ -318,10 +343,17 @@ namespace NKikimr::NTable::NPage {
318
343
return { };
319
344
}
320
345
346
+ void Reset () {
347
+ IndexSize = 0 ;
348
+ Writer.Reset ();
349
+ Levels = { TLevel () };
350
+ ChildrenCount = 0 ;
351
+ ChildrenErasedCount = 0 ;
352
+ ChildrenSize = 0 ;
353
+ }
354
+
321
355
private:
322
356
bool TryFlush (size_t levelIndex, IPageWriter &pager, bool last) {
323
- Y_ABORT_UNLESS (Levels[levelIndex].GetKeysCount (), " Shouldn't have empty levels" );
324
-
325
357
if (!last && Levels[levelIndex].GetKeysCount () <= 2 * NodeKeysMax) {
326
358
// Note: node should meet both NodeKeysMin and NodeSize restrictions for split
327
359
@@ -361,13 +393,15 @@ namespace NKikimr::NTable::NPage {
361
393
}
362
394
auto lastChild = Levels[levelIndex].PopChild ();
363
395
Writer.AddChild (lastChild);
364
-
365
- auto pageId = pager.Write (Writer.Finish (), EPage::BTreeIndex, 0 );
396
+
397
+ auto page = Writer.Finish ();
398
+ IndexSize += page.size ();
399
+ auto pageId = pager.Write (std::move (page), EPage::BTreeIndex, 0 );
366
400
367
401
if (levelIndex + 1 == Levels.size ()) {
368
402
Levels.emplace_back ();
369
403
}
370
- Levels[levelIndex + 1 ].PushChild (TChild{pageId, lastChild.Count , lastChild.ErasedCount , lastChild.Size });
404
+ Levels[levelIndex + 1 ].PushChild (TChild{pageId, lastChild.Count , lastChild.ErasedCount , lastChild.DataSize });
371
405
if (!last) {
372
406
Levels[levelIndex + 1 ].PushKey (Levels[levelIndex].PopKey ());
373
407
}
@@ -383,11 +417,13 @@ namespace NKikimr::NTable::NPage {
383
417
return true ;
384
418
}
385
419
386
- size_t CalcPageSize (TLevel& level) {
420
+ size_t CalcPageSize (const TLevel& level) const {
387
421
return Writer.CalcPageSize (level.GetKeysSize (), level.GetKeysCount ());
388
422
}
389
423
390
424
private:
425
+ ui64 IndexSize = 0 ;
426
+
391
427
TBtreeIndexNodeWriter Writer;
392
428
TVector<TLevel> Levels; // from bottom to top
393
429
0 commit comments