diff options
author | kungurtsev <kungasc@ydb.tech> | 2024-06-18 13:42:18 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-18 13:42:18 +0200 |
commit | 6ff66f609fef8bf83c298d1fb0c47868631ad3ae (patch) | |
tree | 3fd3e8fa1465549684790cd0375f2e00aeeb7190 | |
parent | e9bce00c5aca7e5a2d24bb4696562bdbf8a231ef (diff) | |
download | ydb-6ff66f609fef8bf83c298d1fb0c47868631ad3ae.tar.gz |
Avoid Undefined behavior: reference binding to misaligned address (#5638)
-rw-r--r-- | ydb/core/tablet_flat/flat_fwd_cache.h | 14 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_page_btree_index.h | 78 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_page_btree_index_writer.h | 20 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_part_charge_btree_index.h | 78 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_part_dump.cpp | 4 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_part_index_iter_bree_index.h | 12 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_part_loader.cpp | 2 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_part_writer.h | 10 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_stat_part_group_btree_index.h | 15 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_stat_table_btree_index.h | 24 | ||||
-rw-r--r-- | ydb/core/tablet_flat/flat_stat_table_btree_index_histogram.h | 8 | ||||
-rw-r--r-- | ydb/core/tablet_flat/ut/ut_btree_index_nodes.cpp | 48 | ||||
-rw-r--r-- | ydb/core/tablet_flat/ut/ut_charge.cpp | 4 | ||||
-rw-r--r-- | ydb/core/tablet_flat/ut/ut_stat.cpp | 2 |
14 files changed, 176 insertions, 143 deletions
diff --git a/ydb/core/tablet_flat/flat_fwd_cache.h b/ydb/core/tablet_flat/flat_fwd_cache.h index eb7e2f66b9..7f070ff132 100644 --- a/ydb/core/tablet_flat/flat_fwd_cache.h +++ b/ydb/core/tablet_flat/flat_fwd_cache.h @@ -301,9 +301,9 @@ namespace NFwd { auto& meta = Part->IndexPages.GetBTree(groupId); Levels.resize(meta.LevelCount + 1); - Levels[0].Queue.push_back({meta.PageId, meta.DataSize}); + Levels[0].Queue.push_back({meta.GetPageId(), meta.GetDataSize()}); if (meta.LevelCount) { - IndexPageLocator.Add(meta.PageId, GroupId, 0); + IndexPageLocator.Add(meta.GetPageId(), GroupId, 0); } } @@ -371,7 +371,7 @@ namespace NFwd { if (levelId + 2 < Levels.size()) { // next level is index NPage::TBtreeIndexNode node(page.Data); for (auto pos : xrange(node.GetChildrenCount())) { - IndexPageLocator.Add(node.GetShortChild(pos).PageId, GroupId, levelId + 1); + IndexPageLocator.Add(node.GetShortChild(pos).GetPageId(), GroupId, levelId + 1); } } @@ -433,12 +433,12 @@ namespace NFwd { NPage::TBtreeIndexNode node(page.Data); for (auto pos : xrange(node.GetChildrenCount())) { auto& child = node.GetShortChild(pos); - if (child.RowCount <= BeginRowId) { + if (child.GetRowCount() <= BeginRowId) { continue; } - Y_ABORT_UNLESS(!Levels[levelId + 1].Queue || Levels[levelId + 1].Queue.back().PageId < child.PageId); - Levels[levelId + 1].Queue.push_back({child.PageId, child.DataSize}); - if (child.RowCount >= EndRowId) { + Y_ABORT_UNLESS(!Levels[levelId + 1].Queue || Levels[levelId + 1].Queue.back().PageId < child.GetPageId()); + Levels[levelId + 1].Queue.push_back({child.GetPageId(), child.GetDataSize()}); + if (child.GetRowCount() >= EndRowId) { break; } } diff --git a/ydb/core/tablet_flat/flat_page_btree_index.h b/ydb/core/tablet_flat/flat_page_btree_index.h index 5d463cbf57..515d04a081 100644 --- a/ydb/core/tablet_flat/flat_page_btree_index.h +++ b/ydb/core/tablet_flat/flat_page_btree_index.h @@ -84,9 +84,21 @@ namespace NKikimr::NTable::NPage { static_assert(sizeof(TIsNullBitmap) == 1, "Invalid TBtreeIndexNode TIsNullBitmap size"); struct TShortChild { - TPageId PageId; - TRowId RowCount; - ui64 DataSize; + TPageId PageId_; + TRowId RowCount_; + ui64 DataSize_; + + inline TPageId GetPageId() const noexcept { + return PageId_; + } + + inline TRowId GetRowCount() const noexcept { + return RowCount_; + } + + inline ui64 GetDataSize() const noexcept { + return DataSize_; + } auto operator<=>(const TShortChild&) const = default; } Y_PACKED; @@ -94,38 +106,58 @@ namespace NKikimr::NTable::NPage { static_assert(sizeof(TShortChild) == 20, "Invalid TBtreeIndexNode TShortChild size"); struct TChild { - TPageId PageId; - TRowId RowCount; - ui64 DataSize; - ui64 GroupDataSize; - TRowId ErasedRowCount; + TPageId PageId_; + TRowId RowCount_; + ui64 DataSize_; + ui64 GroupDataSize_; + TRowId ErasedRowCount_; auto operator<=>(const TChild&) const = default; - TRowId GetNonErasedRowCount() const noexcept { - return RowCount - ErasedRowCount; + inline TPageId GetPageId() const noexcept { + return PageId_; + } + + inline TRowId GetRowCount() const noexcept { + return RowCount_; + } + + inline ui64 GetDataSize() const noexcept { + return DataSize_; + } + + inline ui64 GetGroupDataSize() const noexcept { + return GroupDataSize_; + } + + inline TRowId GetErasedRowCount() const noexcept { + return ErasedRowCount_; + } + + inline TRowId GetNonErasedRowCount() const noexcept { + return RowCount_ - ErasedRowCount_; } - ui64 GetTotalDataSize() const noexcept { - return DataSize + GroupDataSize; + inline ui64 GetTotalDataSize() const noexcept { + return DataSize_ + GroupDataSize_; } TString ToString() const noexcept { TStringBuilder result; - result << "PageId: " << PageId << " RowCount: " << RowCount << " DataSize: " << DataSize; - if (GroupDataSize) { - result << " GroupDataSize: " << GroupDataSize; + result << "PageId: " << GetPageId() << " RowCount: " << GetRowCount() << " DataSize: " << GetDataSize(); + if (GetGroupDataSize()) { + result << " GroupDataSize: " << GetGroupDataSize(); } - result << " ErasedRowCount: " << ErasedRowCount; + result << " ErasedRowCount: " << GetErasedRowCount(); return result; } } Y_PACKED; static_assert(sizeof(TChild) == 36, "Invalid TBtreeIndexNode TChild size"); - static_assert(offsetof(TChild, PageId) == offsetof(TShortChild, PageId)); - static_assert(offsetof(TChild, RowCount) == offsetof(TShortChild, RowCount)); - static_assert(offsetof(TChild, DataSize) == offsetof(TShortChild, DataSize)); + static_assert(offsetof(TChild, PageId_) == offsetof(TShortChild, PageId_)); + static_assert(offsetof(TChild, RowCount_) == offsetof(TShortChild, RowCount_)); + static_assert(offsetof(TChild, DataSize_) == offsetof(TShortChild, DataSize_)); #pragma pack(pop) @@ -357,19 +389,19 @@ namespace NKikimr::NTable::NPage { auto range = xrange(0u, childrenCount); const auto cmp = [this](TRowId rowId, TPos pos) { - return rowId < GetShortChild(pos).RowCount; + return rowId < GetShortChild(pos).GetRowCount(); }; TRecIdx result; if (!on) { // Will do a full binary search on full range - } else if (GetShortChild(*on).RowCount <= rowId) { + } else if (GetShortChild(*on).GetRowCount() <= rowId) { // Try a short linear search first result = *on; for (int linear = 0; linear < 4; ++linear) { result++; Y_ABORT_UNLESS(result < childrenCount, "Should always seek some child"); - if (GetShortChild(result).RowCount > rowId) { + if (GetShortChild(result).GetRowCount() > rowId) { return result; } } @@ -383,7 +415,7 @@ namespace NKikimr::NTable::NPage { if (result == 0) { return 0; } - if (GetShortChild(result - 1).RowCount <= rowId) { + if (GetShortChild(result - 1).GetRowCount() <= rowId) { return result; } result--; diff --git a/ydb/core/tablet_flat/flat_page_btree_index_writer.h b/ydb/core/tablet_flat/flat_page_btree_index_writer.h index 8f3a83a3fa..837f276cca 100644 --- a/ydb/core/tablet_flat/flat_page_btree_index_writer.h +++ b/ydb/core/tablet_flat/flat_page_btree_index_writer.h @@ -50,7 +50,7 @@ namespace NKikimr::NTable::NPage { } void AddChild(TChild child) { - Y_ABORT_UNLESS(child.ErasedRowCount == 0 || !IsShortChildFormat(), "Short format can't have ErasedRowCount"); + Y_ABORT_UNLESS(child.GetErasedRowCount() == 0 || !IsShortChildFormat(), "Short format can't have ErasedRowCount"); Children.push_back(child); } @@ -249,9 +249,9 @@ namespace NKikimr::NTable::NPage { void PlaceChild(const TChild& child) noexcept { if (IsShortChildFormat()) { - Y_DEBUG_ABORT_UNLESS(child.GroupDataSize == 0); - Y_DEBUG_ABORT_UNLESS(child.ErasedRowCount == 0); - Place<TShortChild>() = TShortChild{child.PageId, child.RowCount, child.DataSize}; + Y_DEBUG_ABORT_UNLESS(child.GetGroupDataSize() == 0); + Y_DEBUG_ABORT_UNLESS(child.GetErasedRowCount() == 0); + Place<TShortChild>() = TShortChild{child.GetPageId(), child.GetRowCount(), child.GetDataSize()}; } else { Place<TChild>() = child; } @@ -377,15 +377,15 @@ namespace NKikimr::NTable::NPage { } void AddShortChild(TShortChild child) { - AddChild(TChild{child.PageId, child.RowCount, child.DataSize, 0, 0}); + AddChild(TChild{child.GetPageId(), child.GetRowCount(), child.GetDataSize(), 0, 0}); } void AddChild(TChild child) { // aggregate in order to perform search by row id from any leaf node - child.RowCount = (ChildRowCount += child.RowCount); - child.DataSize = (ChildDataSize += child.DataSize); - child.GroupDataSize = (ChildGroupDataSize += child.GroupDataSize); - child.ErasedRowCount = (ChildErasedRowCount += child.ErasedRowCount); + child.RowCount_ = (ChildRowCount += child.GetRowCount()); + child.DataSize_ = (ChildDataSize += child.GetDataSize()); + child.GroupDataSize_ = (ChildGroupDataSize += child.GetGroupDataSize()); + child.ErasedRowCount_ = (ChildErasedRowCount += child.GetErasedRowCount()); Levels[0].PushChild(child); } @@ -478,7 +478,7 @@ namespace NKikimr::NTable::NPage { Levels.emplace_back(); Y_ABORT_UNLESS(Levels.size() < Max<ui32>(), "Levels size is out of bounds"); } - lastChild.PageId = pageId; + lastChild.PageId_ = pageId; Levels[levelIndex + 1].PushChild(lastChild); if (!last) { Levels[levelIndex + 1].PushKey(Levels[levelIndex].PopKey()); diff --git a/ydb/core/tablet_flat/flat_part_charge_btree_index.h b/ydb/core/tablet_flat/flat_part_charge_btree_index.h index 68cb63b39a..dee2c63bc6 100644 --- a/ydb/core/tablet_flat/flat_part_charge_btree_index.h +++ b/ydb/core/tablet_flat/flat_part_charge_btree_index.h @@ -74,7 +74,7 @@ public: const TRowId sliceBeginRowId = beginRowId, sliceEndRowId = endRowId; const auto& meta = Part->IndexPages.GetBTree({}); Y_ABORT_UNLESS(beginRowId < endRowId); - Y_ABORT_UNLESS(endRowId <= meta.RowCount); + Y_ABORT_UNLESS(endRowId <= meta.GetRowCount()); if (Y_UNLIKELY(key1 && key2 && Compare(key1, key2, keyDefaults) > 0)) { key2 = key1; // will not go further than key1 @@ -82,8 +82,8 @@ public: } TVector<TNodeState> level, nextLevel(::Reserve(3)); - TPageId key1PageId = key1 ? meta.PageId : Max<TPageId>(); - TPageId key2PageId = key2 ? meta.PageId : Max<TPageId>(); + TPageId key1PageId = key1 ? meta.GetPageId() : Max<TPageId>(); + TPageId key2PageId = key2 ? meta.GetPageId() : Max<TPageId>(); TChildState firstChild = BuildRootChildState(meta); const auto iterateLevel = [&](const auto& tryHandleChild) { @@ -139,17 +139,17 @@ public: if (child.PageId == key1PageId) { TRecIdx pos = node.Seek(ESeek::Lower, key1, Scheme.Groups[0].ColsKeyIdx, &keyDefaults); auto& key1Child = node.GetChild(pos); - key1PageId = key1Child.PageId; + key1PageId = key1Child.GetPageId(); if (pos) { - beginRowId = Max(beginRowId, node.GetChild(pos - 1).RowCount); // move beginRowId to the first key >= key1 + beginRowId = Max(beginRowId, node.GetChild(pos - 1).GetRowCount()); // move beginRowId to the first key >= key1 } } if (child.PageId == key2PageId) { TRecIdx pos = node.Seek(ESeek::Lower, key2, Scheme.Groups[0].ColsKeyIdx, &keyDefaults); auto& key2Child = node.GetChild(pos); - key2PageId = key2Child.PageId; - endRowId = Min(endRowId, key2Child.RowCount + 1); // move endRowId - 1 to the first key > key2 - if (key2Child.RowCount <= sliceBeginRowId) { + key2PageId = key2Child.GetPageId(); + endRowId = Min(endRowId, key2Child.GetRowCount() + 1); // move endRowId - 1 to the first key > key2 + if (key2Child.GetRowCount() <= sliceBeginRowId) { hasValidRowsRange = false; // key2 is before current slice endRowId = Max(endRowId, sliceBeginRowId + 1); // always load sliceBeginRowId regardless of key2 } @@ -224,7 +224,7 @@ public: const TRowId sliceBeginRowId = beginRowId, sliceEndRowId = endRowId; const auto& meta = Part->IndexPages.GetBTree({}); Y_ABORT_UNLESS(beginRowId < endRowId); - Y_ABORT_UNLESS(endRowId <= meta.RowCount); + Y_ABORT_UNLESS(endRowId <= meta.GetRowCount()); if (Y_UNLIKELY(key1 && key2 && Compare(key2, key1, keyDefaults) > 0)) { key2 = key1; // will not go further than key1 @@ -233,8 +233,8 @@ public: // level's nodes is in reverse order TVector<TNodeState> level, nextLevel(::Reserve(3)); - TPageId key1PageId = key1 ? meta.PageId : Max<TPageId>(); - TPageId key2PageId = key2 ? meta.PageId : Max<TPageId>(); + TPageId key1PageId = key1 ? meta.GetPageId() : Max<TPageId>(); + TPageId key2PageId = key2 ? meta.GetPageId() : Max<TPageId>(); TChildState lastChild = BuildRootChildState(meta); const auto iterateLevel = [&](const auto& tryHandleChild) { @@ -290,16 +290,16 @@ public: if (child.PageId == key1PageId) { TRecIdx pos = node.SeekReverse(ESeek::Lower, key1, Scheme.Groups[0].ColsKeyIdx, &keyDefaults); auto& key1Child = node.GetChild(pos); - key1PageId = key1Child.PageId; - endRowId = Min(endRowId, key1Child.RowCount); // move endRowId - 1 to the last key <= key1 + key1PageId = key1Child.GetPageId(); + endRowId = Min(endRowId, key1Child.GetRowCount()); // move endRowId - 1 to the last key <= key1 } if (child.PageId == key2PageId) { TRecIdx pos = node.Seek(ESeek::Lower, key2, Scheme.Groups[0].ColsKeyIdx, &keyDefaults); - key2PageId = node.GetChild(pos).PageId; + key2PageId = node.GetChild(pos).GetPageId(); if (pos) { auto& prevKey2Child = node.GetChild(pos - 1); - beginRowId = Max(beginRowId, prevKey2Child.RowCount - 1); // move beginRowId to the last key < key2 - if (prevKey2Child.RowCount >= sliceEndRowId) { + beginRowId = Max(beginRowId, prevKey2Child.GetRowCount() - 1); // move beginRowId to the last key < key2 + if (prevKey2Child.GetRowCount() >= sliceEndRowId) { hasValidRowsRange = false; // key2 is after current slice beginRowId = Min(beginRowId, sliceEndRowId - 1); // always load endRowId - 1 regardless of keys } @@ -586,10 +586,10 @@ private: const TGroupId groupId(0, true); const auto& meta = Part->IndexPages.GetBTree(TGroupId{0, true}); - TRowId beginRowId = 0, endRowId = meta.RowCount; + TRowId beginRowId = 0, endRowId = meta.GetRowCount(); TVector<TNodeState> level, nextLevel(::Reserve(3)); - TPageId key1PageId = meta.PageId, key2PageId = meta.PageId; + TPageId key1PageId = meta.GetPageId(), key2PageId = meta.GetPageId(); const auto iterateLevel = [&](const auto& tryHandleChild) { for (const auto &node : level) { @@ -625,16 +625,16 @@ private: if (child.PageId == key1PageId) { TRecIdx pos = node.Seek(ESeek::Lower, key1, scheme.ColsKeyIdx, keyDefaults); auto& key1Child = node.GetShortChild(pos); - key1PageId = key1Child.PageId; + key1PageId = key1Child.GetPageId(); if (pos) { - beginRowId = Max(beginRowId, node.GetShortChild(pos - 1).RowCount); // move beginRowId to the first key >= key1 + beginRowId = Max(beginRowId, node.GetShortChild(pos - 1).GetRowCount()); // move beginRowId to the first key >= key1 } } if (child.PageId == key2PageId) { TRecIdx pos = node.Seek(ESeek::Lower, key2, scheme.ColsKeyIdx, keyDefaults); auto& key2Child = node.GetShortChild(pos); - key2PageId = key2Child.PageId; - endRowId = Min(endRowId, key2Child.RowCount); // move endRowId to the first key > key2 + key2PageId = key2Child.GetPageId(); + endRowId = Min(endRowId, key2Child.GetRowCount()); // move endRowId to the first key > key2 } return true; } else { @@ -704,7 +704,7 @@ private: private: ui64 GetPrevBytes(const TBtreeIndexMeta& meta, TRowId rowId) const { - TPageId pageId = meta.PageId; + TPageId pageId = meta.GetPageId(); ui64 result = 0; for (ui32 height = 0; height < meta.LevelCount; height++) { @@ -714,9 +714,9 @@ private: } auto node = TBtreeIndexNode(*page); auto pos = node.Seek(rowId); - pageId = node.GetShortChild(pos).PageId; + pageId = node.GetShortChild(pos).GetPageId(); if (pos) { - result = node.GetShortChild(pos - 1).DataSize; + result = node.GetShortChild(pos - 1).GetDataSize(); } } @@ -724,8 +724,8 @@ private: } ui64 GetBytes(TBtreeIndexMeta meta, TRowId rowId) const { - TPageId pageId = meta.PageId; - ui64 result = meta.DataSize; + TPageId pageId = meta.GetPageId(); + ui64 result = meta.GetDataSize(); for (ui32 height = 0; height < meta.LevelCount; height++) { auto page = Env->TryGetPage(Part, pageId, {}); @@ -734,8 +734,8 @@ private: } auto node = TBtreeIndexNode(*page); auto pos = node.Seek(rowId); - pageId = node.GetShortChild(pos).PageId; - result = node.GetShortChild(pos).DataSize; + pageId = node.GetShortChild(pos).GetPageId(); + result = node.GetShortChild(pos).GetDataSize(); } return result; @@ -778,24 +778,24 @@ private: } TChildState BuildRootChildState(const TBtreeIndexMeta& meta) const noexcept { - return TChildState(meta.PageId, - 0, meta.RowCount, + return TChildState(meta.GetPageId(), + 0, meta.GetRowCount(), 0, meta.GetNonErasedRowCount(), - 0, meta.DataSize); + 0, meta.GetDataSize()); } TChildState BuildChildState(const TNodeState& parent, TChild child, const TChild* prevChild) const noexcept { - return TChildState(child.PageId, - prevChild ? prevChild->RowCount : parent.BeginRowId, child.RowCount, + return TChildState(child.GetPageId(), + prevChild ? prevChild->GetRowCount() : parent.BeginRowId, child.GetRowCount(), prevChild ? prevChild->GetNonErasedRowCount() : parent.PrevItems, child.GetNonErasedRowCount(), - prevChild ? prevChild->DataSize : parent.PrevBytes, child.DataSize); + prevChild ? prevChild->GetDataSize() : parent.PrevBytes, child.GetDataSize()); } TChildState BuildChildState(const TNodeState& parent, TShortChild child, const TShortChild* prevChild) const noexcept { - return TChildState(child.PageId, - prevChild ? prevChild->RowCount : parent.BeginRowId, child.RowCount, - prevChild ? prevChild->RowCount : parent.BeginRowId, child.RowCount, - prevChild ? prevChild->DataSize : parent.PrevBytes, child.DataSize); + return TChildState(child.GetPageId(), + prevChild ? prevChild->GetRowCount() : parent.BeginRowId, child.GetRowCount(), + prevChild ? prevChild->GetRowCount() : parent.BeginRowId, child.GetRowCount(), + prevChild ? prevChild->GetDataSize() : parent.PrevBytes, child.GetDataSize()); } bool LimitExceeded(ui64 prev, ui64 current, ui64 limit) const noexcept { diff --git a/ydb/core/tablet_flat/flat_part_dump.cpp b/ydb/core/tablet_flat/flat_part_dump.cpp index 8908c088df..e1bdd4e253 100644 --- a/ydb/core/tablet_flat/flat_part_dump.cpp +++ b/ydb/core/tablet_flat/flat_part_dump.cpp @@ -304,14 +304,14 @@ namespace { } auto dumpChild = [&] (NPage::TBtreeIndexNode::TChild child) { - if (part.GetPageType(child.PageId, {}) == EPage::BTreeIndex) { + if (part.GetPageType(child.GetPageId(), {}) == EPage::BTreeIndex) { BTreeIndexNode(part, child, level + 1); } else { Out << intend << " | " << child.ToString() << Endl; } }; - auto page = Env->TryGetPage(&part, meta.PageId, {}); + auto page = Env->TryGetPage(&part, meta.GetPageId(), {}); if (!page) { Out << intend << " | -- the rest of the index pages aren't loaded" << Endl; return; diff --git a/ydb/core/tablet_flat/flat_part_index_iter_bree_index.h b/ydb/core/tablet_flat/flat_part_index_iter_bree_index.h index d686aedfa6..9185a04a4c 100644 --- a/ydb/core/tablet_flat/flat_part_index_iter_bree_index.h +++ b/ydb/core/tablet_flat/flat_part_index_iter_bree_index.h @@ -118,7 +118,7 @@ public: , State(Reserve(Meta.LevelCount + 1)) { const static TCellsIterable EmptyKey(static_cast<const char*>(nullptr), TColumns()); - State.emplace_back(Meta.PageId, 0, GetEndRowId(), EmptyKey, EmptyKey); + State.emplace_back(Meta.GetPageId(), 0, GetEndRowId(), EmptyKey, EmptyKey); } EReady Seek(TRowId rowId) override { @@ -246,7 +246,7 @@ public: } TRowId GetEndRowId() const override { - return Meta.RowCount; + return Meta.GetRowCount(); } TPageId GetPageId() const override { @@ -346,13 +346,13 @@ private: auto& child = current.Node->GetShortChild(pos); - TRowId beginRowId = pos ? current.Node->GetShortChild(pos - 1).RowCount : current.BeginRowId; - TRowId endRowId = child.RowCount; - + TPageId pageId = child.GetPageId(); + TRowId beginRowId = pos ? current.Node->GetShortChild(pos - 1).GetRowCount() : current.BeginRowId; + TRowId endRowId = child.GetRowCount(); TCellsIterable beginKey = pos ? current.Node->GetKeyCellsIterable(pos - 1, GroupInfo.ColsKeyIdx) : current.BeginKey; TCellsIterable endKey = pos < current.Node->GetKeysCount() ? current.Node->GetKeyCellsIterable(pos, GroupInfo.ColsKeyIdx) : current.EndKey; - State.emplace_back(child.PageId, beginRowId, endRowId, beginKey, endKey); + State.emplace_back(pageId, beginRowId, endRowId, beginKey, endKey); } bool TryLoad(TNodeState& state) { diff --git a/ydb/core/tablet_flat/flat_part_loader.cpp b/ydb/core/tablet_flat/flat_part_loader.cpp index fad1d99f59..164903684b 100644 --- a/ydb/core/tablet_flat/flat_part_loader.cpp +++ b/ydb/core/tablet_flat/flat_part_loader.cpp @@ -140,7 +140,7 @@ void TLoader::StageParseMeta() noexcept << " " << Packs.size() << "s " << meta.TotalPages() << "pg" << ", Scheme " << SchemeId << ", FlatIndex " << (FlatGroupIndexes.size() ? FlatGroupIndexes[0] : Max<TPageId>()) - << ", BTreeIndex " << (BTreeGroupIndexes.size() ? BTreeGroupIndexes[0].PageId : Max<TPageId>()) + << ", BTreeIndex " << (BTreeGroupIndexes.size() ? BTreeGroupIndexes[0].GetPageId() : Max<TPageId>()) << ", Blobs " << GlobsId << ", Small " << SmallId << ", Large " << LargeId << ", ByKey " << ByKeyId << ", Garbage " << GarbageStatsId diff --git a/ydb/core/tablet_flat/flat_part_writer.h b/ydb/core/tablet_flat/flat_part_writer.h index c9dafac34e..bef4e44a51 100644 --- a/ydb/core/tablet_flat/flat_part_writer.h +++ b/ydb/core/tablet_flat/flat_part_writer.h @@ -672,13 +672,13 @@ namespace NTable { for (bool history : {false, true}) { for (auto meta : history ? Current.BTreeHistoricIndexes : Current.BTreeGroupIndexes) { auto m = history ? lay->AddBTreeHistoricIndexes() : lay->AddBTreeGroupIndexes(); - m->SetRootPageId(meta.PageId); + m->SetRootPageId(meta.GetPageId()); m->SetLevelCount(meta.LevelCount); m->SetIndexSize(meta.IndexSize); - m->SetDataSize(meta.DataSize); - m->SetGroupDataSize(meta.GroupDataSize); - m->SetRowCount(meta.RowCount); - m->SetErasedRowCount(meta.ErasedRowCount); + m->SetDataSize(meta.GetDataSize()); + m->SetGroupDataSize(meta.GetGroupDataSize()); + m->SetRowCount(meta.GetRowCount()); + m->SetErasedRowCount(meta.GetErasedRowCount()); } } } diff --git a/ydb/core/tablet_flat/flat_stat_part_group_btree_index.h b/ydb/core/tablet_flat/flat_stat_part_group_btree_index.h index 3c1ff86ec5..24c3ce1302 100644 --- a/ydb/core/tablet_flat/flat_stat_part_group_btree_index.h +++ b/ydb/core/tablet_flat/flat_stat_part_group_btree_index.h @@ -58,7 +58,7 @@ public: bool ready = true; TVector<TNodeState> nextNodes; - Nodes.emplace_back(Meta.PageId, 0, GetEndRowId(), EmptyKey, 0, Meta.DataSize); + Nodes.emplace_back(Meta.GetPageId(), 0, GetEndRowId(), EmptyKey, 0, Meta.GetDataSize()); for (ui32 height = 0; height < Meta.LevelCount; height++) { bool hasChanges = false; @@ -86,13 +86,14 @@ public: for (TRecIdx pos : xrange<TRecIdx>(0, node.GetChildrenCount())) { auto& child = node.GetShortChild(pos); - TRowId beginRowId = pos ? node.GetShortChild(pos - 1).RowCount : nodeState.BeginRowId; - TRowId endRowId = child.RowCount; + TPageId pageId = child.GetPageId(); + TRowId beginRowId = pos ? node.GetShortChild(pos - 1).GetRowCount() : nodeState.BeginRowId; + TRowId endRowId = child.GetRowCount(); TCellsIterable beginKey = pos ? node.GetKeyCellsIterable(pos - 1, GroupInfo.ColsKeyIdx) : nodeState.BeginKey; - ui64 beginDataSize = pos ? node.GetShortChild(pos - 1).DataSize : nodeState.BeginDataSize; - ui64 endDataSize = child.DataSize; + ui64 beginDataSize = pos ? node.GetShortChild(pos - 1).GetDataSize() : nodeState.BeginDataSize; + ui64 endDataSize = child.GetDataSize(); - nextNodes.emplace_back(child.PageId, beginRowId, endRowId, beginKey, beginDataSize, endDataSize); + nextNodes.emplace_back(pageId, beginRowId, endRowId, beginKey, beginDataSize, endDataSize); hasChanges = true; } } @@ -137,7 +138,7 @@ public: } TRowId GetEndRowId() const override { - return Meta.RowCount; + return Meta.GetRowCount(); } TPageId GetPageId() const override { diff --git a/ydb/core/tablet_flat/flat_stat_table_btree_index.h b/ydb/core/tablet_flat/flat_stat_table_btree_index.h index d7f64e720e..a82c8e70a4 100644 --- a/ydb/core/tablet_flat/flat_stat_table_btree_index.h +++ b/ydb/core/tablet_flat/flat_stat_table_btree_index.h @@ -21,11 +21,11 @@ ui64 GetPrevDataSize(const TPart* part, TGroupId groupId, TRowId rowId, IPages* if (rowId == 0) { return 0; } - if (rowId >= meta.RowCount) { - return meta.DataSize; + if (rowId >= meta.GetRowCount()) { + return meta.GetDataSize(); } - TPageId pageId = meta.PageId; + TPageId pageId = meta.GetPageId(); ui64 prevDataSize = 0; for (ui32 height = 0; height < meta.LevelCount; height++) { @@ -37,9 +37,9 @@ ui64 GetPrevDataSize(const TPart* part, TGroupId groupId, TRowId rowId, IPages* auto node = TBtreeIndexNode(*page); auto pos = node.Seek(rowId); - pageId = node.GetShortChild(pos).PageId; + pageId = node.GetShortChild(pos).GetPageId(); if (pos) { - prevDataSize = node.GetShortChild(pos - 1).DataSize; + prevDataSize = node.GetShortChild(pos - 1).GetDataSize(); } } @@ -55,12 +55,12 @@ ui64 GetPrevHistoricDataSize(const TPart* part, TGroupId groupId, TRowId rowId, historicRowId = 0; return 0; } - if (rowId >= part->IndexPages.GetBTree({}).RowCount) { - historicRowId = meta.RowCount; - return meta.DataSize; + if (rowId >= part->IndexPages.GetBTree({}).GetRowCount()) { + historicRowId = meta.GetRowCount(); + return meta.GetDataSize(); } - TPageId pageId = meta.PageId; + TPageId pageId = meta.GetPageId(); ui64 prevDataSize = 0; historicRowId = 0; @@ -83,11 +83,11 @@ ui64 GetPrevHistoricDataSize(const TPart* part, TGroupId groupId, TRowId rowId, auto node = TBtreeIndexNode(*page); auto pos = node.Seek(ESeek::Lower, key1, part->Scheme->HistoryGroup.ColsKeyIdx, part->Scheme->HistoryKeys.Get()); - pageId = node.GetShortChild(pos).PageId; + pageId = node.GetShortChild(pos).GetPageId(); if (pos) { const auto& prevChild = node.GetShortChild(pos - 1); - prevDataSize = prevChild.DataSize; - historicRowId = prevChild.RowCount; + prevDataSize = prevChild.GetDataSize(); + historicRowId = prevChild.GetRowCount(); } } diff --git a/ydb/core/tablet_flat/flat_stat_table_btree_index_histogram.h b/ydb/core/tablet_flat/flat_stat_table_btree_index_histogram.h index 367f41972a..78bb64b69c 100644 --- a/ydb/core/tablet_flat/flat_stat_table_btree_index_histogram.h +++ b/ydb/core/tablet_flat/flat_stat_table_btree_index_histogram.h @@ -46,7 +46,7 @@ public: struct TGetRowCount { static ui64 Get(const TChild& child) noexcept { - return child.RowCount; + return child.GetRowCount(); } }; @@ -153,7 +153,7 @@ public: auto& part = Subset.Flatten[index]; auto& meta = part->IndexPages.GetBTree({}); parts.emplace_back(part.Part.Get(), index); - LoadedStateNodes.emplace_back(meta.PageId, meta.LevelCount, 0, meta.RowCount, EmptyKey, EmptyKey, 0, TGetSize::Get(meta)); + LoadedStateNodes.emplace_back(meta.GetPageId(), meta.LevelCount, 0, meta.GetRowCount(), EmptyKey, EmptyKey, 0, TGetSize::Get(meta)); ready &= SlicePart<TGetSize>(parts.back(), *part.Slices, LoadedStateNodes.back()); endSize += parts.back().GetSize(); } @@ -446,8 +446,8 @@ private: for (auto pos : xrange(bTreeNode.GetChildrenCount())) { auto& child = bTreeNode.GetChild(pos); - LoadedStateNodes.emplace_back(child.PageId, parent.Level - 1, - pos ? bTreeNode.GetChild(pos - 1).RowCount : parent.BeginRowId, child.RowCount, + LoadedStateNodes.emplace_back(child.GetPageId(), parent.Level - 1, + pos ? bTreeNode.GetChild(pos - 1).GetRowCount() : parent.BeginRowId, child.GetRowCount(), pos ? bTreeNode.GetKeyCellsIterable(pos - 1, groupInfo.ColsKeyData) : parent.BeginKey, pos < bTreeNode.GetKeysCount() ? bTreeNode.GetKeyCellsIterable(pos, groupInfo.ColsKeyData) : parent.EndKey, pos ? TGetSize::Get(bTreeNode.GetChild(pos - 1)) : parent.BeginSize, TGetSize::Get(child)); diff --git a/ydb/core/tablet_flat/ut/ut_btree_index_nodes.cpp b/ydb/core/tablet_flat/ut/ut_btree_index_nodes.cpp index 78278bbe98..9e266f69f9 100644 --- a/ydb/core/tablet_flat/ut/ut_btree_index_nodes.cpp +++ b/ydb/core/tablet_flat/ut/ut_btree_index_nodes.cpp @@ -73,18 +73,18 @@ namespace { TChild child; if (node.IsShortChildFormat()) { auto shortChild = node.GetShortChild(pos); - child = {shortChild.PageId, shortChild.RowCount, shortChild.DataSize, 0, 0}; + child = {shortChild.GetPageId(), shortChild.GetRowCount(), shortChild.GetDataSize(), 0, 0}; } else { child = node.GetChild(pos); } - if (child.PageId < 1000) { + if (child.GetPageId() < 1000) { Dump(child, groupInfo, store, level + 1); } else { Cerr << intend << " | " << child.ToString() << Endl; } }; - auto node = TBtreeIndexNode(*store.GetPage(0, meta.PageId)); + auto node = TBtreeIndexNode(*store.GetPage(0, meta.GetPageId())); auto label = node.Label(); @@ -152,7 +152,7 @@ namespace { UNIT_ASSERT_VALUES_EQUAL(node.GetKeysCount() + 1, children.size()); for (TRecIdx i : xrange(node.GetKeysCount() + 1)) { UNIT_ASSERT_EQUAL(node.GetChild(i), children[i]); - TShortChild shortChild{children[i].PageId, children[i].RowCount, children[i].DataSize}; + TShortChild shortChild{children[i].GetPageId(), children[i].GetRowCount(), children[i].GetDataSize()}; UNIT_ASSERT_EQUAL(node.GetShortChild(i), shortChild); } } @@ -299,7 +299,7 @@ Y_UNIT_TEST_SUITE(TBtreeIndexNode) { writer.AddKey(deserialized.GetCells()); } for (auto &c : children) { - writer.AddChild({c.PageId, c.RowCount, c.DataSize, 0, 0}); + writer.AddChild({c.GetPageId(), c.GetRowCount(), c.GetDataSize(), 0, 0}); } auto serialized = writer.Finish(); @@ -343,7 +343,7 @@ Y_UNIT_TEST_SUITE(TBtreeIndexNode) { writer.AddKey(deserialized.GetCells()); } for (auto &c : children) { - writer.AddChild({c.PageId, c.RowCount, c.DataSize, 0, 0}); + writer.AddChild({c.GetPageId(), c.GetRowCount(), c.GetDataSize(), 0, 0}); } auto serialized = writer.Finish(); @@ -542,7 +542,7 @@ Y_UNIT_TEST_SUITE(TBtreeIndexBuilder) { TBtreeIndexMeta expected{{0, 1155, 11055, 22055, 385}, 1, 683}; UNIT_ASSERT_EQUAL_C(result, expected, "Got " + result.ToString()); - CheckKeys(result.PageId, keys, builder.GroupInfo, pager.Back()); + CheckKeys(result.GetPageId(), keys, builder.GroupInfo, pager.Back()); } Y_UNIT_TEST(FewNodes) { @@ -576,10 +576,10 @@ Y_UNIT_TEST_SUITE(TBtreeIndexBuilder) { TBtreeIndexMeta expected{{9, 0, 0, 0, 0}, 3, 1790}; for (auto c : children) { - expected.RowCount += c.RowCount; - expected.DataSize += c.DataSize; - expected.GroupDataSize += c.GroupDataSize; - expected.ErasedRowCount += c.ErasedRowCount; + expected.RowCount_ += c.GetRowCount(); + expected.DataSize_ += c.GetDataSize(); + expected.GroupDataSize_ += c.GetGroupDataSize(); + expected.ErasedRowCount_ += c.GetErasedRowCount(); } UNIT_ASSERT_EQUAL_C(result, expected, "Got " + result.ToString()); @@ -730,7 +730,7 @@ Y_UNIT_TEST_SUITE(TBtreeIndexTPart) { auto pages = IndexTools::CountMainPages(*part); UNIT_ASSERT_VALUES_EQUAL(pages, 2); - TBtreeIndexMeta expected{{part->IndexPages.BTreeGroups[0].PageId, 10, 10480, 0, 0}, 1, 1131}; + TBtreeIndexMeta expected{{part->IndexPages.BTreeGroups[0].GetPageId(), 10, 10480, 0, 0}, 1, 1131}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeGroups[0], expected, "Got " + part->IndexPages.BTreeGroups[0].ToString()); } @@ -763,7 +763,7 @@ Y_UNIT_TEST_SUITE(TBtreeIndexTPart) { auto pages = IndexTools::CountMainPages(*part); UNIT_ASSERT_VALUES_EQUAL(pages, 117); - TBtreeIndexMeta expected{{part->IndexPages.BTreeGroups[0].PageId, 700, 733140, 0, 0}, 3, 87172}; + TBtreeIndexMeta expected{{part->IndexPages.BTreeGroups[0].GetPageId(), 700, 733140, 0, 0}, 3, 87172}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeGroups[0], expected, "Got " + part->IndexPages.BTreeGroups[0].ToString()); } @@ -797,7 +797,7 @@ Y_UNIT_TEST_SUITE(TBtreeIndexTPart) { auto pages = IndexTools::CountMainPages(*part); UNIT_ASSERT_VALUES_EQUAL(pages, 31); - TBtreeIndexMeta expected{{part->IndexPages.BTreeGroups[0].PageId, 1000, 22098, 0, 143}, 2, 1668}; + TBtreeIndexMeta expected{{part->IndexPages.BTreeGroups[0].GetPageId(), 1000, 22098, 0, 143}, 2, 1668}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeGroups[0], expected, "Got " + part->IndexPages.BTreeGroups[0].ToString()); } @@ -831,10 +831,10 @@ Y_UNIT_TEST_SUITE(TBtreeIndexTPart) { auto pages = IndexTools::CountMainPages(*part); UNIT_ASSERT_VALUES_EQUAL(pages, 334); - TBtreeIndexMeta expected0{{part->IndexPages.BTreeGroups[0].PageId, 1000, 16680, 21890, 0}, 3, 18430}; + TBtreeIndexMeta expected0{{part->IndexPages.BTreeGroups[0].GetPageId(), 1000, 16680, 21890, 0}, 3, 18430}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeGroups[0], expected0, "Got " + part->IndexPages.BTreeGroups[0].ToString()); - TBtreeIndexMeta expected1{{part->IndexPages.BTreeGroups[1].PageId, 1000, 21890, 0, 0}, 3, 6497}; + TBtreeIndexMeta expected1{{part->IndexPages.BTreeGroups[1].GetPageId(), 1000, 21890, 0, 0}, 3, 6497}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeGroups[1], expected1, "Got " + part->IndexPages.BTreeGroups[1].ToString()); } @@ -876,16 +876,16 @@ Y_UNIT_TEST_SUITE(TBtreeIndexTPart) { ui64 dataSizeHist0 = IndexTools::CountDataSize(*part, TGroupId{0, 1}); ui64 dataSizeHist1 = IndexTools::CountDataSize(*part, TGroupId{1, 1}); - TBtreeIndexMeta expected0{{part->IndexPages.BTreeGroups[0].PageId, 1000, dataSize0, dataSize1+dataSizeHist0+dataSizeHist1, 0}, 3, 18430}; + TBtreeIndexMeta expected0{{part->IndexPages.BTreeGroups[0].GetPageId(), 1000, dataSize0, dataSize1+dataSizeHist0+dataSizeHist1, 0}, 3, 18430}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeGroups[0], expected0, "Got " + part->IndexPages.BTreeGroups[0].ToString()); - TBtreeIndexMeta expected1{{part->IndexPages.BTreeGroups[1].PageId, 1000, dataSize1, 0, 0}, 3, 8284}; + TBtreeIndexMeta expected1{{part->IndexPages.BTreeGroups[1].GetPageId(), 1000, dataSize1, 0, 0}, 3, 8284}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeGroups[1], expected1, "Got " + part->IndexPages.BTreeGroups[1].ToString()); - TBtreeIndexMeta expectedHist0{{part->IndexPages.BTreeHistoric[0].PageId, 2000, dataSizeHist0, 0, 0}, 4, 34225}; + TBtreeIndexMeta expectedHist0{{part->IndexPages.BTreeHistoric[0].GetPageId(), 2000, dataSizeHist0, 0, 0}, 4, 34225}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeHistoric[0], expectedHist0, "Got " + part->IndexPages.BTreeHistoric[0].ToString()); - TBtreeIndexMeta expectedHist1{{part->IndexPages.BTreeHistoric[1].PageId, 2000, dataSizeHist1, 0, 0}, 3, 16645}; + TBtreeIndexMeta expectedHist1{{part->IndexPages.BTreeHistoric[1].GetPageId(), 2000, dataSizeHist1, 0, 0}, 3, 16645}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeHistoric[1], expectedHist1, "Got " + part->IndexPages.BTreeHistoric[1].ToString()); } @@ -930,16 +930,16 @@ Y_UNIT_TEST_SUITE(TBtreeIndexTPart) { ui64 dataSizeHist1 = IndexTools::CountDataSize(*part, TGroupId{1, 1}); ui64 groupDataSize = dataSize1+dataSizeHist0+dataSizeHist1 + 120463 + 7413329; - TBtreeIndexMeta expected0{{part->IndexPages.BTreeGroups[0].PageId, 1000, dataSize0, groupDataSize, 0}, 3, 18430}; + TBtreeIndexMeta expected0{{part->IndexPages.BTreeGroups[0].GetPageId(), 1000, dataSize0, groupDataSize, 0}, 3, 18430}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeGroups[0], expected0, "Got " + part->IndexPages.BTreeGroups[0].ToString()); - TBtreeIndexMeta expected1{{part->IndexPages.BTreeGroups[1].PageId, 1000, dataSize1, 0, 0}, 3, 6497}; + TBtreeIndexMeta expected1{{part->IndexPages.BTreeGroups[1].GetPageId(), 1000, dataSize1, 0, 0}, 3, 6497}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeGroups[1], expected1, "Got " + part->IndexPages.BTreeGroups[1].ToString()); - TBtreeIndexMeta expectedHist0{{part->IndexPages.BTreeHistoric[0].PageId, 2000, dataSizeHist0, 0, 0}, 4, 34225}; + TBtreeIndexMeta expectedHist0{{part->IndexPages.BTreeHistoric[0].GetPageId(), 2000, dataSizeHist0, 0, 0}, 4, 34225}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeHistoric[0], expectedHist0, "Got " + part->IndexPages.BTreeHistoric[0].ToString()); - TBtreeIndexMeta expectedHist1{{part->IndexPages.BTreeHistoric[1].PageId, 2000, dataSizeHist1, 0, 0}, 3, 13014}; + TBtreeIndexMeta expectedHist1{{part->IndexPages.BTreeHistoric[1].GetPageId(), 2000, dataSizeHist1, 0, 0}, 3, 13014}; UNIT_ASSERT_EQUAL_C(part->IndexPages.BTreeHistoric[1], expectedHist1, "Got " + part->IndexPages.BTreeHistoric[1].ToString()); } } diff --git a/ydb/core/tablet_flat/ut/ut_charge.cpp b/ydb/core/tablet_flat/ut/ut_charge.cpp index dde747f327..36bc354559 100644 --- a/ydb/core/tablet_flat/ut/ut_charge.cpp +++ b/ydb/core/tablet_flat/ut/ut_charge.cpp @@ -333,10 +333,10 @@ namespace { } for (auto &x : pages.BTreeGroups) { - result.insert({mainGroupId, x.PageId}); + result.insert({mainGroupId, x.GetPageId()}); } for (auto &x : pages.BTreeHistoric) { - result.insert({mainGroupId, x.PageId}); + result.insert({mainGroupId, x.GetPageId()}); } return result; diff --git a/ydb/core/tablet_flat/ut/ut_stat.cpp b/ydb/core/tablet_flat/ut/ut_stat.cpp index f13bc4ec9c..a021514725 100644 --- a/ydb/core/tablet_flat/ut/ut_stat.cpp +++ b/ydb/core/tablet_flat/ut/ut_stat.cpp @@ -108,7 +108,7 @@ namespace { ui64 byIndexBytes = 0; for (const auto& part : subset.Flatten) { auto &root = part->IndexPages.GetBTree({}); - byIndexBytes += root.DataSize + root.GroupDataSize; + byIndexBytes += root.GetDataSize() + root.GetGroupDataSize(); } UNIT_ASSERT_VALUES_EQUAL(byIndexBytes, expectedData); } |