Skip to content

Commit c4ff0f6

Browse files
azevaykinblinkov
authored andcommitted
TEvWriteResult::EStatus::STATUS_OUT_OF_SPACE (#15555)
1 parent 62ded5c commit c4ff0f6

File tree

6 files changed

+61
-14
lines changed

6 files changed

+61
-14
lines changed

ydb/core/kqp/executer_actor/kqp_data_executer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,7 @@ class TKqpDataExecuter : public TKqpExecuterBase<TKqpDataExecuter, EExecType::Da
904904
case NKikimrTxDataShard::TError::SCHEME_ERROR:
905905
return ReplyErrorAndDie(Ydb::StatusIds::SCHEME_ERROR, YqlIssue({},
906906
TIssuesIds::KIKIMR_SCHEME_MISMATCH, er.GetReason()));
907+
//TODO Split OUT_OF_SPACE and DISK_SPACE_EXHAUSTED cases. The first one is temporary, the second one is permanent.
907908
case NKikimrTxDataShard::TError::OUT_OF_SPACE:
908909
case NKikimrTxDataShard::TError::DISK_SPACE_EXHAUSTED: {
909910
auto issue = YqlIssue({}, TIssuesIds::KIKIMR_TEMPORARILY_UNAVAILABLE);

ydb/core/kqp/runtime/kqp_write_actor.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,25 @@ class TKqpTableWriteActor : public TActorBootstrapped<TKqpTableWriteActor> {
637637
getIssues());
638638
return;
639639
}
640+
case NKikimrDataEvents::TEvWriteResult::STATUS_OUT_OF_SPACE: {
641+
CA_LOG_W("Got OUT_OF_SPACE for table `"
642+
<< TableId.PathId.ToString() << "`."
643+
<< " ShardID=" << ev->Get()->Record.GetOrigin() << ","
644+
<< " Sink=" << this->SelfId() << "."
645+
<< " Ignored this error."
646+
<< getIssues().ToOneLineString());
647+
// TODO: support waiting
648+
if (!InconsistentTx) {
649+
TxManager->SetError(ev->Get()->Record.GetOrigin());
650+
RuntimeError(
651+
NYql::NDqProto::StatusIds::OVERLOADED,
652+
NYql::TIssuesIds::KIKIMR_OVERLOADED,
653+
TStringBuilder() << "Tablet " << ev->Get()->Record.GetOrigin() << " is out of space. Table `"
654+
<< TablePath << "`.",
655+
getIssues());
656+
}
657+
return;
658+
}
640659
case NKikimrDataEvents::TEvWriteResult::STATUS_OVERLOADED: {
641660
CA_LOG_W("Got OVERLOADED for table `"
642661
<< TableId.PathId.ToString() << "`."
@@ -2397,6 +2416,20 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
23972416
getIssues());
23982417
return;
23992418
}
2419+
case NKikimrDataEvents::TEvWriteResult::STATUS_OUT_OF_SPACE: {
2420+
CA_LOG_W("Got OUT_OF_SPACE for tables."
2421+
<< " ShardID=" << ev->Get()->Record.GetOrigin() << ","
2422+
<< " Sink=" << this->SelfId() << "."
2423+
<< " Ignored this error."
2424+
<< getIssues().ToOneLineString());
2425+
TxManager->SetError(ev->Get()->Record.GetOrigin());
2426+
ReplyErrorAndDie(
2427+
NYql::NDqProto::StatusIds::OVERLOADED,
2428+
NYql::TIssuesIds::KIKIMR_OVERLOADED,
2429+
TStringBuilder() << "Tablet " << ev->Get()->Record.GetOrigin() << "(" << getPathes() << ")" << " is out of space.",
2430+
getIssues());
2431+
return;
2432+
}
24002433
case NKikimrDataEvents::TEvWriteResult::STATUS_OVERLOADED: {
24012434
CA_LOG_W("Got OVERLOADED for tables."
24022435
<< " ShardID=" << ev->Get()->Record.GetOrigin() << ","

ydb/core/kqp/ut/query/kqp_limits_ut.cpp

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,6 @@ Y_UNIT_TEST_SUITE(KqpLimits) {
390390
}
391391

392392
Y_UNIT_TEST_TWIN(OutOfSpaceYQLUpsertFail, useSink) {
393-
UNIT_ASSERT(!useSink);
394393
auto app = NKikimrConfig::TAppConfig();
395394
app.MutableTableServiceConfig()->SetEnableOltpSink(useSink);
396395
app.MutableTableServiceConfig()->MutableResourceManager()->SetMkqlLightProgramMemoryLimit(1'000'000'000);
@@ -422,7 +421,6 @@ Y_UNIT_TEST_SUITE(KqpLimits) {
422421

423422
auto session = client.CreateSession().GetValueSync().GetSession();
424423

425-
bool getOutOfSpace = false;
426424
ui32 batchIdx = 0;
427425
ui32 cnt = 0;
428426

@@ -450,26 +448,38 @@ Y_UNIT_TEST_SUITE(KqpLimits) {
450448
UPSERT INTO `/Root/LargeTable`
451449
SELECT * FROM AS_TABLE($rows);
452450
)"), TTxControl::BeginTx().CommitTx(), paramsBuilder.Build()).ExtractValueSync();
453-
if (IsRetryable(result.GetStatus())) {
451+
452+
switch (result.GetStatus()) {
453+
case EStatus::SUCCESS:
454454
continue;
455-
}
456-
if (result.GetStatus() != EStatus::SUCCESS) {
457-
result.GetIssues().PrintTo(Cerr);
458-
UNIT_ASSERT_C(result.GetStatus() == EStatus::UNAVAILABLE, result.GetIssues().ToString());
459-
if (result.GetIssues().ToString().contains("OUT_OF_SPACE")
460-
|| result.GetIssues().ToString().contains("DISK_SPACE_EXHAUSTED")) {
461-
getOutOfSpace = true;
455+
case EStatus::OVERLOADED:
456+
if (result.GetIssues().ToString().contains("out of disk space")) {
457+
UNIT_ASSERT(useSink);
458+
Cerr << "Got out of space. Successfully inserted " << rowsPerBatch << " x " << batchIdx << " lines, each of size " << dataTextSize << "bytes";
459+
return;
460+
} else {
461+
continue;
462+
}
463+
case EStatus::UNAVAILABLE:
464+
if (result.GetIssues().ToString().contains("out of disk space")) {
465+
UNIT_ASSERT(!useSink);
466+
//TODO Should be also EStatus::OVERLOADED
467+
Cerr << "Got out of space. Successfully inserted " << rowsPerBatch << " x " << batchIdx << " lines, each of size " << dataTextSize << "bytes";
468+
return;
462469
} else if (result.GetIssues().ToString().contains("WRONG_SHARD_STATE")
463470
|| result.GetIssues().ToString().contains("wrong shard state")
464471
|| result.GetIssues().ToString().contains("can't deliver message to tablet")) {
465472
// shards are allowed to split
466473
continue;
467474
}
468-
break;
475+
UNIT_ASSERT_C(false, "Unexpected UNAVAILABLE status" << result.GetIssues().ToString());
476+
default:
477+
UNIT_ASSERT_C(false, "Unexpected status" << result.GetStatus() << result.GetIssues().ToString());
469478
}
479+
470480
++batchIdx;
471481
}
472-
UNIT_ASSERT_C(getOutOfSpace, "Successfully inserted " << rowsPerBatch << " x " << batchIdx << " lines, each of size " << dataTextSize << "bytes");
482+
UNIT_FAIL("Out of space is expected");
473483
}
474484

475485
Y_UNIT_TEST_TWIN(TooBigQuery, useSink) {

ydb/core/protos/data_events.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ message TEvWriteResult {
139139
STATUS_DISK_SPACE_EXHAUSTED = 10;
140140
STATUS_WRONG_SHARD_STATE = 11;
141141
STATUS_CONSTRAINT_VIOLATION = 12;
142+
STATUS_OUT_OF_SPACE = 13;
142143
}
143144

144145
// Status

ydb/core/tx/data_events/common/error_codes.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ TConclusion<NErrorCodes::TOperator::TYdbStatusInfo> TOperator::GetStatusInfo(
1313
return TYdbStatusInfo(Ydb::StatusIds::ABORTED, NYql::TIssuesIds::KIKIMR_OPERATION_ABORTED, "Request aborted");
1414
case NKikimrDataEvents::TEvWriteResult::STATUS_DISK_SPACE_EXHAUSTED:
1515
return TYdbStatusInfo(Ydb::StatusIds::INTERNAL_ERROR, NYql::TIssuesIds::KIKIMR_DISK_SPACE_EXHAUSTED, "Disk space exhausted");
16+
case NKikimrDataEvents::TEvWriteResult::STATUS_OUT_OF_SPACE:
17+
return TYdbStatusInfo(Ydb::StatusIds::OVERLOADED, NYql::TIssuesIds::KIKIMR_OVERLOADED, "Out of space");
1618
case NKikimrDataEvents::TEvWriteResult::STATUS_INTERNAL_ERROR:
1719
return TYdbStatusInfo(Ydb::StatusIds::INTERNAL_ERROR, NYql::TIssuesIds::KIKIMR_INTERNAL_ERROR, "Request aborted");
1820
case NKikimrDataEvents::TEvWriteResult::STATUS_OVERLOADED:
@@ -33,4 +35,4 @@ TConclusion<NErrorCodes::TOperator::TYdbStatusInfo> TOperator::GetStatusInfo(
3335
}
3436
}
3537

36-
}
38+
}

ydb/core/tx/datashard/check_write_unit.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ EExecutionStatus TCheckWriteUnit::Execute(TOperation::TPtr op,
6565

6666
DataShard.IncCounter(COUNTER_WRITE_OUT_OF_SPACE);
6767

68-
writeOp->SetError(NKikimrDataEvents::TEvWriteResult::STATUS_OVERLOADED, err);
68+
writeOp->SetError(NKikimrDataEvents::TEvWriteResult::STATUS_OUT_OF_SPACE, err);
6969
op->Abort(EExecutionUnitKind::FinishProposeWrite);
7070

7171
DataShard.SetOverloadSubscribed(writeOp->GetWriteTx()->GetOverloadSubscribe(), writeOp->GetRecipient(), op->GetTarget(), ERejectReasons::YellowChannels, writeOp->GetWriteResult()->Record);

0 commit comments

Comments
 (0)