Skip to content

Commit c13b904

Browse files
Merge 045f5a5 into cc67495
2 parents cc67495 + 045f5a5 commit c13b904

13 files changed

Lines changed: 402 additions & 34 deletions

File tree

ydb/core/kqp/session_actor/kqp_query_state.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,8 +323,14 @@ void TKqpQueryState::AddOffsetsToTransaction() {
323323
const auto& operations = GetTopicOperations();
324324

325325
TMaybe<TString> consumer;
326-
if (operations.HasConsumer())
326+
if (operations.HasConsumer()) {
327327
consumer = operations.GetConsumer();
328+
}
329+
330+
TMaybe<ui32> supportivePartition;
331+
if (operations.HasSupportivePartition()) {
332+
supportivePartition = operations.GetSupportivePartition();
333+
}
328334

329335
TopicOperations = NTopic::TTopicOperations();
330336

@@ -334,7 +340,7 @@ void TKqpQueryState::AddOffsetsToTransaction() {
334340

335341
for (auto& partition : topic.partitions()) {
336342
if (partition.partition_offsets().empty()) {
337-
TopicOperations.AddOperation(path, partition.partition_id());
343+
TopicOperations.AddOperation(path, partition.partition_id(), supportivePartition);
338344
} else {
339345
for (auto& range : partition.partition_offsets()) {
340346
YQL_ENSURE(consumer.Defined());

ydb/core/kqp/topics/kqp_topics.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ void TTopicPartitionOperations::AddOperation(const TString& topic, ui32 partitio
7878
Operations_[consumer].AddOperation(consumer, range);
7979
}
8080

81-
void TTopicPartitionOperations::AddOperation(const TString& topic, ui32 partition)
81+
void TTopicPartitionOperations::AddOperation(const TString& topic, ui32 partition,
82+
TMaybe<ui32> supportivePartition)
8283
{
8384
Y_ABORT_UNLESS(Topic_.Empty() || Topic_ == topic);
8485
Y_ABORT_UNLESS(Partition_.Empty() || Partition_ == partition);
@@ -88,6 +89,8 @@ void TTopicPartitionOperations::AddOperation(const TString& topic, ui32 partitio
8889
Partition_ = partition;
8990
}
9091

92+
SupportivePartition_ = SupportivePartition_ ? Max<ui32>() : supportivePartition;
93+
9194
HasWriteOperations_ = true;
9295
}
9396

@@ -112,6 +115,9 @@ void TTopicPartitionOperations::BuildTopicTxs(THashMap<ui64, NKikimrPQ::TDataTra
112115
NKikimrPQ::TPartitionOperation* o = tx.MutableOperations()->Add();
113116
o->SetPartitionId(*Partition_);
114117
o->SetPath(*Topic_);
118+
if (SupportivePartition_.Defined()) {
119+
o->SetSupportivePartition(*SupportivePartition_);
120+
}
115121
}
116122
}
117123

@@ -127,6 +133,8 @@ void TTopicPartitionOperations::Merge(const TTopicPartitionOperations& rhs)
127133
TabletId_ = rhs.TabletId_;
128134
}
129135

136+
SupportivePartition_ = SupportivePartition_ ? Max<ui32>() : rhs.SupportivePartition_;
137+
130138
for (auto& [key, value] : rhs.Operations_) {
131139
Operations_[key].Merge(value);
132140
}
@@ -240,10 +248,11 @@ void TTopicOperations::AddOperation(const TString& topic, ui32 partition,
240248
HasReadOperations_ = true;
241249
}
242250

243-
void TTopicOperations::AddOperation(const TString& topic, ui32 partition)
251+
void TTopicOperations::AddOperation(const TString& topic, ui32 partition,
252+
TMaybe<ui32> supportivePartition)
244253
{
245254
TTopicPartition key{topic, partition};
246-
Operations_[key].AddOperation(topic, partition);
255+
Operations_[key].AddOperation(topic, partition, supportivePartition);
247256
HasWriteOperations_ = true;
248257
}
249258

ydb/core/kqp/topics/kqp_topics.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ class TTopicPartitionOperations {
4949
void AddOperation(const TString& topic, ui32 partition,
5050
const TString& consumer,
5151
const Ydb::Topic::OffsetsRange& range);
52-
void AddOperation(const TString& topic, ui32 partition);
52+
void AddOperation(const TString& topic, ui32 partition,
53+
TMaybe<ui32> supportivePartition);
5354

5455
void BuildTopicTxs(THashMap<ui64, NKikimrPQ::TDataTransaction> &txs);
5556

@@ -67,6 +68,7 @@ class TTopicPartitionOperations {
6768
THashMap<TString, TConsumerOperations> Operations_;
6869
bool HasWriteOperations_ = false;
6970
TMaybe<ui64> TabletId_;
71+
TMaybe<ui32> SupportivePartition_;
7072
};
7173

7274
struct TTopicPartition {
@@ -98,7 +100,8 @@ class TTopicOperations {
98100
void AddOperation(const TString& topic, ui32 partition,
99101
const TString& consumer,
100102
const Ydb::Topic::OffsetsRange& range);
101-
void AddOperation(const TString& topic, ui32 partition);
103+
void AddOperation(const TString& topic, ui32 partition,
104+
TMaybe<ui32> supportivePartition);
102105

103106
void FillSchemeCacheNavigate(NSchemeCache::TSchemeCacheNavigate& navigate,
104107
TMaybe<TString> consumer);

ydb/core/persqueue/partition.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3042,6 +3042,8 @@ void TPartition::Handle(TEvPQ::TEvCheckPartitionStatusRequest::TPtr& ev, const T
30423042

30433043
void TPartition::HandleOnInit(TEvPQ::TEvDeletePartition::TPtr& ev, const TActorContext&)
30443044
{
3045+
Y_ABORT_UNLESS(IsSupportive());
3046+
30453047
PendingEvents.emplace_back(ev->ReleaseBase().Release());
30463048
}
30473049

ydb/core/persqueue/partition_id.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,15 @@ class TPartitionId {
2929

3030
size_t GetHash() const
3131
{
32-
return MultiHash(OriginalPartitionId, WriteId);
32+
return MultiHash(MultiHash(OriginalPartitionId, WriteId), InternalPartitionId);
3333
}
3434

3535
bool IsEqual(const TPartitionId& rhs) const
3636
{
3737
return
3838
(OriginalPartitionId == rhs.OriginalPartitionId) &&
39-
(WriteId == rhs.WriteId);
39+
(WriteId == rhs.WriteId) &&
40+
(InternalPartitionId == rhs.InternalPartitionId);
4041
}
4142

4243
void ToStream(IOutputStream& s) const

ydb/core/persqueue/partition_write.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ void TPartition::ReplyOwnerOk(const TActorContext& ctx, const ui64 dst, const TS
4141
r->SetOwnerCookie(cookie);
4242
r->SetStatus(PartitionConfig ? PartitionConfig->GetStatus() : NKikimrPQ::ETopicPartitionStatus::Active);
4343
r->SetSeqNo(seqNo);
44+
if (IsSupportive()) {
45+
r->SetSupportivePartition(Partition.InternalPartitionId);
46+
}
4447

4548
ctx.Send(Tablet, response.Release());
4649
}

ydb/core/persqueue/pq_impl.cpp

Lines changed: 61 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2001,7 +2001,8 @@ void TPersQueue::HandleWriteRequest(const ui64 responseCookie, const TActorId& p
20012001
"Tablet " << TabletID() <<
20022002
" Write in transaction." <<
20032003
" Partition: " << req.GetPartition() <<
2004-
", WriteId: " << req.GetWriteId());
2004+
", WriteId: " << req.GetWriteId() <<
2005+
", FirstWrite: " << req.GetFirstWrite());
20052006
}
20062007

20072008
for (ui32 i = 0; i < req.CmdWriteSize(); ++i) {
@@ -2198,7 +2199,8 @@ void TPersQueue::HandleReserveBytesRequest(const ui64 responseCookie, const TAct
21982199
"Tablet " << TabletID() <<
21992200
" Reserve bytes in transaction." <<
22002201
" Partition: " << req.GetPartition() <<
2201-
", WriteId: " << req.GetWriteId());
2202+
", WriteId: " << req.GetWriteId() <<
2203+
", FirstWrite: " << req.GetFirstWrite());
22022204
}
22032205

22042206
InitResponseBuilder(responseCookie, 1, COUNTER_LATENCY_PQ_RESERVE_BYTES);
@@ -2574,6 +2576,8 @@ void TPersQueue::HandleWriteRequestForSupportivePartition(const ui64 responseCoo
25742576
const NKikimrClient::TPersQueuePartitionRequest& req,
25752577
const TActorContext& ctx)
25762578
{
2579+
Y_ABORT_UNLESS(req.HasWriteId());
2580+
25772581
const TPartitionInfo& partition = GetPartitionInfo(req);
25782582
const TActorId& actorId = partition.Actor;
25792583

@@ -2618,6 +2622,7 @@ void TPersQueue::HandleEventForSupportivePartition(const ui64 responseCookie,
26182622

26192623
ui64 writeId = req.GetWriteId();
26202624
ui32 originalPartitionId = req.GetPartition();
2625+
bool firstWrite = req.GetFirstWrite();
26212626

26222627
if (TxWrites.contains(writeId) && TxWrites.at(writeId).Partitions.contains(originalPartitionId)) {
26232628
//
@@ -2648,6 +2653,14 @@ void TPersQueue::HandleEventForSupportivePartition(const ui64 responseCookie,
26482653
sender);
26492654
}
26502655
} else {
2656+
if (!firstWrite) {
2657+
ReplyError(ctx,
2658+
responseCookie,
2659+
NPersQueue::NErrorCode::BAD_REQUEST,
2660+
"lost messages");
2661+
return;
2662+
}
2663+
26512664
//
26522665
// этап 1:
26532666
// - создать запись в TxWrites
@@ -2665,6 +2678,7 @@ void TPersQueue::HandleEventForSupportivePartition(const ui64 responseCookie,
26652678
TPartitionId partitionId(originalPartitionId, writeId, NextSupportivePartitionId++);
26662679

26672680
writeInfo.Partitions.emplace(originalPartitionId, partitionId);
2681+
TxWritesChanged = true;
26682682
AddSupportivePartition(partitionId);
26692683

26702684
Y_ABORT_UNLESS(Partitions.contains(partitionId));
@@ -3115,6 +3129,38 @@ void TPersQueue::Handle(TEvPersQueue::TEvProposeTransaction::TPtr& ev, const TAc
31153129

31163130
}
31173131

3132+
bool TPersQueue::CheckTxWriteOperation(const NKikimrPQ::TPartitionOperation& operation,
3133+
ui64 writeId) const
3134+
{
3135+
TPartitionId partitionId(operation.GetPartitionId(),
3136+
writeId,
3137+
operation.GetSupportivePartition());
3138+
return Partitions.contains(partitionId);
3139+
}
3140+
3141+
bool TPersQueue::CheckTxWriteOperations(const NKikimrPQ::TDataTransaction& txBody) const
3142+
{
3143+
if (!txBody.HasWriteId()) {
3144+
return true;
3145+
}
3146+
3147+
ui64 writeId = txBody.GetWriteId();
3148+
3149+
for (auto& operation : txBody.GetOperations()) {
3150+
auto isWrite = [](const NKikimrPQ::TPartitionOperation& o) {
3151+
return !o.HasBegin();
3152+
};
3153+
3154+
if (isWrite(operation)) {
3155+
if (!CheckTxWriteOperation(operation, writeId)) {
3156+
return false;
3157+
}
3158+
}
3159+
}
3160+
3161+
return true;
3162+
}
3163+
31183164
void TPersQueue::HandleDataTransaction(TAutoPtr<TEvPersQueue::TEvProposeTransaction> ev,
31193165
const TActorContext& ctx)
31203166
{
@@ -3123,23 +3169,6 @@ void TPersQueue::HandleDataTransaction(TAutoPtr<TEvPersQueue::TEvProposeTransact
31233169
Y_ABORT_UNLESS(event.HasData());
31243170
const NKikimrPQ::TDataTransaction& txBody = event.GetData();
31253171

3126-
for (auto& operation : txBody.GetOperations()) {
3127-
Y_ABORT_UNLESS(!operation.HasPath() || (operation.GetPath() == TopicPath));
3128-
3129-
bool isWriteOperation = !operation.HasBegin();
3130-
3131-
LOG_DEBUG_S(ctx, NKikimrServices::PERSQUEUE,
3132-
"Tablet " << TabletID() <<
3133-
" tx=" << event.GetTxId() <<
3134-
", write_id=" << txBody.GetWriteId() <<
3135-
", path=" << operation.GetPath() <<
3136-
", partition=" << operation.GetPartitionId() <<
3137-
", consumer=" << operation.GetConsumer() <<
3138-
", begin=" << operation.GetBegin() <<
3139-
", end=" << operation.GetEnd() <<
3140-
", is_write=" << isWriteOperation);
3141-
}
3142-
31433172
if (TabletState != NKikimrPQ::ENormal) {
31443173
SendProposeTransactionAbort(ActorIdFromProto(event.GetSourceActor()),
31453174
event.GetTxId(),
@@ -3158,6 +3187,13 @@ void TPersQueue::HandleDataTransaction(TAutoPtr<TEvPersQueue::TEvProposeTransact
31583187
return;
31593188
}
31603189

3190+
if (!CheckTxWriteOperations(txBody)) {
3191+
SendProposeTransactionAbort(ActorIdFromProto(event.GetSourceActor()),
3192+
event.GetTxId(),
3193+
ctx);
3194+
return;
3195+
}
3196+
31613197
TMaybe<TPartitionId> partitionId = FindPartitionId(txBody);
31623198
if (!partitionId.Defined()) {
31633199
SendProposeTransactionAbort(ActorIdFromProto(event.GetSourceActor()),
@@ -3392,7 +3428,8 @@ void TPersQueue::BeginWriteTxs(const TActorContext& ctx)
33923428
CanProcessPlanStepQueue() ||
33933429
CanProcessWriteTxs() ||
33943430
CanProcessDeleteTxs() ||
3395-
CanProcessTxWrites()
3431+
CanProcessTxWrites() ||
3432+
TxWritesChanged
33963433
;
33973434
if (!canProcess) {
33983435
return;
@@ -3441,6 +3478,8 @@ void TPersQueue::EndWriteTxs(const NKikimrClient::TResponse& resp,
34413478
return;
34423479
}
34433480

3481+
TxWritesChanged = false;
3482+
34443483
SendReplies(ctx);
34453484
CheckChangedTxStates(ctx);
34463485
CreateSupportivePartitionActors(ctx);
@@ -4411,7 +4450,7 @@ void TPersQueue::ProcessCheckPartitionStatusRequests(const TPartitionId& partiti
44114450
}
44124451
}
44134452

4414-
void TPersQueue::Handle(NLongTxService::TEvLongTxService::TEvLockStatus::TPtr& ev, const TActorContext&)
4453+
void TPersQueue::Handle(NLongTxService::TEvLongTxService::TEvLockStatus::TPtr& ev, const TActorContext& ctx)
44154454
{
44164455
auto& record = ev->Get()->Record;
44174456
ui64 writeId = record.GetLockId();
@@ -4473,6 +4512,7 @@ void TPersQueue::Handle(TEvPQ::TEvDeletePartitionDone::TPtr& ev, const TActorCon
44734512
}
44744513
TxWrites.erase(writeId);
44754514
}
4515+
TxWritesChanged = true;
44764516

44774517
TryWriteTxs(ctx);
44784518
}

ydb/core/persqueue/pq_impl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ class TPersQueue : public NKeyValue::TKeyValueFlat {
205205
};
206206

207207
THashMap<ui64, TTxWriteInfo> TxWrites;
208+
bool TxWritesChanged = false;
208209
ui32 NextSupportivePartitionId = 100'000;
209210

210211
TActorId CacheActor;
@@ -494,6 +495,10 @@ class TPersQueue : public NKeyValue::TKeyValueFlat {
494495

495496
void BeginDeleteTx(const TDistributedTransaction& tx);
496497
void BeginDeletePartitions(TTxWriteInfo& writeInfo);
498+
499+
bool CheckTxWriteOperation(const NKikimrPQ::TPartitionOperation& operation,
500+
ui64 writeId) const;
501+
bool CheckTxWriteOperations(const NKikimrPQ::TDataTransaction& txBody) const;
497502
};
498503

499504

0 commit comments

Comments
 (0)