1
1
#include " datashard_impl.h"
2
2
#include " datashard_direct_transaction.h"
3
+ #include " datashard_txs.h"
3
4
4
5
namespace NKikimr {
5
6
namespace NDataShard {
@@ -112,48 +113,90 @@ class TDataShard::TTxEraseRows : public TTxDirectBase<TEvDataShard::TEvEraseRows
112
113
TTxType GetTxType () const override { return TXTYPE_ERASE_ROWS; }
113
114
};
114
115
115
- static void OutOfSpace (NKikimrTxDataShard ::TEvUploadRowsResponse& response) {
116
- response.SetStatus (NKikimrTxDataShard::TError::OUT_OF_SPACE);
116
+ static void OutOfSpace (TEvDataShard ::TEvUploadRowsResponse& response) {
117
+ response.Record . SetStatus (NKikimrTxDataShard::TError::OUT_OF_SPACE);
117
118
}
118
119
119
- static void DiskSpaceExhausted (NKikimrTxDataShard ::TEvUploadRowsResponse& response) {
120
- response.SetStatus (NKikimrTxDataShard::TError::DISK_SPACE_EXHAUSTED);
120
+ static void DiskSpaceExhausted (TEvDataShard ::TEvUploadRowsResponse& response) {
121
+ response.Record . SetStatus (NKikimrTxDataShard::TError::DISK_SPACE_EXHAUSTED);
121
122
}
122
123
123
- static void WrongShardState (NKikimrTxDataShard ::TEvUploadRowsResponse& response) {
124
- response.SetStatus (NKikimrTxDataShard::TError::WRONG_SHARD_STATE);
124
+ static void WrongShardState (TEvDataShard ::TEvUploadRowsResponse& response) {
125
+ response.Record . SetStatus (NKikimrTxDataShard::TError::WRONG_SHARD_STATE);
125
126
}
126
127
127
- static void Replicated (NKikimrTxDataShard ::TEvUploadRowsResponse& response) {
128
- response.SetStatus (NKikimrTxDataShard::TError::READONLY);
128
+ static void Replicated (TEvDataShard ::TEvUploadRowsResponse& response) {
129
+ response.Record . SetStatus (NKikimrTxDataShard::TError::READONLY);
129
130
}
130
131
131
- static void Overloaded (NKikimrTxDataShard ::TEvUploadRowsResponse& response) {
132
- response.SetStatus (NKikimrTxDataShard::TError::SHARD_IS_BLOCKED);
132
+ static void Overloaded (TEvDataShard ::TEvUploadRowsResponse& response) {
133
+ response.Record . SetStatus (NKikimrTxDataShard::TError::SHARD_IS_BLOCKED);
133
134
}
134
135
135
136
ECumulativeCounters OverloadedCounter (TEvDataShard::TEvUploadRowsRequest::TPtr&) {
136
137
return COUNTER_BULK_UPSERT_OVERLOADED;
137
138
}
138
139
139
- static void WrongShardState (NKikimrTxDataShard::TEvEraseRowsResponse& response) {
140
- response.SetStatus (NKikimrTxDataShard::TEvEraseRowsResponse::WRONG_SHARD_STATE);
140
+ static bool TryDelayS3UploadRows (TDataShard*, TEvDataShard::TEvUploadRowsRequest::TPtr&, ERejectReasons) {
141
+ // not a S3 upload rows
142
+ return false ;
143
+ }
144
+
145
+ static void OutOfSpace (TEvDataShard::TEvS3UploadRowsResponse& response) {
146
+ response.Record .SetStatus (NKikimrTxDataShard::TError::OUT_OF_SPACE);
147
+ }
148
+
149
+ static void DiskSpaceExhausted (TEvDataShard::TEvS3UploadRowsResponse& response) {
150
+ response.Record .SetStatus (NKikimrTxDataShard::TError::DISK_SPACE_EXHAUSTED);
151
+ }
152
+
153
+ static void WrongShardState (TEvDataShard::TEvS3UploadRowsResponse& response) {
154
+ response.Record .SetStatus (NKikimrTxDataShard::TError::WRONG_SHARD_STATE);
155
+ }
156
+
157
+ static void Replicated (TEvDataShard::TEvS3UploadRowsResponse& response) {
158
+ response.Record .SetStatus (NKikimrTxDataShard::TError::READONLY);
141
159
}
142
160
143
- static void Replicated (NKikimrTxDataShard::TEvEraseRowsResponse & response) {
144
- response.SetStatus (NKikimrTxDataShard::TEvEraseRowsResponse::EXEC_ERROR );
161
+ static void Overloaded (TEvDataShard::TEvS3UploadRowsResponse & response) {
162
+ response.Record . SetStatus (NKikimrTxDataShard::TError::SHARD_IS_BLOCKED );
145
163
}
146
164
147
- static void Overloaded (NKikimrTxDataShard::TEvEraseRowsResponse& response) {
148
- response.SetStatus (NKikimrTxDataShard::TEvEraseRowsResponse::SHARD_OVERLOADED);
165
+ ECumulativeCounters OverloadedCounter (TEvDataShard::TEvS3UploadRowsRequest::TPtr&) {
166
+ return COUNTER_BULK_UPSERT_OVERLOADED;
167
+ }
168
+
169
+ static bool TryDelayS3UploadRows (TDataShard* self, TEvDataShard::TEvS3UploadRowsRequest::TPtr& ev, ERejectReasons rejectReasons) {
170
+ if (rejectReasons == ERejectReasons::OverloadByProbability) {
171
+ self->DelayS3UploadRows (ev);
172
+ return true ;
173
+ }
174
+ return false ;
175
+ }
176
+
177
+ static void WrongShardState (TEvDataShard::TEvEraseRowsResponse& response) {
178
+ response.Record .SetStatus (NKikimrTxDataShard::TEvEraseRowsResponse::WRONG_SHARD_STATE);
179
+ }
180
+
181
+ static void Replicated (TEvDataShard::TEvEraseRowsResponse& response) {
182
+ response.Record .SetStatus (NKikimrTxDataShard::TEvEraseRowsResponse::EXEC_ERROR);
183
+ }
184
+
185
+ static void Overloaded (TEvDataShard::TEvEraseRowsResponse& response) {
186
+ response.Record .SetStatus (NKikimrTxDataShard::TEvEraseRowsResponse::SHARD_OVERLOADED);
149
187
}
150
188
151
189
ECumulativeCounters OverloadedCounter (TEvDataShard::TEvEraseRowsRequest::TPtr&) {
152
190
return COUNTER_ERASE_ROWS_OVERLOADED;
153
191
}
154
192
193
+ static bool TryDelayS3UploadRows (TDataShard*, TEvDataShard::TEvEraseRowsRequest::TPtr&, ERejectReasons) {
194
+ // not a S3 upload rows
195
+ return false ;
196
+ }
197
+
155
198
template <typename TEvResponse>
156
- using TSetStatusFunc = void (*)(typename TEvResponse::ProtoRecordType &);
199
+ using TSetStatusFunc = void (*)(TEvResponse&);
157
200
158
201
template <typename TEvResponse, typename TEvRequest>
159
202
static void Reject (TDataShard* self, TEvRequest& ev, const TString& txDesc,
@@ -166,7 +209,7 @@ static void Reject(TDataShard* self, TEvRequest& ev, const TString& txDesc,
166
209
<< " , error# " << rejectDescription);
167
210
168
211
auto response = MakeHolder<TEvResponse>();
169
- setStatusFunc (response-> Record );
212
+ setStatusFunc (* response);
170
213
response->Record .SetTabletID (self->TabletID ());
171
214
response->Record .SetErrorDescription (rejectDescription);
172
215
@@ -191,6 +234,13 @@ static bool MaybeReject(TDataShard* self, TEvRequest& ev, const TActorContext& c
191
234
NKikimrTxDataShard::TEvProposeTransactionResult::EStatus rejectStatus;
192
235
if (self->CheckDataTxReject (txDesc, ctx, rejectStatus, rejectReasons, rejectDescription)) {
193
236
self->IncCounter (OverloadedCounter (ev));
237
+
238
+ // FIXME: it seems that s3 upload should work via TUploadRowsInternal
239
+ // this will deduplicate code and support overload subscribed
240
+ if (TryDelayS3UploadRows (self, ev, rejectReasons)) {
241
+ return true ;
242
+ }
243
+
194
244
Reject<TEvResponse, TEvRequest>(self, ev, txDesc, rejectReasons, rejectDescription, &WrongShardState, ctx, logThrottlerType);
195
245
return true ;
196
246
}
@@ -232,6 +282,16 @@ void TDataShard::Handle(TEvDataShard::TEvUploadRowsRequest::TPtr& ev, const TAct
232
282
}
233
283
}
234
284
285
+ void TDataShard::Handle (TEvDataShard::TEvS3UploadRowsRequest::TPtr& ev, const TActorContext& ctx) {
286
+ if (ShouldDelayOperation (ev)) {
287
+ return ;
288
+ }
289
+
290
+ if (!MaybeReject<TEvDataShard::TEvS3UploadRowsResponse, true >(this , ev, ctx, " s3 bulk upsert" , TDataShard::ELogThrottlerType::S3UploadRows_Reject)) {
291
+ Executor ()->Execute (new TTxS3UploadRows (this , ev), ctx);
292
+ }
293
+ }
294
+
235
295
void TDataShard::Handle (TEvDataShard::TEvEraseRowsRequest::TPtr& ev, const TActorContext& ctx) {
236
296
if (ShouldDelayOperation (ev)) {
237
297
return ;
0 commit comments