Skip to content

Commit 6b2b366

Browse files
committed
Check hashes during repair
1 parent 4c3080a commit 6b2b366

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

downstairs/src/extent.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,22 @@ pub fn extent_dir<P: AsRef<Path>>(dir: P, number: ExtentId) -> PathBuf {
251251
* anchored under "dir".
252252
*/
253253
pub fn extent_path<P: AsRef<Path>>(dir: P, number: ExtentId) -> PathBuf {
254-
extent_dir(dir, number).join(extent_file_name(number, ExtentType::Data))
254+
let e = extent_file_name(number, ExtentType::Data);
255+
256+
// XXX terrible hack: if someone has already provided a full directory tree
257+
// ending in `.copy`, then just append the extent file name. This lets us
258+
// open individual extent files during live-repair.
259+
if dir
260+
.as_ref()
261+
.iter()
262+
.next_back()
263+
.and_then(|s| s.to_str())
264+
.is_some_and(|s| s.ends_with(".copy"))
265+
{
266+
dir.as_ref().join(e)
267+
} else {
268+
extent_dir(dir, number).join(e)
269+
}
255270
}
256271

257272
/**

downstairs/src/region.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,28 @@ impl Region {
682682
);
683683
}
684684

685+
// Validate the extent that we just received, before copying it over
686+
{
687+
let new_extent = match Extent::open(
688+
&copy_dir,
689+
&self.def(),
690+
eid,
691+
true, // read-only
692+
&self.log.clone(),
693+
) {
694+
Ok(e) => e,
695+
Err(e) => {
696+
panic!(
697+
"Failed to open live-repair extent {eid} in \
698+
{copy_dir:?}: {e:?}"
699+
);
700+
}
701+
};
702+
if let Err(e) = new_extent.validate() {
703+
panic!("Failed to validate live-repair extent {eid}: {e:?}");
704+
}
705+
}
706+
685707
// After we have all files: move the repair dir.
686708
info!(
687709
self.log,

0 commit comments

Comments
 (0)