Files
herodb/specs/backgroundinfo/sled.md
2025-08-23 04:57:47 +02:00

4.0 KiB

======================== CODE SNIPPETS

TITLE: Basic Database Operations with sled in Rust DESCRIPTION: This snippet demonstrates fundamental operations using the sled embedded database in Rust. It covers opening a database tree, inserting and retrieving key-value pairs, performing range queries, deleting entries, and executing an atomic compare-and-swap operation. It also shows how to flush changes to disk for durability.

SOURCE: https://github.com/spacejam/sled/blob/main/README.md#_snippet_0

LANGUAGE: Rust CODE:

let tree = sled::open("/tmp/welcome-to-sled")?;

// insert and get, similar to std's BTreeMap
let old_value = tree.insert("key", "value")?;

assert_eq!(
  tree.get(&"key")?,
  Some(sled::IVec::from("value")),
);

// range queries
for kv_result in tree.range("key_1".."key_9") {}

// deletion
let old_value = tree.remove(&"key")?;

// atomic compare and swap
tree.compare_and_swap(
  "key",
  Some("current_value"),
  Some("new_value"),
)?;

// block until all operations are stable on disk
// (flush_async also available to get a Future)
tree.flush()?;

TITLE: Subscribing to sled Events Asynchronously (Rust) DESCRIPTION: This snippet demonstrates how to asynchronously subscribe to events on key prefixes in a sled database. It initializes a sled database, creates a Subscriber for all key prefixes, inserts a key-value pair to trigger an event, and then uses extreme::run to await and process incoming events. The Subscriber struct implements Future<Output=Option<Event>>, allowing it to be awaited in an async context.

SOURCE: https://github.com/spacejam/sled/blob/main/README.md#_snippet_1

LANGUAGE: Rust CODE:

let sled = sled::open("my_db").unwrap();

let mut sub = sled.watch_prefix("");

sled.insert(b"a", b"a").unwrap();

extreme::run(async move {
    while let Some(event) = (&mut sub).await {
        println!("got event {:?}", event);
    }
});

TITLE: Iterating Subscriber Events with Async/Await in Rust DESCRIPTION: This snippet demonstrates how to asynchronously iterate over events from a Subscriber instance in Rust. Since Subscriber now implements Future, it can be awaited in a loop to process incoming events, enabling efficient prefix watching. The loop continues as long as new events are available.

SOURCE: https://github.com/spacejam/sled/blob/main/CHANGELOG.md#_snippet_0

LANGUAGE: Rust CODE:

while let Some(event) = (&mut subscriber).await {}

TITLE: Suppressing TSAN Race on Arc::drop in Rust DESCRIPTION: This suppression addresses a false positive race detection by ThreadSanitizer in Rust's Arc::drop implementation. TSAN fails to correctly reason about the raw atomic Acquire fence used after the strong-count atomic subtraction with a Release fence in the Drop implementation, leading to an erroneous race report.

SOURCE: https://github.com/spacejam/sled/blob/main/tsan_suppressions.txt#_snippet_0

LANGUAGE: TSAN Suppression CODE:

race:Arc*drop

TITLE: Suppressing TSAN Race on std:🧵:local in Rust DESCRIPTION: This suppression addresses ThreadSanitizer false positives when using Rust's std::thread::local. Similar to lazy_static, std::thread::local utilizes implicit barriers that TSAN fails to recognize, leading to incorrect race condition reports.

SOURCE: https://github.com/spacejam/sled/blob/main/tsan_suppressions.txt#_snippet_2

LANGUAGE: TSAN Suppression CODE:

race:std::thread::local

TITLE: Suppressing TSAN Race on lazy_static in Rust DESCRIPTION: This suppression targets ThreadSanitizer false positives related to the lazy_static crate in Rust. lazy_static relies on implicit memory barriers that TSAN does not correctly detect, causing it to report races where none exist.

SOURCE: https://github.com/spacejam/sled/blob/main/tsan_suppressions.txt#_snippet_1

LANGUAGE: TSAN Suppression CODE:

race:lazy_static