Skip to content

Commit 8673c28

Browse files
authored
YQ-3742 Shared reading: remove assert (#10322)
1 parent ddea4fb commit 8673c28

File tree

3 files changed

+59
-25
lines changed

3 files changed

+59
-25
lines changed

ydb/library/yql/providers/pq/async_io/dq_pq_rd_read_actor.cpp

Lines changed: 52 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
#include <ydb/public/sdk/cpp/client/ydb_topic/topic.h>
2525
#include <ydb/public/sdk/cpp/client/ydb_types/credentials/credentials.h>
2626

27-
#include <ydb/library/actors/core/actor_bootstrapped.h>
27+
#include <ydb/library/actors/core/actor.h>
2828
#include <ydb/library/actors/core/event_local.h>
2929
#include <ydb/library/actors/core/events.h>
3030
#include <ydb/library/actors/core/hfunc.h>
@@ -94,16 +94,19 @@ struct TEvPrivate {
9494
enum EEv : ui32 {
9595
EvBegin = EventSpaceBegin(NActors::TEvents::ES_PRIVATE),
9696
EvPrintState = EvBegin + 20,
97+
EvProcessState = EvBegin + 21,
9798
EvEnd
9899
};
99100
static_assert(EvEnd < EventSpaceEnd(NActors::TEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(NActors::TEvents::ES_PRIVATE)");
100101
struct TEvPrintState : public NActors::TEventLocal<TEvPrintState, EvPrintState> {};
102+
struct TEvProcessState : public NActors::TEventLocal<TEvProcessState, EvProcessState> {};
101103
};
102104

103-
ui64 PrintStatePeriodSec = 60;
104-
105105
class TDqPqRdReadActor : public NActors::TActor<TDqPqRdReadActor>, public NYql::NDq::NInternal::TDqPqReadActorBase {
106-
public:
106+
107+
const ui64 PrintStatePeriodSec = 60;
108+
const ui64 ProcessStatePeriodSec = 2;
109+
107110
using TDebugOffsets = TMaybe<std::pair<ui64, ui64>>;
108111

109112
struct TReadyBatch {
@@ -136,6 +139,7 @@ class TDqPqRdReadActor : public NActors::TActor<TDqPqRdReadActor>, public NYql::
136139
ui64 CoordinatorRequestCookie = 0;
137140
TRowDispatcherReadActorMetrics Metrics;
138141
bool SchedulePrintStatePeriod = false;
142+
bool ProcessStateScheduled = false;
139143

140144
struct SessionInfo {
141145
enum class ESessionStatus {
@@ -193,6 +197,7 @@ class TDqPqRdReadActor : public NActors::TActor<TDqPqRdReadActor>, public NYql::
193197
void Handle(NActors::TEvents::TEvPong::TPtr& ev);
194198
void Handle(const NActors::TEvents::TEvPing::TPtr&);
195199
void Handle(TEvPrivate::TEvPrintState::TPtr&);
200+
void Handle(TEvPrivate::TEvProcessState::TPtr&);
196201

197202
STRICT_STFUNC(StateFunc, {
198203
hFunc(NFq::TEvRowDispatcher::TEvCoordinatorChanged, Handle);
@@ -212,6 +217,7 @@ class TDqPqRdReadActor : public NActors::TActor<TDqPqRdReadActor>, public NYql::
212217
hFunc(NYql::NDq::TEvRetryQueuePrivate::TEvSessionClosed, Handle);
213218
hFunc(NActors::TEvents::TEvPing, Handle);
214219
hFunc(TEvPrivate::TEvPrintState, Handle);
220+
hFunc(TEvPrivate::TEvProcessState, Handle);
215221
})
216222

217223
static constexpr char ActorName[] = "DQ_PQ_READ_ACTOR";
@@ -224,7 +230,7 @@ class TDqPqRdReadActor : public NActors::TActor<TDqPqRdReadActor>, public NYql::
224230
void ProcessState();
225231
void Stop(const TString& message);
226232
void StopSessions();
227-
void ReInit();
233+
void ReInit(const TString& reason);
228234
void PrintInternalState();
229235
};
230236

@@ -262,6 +268,10 @@ void TDqPqRdReadActor::ProcessState() {
262268
if (!ReadyBuffer.empty()) {
263269
return;
264270
}
271+
if (!ProcessStateScheduled) {
272+
ProcessStateScheduled = true;
273+
Schedule(TDuration::Seconds(ProcessStatePeriodSec), new TEvPrivate::TEvProcessState());
274+
}
265275
if (!CoordinatorActorId) {
266276
SRC_LOG_D("Send TEvCoordinatorChangesSubscribe to local row dispatcher, self id " << SelfId());
267277
Send(LocalRowDispatcherActorId, new NFq::TEvRowDispatcher::TEvCoordinatorChangesSubscribe());
@@ -401,7 +411,12 @@ void TDqPqRdReadActor::Handle(NFq::TEvRowDispatcher::TEvStartSessionAck::TPtr& e
401411

402412
ui64 partitionId = ev->Get()->Record.GetConsumer().GetPartitionId();
403413
auto sessionIt = Sessions.find(partitionId);
404-
YQL_ENSURE(sessionIt != Sessions.end(), "Unknown partition id");
414+
if (sessionIt == Sessions.end()) {
415+
SRC_LOG_W("Ignore TEvStartSessionAck from " << ev->Sender << ", seqNo " << meta.GetSeqNo()
416+
<< ", ConfirmedSeqNo " << meta.GetConfirmedSeqNo() << ", PartitionId " << partitionId);
417+
YQL_ENSURE(State != EState::STARTED);
418+
return;
419+
}
405420
auto& sessionInfo = sessionIt->second;
406421
if (!sessionInfo.EventsQueue.OnEventReceived(ev)) {
407422
SRC_LOG_W("Wrong seq num ignore message, seqNo " << meta.GetSeqNo());
@@ -415,7 +430,12 @@ void TDqPqRdReadActor::Handle(NFq::TEvRowDispatcher::TEvSessionError::TPtr& ev)
415430

416431
ui64 partitionId = ev->Get()->Record.GetPartitionId();
417432
auto sessionIt = Sessions.find(partitionId);
418-
YQL_ENSURE(sessionIt != Sessions.end(), "Unknown partition id");
433+
if (sessionIt == Sessions.end()) {
434+
SRC_LOG_W("Ignore TEvSessionError from " << ev->Sender << ", seqNo " << meta.GetSeqNo()
435+
<< ", ConfirmedSeqNo " << meta.GetConfirmedSeqNo() << ", PartitionId " << partitionId);
436+
YQL_ENSURE(State != EState::STARTED);
437+
return;
438+
}
419439

420440
auto& sessionInfo = sessionIt->second;
421441
if (!sessionInfo.EventsQueue.OnEventReceived(ev)) {
@@ -431,7 +451,12 @@ void TDqPqRdReadActor::Handle(NFq::TEvRowDispatcher::TEvStatus::TPtr& ev) {
431451

432452
ui64 partitionId = ev->Get()->Record.GetPartitionId();
433453
auto sessionIt = Sessions.find(partitionId);
434-
YQL_ENSURE(sessionIt != Sessions.end(), "Unknown partition id");
454+
if (sessionIt == Sessions.end()) {
455+
SRC_LOG_W("Ignore TEvStatus from " << ev->Sender << ", seqNo " << meta.GetSeqNo()
456+
<< ", ConfirmedSeqNo " << meta.GetConfirmedSeqNo() << ", PartitionId " << partitionId);
457+
YQL_ENSURE(State != EState::STARTED);
458+
return;
459+
}
435460
auto& sessionInfo = sessionIt->second;
436461

437462
if (!sessionInfo.EventsQueue.OnEventReceived(ev)) {
@@ -452,7 +477,9 @@ void TDqPqRdReadActor::Handle(NFq::TEvRowDispatcher::TEvNewDataArrived::TPtr& ev
452477
ui64 partitionId = ev->Get()->Record.GetPartitionId();
453478
auto sessionIt = Sessions.find(partitionId);
454479
if (sessionIt == Sessions.end()) {
455-
Stop("Internal error: unknown partition id " + ToString(partitionId));
480+
SRC_LOG_W("Ignore TEvNewDataArrived from " << ev->Sender << ", seqNo " << meta.GetSeqNo()
481+
<< ", ConfirmedSeqNo " << meta.GetConfirmedSeqNo() << ", PartitionId " << partitionId);
482+
YQL_ENSURE(State != EState::STARTED);
456483
return;
457484
}
458485

@@ -512,20 +539,18 @@ void TDqPqRdReadActor::Handle(NFq::TEvRowDispatcher::TEvCoordinatorChanged::TPtr
512539
}
513540

514541
CoordinatorActorId = ev->Get()->CoordinatorActorId;
515-
SRC_LOG_I("Coordinator is changed, reinit all sessions");
516-
ReInit();
542+
ReInit("Coordinator is changed");
517543
ProcessState();
518544
}
519545

520-
void TDqPqRdReadActor::ReInit() {
521-
SRC_LOG_I("ReInit state");
546+
void TDqPqRdReadActor::ReInit(const TString& reason) {
547+
SRC_LOG_I("ReInit state, reason " << reason);
522548
StopSessions();
523549
Sessions.clear();
524550
State = EState::INIT;
525551
if (!ReadyBuffer.empty()) {
526552
Send(ComputeActorId, new TEvNewAsyncInputDataArrived(InputIndex));
527553
}
528-
ProcessState();
529554
}
530555

531556
void TDqPqRdReadActor::Stop(const TString& message) {
@@ -582,24 +607,23 @@ void TDqPqRdReadActor::Handle(NActors::TEvents::TEvUndelivered::TPtr& ev) {
582607
}
583608

584609
if (CoordinatorActorId && *CoordinatorActorId == ev->Sender) {
585-
SRC_LOG_D("TEvUndelivered to coordinator, reinit");
586-
ReInit();
610+
ReInit("TEvUndelivered to coordinator");
587611
}
588612
}
589613

590614
void TDqPqRdReadActor::Handle(NFq::TEvRowDispatcher::TEvMessageBatch::TPtr& ev) {
591615
const NYql::NDqProto::TMessageTransportMeta& meta = ev->Get()->Record.GetTransportMeta();
592616
SRC_LOG_T("TEvMessageBatch from " << ev->Sender << ", seqNo " << meta.GetSeqNo() << ", ConfirmedSeqNo " << meta.GetConfirmedSeqNo());
593617
ui64 partitionId = ev->Get()->Record.GetPartitionId();
594-
YQL_ENSURE(Sessions.count(partitionId), "Unknown partition id " << partitionId);
595-
auto it = Sessions.find(partitionId);
596-
if (it == Sessions.end()) {
597-
Stop("Wrong session data");
598-
return;
618+
auto sessionIt = Sessions.find(partitionId);
619+
if (sessionIt == Sessions.end()) {
620+
SRC_LOG_W("Ignore TEvMessageBatch from " << ev->Sender << ", seqNo " << meta.GetSeqNo()
621+
<< ", ConfirmedSeqNo " << meta.GetConfirmedSeqNo() << ", PartitionId " << partitionId);
622+
YQL_ENSURE(State != EState::STARTED);
599623
}
600624

601625
Metrics.InFlyGetNextBatch->Set(0);
602-
auto& sessionInfo = it->second;
626+
auto& sessionInfo = sessionIt->second;
603627
if (!sessionInfo.EventsQueue.OnEventReceived(ev)) {
604628
SRC_LOG_W("Wrong seq num ignore message, seqNo " << meta.GetSeqNo());
605629
return;
@@ -631,8 +655,7 @@ std::pair<NUdf::TUnboxedValuePod, i64> TDqPqRdReadActor::CreateItem(const TStrin
631655
}
632656

633657
void TDqPqRdReadActor::Handle(const NYql::NDq::TEvRetryQueuePrivate::TEvSessionClosed::TPtr& ev) {
634-
SRC_LOG_D("Session closed, event queue id " << ev->Get()->EventQueueId);
635-
ReInit();
658+
ReInit(TStringBuilder() << "Session closed, event queue id " << ev->Get()->EventQueueId);
636659
}
637660

638661
void TDqPqRdReadActor::Handle(NActors::TEvents::TEvPong::TPtr& ev) {
@@ -654,6 +677,11 @@ void TDqPqRdReadActor::PrintInternalState() {
654677
SRC_LOG_D(str.Str());
655678
}
656679

680+
void TDqPqRdReadActor::Handle(TEvPrivate::TEvProcessState::TPtr&) {
681+
Schedule(TDuration::Seconds(ProcessStatePeriodSec), new TEvPrivate::TEvProcessState());
682+
ProcessState();
683+
}
684+
657685
std::pair<IDqComputeActorAsyncInput*, NActors::IActor*> CreateDqPqRdReadActor(
658686
NPq::NProto::TDqPqTopicSource&& settings,
659687
ui64 inputIndex,

ydb/library/yql/providers/pq/provider/yql_pq_dq_integration.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ class TPqDqIntegration: public TDqIntegrationBase {
268268
}
269269
}
270270

271-
sharedReading = sharedReading && (format == "json_each_row" || (format == "raw"));
271+
sharedReading = sharedReading && (format == "json_each_row" || format == "raw");
272272
TString predicateSql = NYql::FormatWhere(predicateProto);
273273
if (sharedReading) {
274274
if (format == "json_each_row") {

ydb/tests/fq/pq_async_io/ut/dq_pq_rd_read_actor_ut.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,5 +355,11 @@ Y_UNIT_TEST_SUITE(TDqPqRdReadActorTests) {
355355

356356
ProcessSomeJsons(2, {Json3}, RowDispatcher1);
357357
}
358+
359+
Y_UNIT_TEST_F(IgnoreMessageIfNoSessions, TFixture) {
360+
StartSession();
361+
MockCoordinatorChanged(Coordinator2Id);
362+
MockSessionError();
363+
}
358364
}
359365
} // NYql::NDq

0 commit comments

Comments
 (0)