aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/minikql/aligned_page_pool.cpp
diff options
context:
space:
mode:
authorilezhankin <ilezhankin@yandex-team.com>2025-03-03 18:46:45 +0300
committerilezhankin <ilezhankin@yandex-team.com>2025-03-03 19:11:56 +0300
commit2bc1762eb4cc1110a3dfe6195ec4ee7423a9e30e (patch)
tree0a541f3fe92ea9be796025c0354d5efeef387bb4 /yql/essentials/minikql/aligned_page_pool.cpp
parent46a0810e4806b6d9769174f0d9ce3c342b273960 (diff)
downloadydb-2bc1762eb4cc1110a3dfe6195ec4ee7423a9e30e.tar.gz
Implement and use a page arena for small Arrow allocations
commit_hash:2bcb57a12fbb750db7b33872e2cfbec66bdf6405
Diffstat (limited to 'yql/essentials/minikql/aligned_page_pool.cpp')
-rw-r--r--yql/essentials/minikql/aligned_page_pool.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/yql/essentials/minikql/aligned_page_pool.cpp b/yql/essentials/minikql/aligned_page_pool.cpp
index 04aab1bd8a..bcbb3edd11 100644
--- a/yql/essentials/minikql/aligned_page_pool.cpp
+++ b/yql/essentials/minikql/aligned_page_pool.cpp
@@ -783,6 +783,40 @@ void* GetAlignedPage(ui64 size) {
}
template<typename TMmap>
+void* GetAlignedPage() {
+ const auto size = TAlignedPagePool::POOL_PAGE_SIZE;
+ auto& globalPool = TGlobalPools<TMmap, false>::Instance();
+
+ if (auto* page = globalPool.Get(0).GetPage()) {
+ return page;
+ }
+
+ auto allocSize = size * 2;
+ void* unalignedPtr = globalPool.DoMmap(allocSize);
+ if (Y_UNLIKELY(MAP_FAILED == unalignedPtr)) {
+ TStringStream mmaps;
+ const auto lastError = LastSystemError();
+ if (lastError == ENOMEM) {
+ mmaps << GetMemoryMapsString();
+ }
+
+ ythrow yexception() << "Mmap failed to allocate " << allocSize << " bytes: "
+ << LastSystemErrorText(lastError) << mmaps.Str();
+ }
+
+ void* page = AlignUp(unalignedPtr, size);
+
+ // Unmap unaligned prefix before offset and tail after aligned page
+ const size_t offset = (intptr_t)page - (intptr_t)unalignedPtr;
+ if (Y_UNLIKELY(offset)) {
+ globalPool.DoMunmap(unalignedPtr, offset);
+ globalPool.DoMunmap((ui8*)page + size, size - offset);
+ }
+
+ return page;
+}
+
+template<typename TMmap>
void ReleaseAlignedPage(void* mem, ui64 size) {
size = AlignUp(size, SYS_PAGE_SIZE);
if (size < TAlignedPagePool::POOL_PAGE_SIZE) {
@@ -801,6 +835,11 @@ void ReleaseAlignedPage(void* mem, ui64 size) {
}
template<typename TMmap>
+void ReleaseAlignedPage(void* ptr) {
+ TGlobalPools<TMmap, false>::Instance().PushPage(0, ptr);
+}
+
+template<typename TMmap>
i64 GetTotalMmapedBytes() {
return TGlobalPools<TMmap, true>::Instance().GetTotalMmappedBytes() + TGlobalPools<TMmap, false>::Instance().GetTotalMmappedBytes();
}
@@ -822,10 +861,18 @@ template void* GetAlignedPage<>(ui64);
template void* GetAlignedPage<TFakeAlignedMmap>(ui64);
template void* GetAlignedPage<TFakeUnalignedMmap>(ui64);
+template void* GetAlignedPage<>();
+template void* GetAlignedPage<TFakeAlignedMmap>();
+template void* GetAlignedPage<TFakeUnalignedMmap>();
+
template void ReleaseAlignedPage<>(void*,ui64);
template void ReleaseAlignedPage<TFakeAlignedMmap>(void*,ui64);
template void ReleaseAlignedPage<TFakeUnalignedMmap>(void*,ui64);
+template void ReleaseAlignedPage<>(void*);
+template void ReleaseAlignedPage<TFakeAlignedMmap>(void*);
+template void ReleaseAlignedPage<TFakeUnalignedMmap>(void*);
+
size_t GetMemoryMapsCount() {
size_t lineCount = 0;
TString line;