diff --git a/src/accountant.rs b/src/accountant.rs index 49c5d2c883..a94629837e 100644 --- a/src/accountant.rs +++ b/src/accountant.rs @@ -74,6 +74,13 @@ impl Accountant { acc } + /// Return the last entry ID registered + pub fn last_id(&self) -> Hash { + let last_ids = self.last_ids.read().unwrap(); + let last_item = last_ids.iter().last().expect("empty last_ids list"); + last_item.0 + } + fn reserve_signature(signatures: &RwLock>, sig: &Signature) -> bool { if signatures.read().unwrap().contains(sig) { return false; @@ -327,6 +334,8 @@ mod tests { let alice = Mint::new(10_000); let bob_pubkey = KeyPair::new().pubkey(); let acc = Accountant::new(&alice); + assert_eq!(acc.last_id(), alice.last_id()); + acc.transfer(1_000, &alice.keypair(), bob_pubkey, alice.last_id()) .unwrap(); assert_eq!(acc.get_balance(&bob_pubkey).unwrap(), 1_000); diff --git a/src/accountant_skel.rs b/src/accountant_skel.rs index bd8c7ddd24..1d213cb731 100644 --- a/src/accountant_skel.rs +++ b/src/accountant_skel.rs @@ -33,7 +33,6 @@ use transaction::Transaction; pub struct AccountantSkel { acc: Mutex, - last_id: Mutex, historian_input: Mutex>, historian: Historian, entry_info_subscribers: Mutex>, @@ -81,15 +80,9 @@ pub enum Response { impl AccountantSkel { /// Create a new AccountantSkel that wraps the given Accountant. - pub fn new( - acc: Accountant, - last_id: Hash, - historian_input: SyncSender, - historian: Historian, - ) -> Self { + pub fn new(acc: Accountant, historian_input: SyncSender, historian: Historian) -> Self { AccountantSkel { acc: Mutex::new(acc), - last_id: Mutex::new(last_id), entry_info_subscribers: Mutex::new(vec![]), historian_input: Mutex::new(historian_input), historian, @@ -116,10 +109,7 @@ impl AccountantSkel { fn update_entry(obj: &SharedSkel, writer: &Arc>, entry: &Entry) { trace!("update_entry entry"); - let mut last_id_l = obj.last_id.lock().unwrap(); - *last_id_l = entry.id; - obj.acc.lock().unwrap().register_entry_id(&last_id_l); - drop(last_id_l); + obj.acc.lock().unwrap().register_entry_id(&entry.id); writeln!( writer.lock().unwrap(), "{}", @@ -228,7 +218,7 @@ impl AccountantSkel { } Request::GetLastId => Some(( Response::LastId { - id: *self.last_id.lock().unwrap(), + id: self.acc.lock().unwrap().last_id(), }, rsp_addr, )), @@ -699,7 +689,7 @@ mod tests { let rsp_addr: SocketAddr = "0.0.0.0:0".parse().expect("socket address"); let (input, event_receiver) = sync_channel(10); let historian = Historian::new(event_receiver, &mint.last_id(), None); - let skel = AccountantSkel::new(acc, mint.last_id(), input, historian); + let skel = AccountantSkel::new(acc, input, historian); // Process a batch that includes a transaction that receives two tokens. let alice = KeyPair::new(); @@ -740,7 +730,7 @@ mod tests { let exit = Arc::new(AtomicBool::new(false)); let (input, event_receiver) = sync_channel(10); let historian = Historian::new(event_receiver, &alice.last_id(), Some(30)); - let acc_skel = Arc::new(AccountantSkel::new(acc, alice.last_id(), input, historian)); + let acc_skel = Arc::new(AccountantSkel::new(acc, input, historian)); let serve_addr = leader_serve.local_addr().unwrap(); let threads = AccountantSkel::serve( &acc_skel, @@ -858,7 +848,7 @@ mod tests { let acc = Accountant::new(&alice); let (input, event_receiver) = sync_channel(10); let historian = Historian::new(event_receiver, &alice.last_id(), Some(30)); - let acc = Arc::new(AccountantSkel::new(acc, alice.last_id(), input, historian)); + let acc = Arc::new(AccountantSkel::new(acc, input, historian)); let replicate_addr = target1_data.replicate_addr; let threads = AccountantSkel::replicate( &acc, @@ -1007,7 +997,7 @@ mod bench { let (input, event_receiver) = sync_channel(10); let historian = Historian::new(event_receiver, &mint.last_id(), None); - let skel = AccountantSkel::new(acc, mint.last_id(), input, historian); + let skel = AccountantSkel::new(acc, input, historian); let now = Instant::now(); assert!(skel.process_packets(req_vers).is_ok()); diff --git a/src/accountant_stub.rs b/src/accountant_stub.rs index 15a6a69cb7..b8c72167a4 100644 --- a/src/accountant_stub.rs +++ b/src/accountant_stub.rs @@ -192,7 +192,7 @@ mod tests { let exit = Arc::new(AtomicBool::new(false)); let (input, event_receiver) = sync_channel(10); let historian = Historian::new(event_receiver, &alice.last_id(), Some(30)); - let acc = Arc::new(AccountantSkel::new(acc, alice.last_id(), input, historian)); + let acc = Arc::new(AccountantSkel::new(acc, input, historian)); let threads = AccountantSkel::serve(&acc, d, serve, gossip, exit.clone(), sink()).unwrap(); sleep(Duration::from_millis(300)); diff --git a/src/bin/testnode.rs b/src/bin/testnode.rs index 2c585e6f27..c12840e843 100644 --- a/src/bin/testnode.rs +++ b/src/bin/testnode.rs @@ -104,7 +104,7 @@ fn main() { let (input, event_receiver) = sync_channel(10_000); let historian = Historian::new(event_receiver, &last_id, Some(1000)); let exit = Arc::new(AtomicBool::new(false)); - let skel = Arc::new(AccountantSkel::new(acc, last_id, input, historian)); + let skel = Arc::new(AccountantSkel::new(acc, input, historian)); let serve_sock = UdpSocket::bind(&serve_addr).unwrap(); let gossip_sock = UdpSocket::bind(&gossip_addr).unwrap(); let replicate_sock = UdpSocket::bind(&replicate_addr).unwrap();