snapshot_tests.rs 4.3 KB

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