aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksei Borzenkov <snaury@ydb.tech>2024-12-24 19:37:21 +0300
committerGitHub <noreply@github.com>2024-12-24 16:37:21 +0000
commitbffc72762715463d8ed95fea5e62d67e169a3749 (patch)
tree760ee2110841b8ba8b3c792c1f7ce9025c6460bd
parentcb9731fda6c2a5c546d633438f7a33edda846a96 (diff)
downloadydb-bffc72762715463d8ed95fea5e62d67e169a3749.tar.gz
Use sized operator delete for TOwnedCellVec (#12928)
-rw-r--r--ydb/core/scheme/scheme_tablecell.cpp20
-rw-r--r--ydb/core/scheme/scheme_tablecell.h20
-rw-r--r--ydb/core/scheme/scheme_tablecell_ut.cpp2
3 files changed, 17 insertions, 25 deletions
diff --git a/ydb/core/scheme/scheme_tablecell.cpp b/ydb/core/scheme/scheme_tablecell.cpp
index 4a5e0502ab..d7dd5b57f9 100644
--- a/ydb/core/scheme/scheme_tablecell.cpp
+++ b/ydb/core/scheme/scheme_tablecell.cpp
@@ -112,8 +112,11 @@ namespace {
} // namespace
-void TOwnedCellVec::TData::operator delete(void* mem) noexcept {
- ::free(mem);
+void TOwnedCellVec::TData::operator delete(TData* data, std::destroying_delete_t) noexcept {
+ void* ptr = data;
+ size_t size = data->DataSize;
+ data->~TData();
+ ::operator delete(ptr, size);
}
TOwnedCellVec::TInit TOwnedCellVec::Allocate(TOwnedCellVec::TCellVec cells) {
@@ -124,7 +127,6 @@ TOwnedCellVec::TInit TOwnedCellVec::Allocate(TOwnedCellVec::TCellVec cells) {
return TInit{
TCellVec(),
nullptr,
- 0,
};
}
@@ -136,7 +138,7 @@ TOwnedCellVec::TInit TOwnedCellVec::Allocate(TOwnedCellVec::TCellVec cells) {
}
}
- void* mem = ::malloc(size);
+ void* mem = ::operator new(size);
if (Y_UNLIKELY(!mem)) {
throw std::bad_alloc();
}
@@ -165,8 +167,7 @@ TOwnedCellVec::TInit TOwnedCellVec::Allocate(TOwnedCellVec::TCellVec cells) {
return TInit {
cellvec,
- new (mem) TData(),
- size,
+ new (mem) TData(size),
};
}
@@ -176,7 +177,6 @@ TOwnedCellVec::TInit TOwnedCellVec::AllocateFromSerialized(std::string_view data
return TInit{
TCellVec(),
nullptr,
- 0,
};
}
@@ -192,7 +192,6 @@ TOwnedCellVec::TInit TOwnedCellVec::AllocateFromSerialized(std::string_view data
return TInit{
TCellVec(),
nullptr,
- 0,
};
}
@@ -210,7 +209,7 @@ TOwnedCellVec::TInit TOwnedCellVec::AllocateFromSerialized(std::string_view data
}
}
- void* mem = ::malloc(size);
+ void* mem = ::operator new(size);
if (Y_UNLIKELY(!mem)) {
throw std::bad_alloc();
}
@@ -245,8 +244,7 @@ TOwnedCellVec::TInit TOwnedCellVec::AllocateFromSerialized(std::string_view data
return TInit {
cellvec,
- new (mem) TData(),
- size,
+ new (mem) TData(size),
};
}
diff --git a/ydb/core/scheme/scheme_tablecell.h b/ydb/core/scheme/scheme_tablecell.h
index a4cb6a4c34..74c3cfeaab 100644
--- a/ydb/core/scheme/scheme_tablecell.h
+++ b/ydb/core/scheme/scheme_tablecell.h
@@ -420,21 +420,23 @@ private:
class TData : public TAtomicRefCount<TData> {
public:
- TData() = default;
+ const size_t DataSize;
- void operator delete(void* mem) noexcept;
+ explicit TData(size_t size)
+ : DataSize(size)
+ {}
+
+ void operator delete(TData* data, std::destroying_delete_t) noexcept;
};
struct TInit {
TCellVec Cells;
TIntrusivePtr<TData> Data;
- size_t DataSize;
};
TOwnedCellVec(TInit init) noexcept
: TCellVec(std::move(init.Cells))
, Data(std::move(init.Data))
- , DataSize_(init.DataSize)
{ }
static TInit Allocate(TCellVec cells);
@@ -448,7 +450,6 @@ private:
public:
TOwnedCellVec() noexcept
: TCellVec()
- , DataSize_(0)
{ }
explicit TOwnedCellVec(TCellVec cells)
@@ -466,22 +467,18 @@ public:
TOwnedCellVec(const TOwnedCellVec& rhs) noexcept
: TCellVec(rhs)
, Data(rhs.Data)
- , DataSize_(rhs.DataSize_)
{ }
TOwnedCellVec(TOwnedCellVec&& rhs) noexcept
: TCellVec(rhs)
, Data(std::move(rhs.Data))
- , DataSize_(rhs.DataSize_)
{
rhs.CellVec() = { };
- rhs.DataSize_ = 0;
}
TOwnedCellVec& operator=(const TOwnedCellVec& rhs) noexcept {
if (Y_LIKELY(this != &rhs)) {
Data = rhs.Data;
- DataSize_ = rhs.DataSize_;
CellVec() = rhs;
}
@@ -491,22 +488,19 @@ public:
TOwnedCellVec& operator=(TOwnedCellVec&& rhs) noexcept {
if (Y_LIKELY(this != &rhs)) {
Data = std::move(rhs.Data);
- DataSize_ = rhs.DataSize_;
CellVec() = rhs;
rhs.CellVec() = { };
- rhs.DataSize_ = 0;
}
return *this;
}
size_t DataSize() const {
- return DataSize_;
+ return Data ? Data->DataSize : 0;
}
private:
TIntrusivePtr<TData> Data;
- size_t DataSize_;
};
static_assert(std::is_nothrow_destructible_v<TOwnedCellVec>, "Expected TOwnedCellVec to be nothrow destructible");
diff --git a/ydb/core/scheme/scheme_tablecell_ut.cpp b/ydb/core/scheme/scheme_tablecell_ut.cpp
index fcc21a16cd..8d1a1008f5 100644
--- a/ydb/core/scheme/scheme_tablecell_ut.cpp
+++ b/ydb/core/scheme/scheme_tablecell_ut.cpp
@@ -95,7 +95,7 @@ Y_UNIT_TEST_SUITE(Scheme) {
UNIT_ASSERT_VALUES_EQUAL(twoLargeCells[0].AsBuf(), TStringBuf("zyxwvutsrqponmlkjihgfedcba987654321"));
UNIT_ASSERT_VALUES_EQUAL(twoLargeCells[1].AsBuf(), TStringBuf("ZYXWVUTSRQPONMLKJIHGFEDCBA987654321"));
// Ensure cell data is aligned (36 bytes per cell instead of 35)
- UNIT_ASSERT_VALUES_EQUAL(twoLargeCells.DataSize(), 8 + sizeof(TCell) * 2 + 36 * 2);
+ UNIT_ASSERT_VALUES_EQUAL(twoLargeCells.DataSize(), 16 + sizeof(TCell) * 2 + 36 * 2);
UNIT_ASSERT_VALUES_EQUAL(uintptr_t(twoLargeCells[0].Data()) & 3, 0);
UNIT_ASSERT_VALUES_EQUAL(uintptr_t(twoLargeCells[1].Data()) & 3, 0);
}