diff options
author | alexvru <[email protected]> | 2023-05-24 12:13:10 +0300 |
---|---|---|
committer | alexvru <[email protected]> | 2023-05-24 12:13:10 +0300 |
commit | c0a039174bbacd33e3ce33873a85481d4e83ba8b (patch) | |
tree | 43b8e2d1e4e071fb09d5bea17974fedcc33fc0d7 | |
parent | 128c5e5307c946da48dc581ac149b38c1e3f2552 (diff) |
Replace TString -> TRcBuf for TEvPut
-rw-r--r-- | ydb/core/keyvalue/keyvalue_index_record.cpp | 10 | ||||
-rw-r--r-- | ydb/core/keyvalue/keyvalue_index_record.h | 4 | ||||
-rw-r--r-- | ydb/core/keyvalue/keyvalue_intermediate.h | 2 | ||||
-rw-r--r-- | ydb/core/keyvalue/keyvalue_state.cpp | 17 | ||||
-rw-r--r-- | ydb/core/keyvalue/keyvalue_storage_request.cpp | 6 |
5 files changed, 22 insertions, 17 deletions
diff --git a/ydb/core/keyvalue/keyvalue_index_record.cpp b/ydb/core/keyvalue/keyvalue_index_record.cpp index 2765cc50bb2..35b4f8c1e0a 100644 --- a/ydb/core/keyvalue/keyvalue_index_record.cpp +++ b/ydb/core/keyvalue/keyvalue_index_record.cpp @@ -11,8 +11,8 @@ TIndexRecord::TChainItem::TChainItem(const TLogoBlobID &id, ui64 offset) { } -TIndexRecord::TChainItem::TChainItem(TString &inlineData, ui64 offset) - : InlineData(inlineData) +TIndexRecord::TChainItem::TChainItem(TRcBuf&& inlineData, ui64 offset) + : InlineData(std::move(inlineData)) , Offset(offset) { } @@ -218,10 +218,10 @@ bool TIndexRecord::Deserialize2(const TString &rawData, TString &outErrorInfo) { outErrorInfo = " Deserialization error# DEA4"; return false; } - TString inlineData = TString::Uninitialized(size); - memcpy(const_cast<char *>(inlineData.data()), data->Serialized + offset, size); + TRcBuf inlineData = TRcBuf::Uninitialized(size); + memcpy(inlineData.GetDataMut(), data->Serialized + offset, size); offset += size; - Chain.push_back(TIndexRecord::TChainItem(inlineData, chainOffset)); + Chain.push_back(TIndexRecord::TChainItem(std::move(inlineData), chainOffset)); chainOffset += size; } } diff --git a/ydb/core/keyvalue/keyvalue_index_record.h b/ydb/core/keyvalue/keyvalue_index_record.h index 3df68fe96c7..f4797861abd 100644 --- a/ydb/core/keyvalue/keyvalue_index_record.h +++ b/ydb/core/keyvalue/keyvalue_index_record.h @@ -10,11 +10,11 @@ namespace NKeyValue { struct TIndexRecord { struct TChainItem { TLogoBlobID LogoBlobId; - TString InlineData; + TRcBuf InlineData; ui64 Offset; TChainItem(const TLogoBlobID &id, ui64 offset); - TChainItem(TString &inlineData, ui64 offset); + TChainItem(TRcBuf&& inlineData, ui64 offset); bool IsInline() const; ui64 GetSize() const; diff --git a/ydb/core/keyvalue/keyvalue_intermediate.h b/ydb/core/keyvalue/keyvalue_intermediate.h index ef52c37a63a..5f5b7e20e8f 100644 --- a/ydb/core/keyvalue/keyvalue_intermediate.h +++ b/ydb/core/keyvalue/keyvalue_intermediate.h @@ -61,7 +61,7 @@ struct TIntermediate { struct TWrite { TVector<TLogoBlobID> LogoBlobIds; TString Key; - TString Data; + TRcBuf Data; TEvBlobStorage::TEvPut::ETactic Tactic; NKikimrBlobStorage::EPutHandleClass HandleClass; NKikimrProto::EReplyStatus Status; diff --git a/ydb/core/keyvalue/keyvalue_state.cpp b/ydb/core/keyvalue/keyvalue_state.cpp index 6a3afd5dfb4..f21cbf91768 100644 --- a/ydb/core/keyvalue/keyvalue_state.cpp +++ b/ydb/core/keyvalue/keyvalue_state.cpp @@ -1055,9 +1055,10 @@ void TKeyValueState::ProcessCmd(TIntermediate::TWrite &request, record.Chain = {}; ui32 storage_channel = 0; if (request.Status == NKikimrProto::SCHEDULED) { - TString inlineData = request.Data; - record.Chain.push_back(TIndexRecord::TChainItem(inlineData, 0)); - CountWriteRecord(0, inlineData.size()); + TRcBuf inlineData = request.Data; + const size_t size = inlineData.size(); + record.Chain.push_back(TIndexRecord::TChainItem(std::move(inlineData), 0)); + CountWriteRecord(0, size); request.Status = NKikimrProto::OK; storage_channel = InlineStorageChannelInPublicApi; } else { @@ -1176,8 +1177,8 @@ void TKeyValueState::ProcessCmd(const TIntermediate::TCopyRange &request, void TKeyValueState::ProcessCmd(const TIntermediate::TConcat &request, NKikimrClient::TKeyValueResponse::TConcatResult *legacyResponse, - NKikimrKeyValue::StorageChannel */*response*/, - ISimpleDb &db, const TActorContext &ctx, TRequestStat &/*stat*/, ui64 unixTime, + NKikimrKeyValue::StorageChannel* /*response*/, + ISimpleDb &db, const TActorContext &ctx, TRequestStat& /*stat*/, ui64 unixTime, TIntermediate *intermediate) { TVector<TIndexRecord::TChainItem> chain; @@ -1190,7 +1191,7 @@ void TKeyValueState::ProcessCmd(const TIntermediate::TConcat &request, for (TIndexRecord::TChainItem& chainItem : input.Chain) { if (chainItem.IsInline()) { - chain.push_back(TIndexRecord::TChainItem(chainItem.InlineData, offset)); + chain.push_back(TIndexRecord::TChainItem(TRcBuf(chainItem.InlineData), offset)); } else { const TLogoBlobID& id = chainItem.LogoBlobId; chain.push_back(TIndexRecord::TChainItem(id, offset)); @@ -2256,7 +2257,7 @@ bool TKeyValueState::PrepareCmdWrite(const TActorContext &ctx, NKikimrClient::TK } interm.Key = request.GetKey(); - interm.Data = request.GetValue(); + interm.Data = TRcBuf(request.GetValue()); interm.Tactic = TEvBlobStorage::TEvPut::TacticDefault; switch (request.GetTactic()) { case NKikimrClient::TKeyValueRequest::MIN_LATENCY: @@ -2456,7 +2457,7 @@ TPrepareResult TKeyValueState::PrepareOneCmd(const TCommand::Write &request, THo intermediate->Commands.emplace_back(TIntermediate::TWrite()); auto &cmd = std::get<TIntermediate::TWrite>(intermediate->Commands.back()); cmd.Key = request.key(); - cmd.Data = request.value(); + cmd.Data = TRcBuf(request.value()); switch (request.tactic()) { case TCommand::Write::TACTIC_MIN_LATENCY: cmd.Tactic = TEvBlobStorage::TEvPut::TacticMinLatency; diff --git a/ydb/core/keyvalue/keyvalue_storage_request.cpp b/ydb/core/keyvalue/keyvalue_storage_request.cpp index 020901a70b4..1522e0b22f0 100644 --- a/ydb/core/keyvalue/keyvalue_storage_request.cpp +++ b/ydb/core/keyvalue/keyvalue_storage_request.cpp @@ -635,11 +635,15 @@ public: if (request.Status != NKikimrProto::SCHEDULED) { Y_VERIFY(request.Status == NKikimrProto::UNKNOWN); + const TRcBuf& data = request.Data; + const TContiguousSpan whole = data.GetContiguousSpan(); + ui64 offset = 0; for (const TLogoBlobID& logoBlobId : request.LogoBlobIds) { + const TContiguousSpan chunk = whole.SubSpan(offset, logoBlobId.BlobSize()); THolder<TEvBlobStorage::TEvPut> put( new TEvBlobStorage::TEvPut( - logoBlobId, request.Data.substr(offset, logoBlobId.BlobSize()), + logoBlobId, TRcBuf(TRcBuf::Piece, chunk.data(), chunk.size(), data), IntermediateResults->Deadline, request.HandleClass, request.Tactic)); const ui32 groupId = TabletInfo->GroupFor(logoBlobId.Channel(), logoBlobId.Generation()); |