responder with larger block size

This commit is contained in:
Anatoly Yakovenko
2018-03-24 23:46:25 -07:00
parent 533b3170a7
commit 8ad90807ee
2 changed files with 17 additions and 18 deletions

View File

@ -92,20 +92,16 @@ impl AccountantSkel {
fn process( fn process(
&mut self, &mut self,
r_reader: &streamer::Receiver, r_reader: &streamer::Receiver,
s_sender: &streamer::Sender, s_responder: &streamer::Responder,
recycler: &streamer::Recycler, packet_recycler: &streamer::PacketRecycler,
response_recycler: &streamer::ResponseRecycler,
) -> Result<()> { ) -> Result<()> {
let timer = Duration::new(1, 0); let timer = Duration::new(1, 0);
let msgs = r_reader.recv_timeout(timer)?; let msgs = r_reader.recv_timeout(timer)?;
let msgs_ = msgs.clone(); let msgs_ = msgs.clone();
let msgs__ = msgs.clone(); let msgs__ = msgs.clone();
let rsps = streamer::allocate(recycler); let rsps = streamer::allocate(response_recycler);
let rsps_ = rsps.clone(); let rsps_ = rsps.clone();
let l = msgs__.read().unwrap().packets.len();
rsps.write()
.unwrap()
.packets
.resize(l, streamer::Packet::default());
{ {
let mut num = 0; let mut num = 0;
let mut ursps = rsps.write().unwrap(); let mut ursps = rsps.write().unwrap();
@ -113,10 +109,13 @@ impl AccountantSkel {
let sz = packet.meta.size; let sz = packet.meta.size;
let req = deserialize(&packet.data[0..sz])?; let req = deserialize(&packet.data[0..sz])?;
if let Some(resp) = self.process_request(req) { if let Some(resp) = self.process_request(req) {
let rsp = &mut ursps.packets[num]; if ursps.len() <= num {
ursps.responses.resize(num * 2, streamer::Response::default());
}
let rsp = &mut ursps.responses[num];
let v = serialize(&resp)?; let v = serialize(&resp)?;
let len = v.len(); let len = v.len();
rsp.data[0..len].copy_from_slice(&v); rsp.data[..len].copy_from_slice(&v);
rsp.meta.size = len; rsp.meta.size = len;
rsp.meta.set_addr(&packet.meta.get_addr()); rsp.meta.set_addr(&packet.meta.get_addr());
num += 1; num += 1;
@ -124,7 +123,7 @@ impl AccountantSkel {
} }
ursps.packets.resize(num, streamer::Packet::default()); ursps.packets.resize(num, streamer::Packet::default());
} }
s_sender.send(rsps_)?; s_responder.send(rsps_)?;
streamer::recycle(recycler, msgs_); streamer::recycle(recycler, msgs_);
Ok(()) Ok(())
} }
@ -141,23 +140,24 @@ impl AccountantSkel {
local.set_port(0); local.set_port(0);
let write = UdpSocket::bind(local)?; let write = UdpSocket::bind(local)?;
let recycler = Arc::new(Mutex::new(Vec::new())); let packet_recycler = Arc::new(Mutex::new(Vec::new()));
let response_recycler = Arc::new(Mutex::new(Vec::new()));
let (s_reader, r_reader) = channel(); let (s_reader, r_reader) = channel();
let t_receiver = streamer::receiver(read, exit.clone(), recycler.clone(), s_reader)?; let t_receiver = streamer::receiver(read, exit.clone(), packet_recycler.clone(), s_reader)?;
let (s_sender, r_sender) = channel(); let (s_responder, r_responder) = channel();
let t_sender = streamer::sender(write, exit.clone(), recycler.clone(), r_sender); let t_responder = streamer::responder(write, exit.clone(), response_recycler.clone(), r_responder);
let t_server = spawn(move || { let t_server = spawn(move || {
if let Ok(me) = Arc::try_unwrap(obj) { if let Ok(me) = Arc::try_unwrap(obj) {
loop { loop {
let e = me.lock().unwrap().process(&r_reader, &s_sender, &recycler); let e = me.lock().unwrap().process(&r_reader, &s_responder, &packet_recycler, &response_recycler);
if e.is_err() && exit.load(Ordering::Relaxed) { if e.is_err() && exit.load(Ordering::Relaxed) {
break; break;
} }
} }
} }
}); });
Ok(vec![t_receiver, t_sender, t_server]) Ok(vec![t_receiver, t_responder, t_server])
} }
} }

View File

@ -14,7 +14,6 @@ pub mod accountant;
pub mod accountant_skel; pub mod accountant_skel;
pub mod accountant_stub; pub mod accountant_stub;
pub mod result; pub mod result;
pub mod services;
extern crate bincode; extern crate bincode;
extern crate chrono; extern crate chrono;
extern crate generic_array; extern crate generic_array;