Skip to content

Commit 2a7eb6b

Browse files
authored
Implemented split datashard status (wrong shard state) (#11955)
1 parent 6ed5294 commit 2a7eb6b

File tree

4 files changed

+39
-7
lines changed

4 files changed

+39
-7
lines changed

ydb/core/kqp/runtime/kqp_write_actor.cpp

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -535,25 +535,38 @@ class TKqpTableWriteActor : public TActorBootstrapped<TKqpTableWriteActor> {
535535
getIssues());
536536
return;
537537
}
538-
case NKikimrDataEvents::TEvWriteResult::STATUS_INTERNAL_ERROR: {
539-
CA_LOG_E("Got INTERNAL ERROR for table `"
538+
case NKikimrDataEvents::TEvWriteResult::STATUS_WRONG_SHARD_STATE:
539+
CA_LOG_E("Got WRONG SHARD STATE for table `"
540540
<< SchemeEntry->TableId.PathId.ToString() << "`."
541541
<< " ShardID=" << ev->Get()->Record.GetOrigin() << ","
542542
<< " Sink=" << this->SelfId() << "."
543543
<< getIssues().ToOneLineString());
544-
// TODO: Add new status for splits in datashard. This is tmp solution.
545-
if (getIssues().ToOneLineString().Contains("in a pre/offline state assuming this is due to a finished split (wrong shard state)")) {
544+
545+
if (InconsistentTx) {
546546
ResetShardRetries(ev->Get()->Record.GetOrigin(), ev->Cookie);
547547
RetryResolveTable();
548548
} else {
549549
RuntimeError(
550-
TStringBuilder() << "Internal error for table `"
550+
TStringBuilder() << "Wrong shard state for table `"
551551
<< TablePath << "`. "
552552
<< getIssues().ToOneLineString(),
553-
NYql::NDqProto::StatusIds::INTERNAL_ERROR,
553+
NYql::NDqProto::StatusIds::PRECONDITION_FAILED,
554554
getIssues());
555555
}
556556
return;
557+
case NKikimrDataEvents::TEvWriteResult::STATUS_INTERNAL_ERROR: {
558+
CA_LOG_E("Got INTERNAL ERROR for table `"
559+
<< SchemeEntry->TableId.PathId.ToString() << "`."
560+
<< " ShardID=" << ev->Get()->Record.GetOrigin() << ","
561+
<< " Sink=" << this->SelfId() << "."
562+
<< getIssues().ToOneLineString());
563+
RuntimeError(
564+
TStringBuilder() << "Internal error for table `"
565+
<< TablePath << "`. "
566+
<< getIssues().ToOneLineString(),
567+
NYql::NDqProto::StatusIds::INTERNAL_ERROR,
568+
getIssues());
569+
return;
557570
}
558571
case NKikimrDataEvents::TEvWriteResult::STATUS_DISK_SPACE_EXHAUSTED: {
559572
CA_LOG_E("Got DISK_SPACE_EXHAUSTED for table `"
@@ -1798,6 +1811,18 @@ class TKqpBufferWriteActor :public TActorBootstrapped<TKqpBufferWriteActor>, pub
17981811
getIssues());
17991812
return;
18001813
}
1814+
case NKikimrDataEvents::TEvWriteResult::STATUS_WRONG_SHARD_STATE: {
1815+
CA_LOG_E("Got WRONG SHARD STATE for table."
1816+
<< " ShardID=" << ev->Get()->Record.GetOrigin() << ","
1817+
<< " Sink=" << this->SelfId() << "."
1818+
<< getIssues().ToOneLineString());
1819+
ReplyErrorAndDie(
1820+
TStringBuilder() << "Wrong shard state for table. "
1821+
<< getIssues().ToOneLineString(),
1822+
NYql::NDqProto::StatusIds::INTERNAL_ERROR,
1823+
getIssues());
1824+
return;
1825+
}
18011826
case NKikimrDataEvents::TEvWriteResult::STATUS_INTERNAL_ERROR: {
18021827
CA_LOG_E("Got INTERNAL ERROR for table."
18031828
<< " ShardID=" << ev->Get()->Record.GetOrigin() << ","

ydb/core/protos/data_events.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ message TEvWriteResult {
130130
STATUS_SCHEME_CHANGED = 8;
131131
STATUS_LOCKS_BROKEN = 9;
132132
STATUS_DISK_SPACE_EXHAUSTED = 10;
133+
STATUS_WRONG_SHARD_STATE = 11;
133134
}
134135

135136
// Status

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ TConclusion<NErrorCodes::TOperator::TYdbStatusInfo> TOperator::GetStatusInfo(
2626
case NKikimrDataEvents::TEvWriteResult::STATUS_LOCKS_BROKEN: {
2727
return TYdbStatusInfo(Ydb::StatusIds::ABORTED, NYql::TIssuesIds::KIKIMR_LOCKS_INVALIDATED, "Transaction locks invalidated.");
2828
}
29+
case NKikimrDataEvents::TEvWriteResult::STATUS_WRONG_SHARD_STATE:
30+
return TYdbStatusInfo(Ydb::StatusIds::PRECONDITION_FAILED, NYql::TIssuesIds::KIKIMR_PRECONDITION_FAILED, "Wrong shard state");
2931
}
3032
}
3133

ydb/core/tx/datashard/datashard.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3054,7 +3054,11 @@ bool TDataShard::CheckDataTxRejectAndReply(const NEvents::TDataEvents::TEvWrite:
30543054
status = NKikimrDataEvents::TEvWriteResult::STATUS_OVERLOADED;
30553055
break;
30563056
case NKikimrTxDataShard::TEvProposeTransactionResult::ERROR:
3057-
status = NKikimrDataEvents::TEvWriteResult::STATUS_INTERNAL_ERROR;
3057+
if ((rejectReasons & ERejectReasons::WrongState) != ERejectReasons::None) {
3058+
status = NKikimrDataEvents::TEvWriteResult::STATUS_WRONG_SHARD_STATE;
3059+
} else {
3060+
status = NKikimrDataEvents::TEvWriteResult::STATUS_INTERNAL_ERROR;
3061+
}
30583062
break;
30593063
default:
30603064
Y_FAIL_S("Unexpected rejectStatus " << rejectStatus);

0 commit comments

Comments
 (0)