Skip to content

Commit 2f68933

Browse files
committed
fix: hold FDv1 source via shared_ptr and forward init-time errors
1 parent 55bd262 commit 2f68933

3 files changed

Lines changed: 26 additions & 5 deletions

File tree

libs/server-sdk/src/data_systems/fdv2/fdv1_adapter_synchronizer.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,16 +134,18 @@ FDv1AdapterSynchronizer::FDv1AdapterSynchronizer(SourceBuilder source_builder)
134134
}
135135
switch (status.State()) {
136136
case DataSourceState::kInterrupted:
137+
case DataSourceState::kInitializing:
138+
// Recoverable error.
137139
state->Notify(FDv2SourceResult{
138140
FDv2SourceResult::Interrupted{*error}});
139141
break;
140142
case DataSourceState::kOff:
143+
// Terminal error.
141144
state->Notify(FDv2SourceResult{
142145
FDv2SourceResult::TerminalError{*error}});
143146
break;
144-
case DataSourceState::kInitializing:
145147
case DataSourceState::kValid:
146-
// No FDv2 result for these states.
148+
// Recovery; no FDv2 result.
147149
break;
148150
}
149151
})),

libs/server-sdk/src/data_systems/fdv2/fdv1_adapter_synchronizer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class FDv1AdapterSynchronizer final
3636
: public data_interfaces::IFDv2Synchronizer {
3737
public:
3838
using SourceBuilder =
39-
std::function<std::unique_ptr<data_interfaces::IDataSynchronizer>(
39+
std::function<std::shared_ptr<data_interfaces::IDataSynchronizer>(
4040
data_components::DataSourceStatusManager&)>;
4141

4242
/**
@@ -116,7 +116,7 @@ class FDv1AdapterSynchronizer final
116116
status_manager_;
117117
std::unique_ptr<IConnection> const status_subscription_;
118118

119-
std::unique_ptr<data_interfaces::IDataSynchronizer> const fdv1_source_;
119+
std::shared_ptr<data_interfaces::IDataSynchronizer> const fdv1_source_;
120120

121121
// Serializes StartAsync and ShutdownAsync on fdv1_source_ across
122122
// concurrent Next() and Close() calls.

libs/server-sdk/tests/fdv1_adapter_synchronizer_test.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ FDv1AdapterSynchronizer::SourceBuilder MakeMockBuilder(
5757
if (out_sm) {
5858
*out_sm = &sm;
5959
}
60-
auto source = std::make_unique<MockFDv1Source>(sm);
60+
auto source = std::make_shared<MockFDv1Source>(sm);
6161
if (out_source) {
6262
*out_source = source.get();
6363
}
@@ -242,6 +242,25 @@ TEST(FDv1AdapterSynchronizerTest, InterruptedStatusProducesInterruptedResult) {
242242
interrupted->error.Kind());
243243
}
244244

245+
TEST(FDv1AdapterSynchronizerTest,
246+
InitializingWithErrorProducesInterruptedResult) {
247+
DataSourceStatusManager* source_manager = nullptr;
248+
FDv1AdapterSynchronizer adapter(MakeMockBuilder(nullptr, &source_manager));
249+
250+
auto future = adapter.Next(data_model::Selector{});
251+
source_manager->SetState(
252+
DataSourceStatus::DataSourceState::kInterrupted,
253+
DataSourceStatus::ErrorInfo::ErrorKind::kNetworkError, "boom");
254+
255+
auto result = future.WaitForResult(1s);
256+
ASSERT_TRUE(result.has_value());
257+
auto* interrupted =
258+
std::get_if<FDv2SourceResult::Interrupted>(&result->value);
259+
ASSERT_NE(interrupted, nullptr);
260+
EXPECT_EQ(DataSourceStatus::ErrorInfo::ErrorKind::kNetworkError,
261+
interrupted->error.Kind());
262+
}
263+
245264
TEST(FDv1AdapterSynchronizerTest, OffStatusProducesTerminalErrorResult) {
246265
DataSourceStatusManager* source_manager = nullptr;
247266
FDv1AdapterSynchronizer adapter(MakeMockBuilder(nullptr, &source_manager));

0 commit comments

Comments
 (0)