aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorinnokentii <innokentii@yandex-team.com>2022-11-14 14:20:53 +0300
committerinnokentii <innokentii@yandex-team.com>2022-11-14 14:20:53 +0300
commit7498e8ebce130b426f39a04a925842fca21a52f2 (patch)
treed8be3455fa7a98257191110d7eae1e9b257f9f34
parent6c32f50a2ea79060b1d1724b915a6965c78d18c6 (diff)
downloadydb-7498e8ebce130b426f39a04a925842fca21a52f2.tar.gz
Improve TContiguouseData interface
improve TContiguousData interface
-rw-r--r--library/cpp/actors/util/contiguous_data.h26
-rw-r--r--library/cpp/actors/util/contiguous_data_ut.cpp23
-rw-r--r--ydb/core/erasure/erasure.cpp7
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;