summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorinnokentii <[email protected]>2022-09-12 18:24:51 +0300
committerinnokentii <[email protected]>2022-09-12 18:24:51 +0300
commitf68b69214c16dbfdf12930b40f4e415abf2e4093 (patch)
tree0b692b85cd10bf2288b17ffffc3b25b2758c7ae3
parent2c619590073f5a8e9cc36236dd860e9dc0db9466 (diff)
Replace TString with TRope TEvVPut
add TRope to string comparators make TRope from string constructor explicit replace TString to TRope in couple places
-rw-r--r--library/cpp/actors/util/rope.h43
-rw-r--r--library/cpp/actors/util/rope_ut.cpp36
-rw-r--r--ydb/core/blobstorage/backpressure/ut_client/loader.h2
-rw-r--r--ydb/core/blobstorage/dsproxy/dsproxy_strategy_put_m3of4.h2
-rw-r--r--ydb/core/blobstorage/dsproxy/ut/dsproxy_fault_tolerance_ut_base.h2
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/incorrect_queries.cpp2
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/lib/env.h2
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/osiris.cpp2
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/snapshots.cpp2
-rw-r--r--ydb/core/blobstorage/ut_mirror3of4/main.cpp2
-rw-r--r--ydb/core/blobstorage/ut_vdisk/lib/helpers.cpp4
-rw-r--r--ydb/core/blobstorage/ut_vdisk2/env.h2
-rw-r--r--ydb/core/blobstorage/vdisk/common/vdisk_events.cpp8
-rw-r--r--ydb/core/blobstorage/vdisk/common/vdisk_events.h11
-rw-r--r--ydb/core/blobstorage/vdisk/handoff/handoff_proxy.cpp2
-rw-r--r--ydb/core/blobstorage/vdisk/query/query_extr.cpp2
-rw-r--r--ydb/core/blobstorage/vdisk/scrub/blob_recovery.h4
-rw-r--r--ydb/core/blobstorage/vdisk/scrub/restore_corrupted_blob_actor.cpp2
-rw-r--r--ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp12
-rw-r--r--ydb/core/erasure/erasure.cpp6
-rw-r--r--ydb/core/erasure/erasure.h8
-rw-r--r--ydb/core/erasure/erasure_perf_test.cpp2
-rw-r--r--ydb/core/util/fragmented_buffer_ut.cpp4
23 files changed, 107 insertions, 55 deletions
diff --git a/library/cpp/actors/util/rope.h b/library/cpp/actors/util/rope.h
index fd4a5acdba1..9b234755f8c 100644
--- a/library/cpp/actors/util/rope.h
+++ b/library/cpp/actors/util/rope.h
@@ -676,7 +676,7 @@ public:
rope.InvalidateIterators();
}
- TRope(TString s) {
+ explicit TRope(TString s) {
if (s) {
Size = s.size();
if (s.capacity() < 32) {
@@ -971,6 +971,25 @@ public:
return xIter.Valid() - yIter.Valid();
}
+ static int Compare(const TRope& x, const TString& y) {
+ TConstIterator xIter = x.Begin();
+ const char* yData = y.data();
+ size_t yOffset = 0;
+ while (xIter.Valid() && yOffset != y.size()) {
+ const size_t step = std::min(xIter.ContiguousSize(), y.size() - yOffset);
+ if (int res = memcmp(xIter.ContiguousData(), yData + yOffset, step)) {
+ return res;
+ }
+ xIter += step;
+ yOffset += step;
+ }
+ return xIter.Valid() - (yOffset != y.size());
+ }
+
+ static int Compare(const TString& x, const TRope& y) {
+ return -Compare(y, x);
+ }
+
// Use this method carefully -- it may significantly reduce performance when misused.
TString ConvertToString() const {
// TODO(innokentii): could be microoptimized for single TString case
@@ -1073,10 +1092,16 @@ public:
TString res = TString::Uninitialized(GetSize());
Begin().ExtractPlainDataAndAdvance(res.Detach(), res.size());
Erase(Begin(), End());
- Insert(End(), res);
+ Insert(End(), TRope(res));
}
}
+ static TRope Uninitialized(size_t size)
+ {
+ TString res = TString::Uninitialized(size);
+ return TRope(res);
+ }
+
/**
* Compacts data and calls GetData() on undelying container
* WARN: Will copy if data isn't contiguous
@@ -1133,6 +1158,20 @@ public:
friend bool operator> (const TRope& x, const TRope& y) { return Compare(x, y) > 0; }
friend bool operator>=(const TRope& x, const TRope& y) { return Compare(x, y) >= 0; }
+ friend bool operator==(const TRope& x, const TString& y) { return Compare(x, y) == 0; }
+ friend bool operator!=(const TRope& x, const TString& y) { return Compare(x, y) != 0; }
+ friend bool operator< (const TRope& x, const TString& y) { return Compare(x, y) < 0; }
+ friend bool operator<=(const TRope& x, const TString& y) { return Compare(x, y) <= 0; }
+ friend bool operator> (const TRope& x, const TString& y) { return Compare(x, y) > 0; }
+ friend bool operator>=(const TRope& x, const TString& y) { return Compare(x, y) >= 0; }
+
+ friend bool operator==(const TString& x, const TRope& y) { return Compare(x, y) == 0; }
+ friend bool operator!=(const TString& x, const TRope& y) { return Compare(x, y) != 0; }
+ friend bool operator< (const TString& x, const TRope& y) { return Compare(x, y) < 0; }
+ friend bool operator<=(const TString& x, const TRope& y) { return Compare(x, y) <= 0; }
+ friend bool operator> (const TString& x, const TRope& y) { return Compare(x, y) > 0; }
+ friend bool operator>=(const TString& x, const TRope& y) { return Compare(x, y) >= 0; }
+
private:
void Cut(TIterator begin, TIterator end, TRope *target) {
// ensure all iterators are belong to us
diff --git a/library/cpp/actors/util/rope_ut.cpp b/library/cpp/actors/util/rope_ut.cpp
index b9ca3715ce1..55f995b66ab 100644
--- a/library/cpp/actors/util/rope_ut.cpp
+++ b/library/cpp/actors/util/rope_ut.cpp
@@ -61,6 +61,26 @@ TString RopeToString(const TRope& rope) {
TString Text = "No elements are copied or moved, only the internal pointers of the list nodes are re-pointed.";
Y_UNIT_TEST_SUITE(TRope) {
+ Y_UNIT_TEST(StringCompare) {
+ TRope rope = CreateRope(Text, 10);
+ UNIT_ASSERT_EQUAL(rope, Text);
+ UNIT_ASSERT_EQUAL(Text, rope);
+ rope.Erase(rope.Begin() + 10, rope.Begin() + 11);
+ UNIT_ASSERT_UNEQUAL(rope, Text);
+ UNIT_ASSERT_UNEQUAL(Text, rope);
+ TString str("aa");
+ rope = TRope(TString("ab"));
+ UNIT_ASSERT_LT(str, rope);
+ UNIT_ASSERT_GT(rope, str);
+ str = TString("aa");
+ rope = TRope(TString("a"));
+ UNIT_ASSERT_LT(rope, str);
+ UNIT_ASSERT_GT(str, rope);
+ str = TString("a");
+ rope = TRope(TString("aa"));
+ UNIT_ASSERT_LT(str, rope);
+ UNIT_ASSERT_GT(rope, str);
+ }
Y_UNIT_TEST(Leak) {
const size_t begin = 10, end = 20;
@@ -79,7 +99,7 @@ Y_UNIT_TEST_SUITE(TRope) {
TRope pf;
TRope rope;
TString string = TString(Text.data(), Text.size());
- rope = string;
+ rope = TRope(string);
pf = rope;
pf.GetContiguousSpanMut();
UNIT_ASSERT(!string.IsDetached());
@@ -91,7 +111,7 @@ Y_UNIT_TEST_SUITE(TRope) {
TRope pf;
TRope rope;
TString string = TString(Text.data(), Text.size());
- rope = string;
+ rope = TRope(string);
pf = rope;
UNIT_ASSERT(pf.IsContiguous());
UNIT_ASSERT_EQUAL(pf.UnsafeGetContiguousSpanMut().data(), string.data());
@@ -241,11 +261,23 @@ Y_UNIT_TEST_SUITE(TRope) {
const TRope xRope = CreateRope(x, 7);
const TRope yRope = CreateRope(y, 11);
UNIT_ASSERT_VALUES_EQUAL(xRope == yRope, x == y);
+ UNIT_ASSERT_VALUES_EQUAL(xRope == y, x == y);
+ UNIT_ASSERT_VALUES_EQUAL(x == yRope, x == y);
UNIT_ASSERT_VALUES_EQUAL(xRope != yRope, x != y);
+ UNIT_ASSERT_VALUES_EQUAL(xRope != y, x != y);
+ UNIT_ASSERT_VALUES_EQUAL(x != yRope, x != y);
UNIT_ASSERT_VALUES_EQUAL(xRope < yRope, x < y);
+ UNIT_ASSERT_VALUES_EQUAL(xRope < y, x < y);
+ UNIT_ASSERT_VALUES_EQUAL(x < yRope, x < y);
UNIT_ASSERT_VALUES_EQUAL(xRope <= yRope, x <= y);
+ UNIT_ASSERT_VALUES_EQUAL(xRope <= y, x <= y);
+ UNIT_ASSERT_VALUES_EQUAL(x <= yRope, x <= y);
UNIT_ASSERT_VALUES_EQUAL(xRope > yRope, x > y);
+ UNIT_ASSERT_VALUES_EQUAL(xRope > y, x > y);
+ UNIT_ASSERT_VALUES_EQUAL(x > yRope, x > y);
UNIT_ASSERT_VALUES_EQUAL(xRope >= yRope, x >= y);
+ UNIT_ASSERT_VALUES_EQUAL(xRope >= y, x >= y);
+ UNIT_ASSERT_VALUES_EQUAL(x >= yRope, x >= y);
};
TVector<TString> pool;
diff --git a/ydb/core/blobstorage/backpressure/ut_client/loader.h b/ydb/core/blobstorage/backpressure/ut_client/loader.h
index 1ee901fc61d..2cf0f37703e 100644
--- a/ydb/core/blobstorage/backpressure/ut_client/loader.h
+++ b/ydb/core/blobstorage/backpressure/ut_client/loader.h
@@ -53,7 +53,7 @@ public:
const TLogoBlobID blobId(0x0123456789abcdefUL, 1, BlobIdx++, 0, 1, Buffer.size());
LOG_DEBUG(*TlsActivationContext, NActorsServices::TEST, "%s %s", ClientId.ToString().data(),
blobId.ToString().data());
- Send(QueueId, new TEvBlobStorage::TEvVPut(blobId, Buffer, VDiskId, false, nullptr, TInstant::Max(),
+ Send(QueueId, new TEvBlobStorage::TEvVPut(blobId, TRope(Buffer), VDiskId, false, nullptr, TInstant::Max(),
NKikimrBlobStorage::EPutHandleClass::TabletLog));
RequestQ.push_back(blobId);
--InFlightRemain;
diff --git a/ydb/core/blobstorage/dsproxy/dsproxy_strategy_put_m3of4.h b/ydb/core/blobstorage/dsproxy/dsproxy_strategy_put_m3of4.h
index 0fca82976e0..680c0050ebc 100644
--- a/ydb/core/blobstorage/dsproxy/dsproxy_strategy_put_m3of4.h
+++ b/ydb/core/blobstorage/dsproxy/dsproxy_strategy_put_m3of4.h
@@ -171,7 +171,7 @@ protected:
const bool handoff = (ui8)diskIdx < info.Type.BlobSubgroupSize() - requiredNumMetadataParts;
groupDiskRequests.AddPut(disk.OrderNumber,
TLogoBlobID(state.Id, 3),
- TString(),
+ TRope(TString()),
handoff ? TDiskPutRequest::ReasonError : TDiskPutRequest::ReasonInitial,
handoff,
state.ExtraBlockChecks,
diff --git a/ydb/core/blobstorage/dsproxy/ut/dsproxy_fault_tolerance_ut_base.h b/ydb/core/blobstorage/dsproxy/ut/dsproxy_fault_tolerance_ut_base.h
index c4b5c76f39b..d48ff71ee87 100644
--- a/ydb/core/blobstorage/dsproxy/ut/dsproxy_fault_tolerance_ut_base.h
+++ b/ydb/core/blobstorage/dsproxy/ut/dsproxy_fault_tolerance_ut_base.h
@@ -103,7 +103,7 @@ public:
}
NKikimrProto::EReplyStatus PutToVDisk(ui32 vdiskOrderNum, const TLogoBlobID& id, const TString& part) {
- Send(Info->GetActorId(vdiskOrderNum), new TEvBlobStorage::TEvVPut(id, part, Info->GetVDiskId(vdiskOrderNum),
+ Send(Info->GetActorId(vdiskOrderNum), new TEvBlobStorage::TEvVPut(id, TRope(part), Info->GetVDiskId(vdiskOrderNum),
false, nullptr, TInstant::Max(), NKikimrBlobStorage::TabletLog));
auto ev = WaitForSpecificEvent<TEvBlobStorage::TEvVPutResult>();
return ev->Get()->Record.GetStatus();
diff --git a/ydb/core/blobstorage/ut_blobstorage/incorrect_queries.cpp b/ydb/core/blobstorage/ut_blobstorage/incorrect_queries.cpp
index 23bbd621bd1..2740f51384e 100644
--- a/ydb/core/blobstorage/ut_blobstorage/incorrect_queries.cpp
+++ b/ydb/core/blobstorage/ut_blobstorage/incorrect_queries.cpp
@@ -12,7 +12,7 @@ Y_UNIT_TEST_SUITE(IncorrectQueries) {
void SendPut(TEnvironmentSetup& env, TTestInfo& test,
const TLogoBlobID& blobId, NKikimrProto::EReplyStatus status, ui32 blob_size, bool isEmptyObject = false, bool isEmptyMeta = false) {
const TString data(blob_size, 'a');
- std::unique_ptr<IEventBase> ev = std::make_unique<TEvBlobStorage::TEvVPut>(blobId, data, test.Info->GetVDiskInSubgroup(0, blobId.Hash()),
+ std::unique_ptr<IEventBase> ev = std::make_unique<TEvBlobStorage::TEvVPut>(blobId, TRope(data), test.Info->GetVDiskInSubgroup(0, blobId.Hash()),
false, nullptr, TInstant::Max(), NKikimrBlobStorage::AsyncBlob);
if (isEmptyObject) {
diff --git a/ydb/core/blobstorage/ut_blobstorage/lib/env.h b/ydb/core/blobstorage/ut_blobstorage/lib/env.h
index 48a0a6a8dcd..0f42392943f 100644
--- a/ydb/core/blobstorage/ut_blobstorage/lib/env.h
+++ b/ydb/core/blobstorage/ut_blobstorage/lib/env.h
@@ -590,7 +590,7 @@ struct TEnvironmentSetup {
void PutBlob(const TVDiskID& vdiskId, const TLogoBlobID& blobId, const TString& part) {
WithQueueId(vdiskId, NKikimrBlobStorage::EVDiskQueueId::PutTabletLog, [&](TActorId queueId) {
const TActorId& edge = Runtime->AllocateEdgeActor(queueId.NodeId(), __FILE__, __LINE__);
- Runtime->Send(new IEventHandle(queueId, edge, new TEvBlobStorage::TEvVPut(blobId, part, vdiskId, false, nullptr,
+ Runtime->Send(new IEventHandle(queueId, edge, new TEvBlobStorage::TEvVPut(blobId, TRope(part), vdiskId, false, nullptr,
TInstant::Max(), NKikimrBlobStorage::EPutHandleClass::TabletLog)), queueId.NodeId());
auto r = WaitForEdgeActorEvent<TEvBlobStorage::TEvVPutResult>(edge);
diff --git a/ydb/core/blobstorage/ut_blobstorage/osiris.cpp b/ydb/core/blobstorage/ut_blobstorage/osiris.cpp
index 432d078bf58..627eb15f027 100644
--- a/ydb/core/blobstorage/ut_blobstorage/osiris.cpp
+++ b/ydb/core/blobstorage/ut_blobstorage/osiris.cpp
@@ -43,7 +43,7 @@ bool DoTestCase(TBlobStorageGroupType::EErasureSpecies erasure, const std::set<s
const TActorId& queueId = env.CreateQueueActor(info->GetVDiskId(orderNum), NKikimrBlobStorage::PutTabletLog, 0);
const TActorId& sender = env.Runtime->AllocateEdgeActor(queueId.NodeId());
const TLogoBlobID blobId(id, partIdx + 1);
- TRope buffer = type.PartSize(blobId) ? parts.Parts[partIdx].OwnedString : TString();
+ TRope buffer = type.PartSize(blobId) ? parts.Parts[partIdx].OwnedString : TRope(TString());
env.Runtime->Send(new IEventHandle(queueId, sender, new TEvBlobStorage::TEvVPut(blobId, buffer,
info->GetVDiskId(orderNum), false, nullptr, TInstant::Max(), NKikimrBlobStorage::TabletLog)),
sender.NodeId());
diff --git a/ydb/core/blobstorage/ut_blobstorage/snapshots.cpp b/ydb/core/blobstorage/ut_blobstorage/snapshots.cpp
index d363c11bfa8..c487f20214f 100644
--- a/ydb/core/blobstorage/ut_blobstorage/snapshots.cpp
+++ b/ydb/core/blobstorage/ut_blobstorage/snapshots.cpp
@@ -34,7 +34,7 @@ Y_UNIT_TEST_SUITE(SnapshotTesting) {
const ui32 len = 1 + RandomNumber(131072u);
TString data = env.GenerateRandomString(len);
const TLogoBlobID id(tabletId, generation, step, channel, len, 0, 1);
- auto ev = std::make_unique<TEvBlobStorage::TEvVPut>(id, data, vdiskId, false, nullptr, TInstant::Max(),
+ auto ev = std::make_unique<TEvBlobStorage::TEvVPut>(id, TRope(data), vdiskId, false, nullptr, TInstant::Max(),
NKikimrBlobStorage::EPutHandleClass::TabletLog);
runtime->Send(new IEventHandle(queue, edge, ev.release()), queue.NodeId());
if (putToBlobs) {
diff --git a/ydb/core/blobstorage/ut_mirror3of4/main.cpp b/ydb/core/blobstorage/ut_mirror3of4/main.cpp
index f051b062f14..630b80889ba 100644
--- a/ydb/core/blobstorage/ut_mirror3of4/main.cpp
+++ b/ydb/core/blobstorage/ut_mirror3of4/main.cpp
@@ -182,7 +182,7 @@ public:
}
NKikimrProto::EReplyStatus Put(const TVDiskID& vdiskId, const TLogoBlobID& blobId, const TString& data) {
- Send(GetBackpressureFor(Info->GetOrderNumber(vdiskId)), new TEvBlobStorage::TEvVPut(blobId, data, vdiskId,
+ Send(GetBackpressureFor(Info->GetOrderNumber(vdiskId)), new TEvBlobStorage::TEvVPut(blobId, TRope(data), vdiskId,
false, nullptr, TInstant::Max(), NKikimrBlobStorage::EPutHandleClass::TabletLog));
auto ev = WaitForSpecificEvent<TEvBlobStorage::TEvVPutResult>();
auto& record = ev->Get()->Record;
diff --git a/ydb/core/blobstorage/ut_vdisk/lib/helpers.cpp b/ydb/core/blobstorage/ut_vdisk/lib/helpers.cpp
index f60f1616793..a8bd24cacb0 100644
--- a/ydb/core/blobstorage/ut_vdisk/lib/helpers.cpp
+++ b/ydb/core/blobstorage/ut_vdisk/lib/helpers.cpp
@@ -261,7 +261,7 @@ class TManyPuts : public TActorBootstrapped<TManyPuts> {
const bool noTimeout = RequestTimeout == TDuration::Seconds(0);
const TInstant deadline = noTimeout ? TInstant::Max() : TInstant::Now() + RequestTimeout;
ctx.Send(QueueActorId,
- new TEvBlobStorage::TEvVPut(logoBlobID, put.Data, VDiskInfo.VDiskID, false,
+ new TEvBlobStorage::TEvVPut(logoBlobID, TRope(put.Data), VDiskInfo.VDiskID, false,
nullptr, deadline, HandleClassGen->GetHandleClass()));
return;
} else {
@@ -1393,7 +1393,7 @@ NActors::IActor *PutGCToCorrespondingVDisks(const NActors::TActorId &notifyID, T
void PutLogoBlobToVDisk(const TActorContext &ctx, const TActorId &actorID, const TVDiskID &vdiskID,
const TLogoBlobID &id, const TString &data, NKikimrBlobStorage::EPutHandleClass cls) {
LOG_DEBUG(ctx, NActorsServices::TEST, " Sending TEvPut: id=%s data='%s'", id.ToString().data(), LimitData(data).data());
- ctx.Send(actorID, new TEvBlobStorage::TEvVPut(id, data, vdiskID, false, nullptr, TInstant::Max(), cls));
+ ctx.Send(actorID, new TEvBlobStorage::TEvVPut(id, TRope(data), vdiskID, false, nullptr, TInstant::Max(), cls));
}
// returns number of messages sent
diff --git a/ydb/core/blobstorage/ut_vdisk2/env.h b/ydb/core/blobstorage/ut_vdisk2/env.h
index 9a8ad89cc93..c49be6067b0 100644
--- a/ydb/core/blobstorage/ut_vdisk2/env.h
+++ b/ydb/core/blobstorage/ut_vdisk2/env.h
@@ -49,7 +49,7 @@ namespace NKikimr {
NKikimrBlobStorage::TEvVPutResult Put(const TLogoBlobID& id, TString buffer,
NKikimrBlobStorage::EPutHandleClass prio = NKikimrBlobStorage::EPutHandleClass::TabletLog) {
- return ExecuteQuery<TEvBlobStorage::TEvVPutResult>(std::make_unique<TEvBlobStorage::TEvVPut>(id, buffer,
+ return ExecuteQuery<TEvBlobStorage::TEvVPutResult>(std::make_unique<TEvBlobStorage::TEvVPut>(id, TRope(buffer),
VDiskId, false, nullptr, TInstant::Max(), prio), GetQueueId(prio));
}
diff --git a/ydb/core/blobstorage/vdisk/common/vdisk_events.cpp b/ydb/core/blobstorage/vdisk/common/vdisk_events.cpp
index 2a2a8d69b17..b4a59df5ab8 100644
--- a/ydb/core/blobstorage/vdisk/common/vdisk_events.cpp
+++ b/ydb/core/blobstorage/vdisk/common/vdisk_events.cpp
@@ -34,14 +34,6 @@ namespace NKikimr {
}
}
- void TEvBlobStorage::TEvVPut::StorePayload(const TString& buffer) {
- if (KIKIMR_USE_PROTOBUF_WITH_PAYLOAD) {
- AddPayload(TRope(buffer));
- } else {
- Record.SetBuffer(buffer);
- }
- }
-
void TEvBlobStorage::TEvVPut::StorePayload(TRope&& buffer) {
Y_VERIFY(KIKIMR_USE_PROTOBUF_WITH_PAYLOAD);
AddPayload(std::move(buffer));
diff --git a/ydb/core/blobstorage/vdisk/common/vdisk_events.h b/ydb/core/blobstorage/vdisk/common/vdisk_events.h
index 6921e804d00..0603cc13ada 100644
--- a/ydb/core/blobstorage/vdisk/common/vdisk_events.h
+++ b/ydb/core/blobstorage/vdisk/common/vdisk_events.h
@@ -511,15 +511,6 @@ namespace NKikimr {
TEvVPut()
{}
- TEvVPut(const TLogoBlobID &logoBlobId, const TString &buffer, const TVDiskID &vdisk,
- const bool ignoreBlock, const ui64 *cookie, TInstant deadline,
- NKikimrBlobStorage::EPutHandleClass cls)
- {
- InitWithoutBuffer(logoBlobId, vdisk, ignoreBlock, cookie, deadline, cls);
- REQUEST_VALGRIND_CHECK_MEM_IS_DEFINED(buffer.Data(), buffer.size());
- StorePayload(buffer);
- }
-
TEvVPut(const TLogoBlobID &logoBlobId, TRope buffer, const TVDiskID &vdisk,
const bool ignoreBlock, const ui64 *cookie, TInstant deadline,
NKikimrBlobStorage::EPutHandleClass cls)
@@ -562,8 +553,6 @@ namespace NKikimr {
return Record.HasBuffer() ? TRope(Record.GetBuffer()) : GetPayload(0);
}
- void StorePayload(const TString& buffer);
-
void StorePayload(TRope&& buffer);
ui64 GetBufferBytes() const {
diff --git a/ydb/core/blobstorage/vdisk/handoff/handoff_proxy.cpp b/ydb/core/blobstorage/vdisk/handoff/handoff_proxy.cpp
index 9a2d1676e0e..0ac940598eb 100644
--- a/ydb/core/blobstorage/vdisk/handoff/handoff_proxy.cpp
+++ b/ydb/core/blobstorage/vdisk/handoff/handoff_proxy.cpp
@@ -65,7 +65,7 @@ namespace NKikimr {
void SendItem(const TActorContext &ctx, std::unique_ptr<TEvLocalHandoff> item) {
auto vd = Info->GetVDiskId(VDiskInfoPtr->OrderNumber);
auto aid = Info->GetActorId(VDiskInfoPtr->OrderNumber);
- auto msg = std::make_unique<TEvBlobStorage::TEvVPut>(item->Id, item->Data, vd, true, &item->Cookie,
+ auto msg = std::make_unique<TEvBlobStorage::TEvVPut>(item->Id, TRope(item->Data), vd, true, &item->Cookie, //FIXME(innokentii): RopeFromString
TInstant::Max(), NKikimrBlobStorage::AsyncBlob);
State.InFlightQueueSize++;
State.InFlightQueueByteSize += item->ByteSize();
diff --git a/ydb/core/blobstorage/vdisk/query/query_extr.cpp b/ydb/core/blobstorage/vdisk/query/query_extr.cpp
index 57be3046445..cb10e55cc65 100644
--- a/ydb/core/blobstorage/vdisk/query/query_extr.cpp
+++ b/ydb/core/blobstorage/vdisk/query/query_extr.cpp
@@ -289,7 +289,7 @@ namespace NKikimr {
const auto it = map.find(id.FullID());
Y_VERIFY(it != map.end());
if (it->second->Status == NKikimrProto::OK) {
- const TString& buffer = it->second->GetPartData(id);
+ const TString& buffer = it->second->GetPartData(id).ConvertToString();
res.SetBuffer(buffer.substr(res.GetShift(), res.GetSize() ? res.GetSize() : buffer.size() - res.GetShift()));
res.SetStatus(NKikimrProto::OK);
}
diff --git a/ydb/core/blobstorage/vdisk/scrub/blob_recovery.h b/ydb/core/blobstorage/vdisk/scrub/blob_recovery.h
index 57e892ada4d..aea1d3d50f1 100644
--- a/ydb/core/blobstorage/vdisk/scrub/blob_recovery.h
+++ b/ydb/core/blobstorage/vdisk/scrub/blob_recovery.h
@@ -43,12 +43,12 @@ namespace NKikimr {
}
}
- TString GetPartData(TLogoBlobID id) const {
+ TRope GetPartData(TLogoBlobID id) const {
Y_VERIFY(id.FullID() == BlobId);
Y_VERIFY(id.PartId());
const ui32 partIdx = id.PartId() - 1;
Y_VERIFY(PartSet.PartsMask & (1 << partIdx));
- return PartSet.Parts[partIdx].OwnedString.ConvertToString();
+ return PartSet.Parts[partIdx].OwnedString;
}
NMatrix::TVectorType GetAvailableParts() const {
diff --git a/ydb/core/blobstorage/vdisk/scrub/restore_corrupted_blob_actor.cpp b/ydb/core/blobstorage/vdisk/scrub/restore_corrupted_blob_actor.cpp
index fb621f874ff..89d6f644c81 100644
--- a/ydb/core/blobstorage/vdisk/scrub/restore_corrupted_blob_actor.cpp
+++ b/ydb/core/blobstorage/vdisk/scrub/restore_corrupted_blob_actor.cpp
@@ -245,7 +245,7 @@ namespace NKikimr {
const TVDiskID& vdiskId = Info->GetVDiskId(VCtx->ShortSelfVDisk);
for (ui32 i = item.Needed.FirstPosition(); i != item.Needed.GetSize(); i = item.Needed.NextPosition(i)) {
const TLogoBlobID blobId(item.BlobId, i + 1);
- const TString& buffer = item.GetPartData(blobId);
+ const TRope& buffer = item.GetPartData(blobId);
Y_VERIFY(buffer.size() == Info->Type.PartSize(blobId));
Y_VERIFY(WriteRestoredParts);
auto ev = std::make_unique<TEvBlobStorage::TEvVPut>(blobId, buffer, vdiskId, true, &index, Deadline,
diff --git a/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp b/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp
index f28987129d7..bc2779c21a9 100644
--- a/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp
+++ b/ydb/core/blobstorage/vdisk/skeleton/skeleton_vpatch_actor.cpp
@@ -102,7 +102,7 @@ namespace NKikimr::NPrivate {
TStackVec<ui32, 1> FoundOriginalParts;
TStackVec<TXorReceiver, 2> XorReceivers;
- TString Buffer;
+ TRope Buffer;
TVector<TDiff> Diffs;
TVector<TXorDiffs> ReceivedXorDiffs;
@@ -289,7 +289,7 @@ namespace NKikimr::NPrivate {
TLogoBlobID blobId = LogoBlobIDFromLogoBlobID(item.GetBlobID());
Y_VERIFY(item.HasBuffer());
- Buffer = item.GetBuffer();
+ Buffer = TRope(item.GetBuffer());
STLOG(PRI_INFO, BS_VDISK_PATCH, BSVSP08,
VDiskLogPrefix << " TEvVPatch: received part data;",
@@ -301,7 +301,7 @@ namespace NKikimr::NPrivate {
(Status, record.GetStatus()),
(ResultSize, record.ResultSize()));
- ui8 *buffer = reinterpret_cast<ui8*>(const_cast<char*>(Buffer.data()));
+ ui8 *buffer = reinterpret_cast<ui8*>(Buffer.UnsafeGetContiguousSpanMut().data());
if (blobId.PartId() <= GType.DataParts()) {
if (GType.ErasureFamily() != TErasureType::ErasureMirror) {
SendXorDiff();
@@ -376,7 +376,7 @@ namespace NKikimr::NPrivate {
(PatchedPartId, (ui32)PatchedPartId),
(XorDiffCount, XorReceivers.size()));
- const ui8 *buffer = reinterpret_cast<const ui8*>(Buffer.data());
+ const ui8 *buffer = reinterpret_cast<const ui8*>(Buffer.GetContiguousSpan().data());
GType.MakeXorDiff(TErasureType::CrcModeNone, OriginalBlobId.BlobSize(), buffer, Diffs, &xorDiffs);
for (TXorReceiver &xorReceiver : XorReceivers) {
@@ -541,7 +541,7 @@ namespace NKikimr::NPrivate {
(PatchedBlobId, PatchedBlobId),
(FromPart, (ui32)fromPart),
(ToPart, (ui32)toPart),
- (HasBuffer, (Buffer.empty() ? "no" : "yes")),
+ (HasBuffer, (Buffer.GetSize() == 0 ? "no" : "yes")),
(ReceivedXorDiffCount, TStringBuilder() << ReceivedXorDiffCount << '/' << WaitedXorDiffCount));
TInstant now = TActivationContext::Now();
@@ -564,7 +564,7 @@ namespace NKikimr::NPrivate {
}
if (Buffer) {
- ui8 *buffer = reinterpret_cast<ui8*>(const_cast<char*>(Buffer.data()));
+ ui8 *buffer = reinterpret_cast<ui8*>(Buffer.UnsafeGetContiguousSpanMut().data());
ui32 dataSize = OriginalBlobId.BlobSize();
GType.ApplyXorDiff(TErasureType::CrcModeNone, dataSize, buffer, xorDiffs, fromPart - 1, toPart - 1);
diff --git a/ydb/core/erasure/erasure.cpp b/ydb/core/erasure/erasure.cpp
index fc1d8e8a206..47058a4967e 100644
--- a/ydb/core/erasure/erasure.cpp
+++ b/ydb/core/erasure/erasure.cpp
@@ -46,7 +46,7 @@ namespace NKikimr {
static void Refurbish(TRope &str, ui64 size) {
if (str.size() != size) {
- str = TString::Uninitialized(size);
+ str = TRope::Uninitialized(size);
}
}
@@ -2519,7 +2519,7 @@ void MirrorSplit(TErasureType::ECrcMode crcMode, const TErasureType &type, TRope
case TErasureType::CrcModeWholePart:
{
ui64 partSize = type.PartSize(crcMode, buffer.size());
- TRope part = TString::Uninitialized(partSize);
+ TRope part = TRope::Uninitialized(partSize);
char *dst = part.GetContiguousSpanMut().data();
if (buffer.size() || part.size()) {
Y_VERIFY(part.size() >= buffer.size() + sizeof(ui32), "Part size too small, buffer size# %" PRIu64
@@ -2565,7 +2565,7 @@ void MirrorRestore(TErasureType::ECrcMode crcMode, const TErasureType &type, TDa
Y_VERIFY(outBuffer.size() >= partSet.FullDataSize, "Unexpected outBuffer.size# %" PRIu64
" fullDataSize# %" PRIu64, (ui64)outBuffer.size(), (ui64)partSet.FullDataSize);
newOutBuffer.resize(partSet.FullDataSize); // To pad with zeroes!
- outBuffer = newOutBuffer;
+ outBuffer = TRope(newOutBuffer);
}
partSet.FullDataFragment.ReferenceTo(outBuffer);
return;
diff --git a/ydb/core/erasure/erasure.h b/ydb/core/erasure/erasure.h
index d7d4da114b8..5ccfbf9e3d4 100644
--- a/ydb/core/erasure/erasure.h
+++ b/ydb/core/erasure/erasure.h
@@ -77,8 +77,8 @@ struct TPartFragment {
}
void UninitializedOwnedWhole(ui64 size) {
- OwnedString = TString::Uninitialized(size); //FIXME(innokentii)
- Bytes = OwnedString.GetContiguousSpanMut().data();
+ OwnedString = TRope::Uninitialized(size);
+ Bytes = OwnedString.UnsafeGetContiguousSpanMut().data();
Offset = 0;
Size = size;
PartSize = size;
@@ -326,12 +326,12 @@ struct TErasureType {
void SplitData(ECrcMode crcMode, TRope& buffer, TDataPartSet& outPartSet) const;
void SplitData(ECrcMode crcMode, const TString& buffer, TDataPartSet& outPartSet) const {
- TRope rope = buffer;
+ TRope rope(buffer);
SplitData(crcMode, rope, outPartSet);
}
void IncrementalSplitData(ECrcMode crcMode, TRope& buffer, TDataPartSet& outPartSet) const;
void IncrementalSplitData(ECrcMode crcMode, const TString& buffer, TDataPartSet& outPartSet) const {
- TRope rope = buffer;
+ TRope rope(buffer);
IncrementalSplitData(crcMode, rope, outPartSet);
}
diff --git a/ydb/core/erasure/erasure_perf_test.cpp b/ydb/core/erasure/erasure_perf_test.cpp
index ae4c79c946f..79965e9bdeb 100644
--- a/ydb/core/erasure/erasure_perf_test.cpp
+++ b/ydb/core/erasure/erasure_perf_test.cpp
@@ -119,7 +119,7 @@ std::pair<double, double> MeasureTime(TErasureType &type, TVector<ui32> &missedP
std::vector<TRope> restoredData;
restoredData.resize(attempts);
for (auto& restored : restoredData) {
- restored = TString(dataSize, '\0');
+ restored = TRope(TString(dataSize, '\0'));
}
// Remove the 'missing' parts
for (auto& partSet : partSets) {
diff --git a/ydb/core/util/fragmented_buffer_ut.cpp b/ydb/core/util/fragmented_buffer_ut.cpp
index 7b9dac72b7d..153a875475f 100644
--- a/ydb/core/util/fragmented_buffer_ut.cpp
+++ b/ydb/core/util/fragmented_buffer_ut.cpp
@@ -136,7 +136,7 @@ Y_UNIT_TEST_SUITE(TFragmentedBufferTest) {
}
Y_UNIT_TEST(TestSetMonolith) {
- TRope inData = TString("123");
+ TRope inData(TString("123"));
TFragmentedBuffer fb;
fb.SetMonolith(inData);
UNIT_ASSERT_VALUES_EQUAL(fb.IsMonolith(), true);
@@ -145,7 +145,7 @@ Y_UNIT_TEST_SUITE(TFragmentedBufferTest) {
}
Y_UNIT_TEST(TestReplaceWithSetMonolith) {
- TRope inData = TString("123");
+ TRope inData(TString("123"));
const char *data3v2 = "5";
const char *data4 = "678";
TFragmentedBuffer fb;