diff options
author | innokentii <[email protected]> | 2022-09-12 18:24:51 +0300 |
---|---|---|
committer | innokentii <[email protected]> | 2022-09-12 18:24:51 +0300 |
commit | f68b69214c16dbfdf12930b40f4e415abf2e4093 (patch) | |
tree | 0b692b85cd10bf2288b17ffffc3b25b2758c7ae3 | |
parent | 2c619590073f5a8e9cc36236dd860e9dc0db9466 (diff) |
Replace TString with TRope TEvVPut
add TRope to string comparators
make TRope from string constructor explicit
replace TString to TRope in couple places
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 ¬ifyID, 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; |