|
2 | 2 | //!
|
3 | 3 | //! This module contains the definition of the raw client that wraps the transport method
|
4 | 4 |
|
5 |
| -use std::collections::{HashMap, HashSet, VecDeque}; |
| 5 | +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque}; |
6 | 6 | use std::io::{BufRead, BufReader, Read, Write};
|
7 | 7 | use std::mem::drop;
|
8 | 8 | use std::net::{TcpStream, ToSocketAddrs};
|
@@ -647,8 +647,8 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
|
647 | 647 | fn batch_call(&self, batch: &Batch) -> Result<Vec<serde_json::Value>, Error> {
|
648 | 648 | let mut raw = Vec::new();
|
649 | 649 |
|
650 |
| - let mut missing_responses = HashSet::new(); |
651 |
| - let mut answer = Vec::new(); |
| 650 | + let mut missing_responses = BTreeSet::new(); |
| 651 | + let mut answers = BTreeMap::new(); |
652 | 652 |
|
653 | 653 | // Add our listener to the map before we send the request, Here we will clone the sender
|
654 | 654 | // for every request id, so that we only have to monitor one receiver.
|
@@ -681,32 +681,27 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
|
681 | 681 |
|
682 | 682 | self.increment_calls();
|
683 | 683 |
|
684 |
| - while !missing_responses.is_empty() { |
685 |
| - let req_id = *missing_responses.iter().next().unwrap(); |
686 |
| - let resp = match self.recv(&receiver, req_id) { |
687 |
| - Ok(resp) => resp, |
| 684 | + for req_id in missing_responses.iter() { |
| 685 | + match self.recv(&receiver, *req_id) { |
| 686 | + Ok(mut resp) => answers.insert( |
| 687 | + resp["id"].as_u64().unwrap_or_default(), |
| 688 | + resp["result"].take(), |
| 689 | + ), |
688 | 690 | Err(e) => {
|
689 | 691 | // In case of error our sender could still be left in the map, depending on where
|
690 | 692 | // the error happened. Just in case, try to remove it here
|
691 | 693 | warn!("got error for req_id {}: {:?}", req_id, e);
|
692 | 694 | warn!("removing all waiting req of this batch");
|
693 | 695 | let mut guard = self.waiting_map.lock()?;
|
694 | 696 | for req_id in missing_responses.iter() {
|
695 |
| - guard.remove(&req_id); |
| 697 | + guard.remove(req_id); |
696 | 698 | }
|
697 | 699 | return Err(e);
|
698 | 700 | }
|
699 | 701 | };
|
700 |
| - let resp_id = resp["id"].as_u64().unwrap() as usize; |
701 |
| - |
702 |
| - missing_responses.remove(&resp_id); |
703 |
| - answer.push(resp); |
704 | 702 | }
|
705 | 703 |
|
706 |
| - answer.sort_by(|a, b| a["id"].as_u64().partial_cmp(&b["id"].as_u64()).unwrap()); |
707 |
| - let answer = answer.into_iter().map(|mut x| x["result"].take()).collect(); |
708 |
| - |
709 |
| - Ok(answer) |
| 704 | + Ok(answers.into_iter().map(|(_, r)| r).collect()) |
710 | 705 | }
|
711 | 706 |
|
712 | 707 | fn block_headers_subscribe_raw(&self) -> Result<RawHeaderNotification, Error> {
|
|
0 commit comments