mirror of
https://github.com/Start9Labs/patch-db.git
synced 2026-03-30 03:51:56 +00:00
fixes locker deadlock issue resulting from json pointer recursion being broken
This commit is contained in:
committed by
Aiden McClelland
parent
53cdd6e370
commit
28966308bc
2
json-ptr
2
json-ptr
Submodule json-ptr updated: 5e973c8ee7...dc91a6fbd0
@@ -51,3 +51,4 @@ tokio = { version = "1.0.1", features = [
|
|||||||
"io-util",
|
"io-util",
|
||||||
"macros",
|
"macros",
|
||||||
] }
|
] }
|
||||||
|
rand = "0.8.4"
|
||||||
|
|||||||
@@ -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! {
|
proptest! {
|
||||||
#[test]
|
#[test]
|
||||||
fn zero_or_one_write_lock_per_traversal(x in 0..10) {
|
fn zero_or_one_write_lock_per_traversal(x in 0..10) {
|
||||||
|
|||||||
@@ -3,9 +3,10 @@ use std::collections::BTreeMap;
|
|||||||
use imbl::{ordset, OrdSet};
|
use imbl::{ordset, OrdSet};
|
||||||
use json_ptr::{JsonPointer, SegList};
|
use json_ptr::{JsonPointer, SegList};
|
||||||
|
|
||||||
use crate::{handle::HandleId, LockType};
|
use super::natural::Natural;
|
||||||
|
use super::LockInfo;
|
||||||
use super::{natural::Natural, LockInfo};
|
use crate::handle::HandleId;
|
||||||
|
use crate::LockType;
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
enum LockState {
|
enum LockState {
|
||||||
@@ -351,7 +352,7 @@ impl Default for LockState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default, PartialEq, Eq)]
|
||||||
|
|
||||||
pub(super) struct LockTrie {
|
pub(super) struct LockTrie {
|
||||||
state: LockState,
|
state: LockState,
|
||||||
@@ -596,9 +597,10 @@ impl LockTrie {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod proptest {
|
mod proptest {
|
||||||
use super::*;
|
|
||||||
use ::proptest::prelude::*;
|
use ::proptest::prelude::*;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
fn lock_type_gen() -> BoxedStrategy<crate::LockType> {
|
fn lock_type_gen() -> BoxedStrategy<crate::LockType> {
|
||||||
prop_oneof![
|
prop_oneof![
|
||||||
Just(crate::LockType::Exist),
|
Just(crate::LockType::Exist),
|
||||||
|
|||||||
Reference in New Issue
Block a user