snapshot_tests.rs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. use std::sync::Arc;
  2. use scopeguard::defer;
  3. use kvraft::testing_utils::config::{make_config, sleep_election_timeouts};
  4. use kvraft::testing_utils::generic_test::{generic_test, GenericTestParams};
  5. use test_utils::init_test_log;
  6. #[test]
  7. fn install_snapshot_rpc() {
  8. init_test_log!();
  9. const SERVERS: usize = 3;
  10. const MAX_RAFT_STATE: usize = 1000;
  11. const KEY: &str = "a";
  12. let cfg = Arc::new(make_config(SERVERS, false, MAX_RAFT_STATE));
  13. defer!(cfg.clean_up());
  14. let mut clerk = cfg.make_clerk();
  15. cfg.begin("Test: InstallSnapshot RPC (3B)");
  16. clerk.put("a", "A");
  17. assert_eq!(clerk.get(KEY), Some("A".to_owned()));
  18. let (majority, minority) = cfg.partition();
  19. {
  20. let mut clerk = cfg.make_limited_clerk(&majority);
  21. for i in 0..50 {
  22. let i_str = i.to_string();
  23. clerk.put(&i_str, &i_str);
  24. }
  25. sleep_election_timeouts(1);
  26. clerk.put("b", "B");
  27. }
  28. cfg.check_log_size(MAX_RAFT_STATE * 2)
  29. .expect("Log does not seem to be trimmed:");
  30. // Swap majority and minority.
  31. let (mut majority, mut minority) = (minority, majority);
  32. majority.push(
  33. minority
  34. .pop()
  35. .expect("There should be at least one server in the majority."),
  36. );
  37. cfg.network_partition(&majority, &minority);
  38. {
  39. let mut clerk = cfg.make_limited_clerk(&majority);
  40. clerk.put("c", "C");
  41. clerk.put("d", "D");
  42. assert_eq!(clerk.get(KEY), Some("A".to_owned()));
  43. assert_eq!(clerk.get("b"), Some("B".to_owned()));
  44. assert_eq!(clerk.get("c"), Some("C".to_owned()));
  45. assert_eq!(clerk.get("d"), Some("D".to_owned()));
  46. assert_eq!(clerk.get("1"), Some("1".to_owned()));
  47. assert_eq!(clerk.get("49"), Some("49".to_owned()));
  48. }
  49. cfg.connect_all();
  50. clerk.put("e", "E");
  51. assert_eq!(clerk.get("c"), Some("C".to_owned()));
  52. assert_eq!(clerk.get("e"), Some("E".to_owned()));
  53. assert_eq!(clerk.get("1"), Some("1".to_owned()));
  54. assert_eq!(clerk.get("49"), Some("49".to_owned()));
  55. cfg.end();
  56. }
  57. #[test]
  58. fn snapshot_size() {
  59. init_test_log!();
  60. const SERVERS: usize = 3;
  61. const MAX_RAFT_STATE: usize = 1000;
  62. const MAX_SNAPSHOT_STATE: usize = 500;
  63. let cfg = Arc::new(make_config(SERVERS, false, MAX_RAFT_STATE));
  64. defer!(cfg.clean_up());
  65. let mut clerk = cfg.make_clerk();
  66. cfg.begin("Test: snapshot size is reasonable (3B)");
  67. for _ in 0..200 {
  68. clerk.put("x", "0");
  69. assert_eq!(clerk.get("x"), Some("0".to_owned()));
  70. clerk.put("x", "1");
  71. assert_eq!(clerk.get("x"), Some("1".to_owned()));
  72. }
  73. cfg.check_log_size(MAX_RAFT_STATE * 2)
  74. .expect("Log does not seem to be trimmed:");
  75. cfg.check_snapshot_size(MAX_SNAPSHOT_STATE)
  76. .expect("Snapshot size is too big:");
  77. cfg.end();
  78. }
  79. #[test]
  80. fn snapshot_recover_test() {
  81. init_test_log!();
  82. generic_test(GenericTestParams {
  83. clients: 1,
  84. crash: true,
  85. maxraftstate: Some(1000),
  86. ..Default::default()
  87. })
  88. }
  89. #[test]
  90. fn snapshot_recover_many_clients() {
  91. init_test_log!();
  92. generic_test(GenericTestParams {
  93. clients: 20,
  94. crash: true,
  95. maxraftstate: Some(1000),
  96. min_ops: Some(0),
  97. ..Default::default()
  98. })
  99. }
  100. #[test]
  101. fn snapshot_unreliable_test() {
  102. init_test_log!();
  103. generic_test(GenericTestParams {
  104. clients: 5,
  105. unreliable: true,
  106. maxraftstate: Some(1000),
  107. ..Default::default()
  108. })
  109. }
  110. #[test]
  111. fn snapshot_unreliable_recover_test() {
  112. init_test_log!();
  113. generic_test(GenericTestParams {
  114. clients: 5,
  115. unreliable: true,
  116. crash: true,
  117. maxraftstate: Some(1000),
  118. ..Default::default()
  119. })
  120. }
  121. #[test]
  122. fn snapshot_unreliable_recover_partition() {
  123. init_test_log!();
  124. generic_test(GenericTestParams {
  125. clients: 5,
  126. unreliable: true,
  127. crash: true,
  128. partition: true,
  129. maxraftstate: Some(1000),
  130. min_ops: Some(0),
  131. ..Default::default()
  132. })
  133. }
  134. #[test]
  135. fn linearizability() {
  136. init_test_log!();
  137. generic_test(GenericTestParams {
  138. clients: 15,
  139. unreliable: true,
  140. partition: true,
  141. crash: true,
  142. maxraftstate: Some(1000),
  143. min_ops: Some(0),
  144. test_linearizability: true,
  145. });
  146. }