Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
5ce3fda
feat: orchestrator switches to FDv1 fallback on directive
beekld May 23, 2026
77c972f
chore: add orchestration logging for FDv2 data system
beekld Jun 2, 2026
5a2a9bc
fix: stop emitting kOff status from FDv2DataSystem destructor
beekld Jun 4, 2026
86b2e3d
feat: add FDv1AdapterSynchronizer wrapping IDataSynchronizer as IFDv2…
beekld May 28, 2026
f99f1ad
chore: distinguish engaged vs. unconfigured FDv1 fallback in logs
beekld Jun 8, 2026
82d2730
fix: ignore FDv1 fallback directive when FDv1 source is active
beekld Jun 8, 2026
c164913
test: cover initializer ChangeSet+directive basis preservation
beekld Jun 8, 2026
44f47f4
feat: parse X-LD-FD-Fallback-TTL header into FDv2SourceResult
beekld Jun 8, 2026
6ca1a49
feat: parse protocolFallbackTTL and retryAfter from goodbye
beekld Jun 8, 2026
8f19a0e
feat: schedule FDv2 retry after FDv1 fallback TTL
beekld Jun 8, 2026
5b9e51e
merge: bring in FDv1 fallback TTL changes from #539
beekld Jun 8, 2026
303b3a8
chore: remove unused retry_after field from goodbye
beekld Jun 9, 2026
7f1e999
merge: pick up retry_after removal from #539
beekld Jun 9, 2026
b1157e1
feat: translate FDv1 status changes to FDv2 results in FDv1AdapterSyn…
beekld Jun 9, 2026
9a93aab
docs: explain got_basis reuse in FDv1 fallback branch
beekld Jun 11, 2026
67126a9
fix: reset FDv1 fallback retry source between schedules
beekld Jun 11, 2026
81b1c7f
merge: pick up OpenSSL bump from main
beekld Jun 11, 2026
373150d
merge: pick up OpenSSL bump from #539
beekld Jun 11, 2026
292c779
merge: pick up #539 squash from main
beekld Jun 11, 2026
27f5c1e
fix: serialize StartAsync/ShutdownAsync on wrapped FDv1 source
beekld Jun 11, 2026
6c428c5
fix: give FDv1 adapter a private status manager
beekld Jun 11, 2026
55bd262
merge: pick up #549 from main
beekld Jun 11, 2026
2f68933
fix: hold FDv1 source via shared_ptr and forward init-time errors
beekld Jun 12, 2026
796d25c
merge: pick up #550 from main
beekld Jun 12, 2026
83a5e4d
fix: handle FDv2 intentCode none as listening, reject unknown codes
beekld Jun 12, 2026
f40b13f
merge: pick up main after #540 squash
beekld Jun 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions libs/internal/src/fdv2_protocol_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,15 @@ FDv2ProtocolHandler::Result FDv2ProtocolHandler::HandleServerIntent(
state_ = State::kFull;
} else if (code == IntentCode::kTransferChanges) {
state_ = State::kPartial;
} else {
// kNone or kUnknown: emit an empty changeset immediately.
state_ = State::kInactive;
} else if (code == IntentCode::kNone) {
state_ = State::kPartial;
return data_model::FDv2ChangeSet{
data_model::ChangeSetType::kNone, {}, data_model::Selector{}};
} else {
// kUnknown: an intent code we don't recognise.
Reset();
return Error::ProtocolError(
"server-intent had an unrecognized intent code");
}
return std::monostate{};
}
Expand Down
31 changes: 31 additions & 0 deletions libs/internal/tests/fdv2_protocol_handler_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,37 @@ TEST(FDv2ProtocolHandlerTest, NoneIntentEmitsEmptyChangeSetImmediately) {
EXPECT_FALSE(cs->selector.value.has_value());
}

TEST(FDv2ProtocolHandlerTest, NoneIntentAllowsSubsequentPartialCycle) {
FDv2ProtocolHandler handler;

handler.HandleEvent("server-intent", MakeServerIntent("none"));
handler.HandleEvent("put-object",
MakePutObject("flag", "my-flag", kFlagJson));
auto result = handler.HandleEvent("payload-transferred",
MakePayloadTransferred("s1", 1));

auto* cs = std::get_if<data_model::FDv2ChangeSet>(&result);
ASSERT_NE(cs, nullptr);
EXPECT_EQ(cs->type, data_model::ChangeSetType::kPartial);
ASSERT_EQ(cs->changes.size(), 1u);
EXPECT_EQ(cs->changes[0].key, "my-flag");
}

// ============================================================================
// Unknown intent
// ============================================================================

TEST(FDv2ProtocolHandlerTest, UnknownIntentReturnsProtocolError) {
FDv2ProtocolHandler handler;

auto result =
handler.HandleEvent("server-intent", MakeServerIntent("future-code"));

auto* err = std::get_if<FDv2ProtocolHandler::Error>(&result);
ASSERT_NE(err, nullptr);
EXPECT_EQ(err->kind, FDv2ProtocolHandler::Error::Kind::kProtocolError);
}

// ============================================================================
// kTransferFull intent
// ============================================================================
Expand Down
Loading