Guard the Requester so that the Responder can't do whatever it wants
This commit is contained in:
parent
e1c6d31ee3
commit
438af9164e
|
@ -11,6 +11,7 @@ use std::sync::Arc;
|
||||||
use yama::commands::{load_pile_descriptor, open_pile};
|
use yama::commands::{load_pile_descriptor, open_pile};
|
||||||
use yama::definitions::{PartialPointerData, TreeNode};
|
use yama::definitions::{PartialPointerData, TreeNode};
|
||||||
use yama::operations::storing::{pointer_ops_prepare_to_store, pointers_ops_after_store};
|
use yama::operations::storing::{pointer_ops_prepare_to_store, pointers_ops_after_store};
|
||||||
|
use yama::pile::access_guard::PileGuard;
|
||||||
use yama::pile::{Pile, RawPile, StoragePipelineSettings};
|
use yama::pile::{Pile, RawPile, StoragePipelineSettings};
|
||||||
use yama::progress::ProgressTracker;
|
use yama::progress::ProgressTracker;
|
||||||
use yama::remote::responder::{Responder, ResponderWritingPipeline};
|
use yama::remote::responder::{Responder, ResponderWritingPipeline};
|
||||||
|
@ -94,11 +95,13 @@ pub fn chunking<
|
||||||
(None, None)
|
(None, None)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let guarded_pile = PileGuard::new(Arc::clone(&raw_pile), true);
|
||||||
|
|
||||||
let (r_handle, w_handle, join_handles) = Responder::start(
|
let (r_handle, w_handle, join_handles) = Responder::start(
|
||||||
read,
|
read,
|
||||||
write,
|
write,
|
||||||
get_number_of_workers("YAMA_RESPONDERS") as u16,
|
get_number_of_workers("YAMA_RESPONDERS") as u16,
|
||||||
raw_pile,
|
Arc::new(guarded_pile),
|
||||||
writing_pipeline,
|
writing_pipeline,
|
||||||
progress_bar,
|
progress_bar,
|
||||||
);
|
);
|
||||||
|
|
|
@ -17,8 +17,8 @@ use std::thread;
|
||||||
#[derivative(Clone(bound = ""))]
|
#[derivative(Clone(bound = ""))]
|
||||||
// we need to use derivative's Clone impl because Arc<R> causes R to have a bound on Clone
|
// we need to use derivative's Clone impl because Arc<R> causes R to have a bound on Clone
|
||||||
// even though that's not needed. https://github.com/rust-lang/rust/issues/26925
|
// even though that's not needed. https://github.com/rust-lang/rust/issues/26925
|
||||||
pub struct PileGuard<R: RawPile> {
|
pub struct PileGuard<R: Clone + RawPile> {
|
||||||
underlying: Arc<R>,
|
underlying: R,
|
||||||
/// Whether to verify chunk IDs to prevent malicious corruption
|
/// Whether to verify chunk IDs to prevent malicious corruption
|
||||||
verify_chunk_ids: bool,
|
verify_chunk_ids: bool,
|
||||||
}
|
}
|
||||||
|
@ -39,9 +39,16 @@ fn pipeline(
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<R: RawPile> PileGuard<R> {}
|
impl<R: Clone + RawPile> PileGuard<R> {
|
||||||
|
pub fn new(underlying: R, verify_chunk_ids: bool) -> Self {
|
||||||
|
PileGuard {
|
||||||
|
underlying,
|
||||||
|
verify_chunk_ids,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<R: RawPile> RawPile for PileGuard<R> {
|
impl<R: Clone + RawPile> RawPile for PileGuard<R> {
|
||||||
fn exists(&self, kind: Keyspace, key: &[u8]) -> anyhow::Result<bool> {
|
fn exists(&self, kind: Keyspace, key: &[u8]) -> anyhow::Result<bool> {
|
||||||
match kind {
|
match kind {
|
||||||
Keyspace::Chunk => self.underlying.exists(kind, key),
|
Keyspace::Chunk => self.underlying.exists(kind, key),
|
||||||
|
|
Loading…
Reference in New Issue