Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
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
463 changes: 463 additions & 0 deletions docs/svs-v4.md
Comment thread
a-thieme marked this conversation as resolved.

Large diffs are not rendered by default.

21 changes: 21 additions & 0 deletions std/ndn/svs/v3/definitions.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,22 @@ package svs

import (
enc "github.com/named-data/ndnd/std/encoding"
"github.com/named-data/ndnd/std/types/optional"
)

// VectorType values for inline SvsData (TLV 0xCD).
const (
VectorTypeFull uint64 = 0
VectorTypePartial uint64 = 1
)

type SvsData struct {
//+field:binary:optional
MemberSetHash []byte `tlv:"0xcb"`
//+field:natural:optional
VectorType optional.Optional[uint64] `tlv:"0xcd"`
//+field:name
SvsDataRef enc.Name `tlv:"0x07"`
//+field:struct:StateVector
StateVector *StateVector `tlv:"0xc9"`
}
Expand All @@ -29,6 +42,14 @@ type SeqNoEntry struct {
SeqNo uint64 `tlv:"0xd6"`
}

// MembershipTuple is one (Name, BootstrapTime) pair used to compute MemberSetHash.
type MembershipTuple struct {
//+field:name
Name enc.Name `tlv:"0x07"`
//+field:natural
BootstrapTime uint64 `tlv:"0xd4"`
}

// +tlv-model:nocopy
type PassiveState struct {
//+field:sequence:[]byte:binary:[]byte
Expand Down
261 changes: 261 additions & 0 deletions std/ndn/svs/v3/zz_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions std/object/client_consume.go

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was 3 retries not enough in testing?

@Taranum01 Taranum01 Jul 22, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch — and 3 isn't quite enough on the 53-node sprint topology. After this thread, the e2e test in CI started failing intermittently with 'fetch metadata failed with result: Timeout' (4.5s after the cat fired). Locally it passes reliably because DV's startup converges quickly, but CI's slower startup stretches the window in which a DV startup-Reset can wipe a producer prefix from a consumer's RIB just after the convergence check returns.

So in a follow-up commit (9340c00), I bumped fetchMetadata and fetchDataByPrefix to Retries: 5 and Lifetime: 2s (~10s budget). That gives the consumer enough slack for DV to finish its post-startup re-announce cycle. Verified locally: all three scenarios (NDNd, NFD, NDNd-replay) pass. Verified in CI: 9340c00 is green.

The seg fetcher (client_consume_seg.go) is still at maxRetries: 3 because the segment-fetch flake that originally motivated the bump is solved by the AIMD congestion window in 1002285, not by retry budget.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it's a DV convergence issue, the CI should be updated have a long enough wait time for convergence, instead of modifying the underlying library.

Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,9 @@ func (c *Client) fetchMetadata(
Config: &ndn.InterestConfig{
CanBePrefix: true,
MustBeFresh: true,
Lifetime: optional.Some(time.Millisecond * 1000),
Lifetime: optional.Some(time.Millisecond * 2000),
},
Retries: 3, // TODO: configurable
Retries: 5, // TODO: configurable (sprint e2e needs ~10s budget for DV startup reset storm)
TryStore: utils.If(tryStore, c.store, nil),
Callback: func(args ndn.ExpressCallbackArgs) {
if args.Result == ndn.InterestResultError {
Expand Down Expand Up @@ -174,9 +174,9 @@ func (c *Client) fetchDataByPrefix(
Config: &ndn.InterestConfig{
CanBePrefix: true,
MustBeFresh: true,
Lifetime: optional.Some(time.Millisecond * 1000),
Lifetime: optional.Some(time.Millisecond * 2000),
},
Retries: 3, // TODO: configurable
Retries: 5, // TODO: configurable (sprint e2e needs ~10s budget for DV startup reset storm)
TryStore: utils.If(tryStore, c.store, nil),
Callback: func(args ndn.ExpressCallbackArgs) {
if args.Result == ndn.InterestResultError {
Expand Down
Loading
Loading