Make Responder technically capable of using a writing pipeline
This commit is contained in:
parent
aaf2ea1493
commit
e6d618a29e
@ -83,6 +83,7 @@ pub fn chunking<
|
|||||||
write,
|
write,
|
||||||
get_number_of_workers("YAMA_RESPONDERS") as u16,
|
get_number_of_workers("YAMA_RESPONDERS") as u16,
|
||||||
raw_pile,
|
raw_pile,
|
||||||
|
None,
|
||||||
progress_bar,
|
progress_bar,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -9,15 +9,22 @@ use crossbeam_channel::{Receiver, Sender};
|
|||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use log::{error, info, warn};
|
use log::{error, info, warn};
|
||||||
|
|
||||||
use crate::pile::RawPile;
|
use crate::definitions::ChunkId;
|
||||||
|
use crate::pile::{Keyspace, RawPile};
|
||||||
use crate::progress::ProgressTracker;
|
use crate::progress::ProgressTracker;
|
||||||
use crate::remote::{read_message, write_message, Request, RequestBody, Response, ResponseBody};
|
use crate::remote::{read_message, write_message, Request, RequestBody, Response, ResponseBody};
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct ResponderWritingPipeline {
|
||||||
|
pipeline_submission: Sender<(ChunkId, Vec<u8>)>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
/// A wrapper for a RawPile which allows a `Requester` to access it over a pipe (e.g. TCP socket or
|
/// A wrapper for a RawPile which allows a `Requester` to access it over a pipe (e.g. TCP socket or
|
||||||
/// an SSH connection).
|
/// an SSH connection).
|
||||||
pub struct Responder {
|
pub struct Responder {
|
||||||
continuation_tokens: Arc<Mutex<HashMap<u16, Sender<u16>>>>,
|
continuation_tokens: Arc<Mutex<HashMap<u16, Sender<u16>>>>,
|
||||||
|
writing_pipeline: Option<ResponderWritingPipeline>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Responder {
|
impl Responder {
|
||||||
@ -32,6 +39,7 @@ impl Responder {
|
|||||||
write: W,
|
write: W,
|
||||||
num_workers: u16,
|
num_workers: u16,
|
||||||
pile: Arc<RP>,
|
pile: Arc<RP>,
|
||||||
|
writing_pipeline: Option<ResponderWritingPipeline>,
|
||||||
mut progress_bar: PT,
|
mut progress_bar: PT,
|
||||||
) -> (JoinHandle<R>, JoinHandle<W>, Vec<JoinHandle<()>>) {
|
) -> (JoinHandle<R>, JoinHandle<W>, Vec<JoinHandle<()>>) {
|
||||||
let mut handles = Vec::new();
|
let mut handles = Vec::new();
|
||||||
@ -39,6 +47,7 @@ impl Responder {
|
|||||||
let (resp_send, resp_recv) = crossbeam_channel::bounded::<Response>(4);
|
let (resp_send, resp_recv) = crossbeam_channel::bounded::<Response>(4);
|
||||||
let responder = Responder {
|
let responder = Responder {
|
||||||
continuation_tokens: Arc::new(Mutex::new(Default::default())),
|
continuation_tokens: Arc::new(Mutex::new(Default::default())),
|
||||||
|
writing_pipeline,
|
||||||
};
|
};
|
||||||
|
|
||||||
let r_handle = {
|
let r_handle = {
|
||||||
@ -181,20 +190,38 @@ impl Responder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
RequestBody::Write { kind, key, value } => match pile.write(kind, &key, &value) {
|
RequestBody::Write { kind, key, value } => {
|
||||||
Ok(_) => Response {
|
if let Some(writing_pipeline) = self
|
||||||
response_to: request.id,
|
.writing_pipeline
|
||||||
body: ResponseBody::Success,
|
.as_ref()
|
||||||
},
|
.filter(|_| kind == Keyspace::Chunk)
|
||||||
Err(err) => {
|
{
|
||||||
warn!("Error whilst doing a raw write: {:?}", err);
|
let mut chunk_id = ChunkId::default();
|
||||||
let err = format!("{:?}", err);
|
chunk_id.copy_from_slice(&key[..]);
|
||||||
|
writing_pipeline.pipeline_submission.send((chunk_id, value));
|
||||||
|
// We lie and say it was successful once we submit.
|
||||||
|
// We'll complain on our side if anything goes wrong, anyway.
|
||||||
Response {
|
Response {
|
||||||
response_to: request.id,
|
response_to: request.id,
|
||||||
body: ResponseBody::Failed(err),
|
body: ResponseBody::Success,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
match pile.write(kind, &key, &value) {
|
||||||
|
Ok(_) => Response {
|
||||||
|
response_to: request.id,
|
||||||
|
body: ResponseBody::Success,
|
||||||
|
},
|
||||||
|
Err(err) => {
|
||||||
|
warn!("Error whilst doing a raw write: {:?}", err);
|
||||||
|
let err = format!("{:?}", err);
|
||||||
|
Response {
|
||||||
|
response_to: request.id,
|
||||||
|
body: ResponseBody::Failed(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
RequestBody::Delete { kind, key } => match pile.delete(kind, &key) {
|
RequestBody::Delete { kind, key } => match pile.delete(kind, &key) {
|
||||||
Ok(_) => Response {
|
Ok(_) => Response {
|
||||||
response_to: request.id,
|
response_to: request.id,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user