pub struct BootstrapConfigBuilder { /* private fields */ }Expand description
Builder for BootstrapConfig.
Implementations§
Source§impl BootstrapConfigBuilder
impl BootstrapConfigBuilder
Sourcepub fn max_bootstrap_records(self, max_records: usize) -> Self
pub fn max_bootstrap_records(self, max_records: usize) -> Self
Max bootstrap records per topic per minute slot.
If zero, we don’t publish (PublisherConfig will be set to Disabled).
Default: 5.
Examples found in repository?
17fn config_builder() -> Config {
18 Config::builder()
19 .dht_config(
20 DhtConfig::builder()
21 .retries(3)
22 .base_retry_interval(Duration::from_secs(5))
23 .max_retry_jitter(Duration::from_secs(10))
24 .get_timeout(Duration::from_secs(10))
25 .put_timeout(Duration::from_secs(10))
26 .build(),
27 )
28 .bootstrap_config(
29 BootstrapConfig::builder()
30 .max_bootstrap_records(5)
31 .publish_record_on_startup(true)
32 .check_older_records_first_on_startup(false)
33 .discovery_poll_interval(Duration::from_millis(2000))
34 .no_peers_retry_interval(Duration::from_millis(1500))
35 .per_peer_join_settle_time(Duration::from_millis(100))
36 .join_confirmation_wait_time(Duration::from_millis(500))
37 .build(),
38 )
39 .max_join_peer_count(4)
40 .publisher_config(
41 PublisherConfig::builder()
42 .initial_delay(Duration::from_secs(10))
43 .base_interval(Duration::from_secs(10))
44 .max_jitter(Duration::from_secs(50))
45 .build(),
46 )
47 .merge_config(
48 MergeConfig::builder()
49 .bubble_merge(
50 BubbleMergeConfig::builder()
51 .min_neighbors(4)
52 .base_interval(Duration::from_secs(60))
53 .max_jitter(Duration::from_secs(120))
54 .fail_topic_creation_on_merge_startup_failure(true)
55 .build(),
56 )
57 .message_overlap_merge(
58 MessageOverlapMergeConfig::builder()
59 .base_interval(Duration::from_secs(60))
60 .max_jitter(Duration::from_secs(120))
61 .fail_topic_creation_on_merge_startup_failure(true)
62 .build(),
63 )
64 .build(),
65 )
66 .timeouts(
67 TimeoutConfig::builder()
68 .join_peer_timeout(Duration::from_secs(5))
69 .broadcast_neighbors_timeout(Duration::from_secs(5))
70 .broadcast_timeout(Duration::from_secs(5))
71 .build(),
72 )
73 .build()
74}Sourcepub fn no_peers_retry_interval(self, interval: Duration) -> Self
pub fn no_peers_retry_interval(self, interval: Duration) -> Self
How long to wait when no peers are found before retrying.
Default: 1500ms.
Examples found in repository?
17fn config_builder() -> Config {
18 Config::builder()
19 .dht_config(
20 DhtConfig::builder()
21 .retries(3)
22 .base_retry_interval(Duration::from_secs(5))
23 .max_retry_jitter(Duration::from_secs(10))
24 .get_timeout(Duration::from_secs(10))
25 .put_timeout(Duration::from_secs(10))
26 .build(),
27 )
28 .bootstrap_config(
29 BootstrapConfig::builder()
30 .max_bootstrap_records(5)
31 .publish_record_on_startup(true)
32 .check_older_records_first_on_startup(false)
33 .discovery_poll_interval(Duration::from_millis(2000))
34 .no_peers_retry_interval(Duration::from_millis(1500))
35 .per_peer_join_settle_time(Duration::from_millis(100))
36 .join_confirmation_wait_time(Duration::from_millis(500))
37 .build(),
38 )
39 .max_join_peer_count(4)
40 .publisher_config(
41 PublisherConfig::builder()
42 .initial_delay(Duration::from_secs(10))
43 .base_interval(Duration::from_secs(10))
44 .max_jitter(Duration::from_secs(50))
45 .build(),
46 )
47 .merge_config(
48 MergeConfig::builder()
49 .bubble_merge(
50 BubbleMergeConfig::builder()
51 .min_neighbors(4)
52 .base_interval(Duration::from_secs(60))
53 .max_jitter(Duration::from_secs(120))
54 .fail_topic_creation_on_merge_startup_failure(true)
55 .build(),
56 )
57 .message_overlap_merge(
58 MessageOverlapMergeConfig::builder()
59 .base_interval(Duration::from_secs(60))
60 .max_jitter(Duration::from_secs(120))
61 .fail_topic_creation_on_merge_startup_failure(true)
62 .build(),
63 )
64 .build(),
65 )
66 .timeouts(
67 TimeoutConfig::builder()
68 .join_peer_timeout(Duration::from_secs(5))
69 .broadcast_neighbors_timeout(Duration::from_secs(5))
70 .broadcast_timeout(Duration::from_secs(5))
71 .build(),
72 )
73 .build()
74}Sourcepub fn per_peer_join_settle_time(self, interval: Duration) -> Self
pub fn per_peer_join_settle_time(self, interval: Duration) -> Self
How long to wait after joining a peer before attempting to join another.
Default: 100ms.
Examples found in repository?
17fn config_builder() -> Config {
18 Config::builder()
19 .dht_config(
20 DhtConfig::builder()
21 .retries(3)
22 .base_retry_interval(Duration::from_secs(5))
23 .max_retry_jitter(Duration::from_secs(10))
24 .get_timeout(Duration::from_secs(10))
25 .put_timeout(Duration::from_secs(10))
26 .build(),
27 )
28 .bootstrap_config(
29 BootstrapConfig::builder()
30 .max_bootstrap_records(5)
31 .publish_record_on_startup(true)
32 .check_older_records_first_on_startup(false)
33 .discovery_poll_interval(Duration::from_millis(2000))
34 .no_peers_retry_interval(Duration::from_millis(1500))
35 .per_peer_join_settle_time(Duration::from_millis(100))
36 .join_confirmation_wait_time(Duration::from_millis(500))
37 .build(),
38 )
39 .max_join_peer_count(4)
40 .publisher_config(
41 PublisherConfig::builder()
42 .initial_delay(Duration::from_secs(10))
43 .base_interval(Duration::from_secs(10))
44 .max_jitter(Duration::from_secs(50))
45 .build(),
46 )
47 .merge_config(
48 MergeConfig::builder()
49 .bubble_merge(
50 BubbleMergeConfig::builder()
51 .min_neighbors(4)
52 .base_interval(Duration::from_secs(60))
53 .max_jitter(Duration::from_secs(120))
54 .fail_topic_creation_on_merge_startup_failure(true)
55 .build(),
56 )
57 .message_overlap_merge(
58 MessageOverlapMergeConfig::builder()
59 .base_interval(Duration::from_secs(60))
60 .max_jitter(Duration::from_secs(120))
61 .fail_topic_creation_on_merge_startup_failure(true)
62 .build(),
63 )
64 .build(),
65 )
66 .timeouts(
67 TimeoutConfig::builder()
68 .join_peer_timeout(Duration::from_secs(5))
69 .broadcast_neighbors_timeout(Duration::from_secs(5))
70 .broadcast_timeout(Duration::from_secs(5))
71 .build(),
72 )
73 .build()
74}Sourcepub fn join_confirmation_wait_time(self, interval: Duration) -> Self
pub fn join_confirmation_wait_time(self, interval: Duration) -> Self
How long to wait after joining a peer before checking if joined successfully.
Default: 500ms.
Examples found in repository?
17fn config_builder() -> Config {
18 Config::builder()
19 .dht_config(
20 DhtConfig::builder()
21 .retries(3)
22 .base_retry_interval(Duration::from_secs(5))
23 .max_retry_jitter(Duration::from_secs(10))
24 .get_timeout(Duration::from_secs(10))
25 .put_timeout(Duration::from_secs(10))
26 .build(),
27 )
28 .bootstrap_config(
29 BootstrapConfig::builder()
30 .max_bootstrap_records(5)
31 .publish_record_on_startup(true)
32 .check_older_records_first_on_startup(false)
33 .discovery_poll_interval(Duration::from_millis(2000))
34 .no_peers_retry_interval(Duration::from_millis(1500))
35 .per_peer_join_settle_time(Duration::from_millis(100))
36 .join_confirmation_wait_time(Duration::from_millis(500))
37 .build(),
38 )
39 .max_join_peer_count(4)
40 .publisher_config(
41 PublisherConfig::builder()
42 .initial_delay(Duration::from_secs(10))
43 .base_interval(Duration::from_secs(10))
44 .max_jitter(Duration::from_secs(50))
45 .build(),
46 )
47 .merge_config(
48 MergeConfig::builder()
49 .bubble_merge(
50 BubbleMergeConfig::builder()
51 .min_neighbors(4)
52 .base_interval(Duration::from_secs(60))
53 .max_jitter(Duration::from_secs(120))
54 .fail_topic_creation_on_merge_startup_failure(true)
55 .build(),
56 )
57 .message_overlap_merge(
58 MessageOverlapMergeConfig::builder()
59 .base_interval(Duration::from_secs(60))
60 .max_jitter(Duration::from_secs(120))
61 .fail_topic_creation_on_merge_startup_failure(true)
62 .build(),
63 )
64 .build(),
65 )
66 .timeouts(
67 TimeoutConfig::builder()
68 .join_peer_timeout(Duration::from_secs(5))
69 .broadcast_neighbors_timeout(Duration::from_secs(5))
70 .broadcast_timeout(Duration::from_secs(5))
71 .build(),
72 )
73 .build()
74}Sourcepub fn discovery_poll_interval(self, interval: Duration) -> Self
pub fn discovery_poll_interval(self, interval: Duration) -> Self
How long to wait between DHT discovery attempts.
Default: 2000ms.
Examples found in repository?
17fn config_builder() -> Config {
18 Config::builder()
19 .dht_config(
20 DhtConfig::builder()
21 .retries(3)
22 .base_retry_interval(Duration::from_secs(5))
23 .max_retry_jitter(Duration::from_secs(10))
24 .get_timeout(Duration::from_secs(10))
25 .put_timeout(Duration::from_secs(10))
26 .build(),
27 )
28 .bootstrap_config(
29 BootstrapConfig::builder()
30 .max_bootstrap_records(5)
31 .publish_record_on_startup(true)
32 .check_older_records_first_on_startup(false)
33 .discovery_poll_interval(Duration::from_millis(2000))
34 .no_peers_retry_interval(Duration::from_millis(1500))
35 .per_peer_join_settle_time(Duration::from_millis(100))
36 .join_confirmation_wait_time(Duration::from_millis(500))
37 .build(),
38 )
39 .max_join_peer_count(4)
40 .publisher_config(
41 PublisherConfig::builder()
42 .initial_delay(Duration::from_secs(10))
43 .base_interval(Duration::from_secs(10))
44 .max_jitter(Duration::from_secs(50))
45 .build(),
46 )
47 .merge_config(
48 MergeConfig::builder()
49 .bubble_merge(
50 BubbleMergeConfig::builder()
51 .min_neighbors(4)
52 .base_interval(Duration::from_secs(60))
53 .max_jitter(Duration::from_secs(120))
54 .fail_topic_creation_on_merge_startup_failure(true)
55 .build(),
56 )
57 .message_overlap_merge(
58 MessageOverlapMergeConfig::builder()
59 .base_interval(Duration::from_secs(60))
60 .max_jitter(Duration::from_secs(120))
61 .fail_topic_creation_on_merge_startup_failure(true)
62 .build(),
63 )
64 .build(),
65 )
66 .timeouts(
67 TimeoutConfig::builder()
68 .join_peer_timeout(Duration::from_secs(5))
69 .broadcast_neighbors_timeout(Duration::from_secs(5))
70 .broadcast_timeout(Duration::from_secs(5))
71 .build(),
72 )
73 .build()
74}Sourcepub fn publish_record_on_startup(self, publish: bool) -> Self
pub fn publish_record_on_startup(self, publish: bool) -> Self
Whether to publish a bootstrap record unconditionally on startup before dht get.
Default: true.
Examples found in repository?
17fn config_builder() -> Config {
18 Config::builder()
19 .dht_config(
20 DhtConfig::builder()
21 .retries(3)
22 .base_retry_interval(Duration::from_secs(5))
23 .max_retry_jitter(Duration::from_secs(10))
24 .get_timeout(Duration::from_secs(10))
25 .put_timeout(Duration::from_secs(10))
26 .build(),
27 )
28 .bootstrap_config(
29 BootstrapConfig::builder()
30 .max_bootstrap_records(5)
31 .publish_record_on_startup(true)
32 .check_older_records_first_on_startup(false)
33 .discovery_poll_interval(Duration::from_millis(2000))
34 .no_peers_retry_interval(Duration::from_millis(1500))
35 .per_peer_join_settle_time(Duration::from_millis(100))
36 .join_confirmation_wait_time(Duration::from_millis(500))
37 .build(),
38 )
39 .max_join_peer_count(4)
40 .publisher_config(
41 PublisherConfig::builder()
42 .initial_delay(Duration::from_secs(10))
43 .base_interval(Duration::from_secs(10))
44 .max_jitter(Duration::from_secs(50))
45 .build(),
46 )
47 .merge_config(
48 MergeConfig::builder()
49 .bubble_merge(
50 BubbleMergeConfig::builder()
51 .min_neighbors(4)
52 .base_interval(Duration::from_secs(60))
53 .max_jitter(Duration::from_secs(120))
54 .fail_topic_creation_on_merge_startup_failure(true)
55 .build(),
56 )
57 .message_overlap_merge(
58 MessageOverlapMergeConfig::builder()
59 .base_interval(Duration::from_secs(60))
60 .max_jitter(Duration::from_secs(120))
61 .fail_topic_creation_on_merge_startup_failure(true)
62 .build(),
63 )
64 .build(),
65 )
66 .timeouts(
67 TimeoutConfig::builder()
68 .join_peer_timeout(Duration::from_secs(5))
69 .broadcast_neighbors_timeout(Duration::from_secs(5))
70 .broadcast_timeout(Duration::from_secs(5))
71 .build(),
72 )
73 .build()
74}Sourcepub fn check_older_records_first_on_startup(self, check: bool) -> Self
pub fn check_older_records_first_on_startup(self, check: bool) -> Self
Whether to check unix_minute and unix_minute-1 or unix_minute-1 and unix_minute-2 on startup.
If this is enabled, we first fetch unix_minute-1 and unix_minute-2.
If joining longer running, existing topics is priority, set to true. If minimizing bootstrap time for cluster cold starts (2+ nodes starting roughly at the same time into a topic without peers), set to false.
Default: false.
Examples found in repository?
17fn config_builder() -> Config {
18 Config::builder()
19 .dht_config(
20 DhtConfig::builder()
21 .retries(3)
22 .base_retry_interval(Duration::from_secs(5))
23 .max_retry_jitter(Duration::from_secs(10))
24 .get_timeout(Duration::from_secs(10))
25 .put_timeout(Duration::from_secs(10))
26 .build(),
27 )
28 .bootstrap_config(
29 BootstrapConfig::builder()
30 .max_bootstrap_records(5)
31 .publish_record_on_startup(true)
32 .check_older_records_first_on_startup(false)
33 .discovery_poll_interval(Duration::from_millis(2000))
34 .no_peers_retry_interval(Duration::from_millis(1500))
35 .per_peer_join_settle_time(Duration::from_millis(100))
36 .join_confirmation_wait_time(Duration::from_millis(500))
37 .build(),
38 )
39 .max_join_peer_count(4)
40 .publisher_config(
41 PublisherConfig::builder()
42 .initial_delay(Duration::from_secs(10))
43 .base_interval(Duration::from_secs(10))
44 .max_jitter(Duration::from_secs(50))
45 .build(),
46 )
47 .merge_config(
48 MergeConfig::builder()
49 .bubble_merge(
50 BubbleMergeConfig::builder()
51 .min_neighbors(4)
52 .base_interval(Duration::from_secs(60))
53 .max_jitter(Duration::from_secs(120))
54 .fail_topic_creation_on_merge_startup_failure(true)
55 .build(),
56 )
57 .message_overlap_merge(
58 MessageOverlapMergeConfig::builder()
59 .base_interval(Duration::from_secs(60))
60 .max_jitter(Duration::from_secs(120))
61 .fail_topic_creation_on_merge_startup_failure(true)
62 .build(),
63 )
64 .build(),
65 )
66 .timeouts(
67 TimeoutConfig::builder()
68 .join_peer_timeout(Duration::from_secs(5))
69 .broadcast_neighbors_timeout(Duration::from_secs(5))
70 .broadcast_timeout(Duration::from_secs(5))
71 .build(),
72 )
73 .build()
74}More examples
13async fn main() -> Result<()> {
14 // tracing init - only show distributed_topic_tracker logs
15 use tracing_subscriber::filter::EnvFilter;
16
17 tracing_subscriber::fmt()
18 .with_thread_ids(true)
19 .with_ansi(true)
20 .with_env_filter(
21 EnvFilter::try_from_default_env()
22 .unwrap_or_else(|_| EnvFilter::new("distributed_topic_tracker=debug")),
23 )
24 .init();
25
26 // Generate a new random secret key
27 let secret_key = SecretKey::generate(&mut rand::rng());
28 let signing_key = SigningKey::from_bytes(&secret_key.to_bytes());
29
30 // Set up endpoint with discovery enabled
31 let endpoint = Endpoint::builder(iroh::endpoint::presets::N0)
32 .secret_key(secret_key.clone())
33 .bind()
34 .await?;
35
36 // Initialize gossip with auto-discovery
37 let gossip = Gossip::builder().spawn(endpoint.clone());
38
39 // Set up protocol router
40 let _router = iroh::protocol::Router::builder(endpoint.clone())
41 .accept(iroh_gossip::ALPN, gossip.clone())
42 .spawn();
43
44 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
45 let initial_secret = b"my-initial-secret".to_vec();
46
47 let record_publisher = RecordPublisher::new(
48 topic_id.clone(),
49 signing_key.clone(),
50 None,
51 initial_secret,
52 Config::builder()
53 .bootstrap_config(
54 BootstrapConfig::builder()
55 .check_older_records_first_on_startup(false)
56 .build(),
57 )
58 .build(),
59 );
60
61 // Split into sink (sending) and stream (receiving)
62 let (gossip_sender, mut gossip_receiver) = gossip
63 .subscribe_and_join_with_auto_discovery(record_publisher)
64 .await?
65 .split()
66 .await?;
67
68 println!("Joined topic");
69
70 // Spawn listener for incoming messages
71 tokio::spawn(async move {
72 while let Ok(event) = gossip_receiver.next().await {
73 if let Event::Received(msg) = event {
74 println!(
75 "\nMessage from {}: {}",
76 &msg.delivered_from.to_string()[0..8],
77 String::from_utf8(msg.content.to_vec()).unwrap()
78 );
79 } else if let Event::NeighborUp(peer) = event {
80 println!("\nJoined by {}", &peer.to_string()[0..8]);
81 }
82 }
83 println!("\nGossip receiver stream ended");
84 });
85
86 // Main input loop for sending messages
87 let mut buffer = String::new();
88 let stdin = std::io::stdin();
89 loop {
90 print!("\n> ");
91 stdin.read_line(&mut buffer).unwrap();
92 gossip_sender
93 .broadcast(
94 buffer
95 .trim_end_matches(&['\r', '\n'][..])
96 .as_bytes()
97 .to_vec(),
98 )
99 .await
100 .unwrap();
101 println!(" - (sent)");
102 buffer.clear();
103 }
104}Sourcepub fn build(self) -> BootstrapConfig
pub fn build(self) -> BootstrapConfig
Build the BootstrapConfig.
Examples found in repository?
17fn config_builder() -> Config {
18 Config::builder()
19 .dht_config(
20 DhtConfig::builder()
21 .retries(3)
22 .base_retry_interval(Duration::from_secs(5))
23 .max_retry_jitter(Duration::from_secs(10))
24 .get_timeout(Duration::from_secs(10))
25 .put_timeout(Duration::from_secs(10))
26 .build(),
27 )
28 .bootstrap_config(
29 BootstrapConfig::builder()
30 .max_bootstrap_records(5)
31 .publish_record_on_startup(true)
32 .check_older_records_first_on_startup(false)
33 .discovery_poll_interval(Duration::from_millis(2000))
34 .no_peers_retry_interval(Duration::from_millis(1500))
35 .per_peer_join_settle_time(Duration::from_millis(100))
36 .join_confirmation_wait_time(Duration::from_millis(500))
37 .build(),
38 )
39 .max_join_peer_count(4)
40 .publisher_config(
41 PublisherConfig::builder()
42 .initial_delay(Duration::from_secs(10))
43 .base_interval(Duration::from_secs(10))
44 .max_jitter(Duration::from_secs(50))
45 .build(),
46 )
47 .merge_config(
48 MergeConfig::builder()
49 .bubble_merge(
50 BubbleMergeConfig::builder()
51 .min_neighbors(4)
52 .base_interval(Duration::from_secs(60))
53 .max_jitter(Duration::from_secs(120))
54 .fail_topic_creation_on_merge_startup_failure(true)
55 .build(),
56 )
57 .message_overlap_merge(
58 MessageOverlapMergeConfig::builder()
59 .base_interval(Duration::from_secs(60))
60 .max_jitter(Duration::from_secs(120))
61 .fail_topic_creation_on_merge_startup_failure(true)
62 .build(),
63 )
64 .build(),
65 )
66 .timeouts(
67 TimeoutConfig::builder()
68 .join_peer_timeout(Duration::from_secs(5))
69 .broadcast_neighbors_timeout(Duration::from_secs(5))
70 .broadcast_timeout(Duration::from_secs(5))
71 .build(),
72 )
73 .build()
74}More examples
13async fn main() -> Result<()> {
14 // tracing init - only show distributed_topic_tracker logs
15 use tracing_subscriber::filter::EnvFilter;
16
17 tracing_subscriber::fmt()
18 .with_thread_ids(true)
19 .with_ansi(true)
20 .with_env_filter(
21 EnvFilter::try_from_default_env()
22 .unwrap_or_else(|_| EnvFilter::new("distributed_topic_tracker=debug")),
23 )
24 .init();
25
26 // Generate a new random secret key
27 let secret_key = SecretKey::generate(&mut rand::rng());
28 let signing_key = SigningKey::from_bytes(&secret_key.to_bytes());
29
30 // Set up endpoint with discovery enabled
31 let endpoint = Endpoint::builder(iroh::endpoint::presets::N0)
32 .secret_key(secret_key.clone())
33 .bind()
34 .await?;
35
36 // Initialize gossip with auto-discovery
37 let gossip = Gossip::builder().spawn(endpoint.clone());
38
39 // Set up protocol router
40 let _router = iroh::protocol::Router::builder(endpoint.clone())
41 .accept(iroh_gossip::ALPN, gossip.clone())
42 .spawn();
43
44 let topic_id = TopicId::new("my-iroh-gossip-topic".to_string());
45 let initial_secret = b"my-initial-secret".to_vec();
46
47 let record_publisher = RecordPublisher::new(
48 topic_id.clone(),
49 signing_key.clone(),
50 None,
51 initial_secret,
52 Config::builder()
53 .bootstrap_config(
54 BootstrapConfig::builder()
55 .check_older_records_first_on_startup(false)
56 .build(),
57 )
58 .build(),
59 );
60
61 // Split into sink (sending) and stream (receiving)
62 let (gossip_sender, mut gossip_receiver) = gossip
63 .subscribe_and_join_with_auto_discovery(record_publisher)
64 .await?
65 .split()
66 .await?;
67
68 println!("Joined topic");
69
70 // Spawn listener for incoming messages
71 tokio::spawn(async move {
72 while let Ok(event) = gossip_receiver.next().await {
73 if let Event::Received(msg) = event {
74 println!(
75 "\nMessage from {}: {}",
76 &msg.delivered_from.to_string()[0..8],
77 String::from_utf8(msg.content.to_vec()).unwrap()
78 );
79 } else if let Event::NeighborUp(peer) = event {
80 println!("\nJoined by {}", &peer.to_string()[0..8]);
81 }
82 }
83 println!("\nGossip receiver stream ended");
84 });
85
86 // Main input loop for sending messages
87 let mut buffer = String::new();
88 let stdin = std::io::stdin();
89 loop {
90 print!("\n> ");
91 stdin.read_line(&mut buffer).unwrap();
92 gossip_sender
93 .broadcast(
94 buffer
95 .trim_end_matches(&['\r', '\n'][..])
96 .as_bytes()
97 .to_vec(),
98 )
99 .await
100 .unwrap();
101 println!(" - (sent)");
102 buffer.clear();
103 }
104}