diff --git a/openraft/src/core/raft_core.rs b/openraft/src/core/raft_core.rs index 785652004..a9e93ac5f 100644 --- a/openraft/src/core/raft_core.rs +++ b/openraft/src/core/raft_core.rs @@ -261,7 +261,14 @@ impl, S: RaftStorage> RaftCore anyhow::Result<()> { + let config = Arc::new( + Config { + enable_heartbeat: false, + ..Default::default() + } + .validate()?, + ); + + let mut router = RaftRouter::new(config.clone()); + + tracing::info!("--- bring up cluster of 1 node"); + let mut log_index = router.new_nodes_from_single(btreeset! {0}, btreeset! {}).await?; + + tracing::info!("--- write to 1 log"); + { + router.client_request_many(0, "foo", 1).await?; + log_index += 1; + } + + tracing::info!("--- restart node 0"); + { + let (node, sto) = router.remove_node(0).unwrap(); + node.shutdown().await?; + + router.new_raft_node_with_sto(0, sto); + // leader appends a blank log. + log_index += 1; + + router.wait(&0, timeout()).state(ServerState::Leader, "node-0 is leader").await?; + router.wait(&0, timeout()).log(Some(log_index), "node-0 restarted").await?; + } + + tracing::info!("--- write to 1 log after restart"); + { + router.client_request_many(0, "foo", 1).await?; + log_index += 1; + + router.wait(&0, timeout()).log(Some(log_index), "node-0 works").await?; + } + + Ok(()) +} + +fn timeout() -> Option { + Some(Duration::from_millis(1000)) +}