pub struct BootstrapConfig { /* private fields */ }Expand description
Bootstrap process settings for peer discovery.
Implementations§
Source§impl BootstrapConfig
impl BootstrapConfig
Sourcepub fn builder() -> BootstrapConfigBuilder
pub fn builder() -> BootstrapConfigBuilder
Create a new BootstrapConfigBuilder with default values.
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 .initial_interval(Duration::from_secs(30))
53 .base_interval(Duration::from_secs(60))
54 .max_jitter(Duration::from_secs(120))
55 .fail_topic_creation_on_merge_startup_failure(true)
56 .max_join_peers(2)
57 .build(),
58 )
59 .message_overlap_merge(
60 MessageOverlapMergeConfig::builder()
61 .initial_interval(Duration::from_secs(30))
62 .base_interval(Duration::from_secs(60))
63 .max_jitter(Duration::from_secs(120))
64 .fail_topic_creation_on_merge_startup_failure(true)
65 .max_join_peers(2)
66 .build(),
67 )
68 .build(),
69 )
70 .timeouts(
71 TimeoutConfig::builder()
72 .join_peer_timeout(Duration::from_secs(5))
73 .broadcast_neighbors_timeout(Duration::from_secs(5))
74 .broadcast_timeout(Duration::from_secs(5))
75 .build(),
76 )
77 .build()
78}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();
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 max_bootstrap_records(&self) -> usize
pub fn max_bootstrap_records(&self) -> usize
Max bootstrap records per topic per minute slot.
If zero, we don’t publish (PublisherConfig will be set to Disabled).
Default: 5.
Sourcepub fn no_peers_retry_interval(&self) -> Duration
pub fn no_peers_retry_interval(&self) -> Duration
How long to wait when no peers are found before retrying.
Default: 1500ms.
Sourcepub fn per_peer_join_settle_time(&self) -> Duration
pub fn per_peer_join_settle_time(&self) -> Duration
How long to wait after joining a peer before attempting to join another.
Default: 100ms.
Sourcepub fn join_confirmation_wait_time(&self) -> Duration
pub fn join_confirmation_wait_time(&self) -> Duration
How long to wait after joining a peer before checking if joined successfully.
Default: 500ms.
Sourcepub fn discovery_poll_interval(&self) -> Duration
pub fn discovery_poll_interval(&self) -> Duration
How long to wait between DHT discovery attempts.
Default: 2000ms.
Sourcepub fn publish_record_on_startup(&self) -> bool
pub fn publish_record_on_startup(&self) -> bool
Whether to publish a bootstrap record unconditionally on startup before dht get.
Default: true.
Sourcepub fn check_older_records_first_on_startup(&self) -> bool
pub fn check_older_records_first_on_startup(&self) -> bool
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.
Trait Implementations§
Source§impl Clone for BootstrapConfig
impl Clone for BootstrapConfig
Source§fn clone(&self) -> BootstrapConfig
fn clone(&self) -> BootstrapConfig
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BootstrapConfig
impl Debug for BootstrapConfig
Auto Trait Implementations§
impl Freeze for BootstrapConfig
impl RefUnwindSafe for BootstrapConfig
impl Send for BootstrapConfig
impl Sync for BootstrapConfig
impl Unpin for BootstrapConfig
impl UnsafeUnpin for BootstrapConfig
impl UnwindSafe for BootstrapConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more