Don't block the server

This commit is contained in:
Greg Fitzgerald
2018-03-05 11:11:00 -07:00
parent 79fb9c00aa
commit d76ecbc9c9
3 changed files with 29 additions and 13 deletions

View File

@ -1,6 +1,7 @@
use std::io; use std::io;
use accountant::Accountant; use accountant::Accountant;
use event::{Event, PublicKey, Signature}; use event::{Event, PublicKey, Signature};
use log::{Entry, Sha256Hash};
use std::net::UdpSocket; use std::net::UdpSocket;
use bincode::{deserialize, serialize}; use bincode::{deserialize, serialize};
@ -19,8 +20,8 @@ pub enum Request {
GetBalance { GetBalance {
key: PublicKey, key: PublicKey,
}, },
Wait { GetEntries {
sig: Signature, last_id: Option<Sha256Hash>,
}, },
} }
@ -28,6 +29,7 @@ pub enum Request {
pub enum Response { pub enum Response {
Balance { key: PublicKey, val: u64 }, Balance { key: PublicKey, val: u64 },
Confirmed { sig: Signature }, Confirmed { sig: Signature },
Entries { entries: Vec<Entry<u64>> },
} }
impl AccountantSkel { impl AccountantSkel {
@ -53,7 +55,7 @@ impl AccountantSkel {
let val = self.obj.get_balance(&key).unwrap(); let val = self.obj.get_balance(&key).unwrap();
Some(Response::Balance { key, val }) Some(Response::Balance { key, val })
} }
Request::Wait { sig } => Some(Response::Confirmed { sig }), Request::GetEntries { .. } => Some(Response::Entries { entries: vec![] }),
} }
} }

View File

@ -5,13 +5,15 @@
use std::net::UdpSocket; use std::net::UdpSocket;
use std::io; use std::io;
use bincode::{deserialize, serialize}; use bincode::{deserialize, serialize};
use event::{get_pubkey, sign_transaction_data, PublicKey, Signature}; use event::{get_pubkey, get_signature, sign_transaction_data, PublicKey, Signature};
use log::{Entry, Sha256Hash};
use ring::signature::Ed25519KeyPair; use ring::signature::Ed25519KeyPair;
use accountant_skel::{Request, Response}; use accountant_skel::{Request, Response};
pub struct AccountantStub { pub struct AccountantStub {
pub addr: String, pub addr: String,
pub socket: UdpSocket, pub socket: UdpSocket,
pub last_id: Option<Sha256Hash>,
} }
impl AccountantStub { impl AccountantStub {
@ -19,11 +21,12 @@ impl AccountantStub {
AccountantStub { AccountantStub {
addr: addr.to_string(), addr: addr.to_string(),
socket, socket,
last_id: None,
} }
} }
pub fn transfer_signed( pub fn transfer_signed(
self: &Self, &self,
from: PublicKey, from: PublicKey,
to: PublicKey, to: PublicKey,
val: u64, val: u64,
@ -35,7 +38,7 @@ impl AccountantStub {
} }
pub fn transfer( pub fn transfer(
self: &Self, &self,
n: u64, n: u64,
keypair: &Ed25519KeyPair, keypair: &Ed25519KeyPair,
to: PublicKey, to: PublicKey,
@ -45,7 +48,7 @@ impl AccountantStub {
self.transfer_signed(from, to, n, sig).map(|_| sig) self.transfer_signed(from, to, n, sig).map(|_| sig)
} }
pub fn get_balance(self: &Self, pubkey: &PublicKey) -> io::Result<u64> { pub fn get_balance(&self, pubkey: &PublicKey) -> io::Result<u64> {
let req = Request::GetBalance { key: *pubkey }; let req = Request::GetBalance { key: *pubkey };
let data = serialize(&req).expect("serialize GetBalance"); let data = serialize(&req).expect("serialize GetBalance");
self.socket.send_to(&data, &self.addr)?; self.socket.send_to(&data, &self.addr)?;
@ -59,17 +62,28 @@ impl AccountantStub {
Ok(0) Ok(0)
} }
pub fn wait_on_signature(self: &Self, wait_sig: &Signature) -> io::Result<()> { pub fn wait_on_signature(&mut self, wait_sig: &Signature) -> io::Result<()> {
let req = Request::Wait { sig: *wait_sig }; let req = Request::GetEntries {
last_id: self.last_id,
};
let data = serialize(&req).unwrap(); let data = serialize(&req).unwrap();
self.socket.send_to(&data, &self.addr).map(|_| ())?; self.socket.send_to(&data, &self.addr).map(|_| ())?;
let mut buf = vec![0u8; 1024]; let mut buf = vec![0u8; 1024];
self.socket.recv_from(&mut buf)?; self.socket.recv_from(&mut buf)?;
let resp = deserialize(&buf).expect("deserialize signature"); let resp = deserialize(&buf).expect("deserialize signature");
if let Response::Confirmed { sig } = resp { if let Response::Entries { entries } = resp {
assert_eq!(sig, *wait_sig); for Entry { id, event, .. } in entries {
self.last_id = Some(id);
if let Some(sig) = get_signature(&event) {
if sig == *wait_sig {
return Ok(());
} }
}
}
}
// TODO: Loop until we found it.
Ok(()) Ok(())
} }
} }
@ -95,7 +109,7 @@ mod tests {
sleep(Duration::from_millis(30)); sleep(Duration::from_millis(30));
let socket = UdpSocket::bind(send_addr).unwrap(); let socket = UdpSocket::bind(send_addr).unwrap();
let acc = AccountantStub::new(addr, socket); let mut acc = AccountantStub::new(addr, socket);
let sig = acc.transfer(500, &alice.get_keypair(), bob_pubkey).unwrap(); let sig = acc.transfer(500, &alice.get_keypair(), bob_pubkey).unwrap();
acc.wait_on_signature(&sig).unwrap(); acc.wait_on_signature(&sig).unwrap();
assert_eq!(acc.get_balance(&bob_pubkey).unwrap(), 1_500); assert_eq!(acc.get_balance(&bob_pubkey).unwrap(), 1_500);

View File

@ -28,7 +28,7 @@ fn main() {
sleep(Duration::from_millis(30)); sleep(Duration::from_millis(30));
let socket = UdpSocket::bind(send_addr).unwrap(); let socket = UdpSocket::bind(send_addr).unwrap();
let acc = AccountantStub::new(addr, socket); let mut acc = AccountantStub::new(addr, socket);
let alice_pubkey = get_pubkey(&alice_keypair); let alice_pubkey = get_pubkey(&alice_keypair);
let one = 1; let one = 1;
println!("Signing transactions..."); println!("Signing transactions...");