summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralexvru <[email protected]>2023-05-24 12:13:10 +0300
committeralexvru <[email protected]>2023-05-24 12:13:10 +0300
commitc0a039174bbacd33e3ce33873a85481d4e83ba8b (patch)
tree43b8e2d1e4e071fb09d5bea17974fedcc33fc0d7
parent128c5e5307c946da48dc581ac149b38c1e3f2552 (diff)
Replace TString -> TRcBuf for TEvPut
-rw-r--r--ydb/core/keyvalue/keyvalue_index_record.cpp10
-rw-r--r--ydb/core/keyvalue/keyvalue_index_record.h4
-rw-r--r--ydb/core/keyvalue/keyvalue_intermediate.h2
-rw-r--r--ydb/core/keyvalue/keyvalue_state.cpp17
-rw-r--r--ydb/core/keyvalue/keyvalue_storage_request.cpp6
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());