1use crate::drop_event::DropEvent;
9use crate::log::*;
10use crate::lsm_tree::merge::{self, MergeFn};
11use crate::lsm_tree::types::{
12 BoxedLayerIterator, Existence, Item, ItemRef, Key, Layer, LayerIterator, LayerIteratorMut,
13 LayerValue, OrdLowerBound, OrdUpperBound,
14};
15use crate::serialized_types::{LATEST_VERSION, Version};
16use anyhow::{Error, bail};
17use async_trait::async_trait;
18use fuchsia_sync::{Mutex, MutexGuard};
19use futures::future::BoxFuture;
20use std::cmp::{Ordering, min};
21use std::collections::BTreeMap;
22use std::ops::Bound;
23use std::ptr::NonNull;
24use std::sync::Arc;
25use std::sync::atomic::{self, AtomicPtr, AtomicU32};
26
27struct PointerList<K, V>(Box<[AtomicPtr<SkipListNode<K, V>>]>);
31
32impl<K, V> PointerList<K, V> {
33 fn new(count: usize) -> PointerList<K, V> {
34 PointerList((0..count).map(|_| AtomicPtr::new(std::ptr::null_mut())).collect())
35 }
36
37 fn len(&self) -> usize {
38 self.0.len()
39 }
40
41 fn get(&self, index: usize) -> Option<NonNull<SkipListNode<K, V>>> {
43 NonNull::new(self.0[index].load(atomic::Ordering::SeqCst))
44 }
45
46 fn set(&self, index: usize, node: Option<NonNull<SkipListNode<K, V>>>) {
48 self.0[index]
49 .store(node.map_or(std::ptr::null_mut(), |n| n.as_ptr()), atomic::Ordering::SeqCst);
50 }
51}
52
53struct SkipListNode<K, V> {
54 item: Item<K, V>,
55 pointers: PointerList<K, V>,
56}
57
58pub struct SkipListLayer<K, V> {
59 pointers: PointerList<K, V>,
61
62 inner: Mutex<Inner<K, V>>,
63
64 write_lock: Mutex<()>,
66
67 allocated: AtomicU32,
69
70 close_event: Mutex<Option<Arc<DropEvent>>>,
71}
72
73struct Inner<K, V> {
79 epoch: u64,
83
84 current_count: u64,
86
87 erase_lists: BTreeMap<u64, EpochEraseList<K, V>>,
89
90 item_count: usize,
92}
93
94struct EpochEraseList<K, V> {
99 count: u64,
102 start: NonNull<SkipListNode<K, V>>,
105 end: Option<NonNull<SkipListNode<K, V>>>,
106}
107
108unsafe impl<K, V> Send for Inner<K, V> {}
110
111impl<K, V> Inner<K, V> {
112 fn new() -> Self {
113 Inner { epoch: 0, current_count: 0, erase_lists: BTreeMap::new(), item_count: 0 }
114 }
115 fn free_erase_list(
116 &mut self,
117 owner: &SkipListLayer<K, V>,
118 start: NonNull<SkipListNode<K, V>>,
119 end: Option<NonNull<SkipListNode<K, V>>>,
120 ) {
121 let mut node = start;
122 loop {
123 let next = unsafe { owner.free_node(node) };
125 if next == end {
126 break;
127 }
128 node = next.unwrap();
129 }
130 }
131}
132
133impl<K, V> SkipListLayer<K, V> {
134 pub fn new(max_item_count: usize) -> Arc<SkipListLayer<K, V>> {
135 Arc::new(SkipListLayer {
136 pointers: PointerList::new((usize::BITS - max_item_count.leading_zeros()) as usize),
137 inner: Mutex::new(Inner::new()),
138 write_lock: Mutex::new(()),
139 allocated: AtomicU32::new(0),
140 close_event: Mutex::new(Some(Arc::new(DropEvent::new()))),
141 })
142 }
143
144 pub fn len(&self) -> usize {
145 self.inner.lock().item_count
146 }
147
148 fn alloc_node(&self, item: Item<K, V>, pointer_count: usize) -> Box<SkipListNode<K, V>> {
149 self.allocated.fetch_add(1, atomic::Ordering::Relaxed);
150 Box::new(SkipListNode { item, pointers: PointerList::new(pointer_count) })
151 }
152
153 unsafe fn free_node(
159 &self,
160 node: NonNull<SkipListNode<K, V>>,
161 ) -> Option<NonNull<SkipListNode<K, V>>> {
162 self.allocated.fetch_sub(1, atomic::Ordering::Relaxed);
163 unsafe { Box::from_raw(node.as_ptr()).pointers.get(0) }
164 }
165}
166
167impl<K: Eq + Key + OrdLowerBound, V: LayerValue> SkipListLayer<K, V> {
168 pub fn erase(&self, key: &K)
170 where
171 K: std::cmp::Eq,
172 {
173 let mut iter = SkipListLayerIterMut::new(self, Bound::Included(key));
174 if let Some(ItemRef { key: k, .. }) = iter.get() {
175 if k == key {
176 iter.erase();
177 } else {
178 warn!("Attempt to erase key not present!");
179 }
180 }
181 iter.commit();
182 }
183
184 pub fn insert(&self, item: Item<K, V>) -> Result<(), Error> {
186 let mut iter = SkipListLayerIterMut::new(self, Bound::Included(&item.key));
187 if let Some(found_item) = iter.get() {
188 if found_item.key == &item.key {
189 bail!("Attempted to insert an existing key");
190 }
191 }
192 iter.insert(item);
193 Ok(())
194 }
195
196 pub fn replace_or_insert(&self, item: Item<K, V>) {
198 let mut iter = SkipListLayerIterMut::new(self, Bound::Included(&item.key));
199 if let Some(found_item) = iter.get() {
200 if found_item.key == &item.key {
201 iter.erase();
202 }
203 }
204 iter.insert(item);
205 }
206
207 pub fn merge_into(&self, item: Item<K, V>, lower_bound: &K, merge_fn: MergeFn<K, V>) {
209 merge::merge_into(
210 Box::new(SkipListLayerIterMut::new(self, Bound::Included(lower_bound))),
211 item,
212 merge_fn,
213 )
214 .unwrap();
215 }
216}
217
218impl<K: OrdUpperBound, V> SkipListLayer<K, V> {
219 pub fn seek<'a>(&'a self, bound: Bound<&K>) -> SkipListLayerIter<'a, K, V> {
225 SkipListLayerIter::new(self, bound)
226 }
227}
228
229impl<K, V> Drop for SkipListLayer<K, V> {
231 fn drop(&mut self) {
232 let mut next = self.pointers.get(0);
233 while let Some(node) = next {
234 next = unsafe { self.free_node(node) };
236 }
237 assert_eq!(self.allocated.load(atomic::Ordering::Relaxed), 0);
238 }
239}
240
241#[async_trait]
242impl<K: Key, V: LayerValue> Layer<K, V> for SkipListLayer<K, V> {
243 async fn seek<'a>(
244 &'a self,
245 bound: std::ops::Bound<&K>,
246 ) -> Result<BoxedLayerIterator<'a, K, V>, Error> {
247 Ok(Box::new(SkipListLayer::seek(self, bound)))
248 }
249
250 fn lock(&self) -> Option<Arc<DropEvent>> {
251 self.close_event.lock().clone()
252 }
253
254 fn len(&self) -> usize {
255 self.inner.lock().item_count
256 }
257
258 async fn close(&self) {
259 let listener = self.close_event.lock().take().expect("close already called").listen();
260 listener.await;
261 }
262
263 fn get_version(&self) -> Version {
264 return LATEST_VERSION;
267 }
268
269 fn record_inspect_data(self: Arc<Self>, node: &fuchsia_inspect::Node) {
270 node.record_bool("persistent", false);
271 node.record_uint("num_items", self.inner.lock().item_count as u64);
272 }
273
274 async fn key_exists(&self, key: &K) -> Result<Existence, Error> {
275 let iter = SkipListLayer::seek(self, Bound::Included(key));
276 Ok(iter.get().map_or(Existence::Missing, |i| {
277 if i.key.cmp_upper_bound(key).is_eq() { Existence::Exists } else { Existence::Missing }
278 }))
279 }
280}
281
282pub struct SkipListLayerIter<'a, K, V> {
285 skip_list: &'a SkipListLayer<K, V>,
286
287 epoch: u64,
289
290 node: Option<NonNull<SkipListNode<K, V>>>,
292}
293
294unsafe impl<K, V> Send for SkipListLayerIter<'_, K, V> {}
296unsafe impl<K, V> Sync for SkipListLayerIter<'_, K, V> {}
297
298impl<'a, K: OrdUpperBound, V> SkipListLayerIter<'a, K, V> {
299 fn new(skip_list: &'a SkipListLayer<K, V>, bound: Bound<&K>) -> Self {
300 let epoch = {
301 let mut inner = skip_list.inner.lock();
302 inner.current_count += 1;
303 inner.epoch
304 };
305 let (included, key) = match bound {
306 Bound::Unbounded => {
307 return SkipListLayerIter { skip_list, epoch, node: skip_list.pointers.get(0) };
308 }
309 Bound::Included(key) => (true, key),
310 Bound::Excluded(key) => (false, key),
311 };
312 let mut last_pointers = &skip_list.pointers;
313
314 let mut node = None;
318 for index in (0..skip_list.pointers.len()).rev() {
319 loop {
321 node = last_pointers.get(index);
322 if let Some(node) = node {
323 let node = unsafe { node.as_ref() };
325 match &node.item.key.cmp_upper_bound(key) {
326 Ordering::Equal if included => break,
327 Ordering::Greater => break,
328 _ => {}
329 }
330 last_pointers = &node.pointers;
331 } else {
332 break;
333 }
334 }
335 }
336 SkipListLayerIter { skip_list, epoch, node }
337 }
338}
339
340impl<K, V> Drop for SkipListLayerIter<'_, K, V> {
341 fn drop(&mut self) {
342 let mut inner = self.skip_list.inner.lock();
343 if self.epoch == inner.epoch {
344 inner.current_count -= 1;
345 } else {
346 if let Some(erase_list) = inner.erase_lists.get_mut(&self.epoch) {
347 erase_list.count -= 1;
348 if erase_list.count == 0 {
349 while let Some(entry) = inner.erase_lists.first_entry() {
350 if entry.get().count == 0 {
351 let EpochEraseList { start, end, .. } = entry.remove_entry().1;
352 inner.free_erase_list(self.skip_list, start, end);
353 } else {
354 break;
355 }
356 }
357 }
358 }
359 }
360 }
361}
362
363impl<K: Key, V: LayerValue> LayerIterator<K, V> for SkipListLayerIter<'_, K, V> {
364 async fn advance(&mut self) -> Result<(), Error> {
365 let _ = self.advance_dyn()?;
366 Ok(())
367 }
368
369 fn advance_dyn<'a>(&'a mut self) -> Result<Option<BoxFuture<'a, Result<(), Error>>>, Error> {
370 match self.node {
371 None => {}
372 Some(node) => {
373 self.node = {
374 unsafe { node.as_ref() }.pointers.get(0)
376 }
377 }
378 }
379 Ok(None)
380 }
381
382 fn get(&self) -> Option<ItemRef<'_, K, V>> {
383 self.node.map(|node| unsafe { node.as_ref() }.item.as_item_ref())
385 }
386}
387
388type PointerListRefArray<'a, K, V> = Box<[&'a PointerList<K, V>]>;
389
390pub struct SkipListLayerIterMut<'a, K: Key, V: LayerValue> {
398 skip_list: &'a SkipListLayer<K, V>,
399
400 prev_pointers: PointerListRefArray<'a, K, V>,
404
405 insertion_point: Option<PointerListRefArray<'a, K, V>>,
408
409 insertion_nodes: PointerList<K, V>,
411
412 #[allow(dead_code)]
415 write_guard: MutexGuard<'a, ()>,
416
417 item_delta: isize,
419}
420
421impl<'a, K: Key, V: LayerValue> SkipListLayerIterMut<'a, K, V> {
422 pub fn new(skip_list: &'a SkipListLayer<K, V>, bound: std::ops::Bound<&K>) -> Self {
423 let write_guard = skip_list.write_lock.lock();
424 let len = skip_list.pointers.len();
425
426 let mut prev_pointers = vec![&skip_list.pointers; len].into_boxed_slice();
442 match bound {
443 Bound::Unbounded => {}
444 Bound::Included(key) => {
445 let pointers = &mut prev_pointers;
446 for index in (0..len).rev() {
447 while let Some(node) = pointers[index].get(index) {
448 let node = unsafe { node.as_ref() };
454
455 match node.item.key.cmp_upper_bound(key) {
456 Ordering::Equal | Ordering::Greater => break,
457 Ordering::Less => {}
458 }
459 pointers[index] = &node.pointers;
460 }
461 if index > 0 {
462 pointers[index - 1] = pointers[index];
463 }
464 }
465 }
466 Bound::Excluded(_) => panic!("Excluded bounds not supported"),
467 }
468 SkipListLayerIterMut {
469 skip_list,
470 prev_pointers,
471 insertion_point: None,
472 insertion_nodes: PointerList::new(len),
473 write_guard,
474 item_delta: 0,
475 }
476 }
477}
478
479impl<K: Key, V: LayerValue> Drop for SkipListLayerIterMut<'_, K, V> {
480 fn drop(&mut self) {
481 self.commit();
482 }
483}
484
485impl<K: Key, V: LayerValue> LayerIteratorMut<K, V> for SkipListLayerIterMut<'_, K, V> {
486 fn advance(&mut self) {
487 if self.insertion_point.is_some() {
488 if let Some(item) = self.get() {
489 let copy = item.cloned();
491 self.insert(copy);
492 self.erase();
493 }
494 } else {
495 let pointers = &mut self.prev_pointers;
496 if let Some(next) = pointers[0].get(0) {
497 let next = unsafe { next.as_ref() };
500 for i in 0..next.pointers.len() {
501 pointers[i] = &next.pointers;
502 }
503 }
504 }
505 }
506
507 fn get(&self) -> Option<ItemRef<'_, K, V>> {
508 self.prev_pointers[0].get(0).map(|node| unsafe { node.as_ref() }.item.as_item_ref())
511 }
512
513 fn insert(&mut self, item: Item<K, V>) {
514 use rand::RngExt as _;
515 let mut rng = rand::rng();
516 let max_pointers = self.skip_list.pointers.len();
517 let pointer_count = min(1 + rng.random::<u32>().trailing_zeros() as usize, max_pointers);
520 let node = Box::leak(self.skip_list.alloc_node(item, pointer_count));
521 if self.insertion_point.is_none() {
522 self.insertion_point = Some(self.prev_pointers.clone());
523 }
524 let node_ptr = node.into();
525 for i in 0..pointer_count {
526 let pointers = self.prev_pointers[i];
527 node.pointers.set(i, pointers.get(i));
528 if self.insertion_nodes.get(i).is_none() {
529 self.insertion_nodes.set(i, Some(node_ptr));
532 } else {
533 pointers.set(i, Some(node_ptr));
536 }
537 self.prev_pointers[i] = &node.pointers;
539 }
540 self.item_delta += 1;
541 }
542
543 fn erase(&mut self) {
544 let pointers = &mut self.prev_pointers;
545 if let Some(next) = pointers[0].get(0) {
546 let next = unsafe { next.as_ref() };
549 if self.insertion_point.is_none() {
550 self.insertion_point = Some(pointers.clone());
551 }
552 if self.insertion_nodes.get(0).is_none() {
553 pointers[0] = &next.pointers;
556 } else {
557 pointers[0].set(0, next.pointers.get(0));
562 }
563 for i in 1..next.pointers.len() {
566 pointers[i].set(i, next.pointers.get(i));
567 }
568 }
569 self.item_delta -= 1;
570 }
571
572 fn commit(&mut self) {
575 let prev_pointers = match self.insertion_point.take() {
577 Some(prev_pointers) => prev_pointers,
578 None => return,
579 };
580
581 let maybe_erase = prev_pointers[0].get(0);
583
584 if self.insertion_nodes.get(0).is_none() {
586 prev_pointers[0].set(0, self.prev_pointers[0].get(0));
590 } else {
591 for i in 0..self.insertion_nodes.len() {
595 if let Some(node) = self.insertion_nodes.get(i) {
596 prev_pointers[i].set(i, Some(node));
597 }
598 }
599 }
600
601 let mut inner = self.skip_list.inner.lock();
603 inner.item_count = inner.item_count.checked_add_signed(self.item_delta).unwrap();
604 if let Some(start) = maybe_erase {
605 let end = self.prev_pointers[0].get(0);
606 if maybe_erase != end {
607 if inner.current_count > 0 || !inner.erase_lists.is_empty() {
608 let count = std::mem::take(&mut inner.current_count);
609 let epoch = inner.epoch;
610 inner.erase_lists.insert(epoch, EpochEraseList { count, start, end });
611 inner.epoch = inner.epoch.wrapping_add(1);
612 } else {
613 inner.free_erase_list(self.skip_list, start, end);
614 }
615 }
616 }
617 }
618}
619
620#[cfg(test)]
621mod tests {
622 use super::{SkipListLayer, SkipListLayerIterMut};
623 use crate::lsm_tree::merge::ItemOp::{Discard, Replace};
624 use crate::lsm_tree::merge::{MergeLayerIterator, MergeResult};
625 use crate::lsm_tree::skip_list_layer::SkipListLayerIter;
626 use crate::lsm_tree::types::{
627 DefaultOrdLowerBound, DefaultOrdUpperBound, Existence, FuzzyHash, Item, ItemRef, Layer,
628 LayerIterator, LayerIteratorMut, SortByU64,
629 };
630 use crate::serialized_types::{
631 LATEST_VERSION, Version, Versioned, VersionedLatest, versioned_type,
632 };
633 use assert_matches::assert_matches;
634 use fprint::TypeFingerprint;
635 use fuchsia_async as fasync;
636 use futures::future::join_all;
637 use futures::{FutureExt as _, join};
638 use fxfs_macros::{FuzzyHash, SerializeKey};
639 use std::hash::Hash;
640 use std::ops::Bound;
641 use std::time::{Duration, Instant};
642
643 #[derive(
644 Clone,
645 Eq,
646 Debug,
647 Hash,
648 FuzzyHash,
649 PartialEq,
650 PartialOrd,
651 Ord,
652 serde::Serialize,
653 serde::Deserialize,
654 TypeFingerprint,
655 Versioned,
656 SerializeKey,
657 )]
658 struct TestKey(u64);
659
660 versioned_type! { 1.. => TestKey }
661
662 impl SortByU64 for TestKey {
663 fn get_leading_u64(&self) -> u64 {
664 self.0
665 }
666 }
667
668 impl DefaultOrdLowerBound for TestKey {}
669 impl DefaultOrdUpperBound for TestKey {}
670
671 #[fuchsia::test]
672 async fn test_key_exists() {
673 let skip_list = SkipListLayer::new(100);
674 skip_list.insert(Item::new(TestKey(1), 1)).expect("insert error");
675 skip_list.insert(Item::new(TestKey(3), 3)).expect("insert error");
676
677 assert_eq!(
678 skip_list.key_exists(&TestKey(0)).await.expect("key_exists failed"),
679 Existence::Missing
680 );
681 assert_eq!(
682 skip_list.key_exists(&TestKey(1)).await.expect("key_exists failed"),
683 Existence::Exists
684 );
685 assert_eq!(
686 skip_list.key_exists(&TestKey(2)).await.expect("key_exists failed"),
687 Existence::Missing
688 );
689 assert_eq!(
690 skip_list.key_exists(&TestKey(3)).await.expect("key_exists failed"),
691 Existence::Exists
692 );
693 assert_eq!(
694 skip_list.key_exists(&TestKey(4)).await.expect("key_exists failed"),
695 Existence::Missing
696 );
697 }
698
699 #[fuchsia::test]
700 async fn test_iteration() {
701 let skip_list = SkipListLayer::new(100);
703 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2)];
704 skip_list.insert(items[1].clone()).expect("insert error");
705 skip_list.insert(items[0].clone()).expect("insert error");
706 let mut iter = skip_list.seek(Bound::Unbounded);
707 let ItemRef { key, value, .. } = iter.get().expect("missing item");
708 assert_eq!((key, value), (&items[0].key, &items[0].value));
709 iter.advance().await.unwrap();
710 let ItemRef { key, value, .. } = iter.get().expect("missing item");
711 assert_eq!((key, value), (&items[1].key, &items[1].value));
712 iter.advance().await.unwrap();
713 assert!(iter.get().is_none());
714 }
715
716 #[fuchsia::test]
717 async fn test_seek_exact() {
718 let skip_list = SkipListLayer::new(100);
720 for i in (0..100).rev() {
721 skip_list.insert(Item::new(TestKey(i), i)).expect("insert error");
722 }
723 let mut iter = skip_list.seek(Bound::Included(&TestKey(57)));
724 let ItemRef { key, value, .. } = iter.get().expect("missing item");
725 assert_eq!((key, value), (&TestKey(57), &57));
726
727 iter.advance().await.unwrap();
729 let ItemRef { key, value, .. } = iter.get().expect("missing item");
730 assert_eq!((key, value), (&TestKey(58), &58));
731 }
732
733 #[fuchsia::test]
734 async fn test_seek_lower_bound() {
735 let skip_list = SkipListLayer::new(100);
737 for i in (0..100).rev() {
738 skip_list.insert(Item::new(TestKey(i * 3), i * 3)).expect("insert error");
739 }
740 let mut expected_index = 57 * 3;
741 let mut iter = skip_list.seek(Bound::Included(&TestKey(expected_index - 1)));
742 let ItemRef { key, value, .. } = iter.get().expect("missing item");
743 assert_eq!((key, value), (&TestKey(expected_index), &expected_index));
744
745 expected_index += 3;
747 iter.advance().await.unwrap();
748 let ItemRef { key, value, .. } = iter.get().expect("missing item");
749 assert_eq!((key, value), (&TestKey(expected_index), &expected_index));
750 }
751
752 #[fuchsia::test]
753 async fn test_replace_or_insert_replaces() {
754 let skip_list = SkipListLayer::new(100);
755 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2)];
756 skip_list.insert(items[1].clone()).expect("insert error");
757 skip_list.insert(items[0].clone()).expect("insert error");
758 let replacement_value = 3;
759 skip_list.replace_or_insert(Item::new(items[1].key.clone(), replacement_value));
760
761 let mut iter = skip_list.seek(Bound::Unbounded);
762 let ItemRef { key, value, .. } = iter.get().expect("missing item");
763 assert_eq!((key, value), (&items[0].key, &items[0].value));
764 iter.advance().await.unwrap();
765 let ItemRef { key, value, .. } = iter.get().expect("missing item");
766 assert_eq!((key, value), (&items[1].key, &replacement_value));
767 iter.advance().await.unwrap();
768 assert!(iter.get().is_none());
769 }
770
771 #[fuchsia::test]
772 async fn test_replace_or_insert_inserts() {
773 let skip_list = SkipListLayer::new(100);
774 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2), Item::new(TestKey(3), 3)];
775 skip_list.insert(items[2].clone()).expect("insert error");
776 skip_list.insert(items[0].clone()).expect("insert error");
777 skip_list.replace_or_insert(items[1].clone());
778
779 let mut iter = skip_list.seek(Bound::Unbounded);
780 let ItemRef { key, value, .. } = iter.get().expect("missing item");
781 assert_eq!((key, value), (&items[0].key, &items[0].value));
782 iter.advance().await.unwrap();
783 let ItemRef { key, value, .. } = iter.get().expect("missing item");
784 assert_eq!((key, value), (&items[1].key, &items[1].value));
785 iter.advance().await.unwrap();
786 let ItemRef { key, value, .. } = iter.get().expect("missing item");
787 assert_eq!((key, value), (&items[2].key, &items[2].value));
788 iter.advance().await.unwrap();
789 assert!(iter.get().is_none());
790 }
791
792 #[fuchsia::test]
793 async fn test_erase() {
794 let skip_list = SkipListLayer::new(100);
795 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2)];
796 skip_list.insert(items[1].clone()).expect("insert error");
797 skip_list.insert(items[0].clone()).expect("insert error");
798
799 assert_eq!(skip_list.len(), 2);
800
801 skip_list.erase(&items[1].key);
802
803 assert_eq!(skip_list.len(), 1);
804
805 {
806 let mut iter = skip_list.seek(Bound::Unbounded);
807 let ItemRef { key, value, .. } = iter.get().expect("missing item");
808 assert_eq!((key, value), (&items[0].key, &items[0].value));
809 iter.advance().await.unwrap();
810 assert!(iter.get().is_none());
811 }
812
813 skip_list.erase(&items[0].key);
814
815 assert_eq!(skip_list.len(), 0);
816
817 {
818 let iter = skip_list.seek(Bound::Unbounded);
819 assert!(iter.get().is_none());
820 }
821 }
822
823 #[fuchsia::test]
826 #[ignore]
827 async fn test_seek_is_log_n_complexity() {
828 let mut n = 100;
831 let mut loops = 0;
832 const TARGET_TIME: Duration = Duration::from_millis(500);
833 let time = loop {
834 let skip_list = SkipListLayer::new(n as usize);
835 for i in 0..n {
836 skip_list.insert(Item::new(TestKey(i), i)).expect("insert error");
837 }
838 let start = Instant::now();
839 for i in 0..n {
840 skip_list.seek(Bound::Included(&TestKey(i)));
841 }
842 let elapsed = Instant::now() - start;
843 if elapsed > TARGET_TIME {
844 break elapsed;
845 }
846 n *= 2;
847 loops += 1;
848 };
849
850 let seek_count = n;
851 n >>= loops / 2; let skip_list = SkipListLayer::new(n as usize);
853 for i in 0..n {
854 skip_list.insert(Item::new(TestKey(i), i)).expect("insert error");
855 }
856 let start = Instant::now();
857 for i in 0..seek_count {
858 skip_list.seek(Bound::Included(&TestKey(i)));
859 }
860 let elapsed = Instant::now() - start;
861
862 eprintln!(
863 "{} items: {}ms, {} items: {}ms",
864 seek_count,
865 time.as_millis(),
866 n,
867 elapsed.as_millis()
868 );
869
870 assert!(elapsed * 4 > time);
874 }
875
876 #[fuchsia::test]
877 async fn test_large_number_of_items() {
878 let item_count = 1000;
879 let skip_list = SkipListLayer::new(1000);
880 for i in 1..item_count {
881 skip_list.insert(Item::new(TestKey(i), 1)).expect("insert error");
882 }
883 let mut iter = skip_list.seek(Bound::Included(&TestKey(item_count - 10)));
884 for i in item_count - 10..item_count {
885 assert_eq!(iter.get().expect("missing item").key, &TestKey(i));
886 iter.advance().await.unwrap();
887 }
888 assert!(iter.get().is_none());
889 }
890
891 #[fuchsia::test]
892 async fn test_multiple_readers_allowed() {
893 let skip_list = SkipListLayer::new(100);
894 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2)];
895 skip_list.insert(items[1].clone()).expect("insert error");
896 skip_list.insert(items[0].clone()).expect("insert error");
897
898 let mut iter = skip_list.seek(Bound::Unbounded);
900 let ItemRef { key, value, .. } = iter.get().expect("missing item");
901 assert_eq!((key, value), (&items[0].key, &items[0].value));
902
903 let iter2 = skip_list.seek(Bound::Unbounded);
905 let ItemRef { key, value, .. } = iter2.get().expect("missing item");
906 assert_eq!((key, value), (&items[0].key, &items[0].value));
907
908 iter.advance().await.unwrap();
910 let ItemRef { key, value, .. } = iter.get().expect("missing item");
911 assert_eq!((key, value), (&items[1].key, &items[1].value));
912 }
913
914 fn merge(
915 left: &'_ MergeLayerIterator<'_, TestKey, i32>,
916 right: &'_ MergeLayerIterator<'_, TestKey, i32>,
917 ) -> MergeResult<TestKey, i32> {
918 MergeResult::Other {
919 emit: None,
920 left: Replace(Item::new((*left.key()).clone(), *left.value() + *right.value()).boxed()),
921 right: Discard,
922 }
923 }
924
925 #[fuchsia::test]
926 async fn test_merge_into() {
927 let skip_list = SkipListLayer::new(100);
928 skip_list.insert(Item::new(TestKey(1), 1)).expect("insert error");
929
930 skip_list.merge_into(Item::new(TestKey(2), 2), &TestKey(1), merge);
931
932 let mut iter = skip_list.seek(Bound::Unbounded);
933 let ItemRef { key, value, .. } = iter.get().expect("missing item");
934 assert_eq!((key, value), (&TestKey(1), &3));
935 iter.advance().await.unwrap();
936 assert!(iter.get().is_none());
937 }
938
939 #[fuchsia::test]
940 async fn test_two_inserts() {
941 let skip_list = SkipListLayer::new(100);
942 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2)];
943 {
944 let mut iter = SkipListLayerIterMut::new(&skip_list, std::ops::Bound::Unbounded);
945 iter.insert(items[0].clone());
946 iter.insert(items[1].clone());
947 }
948
949 let mut iter = skip_list.seek(Bound::Unbounded);
950 let ItemRef { key, value, .. } = iter.get().expect("missing item");
951 assert_eq!((key, value), (&items[0].key, &items[0].value));
952 iter.advance().await.unwrap();
953 let ItemRef { key, value, .. } = iter.get().expect("missing item");
954 assert_eq!((key, value), (&items[1].key, &items[1].value));
955 }
956
957 #[fuchsia::test]
958 async fn test_erase_after_insert() {
959 let skip_list = SkipListLayer::new(100);
960 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2)];
961 skip_list.insert(items[1].clone()).expect("insert error");
962 {
963 let mut iter = SkipListLayerIterMut::new(&skip_list, std::ops::Bound::Unbounded);
964 iter.insert(items[0].clone());
965 iter.erase();
966 }
967
968 let mut iter = skip_list.seek(Bound::Unbounded);
969 let ItemRef { key, value, .. } = iter.get().expect("missing item");
970 assert_eq!((key, value), (&items[0].key, &items[0].value));
971 iter.advance().await.unwrap();
972 assert!(iter.get().is_none());
973 }
974
975 #[fuchsia::test]
976 async fn test_insert_after_erase() {
977 let skip_list = SkipListLayer::new(100);
978 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2)];
979 skip_list.insert(items[1].clone()).expect("insert error");
980 {
981 let mut iter = SkipListLayerIterMut::new(&skip_list, std::ops::Bound::Unbounded);
982 iter.erase();
983 iter.insert(items[0].clone());
984 }
985
986 let mut iter = skip_list.seek(Bound::Unbounded);
987 let ItemRef { key, value, .. } = iter.get().expect("missing item");
988 assert_eq!((key, value), (&items[0].key, &items[0].value));
989 iter.advance().await.unwrap();
990 assert!(iter.get().is_none());
991 }
992
993 #[fuchsia::test]
994 async fn test_insert_erase_insert() {
995 let skip_list = SkipListLayer::new(100);
996 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2), Item::new(TestKey(3), 3)];
997 skip_list.insert(items[0].clone()).expect("insert error");
998 {
999 let mut iter = SkipListLayerIterMut::new(&skip_list, std::ops::Bound::Unbounded);
1000 iter.insert(items[1].clone());
1001 iter.erase();
1002 iter.insert(items[2].clone());
1003 }
1004
1005 let mut iter = skip_list.seek(Bound::Unbounded);
1006 let ItemRef { key, value, .. } = iter.get().expect("missing item");
1007 assert_eq!((key, value), (&items[1].key, &items[1].value));
1008 iter.advance().await.unwrap();
1009 let ItemRef { key, value, .. } = iter.get().expect("missing item");
1010 assert_eq!((key, value), (&items[2].key, &items[2].value));
1011 }
1012
1013 #[fuchsia::test]
1014 async fn test_two_erase_erases() {
1015 let skip_list = SkipListLayer::new(100);
1016 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2), Item::new(TestKey(3), 3)];
1017 skip_list.insert(items[0].clone()).expect("insert error");
1018 skip_list.insert(items[1].clone()).expect("insert error");
1019 skip_list.insert(items[2].clone()).expect("insert error");
1020 {
1021 let mut iter = SkipListLayerIterMut::new(&skip_list, std::ops::Bound::Unbounded);
1022 iter.erase();
1023 iter.erase();
1024 }
1025
1026 let mut iter = skip_list.seek(Bound::Unbounded);
1027 let ItemRef { key, value, .. } = iter.get().expect("missing item");
1028 assert_eq!((key, value), (&items[2].key, &items[2].value));
1029 iter.advance().await.unwrap();
1030 assert!(iter.get().is_none());
1031 }
1032
1033 #[fuchsia::test]
1034 async fn test_readers_not_blocked_by_writers() {
1035 let skip_list = SkipListLayer::new(100);
1036 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2)];
1037 skip_list.insert(items[1].clone()).expect("insert error");
1038
1039 let mut iter = skip_list.seek(Bound::Unbounded);
1040 let ItemRef { key, value, .. } = iter.get().expect("missing item");
1041 assert_eq!((key, value), (&items[1].key, &items[1].value));
1042
1043 let mut iter2 = skip_list.seek(Bound::Unbounded);
1044 let ItemRef { key, value, .. } = iter2.get().expect("missing item");
1045 assert_eq!((key, value), (&items[1].key, &items[1].value));
1046
1047 join!(async { skip_list.insert(items[0].clone()).expect("insert error") }, async {
1048 loop {
1049 let iter = skip_list.seek(Bound::Unbounded);
1050 let ItemRef { key, .. } = iter.get().expect("missing item");
1051 if key == &items[0].key {
1052 break;
1053 }
1054 }
1055 iter.advance().await.unwrap();
1056 assert!(iter.get().is_none());
1057 std::mem::drop(iter);
1058 iter2.advance().await.unwrap();
1059 assert!(iter2.get().is_none());
1060 std::mem::drop(iter2);
1061 });
1062 }
1063
1064 #[fuchsia::test(threads = 20)]
1065 async fn test_many_readers_and_writers() {
1066 let skip_list = SkipListLayer::new(100);
1067 join_all(
1068 (0..10)
1069 .map(|i| {
1070 let skip_list_clone = skip_list.clone();
1071 fasync::Task::spawn(async move {
1072 for j in 0..10 {
1073 skip_list_clone
1074 .insert(Item::new(TestKey(i * 100 + j), i))
1075 .expect("insert error");
1076 }
1077 })
1078 })
1079 .chain((0..10).map(|_| {
1080 let skip_list_clone = skip_list.clone();
1081 fasync::Task::spawn(async move {
1082 for _ in 0..300 {
1083 let mut iter = skip_list_clone.seek(Bound::Unbounded);
1084 let mut last_item: Option<TestKey> = None;
1085 while let Some(item) = iter.get() {
1086 if let Some(last) = last_item {
1087 assert!(item.key > &last);
1088 }
1089 last_item = Some(item.key.clone());
1090 iter.advance().await.expect("advance failed");
1091 }
1092 }
1093 })
1094 })),
1095 )
1096 .await;
1097 }
1098
1099 #[fuchsia::test]
1100 async fn test_insert_advance_erase() {
1101 let skip_list = SkipListLayer::new(100);
1102 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2), Item::new(TestKey(3), 3)];
1103 skip_list.insert(items[1].clone()).expect("insert error");
1104 skip_list.insert(items[2].clone()).expect("insert error");
1105
1106 assert_eq!(skip_list.len(), 2);
1107
1108 {
1109 let mut iter = SkipListLayerIterMut::new(&skip_list, std::ops::Bound::Unbounded);
1110 iter.insert(items[0].clone());
1111 iter.advance();
1112 iter.erase();
1113 }
1114
1115 assert_eq!(skip_list.len(), 2);
1116
1117 let mut iter = skip_list.seek(Bound::Unbounded);
1118 let ItemRef { key, value, .. } = iter.get().expect("missing item");
1119 assert_eq!((key, value), (&items[0].key, &items[0].value));
1120 iter.advance().await.unwrap();
1121 let ItemRef { key, value, .. } = iter.get().expect("missing item");
1122 assert_eq!((key, value), (&items[1].key, &items[1].value));
1123 iter.advance().await.unwrap();
1124 assert!(iter.get().is_none());
1125 }
1126
1127 #[fuchsia::test]
1128 async fn test_seek_excluded() {
1129 let skip_list = SkipListLayer::new(100);
1130 let items = [Item::new(TestKey(1), 1), Item::new(TestKey(2), 2)];
1131 skip_list.insert(items[0].clone()).expect("insert error");
1132 skip_list.insert(items[1].clone()).expect("insert error");
1133 let iter = skip_list.seek(Bound::Excluded(&items[0].key));
1134 let ItemRef { key, value, .. } = iter.get().expect("missing item");
1135 assert_eq!((key, value), (&items[1].key, &items[1].value));
1136 }
1137
1138 #[fuchsia::test]
1139 fn test_insert_race() {
1140 for _ in 0..1000 {
1141 let skip_list = SkipListLayer::new(100);
1142 skip_list.insert(Item::new(TestKey(2), 2)).expect("insert error");
1143
1144 let skip_list_clone = skip_list.clone();
1145 let thread1 = std::thread::spawn(move || {
1146 skip_list_clone.insert(Item::new(TestKey(1), 1)).expect("insert error")
1147 });
1148 let thread2 = std::thread::spawn(move || {
1149 let iter = SkipListLayerIter::new(&skip_list, Bound::Included(&TestKey(2)));
1150 match iter.get() {
1151 Some(ItemRef { key: TestKey(2), .. }) => {}
1152 result => assert!(false, "{:?}", result),
1153 }
1154 });
1155 thread1.join().unwrap();
1156 thread2.join().unwrap();
1157 }
1158 }
1159
1160 #[fuchsia::test]
1161 fn test_replace_or_insert_multi_thread() {
1162 let skip_list = SkipListLayer::new(100);
1163 skip_list.insert(Item::new(TestKey(1), 1)).expect("insert error");
1164 skip_list.insert(Item::new(TestKey(2), 2)).expect("insert error");
1165 skip_list.insert(Item::new(TestKey(3), 3)).expect("insert error");
1166 skip_list.insert(Item::new(TestKey(4), 4)).expect("insert error");
1167
1168 let mut threads = Vec::new();
1170 for i in 0..200 {
1171 let skip_list_clone = skip_list.clone();
1172 threads.push(std::thread::spawn(move || {
1173 skip_list_clone.replace_or_insert(Item::new(TestKey(3), i));
1174 }));
1175 }
1176
1177 let _checker_thread = std::thread::spawn(move || {
1179 loop {
1180 let mut iter = SkipListLayerIter::new(&skip_list, Bound::Included(&TestKey(2)));
1181 assert_matches!(iter.get(), Some(ItemRef { key: TestKey(2), .. }));
1182 iter.advance().now_or_never().unwrap().unwrap();
1183 assert_matches!(iter.get(), Some(ItemRef { key: TestKey(3), .. }));
1184 iter.advance().now_or_never().unwrap().unwrap();
1185 assert_matches!(iter.get(), Some(ItemRef { key: TestKey(4), .. }));
1186 }
1187 });
1188
1189 for thread in threads {
1190 thread.join().unwrap();
1191 }
1192 }
1193}