Skip to content

Commit

Permalink
storage: don't return errors from MVCC scans
Browse files Browse the repository at this point in the history
  • Loading branch information
erikgrinaker committed Jun 18, 2024
1 parent d4063a6 commit 5a1756a
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 9 deletions.
6 changes: 3 additions & 3 deletions src/sql/engine/local.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ impl<E: storage::Engine> super::Transaction for Transaction<E> {
let table = self.must_get_table(table)?;
Ok(Box::new(
self.txn
.scan_prefix(&KeyPrefix::Row((&table.name).into()).encode())?
.scan_prefix(&KeyPrefix::Row((&table.name).into()).encode())
.iter()
.map(|r| r.and_then(|(_, v)| Row::decode(&v)))
.filter_map(move |r| match r {
Expand Down Expand Up @@ -235,7 +235,7 @@ impl<E: storage::Engine> super::Transaction for Transaction<E> {
self.txn
.scan_prefix(
&KeyPrefix::Index((&table.name).into(), (&column.name).into()).encode(),
)?
)
.iter()
.map(|r| -> Result<(Value, HashSet<Value>)> {
let (k, v) = r?;
Expand Down Expand Up @@ -314,7 +314,7 @@ impl<E: storage::Engine> Catalog for Transaction<E> {

fn list_tables(&self) -> Result<Vec<Table>> {
self.txn
.scan_prefix(&KeyPrefix::Table.encode())?
.scan_prefix(&KeyPrefix::Table.encode())
.iter()
.map(|r| r.and_then(|(_, v)| Table::decode(&v)))
.collect()
Expand Down
14 changes: 8 additions & 6 deletions src/storage/mvcc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ impl<E: Engine> Transaction<E> {

/// Returns an iterator over the latest visible key/value pairs at the
/// transaction's version.
pub fn scan<R: RangeBounds<Vec<u8>>>(&self, range: R) -> Result<Scan<E>> {
pub fn scan<R: RangeBounds<Vec<u8>>>(&self, range: R) -> Scan<E> {
let start = match range.start_bound() {
Bound::Excluded(k) => Bound::Excluded(Key::Version(k.into(), u64::MAX).encode()),
Bound::Included(k) => Bound::Included(Key::Version(k.into(), 0).encode()),
Expand All @@ -576,17 +576,19 @@ impl<E: Engine> Transaction<E> {
Bound::Included(k) => Bound::Included(Key::Version(k.into(), u64::MAX).encode()),
Bound::Unbounded => Bound::Excluded(KeyPrefix::Unversioned.encode()),
};
Ok(Scan::new(self.engine.lock()?, self.state(), start, end))
let engine = self.engine.lock().expect("mutex failed");
Scan::new(engine, self.state(), start, end)
}

/// Scans keys under a given prefix.
pub fn scan_prefix(&self, prefix: &[u8]) -> Result<Scan<E>> {
pub fn scan_prefix(&self, prefix: &[u8]) -> Scan<E> {
// Normally, KeyPrefix::Version will only match all versions of the
// exact given key. We want all keys maching the prefix, so we chop off
// the KeyCode byte slice terminator 0x0000 at the end.
let mut prefix = KeyPrefix::Version(prefix.into()).encode();
prefix.truncate(prefix.len() - 2);
Ok(Scan::new_prefix(self.engine.lock()?, self.state(), prefix))
let engine = self.engine.lock().expect("mutex error");
Scan::new_prefix(engine, self.state(), prefix)
}
}

Expand Down Expand Up @@ -960,7 +962,7 @@ pub mod tests {
)?;
args.reject_rest()?;

let mut scan = txn.scan(range)?;
let mut scan = txn.scan(range);
let kvs: Vec<_> = match reverse {
false => scan.iter().collect::<crate::error::Result<_>>()?,
true => scan.iter().rev().collect::<crate::error::Result<_>>()?,
Expand All @@ -979,7 +981,7 @@ pub mod tests {
let reverse = args.lookup_parse("reverse")?.unwrap_or(false);
args.reject_rest()?;

let mut scan = txn.scan_prefix(&prefix)?;
let mut scan = txn.scan_prefix(&prefix);
let kvs: Vec<_> = match reverse {
false => scan.iter().collect::<crate::error::Result<_>>()?,
true => scan.iter().rev().collect::<crate::error::Result<_>>()?,
Expand Down

0 comments on commit 5a1756a

Please sign in to comment.