snapshot_tests.rs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. extern crate kvraft;
  2. #[macro_use]
  3. extern crate scopeguard;
  4. use kvraft::testing_utils::config::{make_config, sleep_election_timeouts};
  5. use std::sync::Arc;
  6. #[test]
  7. fn install_snapshot_rpc() {
  8. const SERVERS: usize = 3;
  9. const MAX_RAFT_STATE: usize = 1000;
  10. const KEY: &str = "a";
  11. let cfg = Arc::new(make_config(SERVERS, false, MAX_RAFT_STATE));
  12. defer!(cfg.clean_up());
  13. let mut clerk = cfg.make_clerk();
  14. cfg.begin("Test: InstallSnapshot RPC (3B)");
  15. clerk.put("a", "A");
  16. assert_eq!(clerk.get(KEY), Some("A".to_owned()));
  17. let (majority, minority) = cfg.partition();
  18. {
  19. let mut clerk = cfg.make_limited_clerk(&majority);
  20. for i in 0..50 {
  21. let i_str = i.to_string();
  22. clerk.put(&i_str, &i_str);
  23. }
  24. sleep_election_timeouts(1);
  25. clerk.put("b", "B");
  26. }
  27. cfg.check_log_size(MAX_RAFT_STATE * 2)
  28. .expect("Log does not seem to be trimmed:");
  29. // Swap majority and minority.
  30. let (mut majority, mut minority) = (minority, majority);
  31. majority.push(
  32. minority
  33. .pop()
  34. .expect("There should be at least one server in the majority."),
  35. );
  36. cfg.network_partition(&majority, &minority);
  37. {
  38. let mut clerk = cfg.make_limited_clerk(&majority);
  39. clerk.put("c", "C");
  40. clerk.put("d", "D");
  41. assert_eq!(clerk.get(KEY), Some("A".to_owned()));
  42. assert_eq!(clerk.get("b"), Some("B".to_owned()));
  43. assert_eq!(clerk.get("c"), Some("C".to_owned()));
  44. assert_eq!(clerk.get("d"), Some("D".to_owned()));
  45. assert_eq!(clerk.get("1"), Some("1".to_owned()));
  46. assert_eq!(clerk.get("49"), Some("49".to_owned()));
  47. }
  48. cfg.connect_all();
  49. clerk.put("e", "E");
  50. assert_eq!(clerk.get("c"), Some("C".to_owned()));
  51. assert_eq!(clerk.get("e"), Some("E".to_owned()));
  52. assert_eq!(clerk.get("1"), Some("1".to_owned()));
  53. assert_eq!(clerk.get("49"), Some("49".to_owned()));
  54. cfg.end();
  55. }
  56. #[test]
  57. fn snapshot_size() {
  58. const SERVERS: usize = 3;
  59. const MAX_RAFT_STATE: usize = 1000;
  60. const MAX_SNAPSHOT_STATE: usize = 500;
  61. let cfg = Arc::new(make_config(SERVERS, false, MAX_RAFT_STATE));
  62. defer!(cfg.clean_up());
  63. let mut clerk = cfg.make_clerk();
  64. cfg.begin("Test: snapshot size is reasonable (3B)");
  65. for _ in 0..200 {
  66. clerk.put("x", "0");
  67. assert_eq!(clerk.get("x"), Some("0".to_owned()));
  68. clerk.put("x", "1");
  69. assert_eq!(clerk.get("x"), Some("1".to_owned()));
  70. }
  71. cfg.check_log_size(MAX_RAFT_STATE * 2)
  72. .expect("Log does not seem to be trimmed:");
  73. cfg.check_snapshot_size(MAX_SNAPSHOT_STATE)
  74. .expect("Snapshot size is too big:");
  75. cfg.end();
  76. }