@@ -45,7 +45,6 @@ namespace {
45
45
constexpr TDuration LEASE_DURATION = TDuration::Seconds(30 );
46
46
constexpr TDuration DEADLINE_OFFSET = TDuration::Minutes(20 );
47
47
constexpr TDuration BRO_RUN_INTERVAL = TDuration::Minutes(60 );
48
- constexpr ui64 MAX_NUMBER_ROWS_IN_BATCH = 10000 ;
49
48
50
49
TString SerializeIssues (const NYql::TIssues& issues) {
51
50
NYql::TIssue root;
@@ -884,18 +883,25 @@ class TCheckLeaseStatusActor : public TCheckLeaseStatusActorBase {
884
883
};
885
884
886
885
class TForgetScriptExecutionOperationQueryActor : public TQueryBase {
886
+ static constexpr i64 MAX_NUMBER_ROWS_IN_BATCH = 10000 ;
887
+
887
888
struct TResultSetDescription {
888
- ui64 NumberRows ;
889
+ i64 MaxRowId ;
889
890
i32 ResultSetId;
890
891
};
891
892
892
893
public:
893
- TForgetScriptExecutionOperationQueryActor (const TString& executionId, const TString& database)
894
+ TForgetScriptExecutionOperationQueryActor (const TString& executionId, const TString& database, TInstant operationDeadline )
894
895
: ExecutionId(executionId)
895
896
, Database(database)
897
+ , Deadline(GetDeadline(operationDeadline))
896
898
{}
897
899
898
900
void OnRunQuery () override {
901
+ if (!CheckDeadline ()) {
902
+ return ;
903
+ }
904
+
899
905
TString sql = R"(
900
906
-- TForgetScriptExecutionOperationQueryActor::OnRunQuery
901
907
DECLARE $database AS Text;
@@ -905,7 +911,7 @@ class TForgetScriptExecutionOperationQueryActor : public TQueryBase {
905
911
FROM `.metadata/script_executions`
906
912
WHERE database = $database AND execution_id = $execution_id;
907
913
908
- SELECT result_set_id, COUNT (row_id) AS number_rows
914
+ SELECT result_set_id, MAX (row_id) AS max_row_id
909
915
FROM `.metadata/result_sets`
910
916
WHERE database = $database AND execution_id = $execution_id
911
917
GROUP BY result_set_id;
@@ -944,19 +950,24 @@ class TForgetScriptExecutionOperationQueryActor : public TQueryBase {
944
950
while (result.TryNextRow ()) {
945
951
TMaybe<i32 > resultSetId = result.ColumnParser (" result_set_id" ).GetOptionalInt32 ();
946
952
if (!resultSetId) {
947
- continue ;
953
+ Finish (Ydb::StatusIds::INTERNAL_ERROR, " Result set id is not specified" );
954
+ return ;
948
955
}
949
956
950
- ui64 numberRows = result.ColumnParser (" number_rows" ).GetUint64 ();
957
+ TMaybe<i64 > maxRowId = result.ColumnParser (" max_row_id" ).GetOptionalInt64 ();
958
+ if (!maxRowId) {
959
+ Finish (Ydb::StatusIds::INTERNAL_ERROR, " Result set row id is not specified" );
960
+ return ;
961
+ }
951
962
952
- ResultSetsDescription.emplace_back (TResultSetDescription{numberRows , *resultSetId});
963
+ ResultSetsDescription.emplace_back (TResultSetDescription{*maxRowId , *resultSetId});
953
964
}
954
965
955
966
DeleteScriptResults ();
956
967
}
957
968
958
969
void DeleteScriptResults () {
959
- while (!ResultSetsDescription.empty () && ResultSetsDescription.back ().NumberRows == 0 ) {
970
+ while (!ResultSetsDescription.empty () && ResultSetsDescription.back ().MaxRowId < 0 ) {
960
971
ResultSetsDescription.pop_back ();
961
972
}
962
973
@@ -965,22 +976,26 @@ class TForgetScriptExecutionOperationQueryActor : public TQueryBase {
965
976
return ;
966
977
}
967
978
979
+ if (!CheckDeadline ()) {
980
+ return ;
981
+ }
982
+
968
983
TResultSetDescription& resultSet = ResultSetsDescription.back ();
969
- resultSet.NumberRows -= std::min ( MAX_NUMBER_ROWS_IN_BATCH, resultSet. NumberRows ) ;
984
+ resultSet.MaxRowId -= MAX_NUMBER_ROWS_IN_BATCH;
970
985
971
986
TString sql = R"(
972
987
-- TForgetScriptExecutionOperationQueryActor::DeleteScriptResults
973
988
DECLARE $database AS Text;
974
989
DECLARE $execution_id AS Text;
975
990
DECLARE $result_set_id AS Int32;
976
- DECLARE $last_row_id AS Uint64 ;
991
+ DECLARE $max_row_id AS Int64 ;
977
992
978
993
DELETE
979
994
FROM `.metadata/result_sets`
980
995
WHERE database = $database
981
996
AND execution_id = $execution_id
982
997
AND result_set_id = $result_set_id
983
- AND row_id >= $last_row_id ;
998
+ AND row_id > $max_row_id ;
984
999
)" ;
985
1000
986
1001
NYdb::TParamsBuilder params;
@@ -994,8 +1009,8 @@ class TForgetScriptExecutionOperationQueryActor : public TQueryBase {
994
1009
.AddParam (" $result_set_id" )
995
1010
.Int32 (resultSet.ResultSetId )
996
1011
.Build ()
997
- .AddParam (" $last_row_id " )
998
- .Uint64 (resultSet.NumberRows )
1012
+ .AddParam (" $max_row_id " )
1013
+ .Int64 (resultSet.MaxRowId )
999
1014
.Build ();
1000
1015
1001
1016
RunDataQuery (sql, ¶ms);
@@ -1006,9 +1021,26 @@ class TForgetScriptExecutionOperationQueryActor : public TQueryBase {
1006
1021
Send (Owner, new TEvForgetScriptExecutionOperationResponse (status, std::move (issues)));
1007
1022
}
1008
1023
1024
+ private:
1025
+ bool CheckDeadline () {
1026
+ if (TInstant::Now () >= Deadline) {
1027
+ Finish (Ydb::StatusIds::TIMEOUT, " Forget script execution operation timeout" );
1028
+ return false ;
1029
+ }
1030
+ return true ;
1031
+ }
1032
+
1033
+ static TInstant GetDeadline (TInstant operationDeadline) {
1034
+ if (TInstant::Now () >= operationDeadline) {
1035
+ return operationDeadline;
1036
+ }
1037
+ return TInstant::Now () + (operationDeadline - TInstant::Now ()) / 2 ;
1038
+ }
1039
+
1009
1040
private:
1010
1041
TString ExecutionId;
1011
1042
TString Database;
1043
+ TInstant Deadline;
1012
1044
std::vector<TResultSetDescription> ResultSetsDescription;
1013
1045
};
1014
1046
@@ -1049,7 +1081,7 @@ class TForgetScriptExecutionOperationActor : public TActorBootstrapped<TForgetSc
1049
1081
}
1050
1082
}
1051
1083
1052
- Register (new TForgetScriptExecutionOperationQueryActor (ExecutionId, Request->Get ()->Database ));
1084
+ Register (new TForgetScriptExecutionOperationQueryActor (ExecutionId, Request->Get ()->Database , Request-> Get ()-> Deadline ));
1053
1085
}
1054
1086
1055
1087
void Handle (TEvForgetScriptExecutionOperationResponse::TPtr& ev) {
@@ -1847,6 +1879,7 @@ class TSaveScriptExecutionResultQuery : public TQueryBase {
1847
1879
};
1848
1880
1849
1881
class TSaveScriptExecutionResultActor : public TActorBootstrapped <TSaveScriptExecutionResultActor> {
1882
+ static constexpr ui64 MAX_NUMBER_ROWS_IN_BATCH = 10000 ;
1850
1883
static constexpr ui64 PROGRAM_SIZE_LIMIT = 10_MB;
1851
1884
static constexpr ui64 PROGRAM_BASE_SIZE = 1_MB; // Depends on MAX_NUMBER_ROWS_IN_BATCH
1852
1885
@@ -2069,6 +2102,11 @@ class TGetScriptExecutionResultQuery : public TQueryBase {
2069
2102
const TMaybe<TString> serializedRow = result.ColumnParser (" result_set" ).GetOptionalString ();
2070
2103
2071
2104
if (!serializedRow) {
2105
+ Finish (Ydb::StatusIds::INTERNAL_ERROR, " Result set row is null" );
2106
+ return ;
2107
+ }
2108
+
2109
+ if (serializedRow->Empty ()) {
2072
2110
Finish (Ydb::StatusIds::INTERNAL_ERROR, " Result set row is empty" );
2073
2111
return ;
2074
2112
}
0 commit comments