Skip to content

Commit 1b571bb

Browse files
committed
add check to shared references to nodes before deletion
1 parent c55e387 commit 1b571bb

File tree

3 files changed

+14
-9
lines changed

3 files changed

+14
-9
lines changed

cmd.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ redis-cli hnsw.search test1 5 ${data}
1717
for i in {1..100}
1818
do
1919
redis-cli hnsw.node.del test1 node${i-1}
20-
sleep 0.001
20+
sleep 0.1
2121
done
2222

2323
redis-cli hnsw.del test1

src/hnsw/hnsw_tests.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@ fn hnsw_test() {
1515
assert_eq!(index.max_layer, 0);
1616
assert_eq!(index.enterpoint, None);
1717

18-
let mock_fn = |_s: String, _n: Node<f32>| {
19-
let ten_millis = time::Duration::from_millis(10);
20-
thread::sleep(ten_millis);
21-
};
18+
let mock_fn = |_s: String, _n: Node<f32>| {};
2219

2320
// add node
2421
for i in 0..100 {
@@ -27,8 +24,8 @@ fn hnsw_test() {
2724
index.add_node(&name, &data, mock_fn).unwrap();
2825
}
2926
// sleep for a brief period to make sure all threads are done
30-
let hundred_millis = time::Duration::from_millis(100);
31-
thread::sleep(hundred_millis);
27+
let ten_millis = time::Duration::from_millis(10);
28+
thread::sleep(ten_millis);
3229
for i in 0..100 {
3330
let node_name = format!("node{}", i);
3431
let node = index.nodes.get(&node_name).unwrap();
@@ -70,8 +67,8 @@ fn hnsw_test() {
7067
}
7168
}
7269
// sleep for a brief period to make sure all threads are done
73-
let hundred_millis = time::Duration::from_millis(10);
74-
thread::sleep(hundred_millis);
70+
let ten_millis = time::Duration::from_millis(10);
71+
thread::sleep(ten_millis);
7572
let sc = Arc::strong_count(&node.0);
7673
if sc > 1 {
7774
println!("Delete {:?}", node);

src/lib.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,14 @@ fn delete_node(ctx: &Context, args: Vec<String>) -> RedisResult {
293293
let node_name = format!("{}.{}.{}", PREFIX, &args[1], &args[2]);
294294

295295
// TODO return error if node has more than 1 strong_count
296+
let node = index.nodes.get(&node_name).unwrap();
297+
if Arc::strong_count(&node.0) > 1 {
298+
return Err(format!(
299+
"{} is being accessed, unable to delete. Try again later",
300+
&node_name
301+
)
302+
.into());
303+
}
296304
match index.delete_node(&node_name, update_node) {
297305
Err(e) => return Err(e.error_string().into()),
298306
_ => (),

0 commit comments

Comments
 (0)