Skip to content

Commit 65f450d

Browse files
committed
fix(snapshots): remove unwraps and handle errors
1 parent 756766a commit 65f450d

4 files changed

Lines changed: 45 additions & 20 deletions

File tree

‎crates/defs/src/error.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub enum DbError {
1818
InvalidMagicBytes(String),
1919
VectorNotFound(uuid::Uuid),
2020
SnapshotRegistryError(String),
21-
StorageEngineError(String),
21+
SnapshotEngineError(String),
2222
InvalidDimension { expected: Dimension, got: Dimension },
2323
PointAlreadyExists { id: PointId },
2424
PointNotFound { id: PointId },

‎crates/snapshot/src/engine/mod.rs‎

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl SnapshotEngine {
3636
// acquire lock for worker_running
3737
let mut worker_running = self.worker_running.lock().map_err(|_| DbError::LockError)?;
3838
if !*worker_running {
39-
return Err(DbError::StorageEngineError(
39+
return Err(DbError::SnapshotEngineError(
4040
"Worker thread not running".to_string(),
4141
));
4242
}
@@ -50,7 +50,7 @@ impl SnapshotEngine {
5050
// acquire lock for worker_running
5151
let worker_running = self.worker_running.lock().map_err(|_| DbError::LockError)?;
5252
if !*worker_running {
53-
return Err(DbError::StorageEngineError(
53+
return Err(DbError::SnapshotEngineError(
5454
"Worker thread not running".to_string(),
5555
));
5656
}
@@ -82,7 +82,7 @@ impl SnapshotEngine {
8282
// acquire lock for worker_running
8383
let mut worker_running = self.worker_running.lock().map_err(|_| DbError::LockError)?;
8484
if *worker_running {
85-
return Err(DbError::StorageEngineError(
85+
return Err(DbError::SnapshotEngineError(
8686
"Worker thread already running".to_string(),
8787
));
8888
}
@@ -119,25 +119,48 @@ impl SnapshotEngine {
119119
) -> Result<(), DbError> {
120120
let snapshot_path = db
121121
.lock()
122-
.unwrap()
123-
.create_snapshot(registry.lock().unwrap().dir().as_path())
124-
.unwrap();
125-
let snapshot_metadata = Metadata::parse(&snapshot_path).unwrap();
122+
.map_err(|_| DbError::LockError)?
123+
.create_snapshot(
124+
registry
125+
.lock()
126+
.map_err(|_| DbError::LockError)?
127+
.dir()
128+
.as_path(),
129+
)
130+
.map_err(|err| {
131+
DbError::SnapshotEngineError(format!("Could not create snapshot : {}", err))
132+
})?;
133+
let snapshot_metadata = Metadata::parse(&snapshot_path).map_err(|err| {
134+
DbError::SnapshotEngineError(format!("Could not parse snapshot metadata: {}", err))
135+
})?;
126136

127137
// add the snapshot to registry
128138
registry
129139
.lock()
130-
.unwrap()
140+
.map_err(|_| DbError::LockError)?
131141
.add_snapshot(&snapshot_path)
132-
.unwrap();
142+
.map_err(|err| {
143+
DbError::SnapshotEngineError(format!("Could not add snapshot to registry: {}", err))
144+
})?;
133145

134146
{
135-
let mut queue = snapshot_queue.lock().unwrap();
147+
let mut queue = snapshot_queue.lock().map_err(|_| DbError::LockError)?;
136148
queue.push_back(snapshot_metadata);
137149

138150
while queue.len() > last_k {
139-
let old = queue.pop_front().unwrap();
140-
registry.lock().unwrap().mark_dead(old.small_id).unwrap();
151+
let old = queue.pop_front().ok_or_else(|| {
152+
DbError::SnapshotEngineError("Snapshot metadata queue is empty".to_string())
153+
})?;
154+
registry
155+
.lock()
156+
.map_err(|_| DbError::LockError)?
157+
.mark_dead(old.small_id)
158+
.map_err(|err| {
159+
DbError::SnapshotEngineError(format!(
160+
"Could not mark snapshot as dead in registry: {}",
161+
err
162+
))
163+
})?;
141164
}
142165
// drop queue lock
143166
}
@@ -156,10 +179,7 @@ impl SnapshotEngine {
156179
) {
157180
loop {
158181
// acquire the lock and exit if its false
159-
let worker_running = worker_running
160-
.lock()
161-
.map_err(|_| DbError::LockError)
162-
.unwrap();
182+
let worker_running = worker_running.lock().unwrap();
163183
if !*worker_running {
164184
break;
165185
}

‎crates/snapshot/src/lib.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,9 @@ impl Snapshot {
106106
"Storage checkpoint was not properly made".to_string(),
107107
))?
108108
.to_str()
109-
.unwrap()
109+
.ok_or(DbError::SnapshotError(
110+
"Storage checkpoint filename is not valid UTF-8".to_string(),
111+
))?
110112
.to_string();
111113

112114
// create manifest file

‎crates/snapshot/src/util.rs‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use data_encoding::HEXLOWER;
22
use sha2::{Digest, Sha256};
33
use std::fs::File;
4-
use std::io::{BufReader, Error, Read};
4+
use std::io::{BufReader, Error, ErrorKind, Read};
55
use std::path::PathBuf;
66

77
use defs::{DbError, Magic};
@@ -92,7 +92,10 @@ pub fn compress_archive(path: &Path, files: &[&Path]) -> Result<(), Error> {
9292
let mut tar = Builder::new(enc);
9393

9494
for file in files {
95-
let rel_path = file.file_name().unwrap();
95+
let rel_path = file.file_name().ok_or(Error::new(
96+
ErrorKind::InvalidFilename,
97+
"Could not create archive : invalid snapshot file",
98+
))?;
9699
let mut f = File::open(file)?;
97100
tar.append_file(rel_path, &mut f)?;
98101
}

0 commit comments

Comments
 (0)