snapshot_tests.rs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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. #[test]
  8. fn install_snapshot_rpc() {
  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. const SERVERS: usize = 3;
  60. const MAX_RAFT_STATE: usize = 1000;
  61. const MAX_SNAPSHOT_STATE: usize = 500;
  62. let cfg = Arc::new(make_config(SERVERS, false, MAX_RAFT_STATE));
  63. defer!(cfg.clean_up());
  64. let mut clerk = cfg.make_clerk();
  65. cfg.begin("Test: snapshot size is reasonable (3B)");
  66. for _ in 0..200 {
  67. clerk.put("x", "0");
  68. assert_eq!(clerk.get("x"), Some("0".to_owned()));
  69. clerk.put("x", "1");
  70. assert_eq!(clerk.get("x"), Some("1".to_owned()));
  71. }
  72. cfg.check_log_size(MAX_RAFT_STATE * 2)
  73. .expect("Log does not seem to be trimmed:");
  74. cfg.check_snapshot_size(MAX_SNAPSHOT_STATE)
  75. .expect("Snapshot size is too big:");
  76. cfg.end();
  77. }
  78. #[test]
  79. fn snapshot_recover_test() {
  80. generic_test(GenericTestParams {
  81. clients: 1,
  82. crash: true,
  83. maxraftstate: Some(1000),
  84. ..Default::default()
  85. })
  86. }
  87. #[test]
  88. fn snapshot_recover_many_clients() {
  89. generic_test(GenericTestParams {
  90. clients: 20,
  91. crash: true,
  92. maxraftstate: Some(1000),
  93. min_ops: Some(0),
  94. ..Default::default()
  95. })
  96. }
  97. #[test]
  98. fn snapshot_unreliable_test() {
  99. generic_test(GenericTestParams {
  100. clients: 5,
  101. unreliable: true,
  102. maxraftstate: Some(1000),
  103. ..Default::default()
  104. })
  105. }
  106. #[test]
  107. fn snapshot_unreliable_recover_test() {
  108. generic_test(GenericTestParams {
  109. clients: 5,
  110. unreliable: true,
  111. crash: true,
  112. maxraftstate: Some(1000),
  113. ..Default::default()
  114. })
  115. }
  116. #[test]
  117. fn snapshot_unreliable_recover_partition() {
  118. generic_test(GenericTestParams {
  119. clients: 5,
  120. unreliable: true,
  121. crash: true,
  122. partition: true,
  123. maxraftstate: Some(1000),
  124. min_ops: Some(0),
  125. ..Default::default()
  126. })
  127. }
  128. #[test]
  129. fn linearizability() {
  130. generic_test(GenericTestParams {
  131. clients: 15,
  132. unreliable: true,
  133. partition: true,
  134. crash: true,
  135. maxraftstate: Some(1000),
  136. min_ops: Some(0),
  137. test_linearizability: true,
  138. });
  139. }