diff --git a/ydb/core/fq/libs/checkpoint_storage/ydb_checkpoint_storage.cpp b/ydb/core/fq/libs/checkpoint_storage/ydb_checkpoint_storage.cpp index 3f4a228b93f2..3d71e8809ac1 100644 --- a/ydb/core/fq/libs/checkpoint_storage/ydb_checkpoint_storage.cpp +++ b/ydb/core/fq/libs/checkpoint_storage/ydb_checkpoint_storage.cpp @@ -754,7 +754,7 @@ TFuture TCheckpointStorage::GetCoord [getContext] (const TFuture& future) { auto result = TGetCoordinatorsResult( std::move(getContext->Coordinators), - std::move(future.GetValue())); + future.GetValue()); return MakeFuture(result); }); } @@ -803,13 +803,11 @@ TFuture TCheckpointStorage::CreateC return CreateCheckpointWrapper(future, checkpointContext); }); - return future.Apply( - [checkpointContext](const TFuture& future) { - if (NYql::TIssues issues = StatusToIssues(future.GetValue())) { - return TCreateCheckpointResult(TString(), std::move(issues)); - } else { - return TCreateCheckpointResult(checkpointContext->CheckpointGraphDescriptionContext->GraphDescId, NYql::TIssues()); - } + return StatusToIssues(future).Apply( + [checkpointContext] (const TFuture& future) { + NYql::TIssues issues = future.GetValue(); + TString descId = !issues ? checkpointContext->CheckpointGraphDescriptionContext->GraphDescId : TString(); + return TCreateCheckpointResult(descId, issues); }); } @@ -898,7 +896,7 @@ TFuture TCheckpointStorage::GetCheckp return StatusToIssues(future).Apply( [getContext] (const TFuture& future) { - auto result = TGetCheckpointsResult(std::move(getContext->Checkpoints), std::move(future.GetValue())); + auto result = TGetCheckpointsResult(std::move(getContext->Checkpoints), future.GetValue()); return MakeFuture(result); }); } @@ -1097,9 +1095,10 @@ TFuture TCheckpointStor return status; }); }); - return future.Apply( - [result](const TFuture& status) { - return std::make_pair(std::move(result->Size), std::move(status.GetValue().GetIssues())); + + return StatusToIssues(future).Apply( + [result] (const TFuture& future) { + return std::make_pair(result->Size, future.GetValue()); }); } diff --git a/ydb/core/fq/libs/checkpoint_storage/ydb_state_storage.cpp b/ydb/core/fq/libs/checkpoint_storage/ydb_state_storage.cpp index 1fe0e7794944..1e119408447b 100644 --- a/ydb/core/fq/libs/checkpoint_storage/ydb_state_storage.cpp +++ b/ydb/core/fq/libs/checkpoint_storage/ydb_state_storage.cpp @@ -286,6 +286,7 @@ TFuture TStateStorage::GetState( return MakeFuture(result); } + auto context = MakeIntrusive( YdbConnection->TablePathPrefix, taskIds, @@ -362,15 +363,9 @@ TFuture TStateStorage::CountStates( }); }); - return future.Apply( - [context] (const TFuture& future) { - TCountStatesResult countResult; - countResult.first = context->Count; - const auto& status = future.GetValue(); - if (!status.IsSuccess()) { - countResult.second = status.GetIssues(); - } - return countResult; + return StatusToIssues(future).Apply( + [context] (const TFuture& future) { + return TCountStatesResult{context->Count, future.GetValue()}; }); } TExecDataQuerySettings TStateStorage::DefaultExecDataQuerySettings() { diff --git a/ydb/core/fq/libs/ydb/ut/ya.make b/ydb/core/fq/libs/ydb/ut/ya.make new file mode 100644 index 000000000000..e96a95760f6c --- /dev/null +++ b/ydb/core/fq/libs/ydb/ut/ya.make @@ -0,0 +1,12 @@ +UNITTEST_FOR(ydb/core/fq/libs/ydb) + +SRCS( + ydb_ut.cpp +) + +PEERDIR( + ydb/core/fq/libs/ydb +) + +END() + diff --git a/ydb/core/fq/libs/ydb/ut/ydb_ut.cpp b/ydb/core/fq/libs/ydb/ut/ydb_ut.cpp new file mode 100644 index 000000000000..263ea8f0b340 --- /dev/null +++ b/ydb/core/fq/libs/ydb/ut/ydb_ut.cpp @@ -0,0 +1,23 @@ +#include + +#include + +namespace NFq { + +Y_UNIT_TEST_SUITE(TFqYdbTest) { + + Y_UNIT_TEST(ShouldStatusToIssuesProcessExceptions) + { + auto promise = NThreading::NewPromise(); + auto future = promise.GetFuture(); + TString text("Test exception"); + promise.SetException(text); + NThreading::TFuture future2 = NFq::StatusToIssues(future); + + NYql::TIssues issues = future2.GetValueSync(); + UNIT_ASSERT(issues.Size() == 1); + UNIT_ASSERT(issues.ToString().Contains(text)); + } +} + +} // namespace NFq diff --git a/ydb/core/fq/libs/ydb/ya.make b/ydb/core/fq/libs/ydb/ya.make index 887219ddac96..6e392e79c13b 100644 --- a/ydb/core/fq/libs/ydb/ya.make +++ b/ydb/core/fq/libs/ydb/ya.make @@ -24,3 +24,7 @@ GENERATE_ENUM_SERIALIZATION(ydb.h) YQL_LAST_ABI_VERSION() END() + +RECURSE_FOR_TESTS( + ut +) diff --git a/ydb/core/fq/libs/ydb/ydb.cpp b/ydb/core/fq/libs/ydb/ydb.cpp index ca72290bccc0..3bcdc01f5fbe 100644 --- a/ydb/core/fq/libs/ydb/ydb.cpp +++ b/ydb/core/fq/libs/ydb/ydb.cpp @@ -210,7 +210,13 @@ NYql::TIssues StatusToIssues(const NYdb::TStatus& status) { TFuture StatusToIssues(const TFuture& future) { return future.Apply( [] (const TFuture& future) { - return StatusToIssues(future.GetValue()); + try { + return StatusToIssues(future.GetValue()); + } catch (...) { + TIssues issues; + issues.AddIssue("StatusToIssues failed with exception: " + CurrentExceptionMessage()); + return issues; + } }); }