raft.rs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  1. use async_std::{
  2. sync::{Arc, Mutex},
  3. task,
  4. };
  5. use std::{cmp::min, collections::HashMap, net::SocketAddr, path::PathBuf, time::Duration};
  6. use async_executor::Executor;
  7. use futures::{select, FutureExt};
  8. use log::{debug, error, info, warn};
  9. use rand::{rngs::OsRng, Rng, RngCore};
  10. use crate::{
  11. net,
  12. util::serial::{deserialize, serialize, Decodable, Encodable},
  13. Error, Result,
  14. };
  15. use super::{
  16. BroadcastMsgRequest, DataStore, Log, LogRequest, LogResponse, Logs, MapLength, NetMsg,
  17. NetMsgMethod, NodeId, ProtocolRaft, Role, SyncRequest, SyncResponse, VoteRequest, VoteResponse,
  18. };
  19. const HEARTBEATTIMEOUT: u64 = 100;
  20. const TIMEOUT: u64 = 300;
  21. const TIMEOUT_NODES: u64 = 300;
  22. pub type Broadcast<T> = (async_channel::Sender<T>, async_channel::Receiver<T>);
  23. type Sender = (async_channel::Sender<NetMsg>, async_channel::Receiver<NetMsg>);
  24. async fn load_node_ids_loop(
  25. nodes: Arc<Mutex<HashMap<NodeId, SocketAddr>>>,
  26. p2p: net::P2pPtr,
  27. self_id: Option<NodeId>,
  28. ) -> Result<()> {
  29. if self_id.is_none() {
  30. return Ok(())
  31. }
  32. loop {
  33. debug!(target: "raft", "load node ids from p2p hosts ips");
  34. task::sleep(Duration::from_millis(TIMEOUT_NODES * 10)).await;
  35. let hosts = p2p.hosts().clone();
  36. let nodes_ip = hosts.load_all().await.clone();
  37. let mut nodes = nodes.lock().await;
  38. for ip in nodes_ip.iter() {
  39. nodes.insert(NodeId::from(*ip), *ip);
  40. }
  41. drop(nodes);
  42. }
  43. }
  44. async fn p2p_recv_send_loop(
  45. p2p_recv: async_channel::Receiver<NetMsg>,
  46. p2p: net::P2pPtr,
  47. ) -> Result<()> {
  48. loop {
  49. let msg: NetMsg = match p2p_recv.recv().await {
  50. Ok(m) => m,
  51. Err(e) => {
  52. error!(target: "raft", "error occurred while receiving a msg: {}", e);
  53. continue
  54. }
  55. };
  56. match p2p.broadcast(msg).await {
  57. Ok(_) => {}
  58. Err(e) => {
  59. error!(target: "raft", "error occurred during broadcasting a msg: {}", e);
  60. continue
  61. }
  62. }
  63. }
  64. }
  65. pub struct Raft<T> {
  66. // this will be derived from the ip
  67. // if the node doesn't have an id then will become a listener and doesn't have the right
  68. // to request/response votes or response a confirmation for log
  69. id: Option<NodeId>,
  70. // these five vars should be on local storage
  71. current_term: u64,
  72. voted_for: Option<NodeId>,
  73. logs: Logs,
  74. commit_length: u64,
  75. role: Role,
  76. current_leader: Option<NodeId>,
  77. votes_received: Vec<NodeId>,
  78. sent_length: MapLength,
  79. acked_length: MapLength,
  80. nodes: Arc<Mutex<HashMap<NodeId, SocketAddr>>>,
  81. last_term: u64,
  82. sender: Sender,
  83. broadcast_msg: Broadcast<T>,
  84. broadcast_commits: Broadcast<T>,
  85. datastore: DataStore<T>,
  86. }
  87. impl<T: Decodable + Encodable + Clone> Raft<T> {
  88. pub fn new(addr: Option<SocketAddr>, db_path: PathBuf) -> Result<Self> {
  89. if db_path.to_str().is_none() {
  90. error!(target: "raft", "datastore path is incorrect");
  91. return Err(Error::ParseFailed("unable to parse pathbuf to str"))
  92. };
  93. let db_path_str = db_path.to_str().unwrap();
  94. let mut current_term = 0;
  95. let mut voted_for = None;
  96. let mut logs = Logs(vec![]);
  97. let mut commit_length = 0;
  98. let datastore = if db_path.exists() {
  99. let datastore = DataStore::new(db_path_str)?;
  100. current_term = datastore.current_term.get_last()?.unwrap_or(0);
  101. voted_for = datastore.voted_for.get_last()?.flatten();
  102. logs = Logs(datastore.logs.get_all()?);
  103. commit_length = datastore.commits_length.get_last()?.unwrap_or(0);
  104. datastore
  105. } else {
  106. DataStore::new(db_path_str)?
  107. };
  108. // broadcasting channels
  109. let broadcast_msg = async_channel::unbounded::<T>();
  110. let broadcast_commits = async_channel::unbounded::<T>();
  111. let sender = async_channel::unbounded::<NetMsg>();
  112. Ok(Self {
  113. id: addr.map(NodeId::from),
  114. current_term,
  115. voted_for,
  116. logs,
  117. commit_length,
  118. role: Role::Follower,
  119. current_leader: None,
  120. votes_received: vec![],
  121. sent_length: MapLength(HashMap::new()),
  122. acked_length: MapLength(HashMap::new()),
  123. nodes: Arc::new(Mutex::new(HashMap::new())),
  124. last_term: 0,
  125. sender,
  126. broadcast_msg,
  127. broadcast_commits,
  128. datastore,
  129. })
  130. }
  131. pub async fn start(
  132. &mut self,
  133. net_settings: net::Settings,
  134. executor: Arc<Executor<'_>>,
  135. stop_signal: async_channel::Receiver<()>,
  136. ) -> Result<()> {
  137. // P2p setup
  138. let (p2p_snd, receive_queues) = async_channel::unbounded::<NetMsg>();
  139. let p2p = net::P2p::new(net_settings).await;
  140. let p2p = p2p.clone();
  141. let registry = p2p.protocol_registry();
  142. let seen_net_msg = Arc::new(Mutex::new(vec![]));
  143. let self_id = self.id.clone();
  144. registry
  145. .register(net::SESSION_ALL, move |channel, p2p| {
  146. let self_id = self_id.clone();
  147. let sender = p2p_snd.clone();
  148. let seen_net_msg_cloned = seen_net_msg.clone();
  149. async move {
  150. ProtocolRaft::init(self_id, channel, sender, p2p, seen_net_msg_cloned).await
  151. }
  152. })
  153. .await;
  154. // P2p start
  155. p2p.clone().start(executor.clone()).await?;
  156. let executor_cloned = executor.clone();
  157. let p2p_task = executor_cloned.spawn(p2p.clone().run(executor.clone()));
  158. let p2p_recv = self.sender.1.clone();
  159. let p2p_recv_task = executor.spawn(p2p_recv_send_loop(p2p_recv.clone(), p2p.clone()));
  160. let load_ips_task =
  161. executor.spawn(load_node_ids_loop(self.nodes.clone(), p2p.clone(), self.id.clone()));
  162. // Sync listener node
  163. if self.id.is_none() {
  164. let last_term =
  165. if !self.logs.0.is_empty() { self.logs.0.last().unwrap().term } else { 0 };
  166. let sync_request = SyncRequest { logs_len: self.logs.len(), last_term };
  167. info!("send sync request");
  168. self.send(None, &serialize(&sync_request), NetMsgMethod::SyncRequest, None).await?;
  169. self.waiting_for_sync(receive_queues.clone(), stop_signal.clone()).await?;
  170. }
  171. let mut rng = rand::thread_rng();
  172. let broadcast_msg_rv = self.broadcast_msg.1.clone();
  173. loop {
  174. let timeout: Duration = if self.role == Role::Leader {
  175. Duration::from_millis(HEARTBEATTIMEOUT)
  176. } else {
  177. Duration::from_millis(rng.gen_range(0..200) + TIMEOUT)
  178. };
  179. let result: Result<()>;
  180. select! {
  181. m = receive_queues.recv().fuse() => result = self.handle_method(m?).await,
  182. m = broadcast_msg_rv.recv().fuse() => result = self.broadcast_msg(&m?,None).await,
  183. _ = task::sleep(timeout).fuse() => {
  184. result = if self.role == Role::Leader {
  185. self.send_heartbeat().await
  186. }else {
  187. self.send_vote_request().await
  188. };
  189. },
  190. _ = stop_signal.recv().fuse() => break,
  191. }
  192. match result {
  193. Ok(_) => {}
  194. Err(e) => warn!(target: "raft", "warn: {}", e),
  195. }
  196. }
  197. warn!(target: "raft", "Raft start() Exit Signal");
  198. load_ips_task.cancel().await;
  199. p2p_recv_task.cancel().await;
  200. p2p_task.cancel().await;
  201. self.datastore.cancel().await?;
  202. Ok(())
  203. }
  204. pub fn get_commits(&self) -> async_channel::Receiver<T> {
  205. self.broadcast_commits.1.clone()
  206. }
  207. pub fn get_broadcast(&self) -> async_channel::Sender<T> {
  208. self.broadcast_msg.0.clone()
  209. }
  210. async fn broadcast_msg(&mut self, msg: &T, msg_id: Option<u64>) -> Result<()> {
  211. if self.role == Role::Leader {
  212. let msg = serialize(msg);
  213. let log = Log { msg, term: self.current_term };
  214. self.push_log(&log)?;
  215. self.acked_length.insert(&self.id.clone().unwrap(), self.logs.len());
  216. } else {
  217. let b_msg = BroadcastMsgRequest(serialize(msg));
  218. self.send(
  219. self.current_leader.clone(),
  220. &serialize(&b_msg),
  221. NetMsgMethod::BroadcastRequest,
  222. msg_id,
  223. )
  224. .await?;
  225. }
  226. info!(target: "raft",
  227. "Node has id: {}, Node status: {:?}, broadcast a msg id: {:?} ",
  228. self.id.is_some(),
  229. self.role, msg_id
  230. );
  231. Ok(())
  232. }
  233. async fn handle_method(&mut self, msg: NetMsg) -> Result<()> {
  234. match msg.method {
  235. NetMsgMethod::LogResponse => {
  236. let lr: LogResponse = deserialize(&msg.payload)?;
  237. self.receive_log_response(lr).await?;
  238. }
  239. NetMsgMethod::LogRequest => {
  240. let lr: LogRequest = deserialize(&msg.payload)?;
  241. self.receive_log_request(lr).await?;
  242. }
  243. NetMsgMethod::VoteResponse => {
  244. let vr: VoteResponse = deserialize(&msg.payload)?;
  245. self.receive_vote_response(vr).await?;
  246. }
  247. NetMsgMethod::VoteRequest => {
  248. let vr: VoteRequest = deserialize(&msg.payload)?;
  249. self.receive_vote_request(vr).await?;
  250. }
  251. NetMsgMethod::BroadcastRequest => {
  252. let vr: BroadcastMsgRequest = deserialize(&msg.payload)?;
  253. let d: T = deserialize(&vr.0)?;
  254. self.broadcast_msg(&d, Some(msg.id)).await?;
  255. }
  256. NetMsgMethod::SyncRequest => {
  257. info!("receive sync request");
  258. let sr: SyncRequest = deserialize(&msg.payload)?;
  259. self.receive_sync_request(&sr, msg.id).await?;
  260. }
  261. NetMsgMethod::SyncResponse => {}
  262. }
  263. debug!(
  264. target: "raft",
  265. "Node has id: {} {:?} receive msg id: {} recipient_id: {:?} method: {:?} ",
  266. self.id.is_some(), self.role, msg.id, &msg.recipient_id.is_some(), &msg.method
  267. );
  268. Ok(())
  269. }
  270. async fn receive_sync_request(&self, sr: &SyncRequest, msg_id: u64) -> Result<()> {
  271. if self.id.is_none() {
  272. return Ok(())
  273. }
  274. if self.role == Role::Leader {
  275. let mut wipe = false;
  276. let logs = if sr.logs_len == 0 {
  277. self.logs.clone()
  278. } else if self.logs.len() >= sr.logs_len &&
  279. self.logs.get(sr.logs_len - 1)?.term == sr.last_term
  280. {
  281. self.logs.slice_from(sr.logs_len).unwrap()
  282. } else {
  283. wipe = true;
  284. self.logs.clone()
  285. };
  286. let sync_response = SyncResponse {
  287. logs,
  288. commit_length: self.commit_length,
  289. leader_id: self.id.clone().unwrap(),
  290. wipe,
  291. };
  292. info!("send sync response");
  293. for _ in 0..2 {
  294. self.send(
  295. self.current_leader.clone(),
  296. &serialize(&sync_response),
  297. NetMsgMethod::SyncResponse,
  298. None,
  299. )
  300. .await?;
  301. }
  302. } else {
  303. self.send(
  304. self.current_leader.clone(),
  305. &serialize(sr),
  306. NetMsgMethod::SyncRequest,
  307. Some(msg_id),
  308. )
  309. .await?;
  310. }
  311. Ok(())
  312. }
  313. async fn receive_sync_response(&mut self, sr: &SyncResponse) -> Result<()> {
  314. info!("receive sync response");
  315. if sr.wipe {
  316. self.set_commit_length(&0)?;
  317. self.push_logs(&sr.logs)?;
  318. } else {
  319. for log in sr.logs.0.iter() {
  320. self.push_log(log)?;
  321. }
  322. }
  323. if !self.logs.is_empty() {
  324. self.set_current_term(&self.logs.0.last().unwrap().term.clone())?;
  325. }
  326. if self.commit_length > sr.commit_length {
  327. self.set_commit_length(&0)?;
  328. }
  329. for i in self.commit_length..sr.commit_length {
  330. self.push_commit(&self.logs.get(i)?.msg).await?;
  331. }
  332. self.set_commit_length(&sr.commit_length)?;
  333. self.current_leader = Some(sr.leader_id.clone());
  334. Ok(())
  335. }
  336. async fn send(
  337. &self,
  338. recipient_id: Option<NodeId>,
  339. payload: &[u8],
  340. method: NetMsgMethod,
  341. msg_id: Option<u64>,
  342. ) -> Result<()> {
  343. let random_id = if msg_id.is_some() { msg_id.unwrap() } else { OsRng.next_u64() };
  344. debug!(
  345. target: "raft",
  346. "Node has id: {} {:?} send a msg id: {} recipient_id: {:?} method: {:?} ",
  347. self.id.is_some(), self.role, random_id, &recipient_id.is_some(), &method
  348. );
  349. let net_msg = NetMsg { id: random_id, recipient_id, payload: payload.to_vec(), method };
  350. self.sender.0.send(net_msg).await?;
  351. Ok(())
  352. }
  353. async fn waiting_for_sync(
  354. &mut self,
  355. receive_queues: async_channel::Receiver<NetMsg>,
  356. stop_signal: async_channel::Receiver<()>,
  357. ) -> Result<()> {
  358. loop {
  359. select! {
  360. msg = receive_queues.recv().fuse() => {
  361. let msg = msg?;
  362. if msg.method == NetMsgMethod::SyncResponse {
  363. let sr: SyncResponse = deserialize(&msg.payload)?;
  364. self.receive_sync_response(&sr).await?;
  365. break
  366. }},
  367. _ = stop_signal.recv().fuse() => break,
  368. }
  369. }
  370. Ok(())
  371. }
  372. async fn send_heartbeat(&self) -> Result<()> {
  373. if self.role == Role::Leader {
  374. let nodes = self.nodes.lock().await;
  375. let nodes_cloned = nodes.clone();
  376. drop(nodes);
  377. for node in nodes_cloned.iter() {
  378. self.update_logs(node.0).await?;
  379. }
  380. }
  381. Ok(())
  382. }
  383. async fn send_vote_request(&mut self) -> Result<()> {
  384. // this will prevent the listener node to become a candidate
  385. if self.id.is_none() {
  386. return Ok(())
  387. }
  388. let self_id = self.id.clone().unwrap();
  389. self.set_current_term(&(self.current_term + 1))?;
  390. self.role = Role::Candidate;
  391. self.set_voted_for(&Some(self_id.clone()))?;
  392. self.votes_received.push(self_id.clone());
  393. self.reset_last_term();
  394. let request = VoteRequest {
  395. node_id: self_id,
  396. current_term: self.current_term,
  397. log_length: self.logs.len(),
  398. last_term: self.last_term,
  399. };
  400. let payload = serialize(&request);
  401. self.send(None, &payload, NetMsgMethod::VoteRequest, None).await
  402. }
  403. async fn receive_vote_request(&mut self, vr: VoteRequest) -> Result<()> {
  404. if self.id.is_none() {
  405. return Ok(())
  406. }
  407. if vr.current_term > self.current_term {
  408. self.set_current_term(&vr.current_term)?;
  409. self.set_voted_for(&None)?;
  410. self.role = Role::Follower;
  411. }
  412. self.reset_last_term();
  413. // check the logs of the candidate
  414. let vote_ok = (vr.last_term > self.last_term) ||
  415. (vr.last_term == self.last_term && vr.log_length >= self.logs.len());
  416. // slef.voted_for equal to vr.node_id or is None or voted to someone else
  417. let vote = if let Some(voted_for) = self.voted_for.as_ref() {
  418. *voted_for == vr.node_id
  419. } else {
  420. true
  421. };
  422. let mut response = VoteResponse {
  423. node_id: self.id.clone().unwrap(),
  424. current_term: self.current_term,
  425. ok: false,
  426. };
  427. if vr.current_term == self.current_term && vote_ok && vote {
  428. self.set_voted_for(&Some(vr.node_id.clone()))?;
  429. response.set_ok(true);
  430. }
  431. let payload = serialize(&response);
  432. self.send(Some(vr.node_id), &payload, NetMsgMethod::VoteResponse, None).await
  433. }
  434. async fn receive_vote_response(&mut self, vr: VoteResponse) -> Result<()> {
  435. if self.role == Role::Candidate && vr.current_term == self.current_term && vr.ok {
  436. self.votes_received.push(vr.node_id);
  437. let nodes = self.nodes.lock().await;
  438. let nodes_cloned = nodes.clone();
  439. drop(nodes);
  440. if self.votes_received.len() >= ((nodes_cloned.len() + 1) / 2) {
  441. self.role = Role::Leader;
  442. self.current_leader = Some(self.id.clone().unwrap());
  443. for node in nodes_cloned.iter() {
  444. self.sent_length.insert(node.0, self.logs.len());
  445. self.acked_length.insert(node.0, 0);
  446. }
  447. }
  448. } else if vr.current_term > self.current_term {
  449. self.set_current_term(&vr.current_term)?;
  450. self.role = Role::Follower;
  451. self.set_voted_for(&None)?;
  452. }
  453. Ok(())
  454. }
  455. async fn update_logs(&self, node_id: &NodeId) -> Result<()> {
  456. let prefix_len = match self.sent_length.get(node_id) {
  457. Ok(len) => len,
  458. Err(_) => {
  459. // return if failed to index
  460. return Ok(())
  461. }
  462. };
  463. let suffix: Logs = if self.logs.slice_from(prefix_len).is_some() {
  464. self.logs.slice_from(prefix_len).unwrap()
  465. } else {
  466. return Ok(())
  467. };
  468. let mut prefix_term = 0;
  469. if prefix_len > 0 {
  470. prefix_term = self.logs.get(prefix_len - 1)?.term;
  471. }
  472. let request = LogRequest {
  473. leader_id: self.id.clone().unwrap(),
  474. current_term: self.current_term,
  475. prefix_len,
  476. prefix_term,
  477. commit_length: self.commit_length,
  478. suffix,
  479. };
  480. let payload = serialize(&request);
  481. self.send(Some(node_id.clone()), &payload, NetMsgMethod::LogRequest, None).await
  482. }
  483. async fn receive_log_request(&mut self, lr: LogRequest) -> Result<()> {
  484. if lr.current_term > self.current_term {
  485. self.set_current_term(&lr.current_term)?;
  486. self.set_voted_for(&None)?;
  487. }
  488. if lr.current_term == self.current_term {
  489. self.role = Role::Follower;
  490. self.current_leader = Some(lr.leader_id.clone());
  491. }
  492. let mut ok = (self.logs.len() >= lr.prefix_len) &&
  493. (lr.prefix_len == 0 || self.logs.get(lr.prefix_len - 1)?.term == lr.prefix_term);
  494. let mut ack = 0;
  495. if lr.current_term == self.current_term && ok {
  496. self.append_log(lr.prefix_len, lr.commit_length, &lr.suffix).await?;
  497. ack = lr.prefix_len + lr.suffix.len();
  498. } else {
  499. ok = false;
  500. }
  501. if self.id.is_none() {
  502. return Ok(())
  503. }
  504. let response = LogResponse {
  505. node_id: self.id.clone().unwrap(),
  506. current_term: self.current_term,
  507. ack,
  508. ok,
  509. };
  510. let payload = serialize(&response);
  511. self.send(Some(lr.leader_id.clone()), &payload, NetMsgMethod::LogResponse, None).await
  512. }
  513. async fn receive_log_response(&mut self, lr: LogResponse) -> Result<()> {
  514. if lr.current_term == self.current_term && self.role == Role::Leader {
  515. if lr.ok && lr.ack >= self.acked_length.get(&lr.node_id)? {
  516. self.sent_length.insert(&lr.node_id, lr.ack);
  517. self.acked_length.insert(&lr.node_id, lr.ack);
  518. self.commit_log().await?;
  519. } else if self.sent_length.get(&lr.node_id)? > 0 {
  520. self.sent_length.insert(&lr.node_id, self.sent_length.get(&lr.node_id)? - 1);
  521. }
  522. } else if lr.current_term > self.current_term {
  523. self.set_current_term(&lr.current_term)?;
  524. self.role = Role::Follower;
  525. self.set_voted_for(&None)?;
  526. }
  527. Ok(())
  528. }
  529. fn reset_last_term(&mut self) {
  530. self.last_term = 0;
  531. if let Some(log) = self.logs.0.last() {
  532. self.last_term = log.term;
  533. }
  534. }
  535. fn acks(&self, nodes: HashMap<NodeId, SocketAddr>, length: u64) -> HashMap<NodeId, SocketAddr> {
  536. nodes
  537. .into_iter()
  538. .filter(|n| {
  539. let len = self.acked_length.get(&n.0);
  540. len.is_ok() && len.unwrap() >= length
  541. })
  542. .collect()
  543. }
  544. async fn commit_log(&mut self) -> Result<()> {
  545. let nodes_ptr = self.nodes.lock().await;
  546. let min_acks = ((nodes_ptr.len() + 1) / 2) as usize;
  547. let nodes = nodes_ptr.clone();
  548. drop(nodes_ptr);
  549. let mut ready: Vec<u64> = vec![];
  550. for len in 1..(self.logs.len() + 1) {
  551. if self.acks(nodes.clone(), len).len() >= min_acks {
  552. ready.push(len);
  553. }
  554. }
  555. if ready.is_empty() {
  556. return Ok(())
  557. }
  558. let max_ready = *ready.iter().max().unwrap();
  559. if max_ready > self.commit_length && self.logs.get(max_ready - 1)?.term == self.current_term
  560. {
  561. for i in self.commit_length..max_ready {
  562. self.push_commit(&self.logs.get(i)?.msg).await?;
  563. }
  564. self.set_commit_length(&max_ready)?;
  565. }
  566. Ok(())
  567. }
  568. async fn append_log(
  569. &mut self,
  570. prefix_len: u64,
  571. leader_commit: u64,
  572. suffix: &Logs,
  573. ) -> Result<()> {
  574. if !suffix.is_empty() && self.logs.len() > prefix_len {
  575. let index = min(self.logs.len(), prefix_len + suffix.len()) - 1;
  576. if self.logs.get(index)?.term != suffix.get(index - prefix_len)?.term {
  577. self.push_logs(&self.logs.slice_to(prefix_len))?;
  578. }
  579. }
  580. if prefix_len + suffix.len() > self.logs.len() {
  581. for i in (self.logs.len() - prefix_len)..suffix.len() {
  582. self.push_log(&suffix.get(i)?)?;
  583. }
  584. }
  585. if leader_commit > self.commit_length {
  586. for i in self.commit_length..leader_commit {
  587. self.push_commit(&self.logs.get(i)?.msg).await?;
  588. }
  589. self.set_commit_length(&leader_commit)?;
  590. }
  591. Ok(())
  592. }
  593. fn set_commit_length(&mut self, i: &u64) -> Result<()> {
  594. self.commit_length = *i;
  595. self.datastore.commits_length.insert(i)
  596. }
  597. fn set_current_term(&mut self, i: &u64) -> Result<()> {
  598. self.current_term = *i;
  599. self.datastore.current_term.insert(i)
  600. }
  601. fn set_voted_for(&mut self, i: &Option<NodeId>) -> Result<()> {
  602. self.voted_for = i.clone();
  603. self.datastore.voted_for.insert(i)
  604. }
  605. async fn push_commit(&mut self, commit: &[u8]) -> Result<()> {
  606. let commit: T = deserialize(commit)?;
  607. self.broadcast_commits.0.send(commit.clone()).await?;
  608. self.datastore.commits.insert(&commit)
  609. }
  610. fn push_log(&mut self, i: &Log) -> Result<()> {
  611. self.logs.push(i);
  612. self.datastore.logs.insert(i)
  613. }
  614. fn push_logs(&mut self, i: &Logs) -> Result<()> {
  615. self.logs = i.clone();
  616. self.datastore.logs.wipe_insert_all(&i.to_vec())
  617. }
  618. }