snapshot_tests.rs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. use std::sync::Arc;
  2. use scopeguard::defer;
  3. use test_configs::kvraft::config::make_config;
  4. use test_configs::kvraft::generic_test::{generic_test, GenericTestParams};
  5. use test_configs::utils::sleep_election_timeouts;
  6. use test_utils::init_test_log;
  7. #[test]
  8. fn install_snapshot_rpc() {
  9. init_test_log!();
  10. const SERVERS: usize = 3;
  11. const MAX_RAFT_STATE: usize = 1000;
  12. const KEY: &str = "a";
  13. let cfg = Arc::new(make_config(SERVERS, false, MAX_RAFT_STATE));
  14. defer!(cfg.clean_up());
  15. let mut clerk = cfg.make_clerk();
  16. cfg.begin("Test: InstallSnapshot RPC (3B)");
  17. clerk.put("a", "A");
  18. assert_eq!(clerk.get(KEY), Some("A".to_owned()));
  19. let (majority, minority) = cfg.partition();
  20. {
  21. let mut clerk = cfg.make_limited_clerk(&majority);
  22. for i in 0..50 {
  23. let i_str = i.to_string();
  24. clerk.put(&i_str, &i_str);
  25. }
  26. sleep_election_timeouts(1);
  27. clerk.put("b", "B");
  28. }
  29. cfg.check_log_size(MAX_RAFT_STATE * 2)
  30. .expect("Log does not seem to be trimmed:");
  31. // Swap majority and minority.
  32. let (mut majority, mut minority) = (minority, majority);
  33. majority.push(
  34. minority
  35. .pop()
  36. .expect("There should be at least one server in the majority."),
  37. );
  38. cfg.network_partition(&majority, &minority);
  39. {
  40. let mut clerk = cfg.make_limited_clerk(&majority);
  41. clerk.put("c", "C");
  42. clerk.put("d", "D");
  43. assert_eq!(clerk.get(KEY), Some("A".to_owned()));
  44. assert_eq!(clerk.get("b"), Some("B".to_owned()));
  45. assert_eq!(clerk.get("c"), Some("C".to_owned()));
  46. assert_eq!(clerk.get("d"), Some("D".to_owned()));
  47. assert_eq!(clerk.get("1"), Some("1".to_owned()));
  48. assert_eq!(clerk.get("49"), Some("49".to_owned()));
  49. }
  50. cfg.connect_all();
  51. clerk.put("e", "E");
  52. assert_eq!(clerk.get("c"), Some("C".to_owned()));
  53. assert_eq!(clerk.get("e"), Some("E".to_owned()));
  54. assert_eq!(clerk.get("1"), Some("1".to_owned()));
  55. assert_eq!(clerk.get("49"), Some("49".to_owned()));
  56. cfg.end();
  57. }
  58. #[test]
  59. fn snapshot_size() {
  60. init_test_log!();
  61. const SERVERS: usize = 3;
  62. const MAX_RAFT_STATE: usize = 1000;
  63. const MAX_SNAPSHOT_STATE: usize = 500;
  64. let cfg = Arc::new(make_config(SERVERS, false, MAX_RAFT_STATE));
  65. defer!(cfg.clean_up());
  66. let mut clerk = cfg.make_clerk();
  67. cfg.begin("Test: snapshot size is reasonable (3B)");
  68. for _ in 0..200 {
  69. clerk.put("x", "0");
  70. assert_eq!(clerk.get("x"), Some("0".to_owned()));
  71. clerk.put("x", "1");
  72. assert_eq!(clerk.get("x"), Some("1".to_owned()));
  73. }
  74. cfg.check_log_size(MAX_RAFT_STATE * 2)
  75. .expect("Log does not seem to be trimmed:");
  76. cfg.check_snapshot_size(MAX_SNAPSHOT_STATE)
  77. .expect("Snapshot size is too big:");
  78. cfg.end();
  79. }
  80. #[test]
  81. fn snapshot_recover_test() {
  82. init_test_log!();
  83. generic_test(GenericTestParams {
  84. clients: 1,
  85. crash: true,
  86. maxraftstate: Some(1000),
  87. ..Default::default()
  88. })
  89. }
  90. #[test]
  91. fn snapshot_recover_many_clients() {
  92. init_test_log!();
  93. generic_test(GenericTestParams {
  94. clients: 20,
  95. crash: true,
  96. maxraftstate: Some(1000),
  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. }
  147. #[ignore = "Large test with too many threads"]
  148. #[test]
  149. fn snapshot_throughput() {
  150. init_test_log!();
  151. generic_test(GenericTestParams {
  152. // To boost client count to 48 we need more network threads in labrpc.
  153. clients: 32,
  154. crash: true,
  155. maxraftstate: Some(10000),
  156. ..Default::default()
  157. })
  158. }