fixes locker deadlock issue resulting from json pointer recursion being broken

This commit is contained in:
Keagan McClelland
2022-01-11 13:10:58 -07:00
committed by Aiden McClelland
parent 53cdd6e370
commit 28966308bc
4 changed files with 53 additions and 6 deletions

View File

@@ -51,3 +51,4 @@ tokio = { version = "1.0.1", features = [
"io-util",
"macros",
] }
rand = "0.8.4"

View File

@@ -270,6 +270,50 @@ mod tests {
}
}
proptest! {
#[test]
fn trie_lock_inverse_identity(lock_order in proptest::collection::vec(arb_lock_info(1, 5), 1..30)) {
use crate::locker::trie::LockTrie;
use rand::seq::SliceRandom;
let mut trie = LockTrie::default();
for i in &lock_order {
trie.try_lock(i).expect(&format!("try_lock failed: {}", i));
}
let mut release_order = lock_order.clone();
let slice: &mut [LockInfo] = &mut release_order[..];
slice.shuffle(&mut rand::thread_rng());
for i in &release_order {
trie.unlock(i);
}
prop_assert_eq!(trie, LockTrie::default())
}
}
proptest! {
#[test]
fn existence_ancestors_dont_block_descendent_writes(s0 in arb_handle_id(10), s1 in arb_handle_id(10), mut ptr0 in arb_json_ptr(3), ptr1 in arb_json_ptr(3)) {
use crate::locker::trie::LockTrie;
prop_assume!(s0 != s1);
let mut trie = LockTrie::default();
let li0 = LockInfo {
handle_id: s0,
ty: LockType::Exist,
ptr: ptr0.clone()
};
println!("{}", ptr0);
ptr0.append(&ptr1);
println!("{}", ptr0);
let li1 = LockInfo {
handle_id: s1,
ty: LockType::Write,
ptr: ptr0.clone()
};
trie.try_lock(&li0).unwrap();
println!("{:?}", trie);
trie.try_lock(&li1).expect("E locks don't prevent child locks");
}
}
proptest! {
#[test]
fn zero_or_one_write_lock_per_traversal(x in 0..10) {

View File

@@ -3,9 +3,10 @@ use std::collections::BTreeMap;
use imbl::{ordset, OrdSet};
use json_ptr::{JsonPointer, SegList};
use crate::{handle::HandleId, LockType};
use super::{natural::Natural, LockInfo};
use super::natural::Natural;
use super::LockInfo;
use crate::handle::HandleId;
use crate::LockType;
#[derive(Debug, Clone, PartialEq, Eq)]
enum LockState {
@@ -351,7 +352,7 @@ impl Default for LockState {
}
}
#[derive(Debug, Default)]
#[derive(Debug, Default, PartialEq, Eq)]
pub(super) struct LockTrie {
state: LockState,
@@ -596,9 +597,10 @@ impl LockTrie {
#[cfg(test)]
mod proptest {
use super::*;
use ::proptest::prelude::*;
use super::*;
fn lock_type_gen() -> BoxedStrategy<crate::LockType> {
prop_oneof![
Just(crate::LockType::Exist),