Skip to content

Commit b9e6764

Browse files
authored
KqpRun added inprogress statistic (#4861)
1 parent a6248d0 commit b9e6764

File tree

8 files changed

+288
-22
lines changed

8 files changed

+288
-22
lines changed

ydb/tests/tools/kqprun/configuration/app_config.conf

+4
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ QueryServiceConfig {
7373
MinDesiredDirectoriesOfFilesPerQuery: 1000
7474
RegexpCacheSize: 100
7575

76+
DefaultSettings {
77+
Name: "AtomicUploadCommit"
78+
Value: "true"
79+
}
7680
DefaultSettings {
7781
Name: "UseBlocksSource"
7882
Value: "true"

ydb/tests/tools/kqprun/kqprun.cpp

+22-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct TExecutionOptions {
3232
EClearExecutionCase ClearExecution = EClearExecutionCase::Disabled;
3333
NKikimrKqp::EQueryAction ScriptQueryAction = NKikimrKqp::QUERY_ACTION_EXECUTE;
3434

35-
TString TraceId = "kqprun";
35+
TString TraceId = "kqprun_" + CreateGuidAsString();
3636

3737
bool HasResults() const {
3838
return !ScriptQueries.empty() && ScriptQueryAction == NKikimrKqp::QUERY_ACTION_EXECUTE;
@@ -163,6 +163,7 @@ void RunMain(int argc, const char* argv[]) {
163163
TString schemeQueryAstFile;
164164
TString scriptQueryAstFile;
165165
TString scriptQueryPlanFile;
166+
TString inProgressStatisticsFile;
166167
TString logFile = "-";
167168
TString appConfigFile = "./configuration/app_config.conf";
168169
std::vector<TString> tablesMappingList;
@@ -218,6 +219,10 @@ void RunMain(int argc, const char* argv[]) {
218219
.Optional()
219220
.RequiredArgument("FILE")
220221
.StoreResult(&scriptQueryPlanFile);
222+
options.AddLongOption("in-progress-statistics", "File with script inprogress statistics")
223+
.Optional()
224+
.RequiredArgument("FILE")
225+
.StoreResult(&inProgressStatisticsFile);
221226

222227
options.AddLongOption('C', "clear-execution", "Execute script query without creating additional tables, one of { query | yql-script }")
223228
.Optional()
@@ -319,6 +324,10 @@ void RunMain(int argc, const char* argv[]) {
319324
THolder<TFileOutput> scriptQueryAstFileHolder = SetupDefaultFileOutput(scriptQueryAstFile, runnerOptions.ScriptQueryAstOutput);
320325
THolder<TFileOutput> scriptQueryPlanFileHolder = SetupDefaultFileOutput(scriptQueryPlanFile, runnerOptions.ScriptQueryPlanOutput);
321326

327+
if (inProgressStatisticsFile) {
328+
runnerOptions.InProgressStatisticsOutputFile = inProgressStatisticsFile;
329+
}
330+
322331
runnerOptions.TraceOptType = GetCaseVariant<NKqpRun::TRunnerOptions::ETraceOptType>("trace-opt", traceOptType, {
323332
{"all", NKqpRun::TRunnerOptions::ETraceOptType::All},
324333
{"scheme", NKqpRun::TRunnerOptions::ETraceOptType::Scheme},
@@ -399,8 +408,20 @@ void KqprunTerminateHandler() {
399408
}
400409

401410

411+
void SegmentationFaultHandler(int) {
412+
NColorizer::TColors colors = NColorizer::AutoColors(Cerr);
413+
414+
Cerr << colors.Red() << "======= segmentation fault call stack ========" << colors.Default() << Endl;
415+
FormatBackTrace(&Cerr);
416+
Cerr << colors.Red() << "==============================================" << colors.Default() << Endl;
417+
418+
abort();
419+
}
420+
421+
402422
int main(int argc, const char* argv[]) {
403423
std::set_terminate(KqprunTerminateHandler);
424+
signal(SIGSEGV, &SegmentationFaultHandler);
404425

405426
try {
406427
RunMain(argc, argv);

ydb/tests/tools/kqprun/src/actors.cpp

+99-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "actors.h"
22

33
#include <ydb/core/kqp/common/simple/services.h>
4+
#include <ydb/core/kqp/rm_service/kqp_rm_service.h>
45

56

67
namespace NKqpRun {
@@ -11,13 +12,14 @@ class TRunScriptActorMock : public NActors::TActorBootstrapped<TRunScriptActorMo
1112
public:
1213
TRunScriptActorMock(THolder<NKikimr::NKqp::TEvKqp::TEvQueryRequest> request,
1314
NThreading::TPromise<NKikimr::NKqp::TEvKqp::TEvQueryResponse::TPtr> promise,
14-
ui64 resultRowsLimit, ui64 resultSizeLimit, std::vector<Ydb::ResultSet>& resultSets, TString& queryPlan)
15+
ui64 resultRowsLimit, ui64 resultSizeLimit, std::vector<Ydb::ResultSet>& resultSets,
16+
TProgressCallback progressCallback)
1517
: Request_(std::move(request))
1618
, Promise_(promise)
1719
, ResultRowsLimit_(std::numeric_limits<ui64>::max())
1820
, ResultSizeLimit_(std::numeric_limits<i64>::max())
1921
, ResultSets_(resultSets)
20-
, QueryPlan_(queryPlan)
22+
, ProgressCallback_(progressCallback)
2123
{
2224
if (resultRowsLimit) {
2325
ResultRowsLimit_ = resultRowsLimit;
@@ -76,7 +78,9 @@ class TRunScriptActorMock : public NActors::TActorBootstrapped<TRunScriptActorMo
7678
}
7779

7880
void Handle(NKikimr::NKqp::TEvKqpExecuter::TEvExecuterProgress::TPtr& ev) {
79-
QueryPlan_ = ev->Get()->Record.GetQueryPlan();
81+
if (ProgressCallback_) {
82+
ProgressCallback_(ev->Get()->Record);
83+
}
8084
}
8185

8286
private:
@@ -85,15 +89,104 @@ class TRunScriptActorMock : public NActors::TActorBootstrapped<TRunScriptActorMo
8589
ui64 ResultRowsLimit_;
8690
ui64 ResultSizeLimit_;
8791
std::vector<Ydb::ResultSet>& ResultSets_;
88-
TString& QueryPlan_;
92+
TProgressCallback ProgressCallback_;
93+
};
94+
95+
class TResourcesWaiterActor : public NActors::TActorBootstrapped<TResourcesWaiterActor> {
96+
struct TEvPrivate {
97+
enum EEv : ui32 {
98+
EvResourcesInfo = EventSpaceBegin(NActors::TEvents::ES_PRIVATE),
99+
100+
EvEnd
101+
};
102+
103+
static_assert(EvEnd < EventSpaceEnd(NActors::TEvents::ES_PRIVATE), "expect EvEnd < EventSpaceEnd(NActors::TEvents::ES_PRIVATE)");
104+
105+
struct TEvResourcesInfo : public NActors::TEventLocal<TEvResourcesInfo, EvResourcesInfo> {
106+
explicit TEvResourcesInfo(i32 nodeCount)
107+
: NodeCount(nodeCount)
108+
{}
109+
110+
const i32 NodeCount;
111+
};
112+
};
113+
114+
static constexpr TDuration REFRESH_PERIOD = TDuration::MilliSeconds(10);
115+
116+
public:
117+
TResourcesWaiterActor(NThreading::TPromise<void> promise, i32 expectedNodeCount)
118+
: ExpectedNodeCount_(expectedNodeCount)
119+
, Promise_(promise)
120+
{}
121+
122+
void Bootstrap() {
123+
Become(&TResourcesWaiterActor::StateFunc);
124+
CheckResourcesPublish();
125+
}
126+
127+
void Handle(NActors::TEvents::TEvWakeup::TPtr&) {
128+
CheckResourcesPublish();
129+
}
130+
131+
void Handle(TEvPrivate::TEvResourcesInfo::TPtr& ev) {
132+
if (ev->Get()->NodeCount == ExpectedNodeCount_) {
133+
Promise_.SetValue();
134+
PassAway();
135+
return;
136+
}
137+
138+
Schedule(REFRESH_PERIOD, new NActors::TEvents::TEvWakeup());
139+
}
140+
141+
STRICT_STFUNC(StateFunc,
142+
hFunc(NActors::TEvents::TEvWakeup, Handle);
143+
hFunc(TEvPrivate::TEvResourcesInfo, Handle);
144+
)
145+
146+
private:
147+
void CheckResourcesPublish() {
148+
GetResourceManager();
149+
150+
if (!ResourceManager_) {
151+
Schedule(REFRESH_PERIOD, new NActors::TEvents::TEvWakeup());
152+
return;
153+
}
154+
155+
UpdateResourcesInfo();
156+
}
157+
158+
void GetResourceManager() {
159+
if (ResourceManager_) {
160+
return;
161+
}
162+
ResourceManager_ = NKikimr::NKqp::TryGetKqpResourceManager(SelfId().NodeId());
163+
}
164+
165+
void UpdateResourcesInfo() const {
166+
ResourceManager_->RequestClusterResourcesInfo(
167+
[selfId = SelfId(), actorContext = ActorContext()](TVector<NKikimrKqp::TKqpNodeResources>&& resources) {
168+
actorContext.Send(selfId, new TEvPrivate::TEvResourcesInfo(resources.size()));
169+
});
170+
}
171+
172+
private:
173+
const i32 ExpectedNodeCount_;
174+
NThreading::TPromise<void> Promise_;
175+
176+
std::shared_ptr<NKikimr::NKqp::NRm::IKqpResourceManager> ResourceManager_;
89177
};
90178

91179
} // anonymous namespace
92180

93181
NActors::IActor* CreateRunScriptActorMock(THolder<NKikimr::NKqp::TEvKqp::TEvQueryRequest> request,
94182
NThreading::TPromise<NKikimr::NKqp::TEvKqp::TEvQueryResponse::TPtr> promise,
95-
ui64 resultRowsLimit, ui64 resultSizeLimit, std::vector<Ydb::ResultSet>& resultSets, TString& queryPlan) {
96-
return new TRunScriptActorMock(std::move(request), promise, resultRowsLimit, resultSizeLimit, resultSets, queryPlan);
183+
ui64 resultRowsLimit, ui64 resultSizeLimit, std::vector<Ydb::ResultSet>& resultSets,
184+
TProgressCallback progressCallback) {
185+
return new TRunScriptActorMock(std::move(request), promise, resultRowsLimit, resultSizeLimit, resultSets, progressCallback);
186+
}
187+
188+
NActors::IActor* CreateResourcesWaiterActor(NThreading::TPromise<void> promise, i32 expectedNodeCount) {
189+
return new TResourcesWaiterActor(promise, expectedNodeCount);
97190
}
98191

99192
} // namespace NKqpRun

ydb/tests/tools/kqprun/src/actors.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44

55
namespace NKqpRun {
66

7+
using TProgressCallback = std::function<void(const NKikimrKqp::TEvExecuterProgress&)>;
8+
79
NActors::IActor* CreateRunScriptActorMock(THolder<NKikimr::NKqp::TEvKqp::TEvQueryRequest> request,
810
NThreading::TPromise<NKikimr::NKqp::TEvKqp::TEvQueryResponse::TPtr> promise,
9-
ui64 resultRowsLimit, ui64 resultSizeLimit, std::vector<Ydb::ResultSet>& resultSets, TString& queryPlan);
11+
ui64 resultRowsLimit, ui64 resultSizeLimit, std::vector<Ydb::ResultSet>& resultSets,
12+
TProgressCallback progressCallback);
13+
14+
NActors::IActor* CreateResourcesWaiterActor(NThreading::TPromise<void> promise, i32 expectedNodeCount);
1015

1116
} // namespace NKqpRun

ydb/tests/tools/kqprun/src/common.h

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ constexpr char YQL_TOKEN_VARIABLE[] = "YQL_TOKEN";
1616
struct TYdbSetupSettings {
1717
i32 NodeCount = 1;
1818
TString DomainName = "Root";
19+
TDuration InitializationTimeout = TDuration::Seconds(10);
1920

2021
bool TraceOptEnabled = false;
2122
TMaybe<TString> LogOutputFile;
@@ -46,6 +47,7 @@ struct TRunnerOptions {
4647
IOutputStream* SchemeQueryAstOutput = nullptr;
4748
IOutputStream* ScriptQueryAstOutput = nullptr;
4849
IOutputStream* ScriptQueryPlanOutput = nullptr;
50+
TMaybe<TString> InProgressStatisticsOutputFile;
4951

5052
EResultOutputFormat ResultOutputFormat = EResultOutputFormat::RowsJson;
5153
NYdb::NConsoleClient::EOutputFormat PlanOutputFormat = NYdb::NConsoleClient::EOutputFormat::Default;

0 commit comments

Comments
 (0)