1
1
#include " analyze_actor.h"
2
2
3
3
#include < ydb/core/base/path.h>
4
- #include < ydb/core/base/tablet_pipecache.h>
5
4
#include < ydb/core/util/ulid.h>
6
5
#include < ydb/library/actors/core/log.h>
7
6
#include < ydb/library/services/services.pb.h>
@@ -42,19 +41,6 @@ void TAnalyzeActor::Bootstrap() {
42
41
Become (&TAnalyzeActor::StateWork);
43
42
}
44
43
45
- void TAnalyzeActor::SendAnalyzeStatus () {
46
- Y_ABORT_UNLESS (StatisticsAggregatorId.has_value ());
47
-
48
- auto getStatus = std::make_unique<NStat::TEvStatistics::TEvAnalyzeStatus>();
49
- auto & record = getStatus->Record ;
50
- record.SetOperationId (OperationId);
51
-
52
- Send (
53
- MakePipePerNodeCacheID (false ),
54
- new TEvPipeCache::TEvForward (getStatus.release (), StatisticsAggregatorId.value (), true )
55
- );
56
- }
57
-
58
44
void TAnalyzeActor::Handle (NStat::TEvStatistics::TEvAnalyzeResponse::TPtr& ev, const TActorContext& ctx) {
59
45
Y_UNUSED (ctx);
60
46
@@ -67,50 +53,10 @@ void TAnalyzeActor::Handle(NStat::TEvStatistics::TEvAnalyzeResponse::TPtr& ev, c
67
53
<< " , but expected " << OperationId);
68
54
}
69
55
70
-
71
- // TODO Don't send EvAnalyzeStatus, EvAnalyzeResponse is already here
72
- SendAnalyzeStatus ();
73
- }
74
-
75
- void TAnalyzeActor::Handle (TEvAnalyzePrivate::TEvAnalyzeStatusCheck::TPtr& ev, const TActorContext& ctx) {
76
- Y_UNUSED (ev);
77
- Y_UNUSED (ctx);
78
-
79
- SendAnalyzeStatus ();
80
- }
81
-
82
- void TAnalyzeActor::Handle (NStat::TEvStatistics::TEvAnalyzeStatusResponse::TPtr& ev, const TActorContext& ctx) {
83
- auto & record = ev->Get ()->Record ;
84
- switch (record.GetStatus ()) {
85
- case NKikimrStat::TEvAnalyzeStatusResponse::STATUS_UNSPECIFIED: {
86
- Promise.SetValue (
87
- NYql::NCommon::ResultFromError<NYql::IKikimrGateway::TGenericResult>(
88
- YqlIssue (
89
- {}, NYql::TIssuesIds::UNEXPECTED,
90
- TStringBuilder () << " Statistics Aggregator unspecified error"
91
- )
92
- )
93
- );
94
- this ->Die (ctx);
95
- return ;
96
- }
97
- case NKikimrStat::TEvAnalyzeStatusResponse::STATUS_NO_OPERATION: {
98
- NYql::IKikimrGateway::TGenericResult result;
99
- result.SetSuccess ();
100
- Promise.SetValue (std::move (result));
101
-
102
- this ->Die (ctx);
103
- return ;
104
- }
105
- case NKikimrStat::TEvAnalyzeStatusResponse::STATUS_ENQUEUED: {
106
- Schedule (TDuration::Seconds (10 ), new TEvAnalyzePrivate::TEvAnalyzeStatusCheck ());
107
- return ;
108
- }
109
- case NKikimrStat::TEvAnalyzeStatusResponse::STATUS_IN_PROGRESS: {
110
- Schedule (TDuration::Seconds (5 ), new TEvAnalyzePrivate::TEvAnalyzeStatusCheck ());
111
- return ;
112
- }
113
- }
56
+ NYql::IKikimrGateway::TGenericResult result;
57
+ result.SetSuccess ();
58
+ Promise.SetValue (std::move (result));
59
+ this ->Die (ctx);
114
60
}
115
61
116
62
void TAnalyzeActor::Handle (TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr& ev, const TActorContext& ctx) {
@@ -188,13 +134,56 @@ void TAnalyzeActor::Handle(TEvTxProxySchemeCache::TEvNavigateKeySetResult::TPtr&
188
134
}
189
135
}
190
136
137
+ TDuration TAnalyzeActor::CalcBackoffTime () {
138
+ ui32 backoffSlots = 1 << RetryCount;
139
+ TDuration maxDuration = RetryInterval * backoffSlots;
140
+
141
+ double uncertaintyRatio = std::max (std::min (UncertainRatio, 1.0 ), 0.0 );
142
+ double uncertaintyMultiplier = RandomNumber<double >() * uncertaintyRatio - uncertaintyRatio + 1.0 ;
143
+
144
+ double durationMs = round (maxDuration.MilliSeconds () * uncertaintyMultiplier);
145
+ durationMs = std::max (std::min (durationMs, MaxBackoffDurationMs), 0.0 );
146
+ return TDuration::MilliSeconds (durationMs);
147
+ }
148
+
149
+ void TAnalyzeActor::Handle (TEvPipeCache::TEvDeliveryProblem::TPtr& ev, const TActorContext& ctx) {
150
+ Y_UNUSED (ev, ctx);
151
+
152
+ if (RetryCount >= MaxRetryCount) {
153
+ Promise.SetValue (
154
+ NYql::NCommon::ResultFromError<NYql::IKikimrGateway::TGenericResult>(
155
+ YqlIssue (
156
+ {}, NYql::TIssuesIds::UNEXPECTED,
157
+ TStringBuilder () << " Can't establish connection with the Statistics Aggregator!"
158
+ )
159
+ )
160
+ );
161
+ this ->Die (ctx);
162
+ return ;
163
+ }
164
+
165
+ ++RetryCount;
166
+ Schedule (CalcBackoffTime (), new TEvAnalyzePrivate::TEvAnalyzeRetry ());
167
+ }
168
+
169
+ void TAnalyzeActor::Handle (TEvAnalyzePrivate::TEvAnalyzeRetry::TPtr& ev, const TActorContext& ctx) {
170
+ Y_UNUSED (ev, ctx);
171
+
172
+ auto analyzeRequest = std::make_unique<NStat::TEvStatistics::TEvAnalyze>();
173
+ analyzeRequest->Record = Request.Record ;
174
+ Send (
175
+ MakePipePerNodeCacheID (false ),
176
+ new TEvPipeCache::TEvForward (analyzeRequest.release (), StatisticsAggregatorId.value (), true ),
177
+ IEventHandle::FlagTrackDelivery
178
+ );
179
+ }
180
+
191
181
void TAnalyzeActor::SendStatisticsAggregatorAnalyze (const NSchemeCache::TSchemeCacheNavigate::TEntry& entry, const TActorContext& ctx) {
192
182
Y_ABORT_UNLESS (entry.DomainInfo ->Params .HasStatisticsAggregator ());
193
183
194
184
StatisticsAggregatorId = entry.DomainInfo ->Params .GetStatisticsAggregator ();
195
185
196
- auto analyzeRequest = std::make_unique<NStat::TEvStatistics::TEvAnalyze>();
197
- auto & record = analyzeRequest->Record ;
186
+ auto & record = Request.Record ;
198
187
record.SetOperationId (OperationId);
199
188
auto table = record.AddTables ();
200
189
@@ -223,7 +212,8 @@ void TAnalyzeActor::SendStatisticsAggregatorAnalyze(const NSchemeCache::TSchemeC
223
212
*table->MutableColumnTags ()->Add () = tagByColumnName[columnName];
224
213
}
225
214
226
- // TODO This request should be retried if StatisticsAggregator fails
215
+ auto analyzeRequest = std::make_unique<NStat::TEvStatistics::TEvAnalyze>();
216
+ analyzeRequest->Record = Request.Record ;
227
217
Send (
228
218
MakePipePerNodeCacheID (false ),
229
219
new TEvPipeCache::TEvForward (analyzeRequest.release (), entry.DomainInfo ->Params .GetStatisticsAggregator (), true ),
0 commit comments