diff options
author | innokentii <innokentii@yandex-team.com> | 2022-11-14 14:20:53 +0300 |
---|---|---|
committer | innokentii <innokentii@yandex-team.com> | 2022-11-14 14:20:53 +0300 |
commit | 7498e8ebce130b426f39a04a925842fca21a52f2 (patch) | |
tree | d8be3455fa7a98257191110d7eae1e9b257f9f34 | |
parent | 6c32f50a2ea79060b1d1724b915a6965c78d18c6 (diff) | |
download | ydb-7498e8ebce130b426f39a04a925842fca21a52f2.tar.gz |
Improve TContiguouseData interface
improve TContiguousData interface
-rw-r--r-- | library/cpp/actors/util/contiguous_data.h | 26 | ||||
-rw-r--r-- | library/cpp/actors/util/contiguous_data_ut.cpp | 23 | ||||
-rw-r--r-- | ydb/core/erasure/erasure.cpp | 7 |
3 files changed, 44 insertions, 12 deletions
diff --git a/library/cpp/actors/util/contiguous_data.h b/library/cpp/actors/util/contiguous_data.h index 382b19f82c..d7123ca457 100644 --- a/library/cpp/actors/util/contiguous_data.h +++ b/library/cpp/actors/util/contiguous_data.h @@ -882,6 +882,16 @@ public: } } + static TContiguousData Copy(TContiguousSpan data, size_t headroom = 0, size_t tailroom = 0) { + TContiguousData res = Uninitialized(data.size(), headroom, tailroom); + std::memcpy(res.UnsafeGetDataMut(), data.GetData(), data.GetSize()); + return res; + } + + static TContiguousData Copy(const char* data, size_t size, size_t headroom = 0, size_t tailroom = 0) { + return Copy({data, size}, headroom, tailroom); + } + static NActors::TSharedData UninitializedSharedData(size_t size) { return NActors::TSharedData::AttachUnsafe(TBackend::TSharedDataControllingOwner::Allocate(size), size); } @@ -1062,10 +1072,18 @@ public: } } - void Trim(size_t size, size_t frontOffset = 0) { - Y_VERIFY(size <= End - Begin - frontOffset); - Begin = Begin + frontOffset; - End = Begin + size; + void TrimBack(size_t size) { + Y_VERIFY(size <= GetSize()); + End = End - (GetSize() - size); + } + + void TrimFront(size_t size) { + Y_VERIFY(size <= GetSize()); + Begin = Begin + (GetSize() - size); + } + + char* Detach() { + return GetDataMut(); } size_t UnsafeHeadroom() const { diff --git a/library/cpp/actors/util/contiguous_data_ut.cpp b/library/cpp/actors/util/contiguous_data_ut.cpp index b7b9029f85..6452e748b8 100644 --- a/library/cpp/actors/util/contiguous_data_ut.cpp +++ b/library/cpp/actors/util/contiguous_data_ut.cpp @@ -50,6 +50,16 @@ Y_UNIT_TEST_SUITE(TContiguousData) { constSharedData); } + Y_UNIT_TEST(Detach) { + TContiguousData data = TContiguousData::Copy(TString("test")); + TContiguousData data2 = data; + char* res = data2.Detach(); + UNIT_ASSERT_UNEQUAL(data.GetData(), data2.GetData()); + UNIT_ASSERT_EQUAL(res, data2.GetData()); + UNIT_ASSERT_EQUAL(::memcmp(res, "test", 4), 0); + UNIT_ASSERT_EQUAL(::memcmp(data.GetData(), "test", 4), 0); + } + Y_UNIT_TEST(Resize) { TContiguousData data = TContiguousData::Uninitialized(10, 20, 30); UNIT_ASSERT_EQUAL(data.size(), 10); @@ -108,7 +118,8 @@ Y_UNIT_TEST_SUITE(TContiguousData) { UNIT_ASSERT_EQUAL(otherData.Headroom(), 15); UNIT_ASSERT_EQUAL(otherData.Tailroom(), 30); UNIT_ASSERT_EQUAL(otherData.GetOccupiedMemorySize(), 60); - data.Trim(10, 5); + data.TrimBack(15); + data.TrimFront(10); UNIT_ASSERT_EQUAL(data.size(), 10); UNIT_ASSERT_EQUAL(data.Headroom(), 20); UNIT_ASSERT_EQUAL(data.Tailroom(), 30); @@ -118,16 +129,18 @@ Y_UNIT_TEST_SUITE(TContiguousData) { Y_UNIT_TEST(Trim) { TContiguousData data = TContiguousData::Uninitialized(10, 20, 30); TContiguousData otherData(data); - otherData.Trim(5); + otherData.TrimBack(5); UNIT_ASSERT_EQUAL(data.data(), otherData.data()); UNIT_ASSERT_EQUAL(otherData.Headroom(), 20); UNIT_ASSERT_EQUAL(otherData.Tailroom(), 0); TContiguousData otherData2(data); - otherData2.Trim(1, 1); + otherData2.TrimBack(2); + otherData2.TrimFront(1); UNIT_ASSERT_EQUAL(data.data() + 1, otherData2.data()); UNIT_ASSERT_EQUAL(otherData2.Headroom(), 0); UNIT_ASSERT_EQUAL(otherData2.Tailroom(), 0); - otherData.Trim(1, 1); + otherData.TrimBack(2); + otherData.TrimFront(1); UNIT_ASSERT_EQUAL(otherData.data(), otherData2.data()); data.GrowFront(5); data.GrowBack(5); @@ -139,7 +152,7 @@ Y_UNIT_TEST_SUITE(TContiguousData) { UNIT_ASSERT_UNEQUAL(data.data() + 6, otherData2.data()); data = TContiguousData::Uninitialized(10); otherData = data; - data.Trim(5); + data.TrimBack(5); UNIT_ASSERT_EQUAL(data.data(), otherData.data()); UNIT_ASSERT_EQUAL(data.size(), 5); } diff --git a/ydb/core/erasure/erasure.cpp b/ydb/core/erasure/erasure.cpp index a97e264cd0..e0174a7e1e 100644 --- a/ydb/core/erasure/erasure.cpp +++ b/ydb/core/erasure/erasure.cpp @@ -2562,7 +2562,7 @@ void MirrorRestore(TErasureType::ECrcMode crcMode, const TErasureType &type, TDa TContiguousData newOutBuffer(outBuffer); Y_VERIFY(outBuffer.size() >= partSet.FullDataSize, "Unexpected outBuffer.size# %" PRIu64 " fullDataSize# %" PRIu64, (ui64)outBuffer.size(), (ui64)partSet.FullDataSize); - newOutBuffer.Trim(partSet.FullDataSize); // To pad with zeroes! + newOutBuffer.TrimBack(partSet.FullDataSize); // To pad with zeroes! outBuffer = TRope(newOutBuffer); } partSet.FullDataFragment.ReferenceTo(outBuffer); @@ -2688,7 +2688,8 @@ void EoBlockSplitDiff(TErasureType::ECrcMode crcMode, const TErasureType &type, Y_VERIFY_S(diffShift + bufferSize <= diff.Buffer.size(), "diffShift# " << diffShift << " bufferSize# " << bufferSize << " diff.GetDiffLength()# " << diff.GetDiffLength()); TContiguousData newBuffer(diff.Buffer); - newBuffer.Trim(bufferSize, diffShift); + newBuffer.TrimBack(bufferSize + diffShift); + newBuffer.TrimFront(bufferSize); part.Diffs.emplace_back(newBuffer, 0, false, true); if (diffEnd <= nextOffset) { @@ -2714,7 +2715,7 @@ void EoBlockSplitDiff(TErasureType::ECrcMode crcMode, const TErasureType &type, ui32 bufferSize = nextOffset - diff.Offset + lineOffset; TContiguousData newBuffer = diff.Buffer; newBuffer.GrowFront(lineOffset); // FIXME(innokentii) should the [0..lineOffset) be zeroed? - newBuffer.Trim(bufferSize); + newBuffer.TrimBack(bufferSize); Y_VERIFY(bufferSize); part.Diffs.emplace_back(newBuffer, diff.Offset - partOffset, false, true); break; |