channel.rs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. use async_std::sync::Mutex;
  2. use futures::io::{ReadHalf, WriteHalf};
  3. use futures::AsyncReadExt;
  4. use log::*;
  5. use smol::{Async, Executor};
  6. use std::net::{SocketAddr, TcpStream};
  7. use std::sync::atomic::{AtomicBool, Ordering};
  8. use std::sync::Arc;
  9. use crate::error;
  10. use crate::net::error::{NetError, NetResult};
  11. use crate::net::message_subscriber::{MessageSubscription, MessageSubsystem};
  12. use crate::net::messages;
  13. use crate::system::{StoppableTask, StoppableTaskPtr, Subscriber, SubscriberPtr, Subscription};
  14. /// Atomic pointer to async channel.
  15. pub type ChannelPtr = Arc<Channel>;
  16. /// Async TCP channel that handles the sending of messages across the network.
  17. pub struct Channel {
  18. reader: Mutex<ReadHalf<Async<TcpStream>>>,
  19. writer: Mutex<WriteHalf<Async<TcpStream>>>,
  20. address: SocketAddr,
  21. message_subsystem: MessageSubsystem,
  22. stop_subscriber: SubscriberPtr<NetError>,
  23. receive_task: StoppableTaskPtr,
  24. stopped: AtomicBool,
  25. }
  26. impl Channel {
  27. /// Create a new channel.
  28. pub async fn new(stream: Async<TcpStream>, address: SocketAddr) -> Arc<Self> {
  29. let (reader, writer) = stream.split();
  30. let reader = Mutex::new(reader);
  31. let writer = Mutex::new(writer);
  32. let message_subsystem = MessageSubsystem::new();
  33. Self::setup_dispatchers(&message_subsystem).await;
  34. Arc::new(Self {
  35. reader,
  36. writer,
  37. address,
  38. message_subsystem,
  39. stop_subscriber: Subscriber::new(),
  40. receive_task: StoppableTask::new(),
  41. stopped: AtomicBool::new(false),
  42. })
  43. }
  44. /// Start the channel.
  45. pub fn start(self: Arc<Self>, executor: Arc<Executor<'_>>) {
  46. debug!(target: "net", "Channel::start() [START, address={}]", self.address());
  47. let self2 = self.clone();
  48. self.receive_task.clone().start(
  49. self.clone().main_receive_loop(),
  50. // Ignore stop handler
  51. |result| self2.handle_stop(result),
  52. NetError::ServiceStopped,
  53. executor,
  54. );
  55. debug!(target: "net", "Channel::start() [END, address={}]", self.address());
  56. }
  57. /// Stop the channel.
  58. pub async fn stop(&self) {
  59. debug!(target: "net", "Channel::stop() [START, address={}]", self.address());
  60. assert_eq!(self.stopped.load(Ordering::Relaxed), false);
  61. self.stopped.store(false, Ordering::Relaxed);
  62. self.stop_subscriber.notify(NetError::ChannelStopped).await;
  63. self.receive_task.stop().await;
  64. self.message_subsystem
  65. .trigger_error(NetError::ChannelStopped)
  66. .await;
  67. debug!(target: "net", "Channel::stop() [END, address={}]", self.address());
  68. }
  69. /// Stop the channel and create a new sub.
  70. pub async fn subscribe_stop(&self) -> Subscription<NetError> {
  71. debug!(target: "net",
  72. "Channel::subscribe_stop() [START, address={}]",
  73. self.address()
  74. );
  75. // TODO: this should check the stopped status
  76. // Call to receive should return ChannelStopped on newly created sub
  77. let sub = self.stop_subscriber.clone().subscribe().await;
  78. debug!(target: "net",
  79. "Channel::subscribe_stop() [END, address={}]",
  80. self.address()
  81. );
  82. sub
  83. }
  84. /// Send a message across a channel.
  85. pub async fn send<M: messages::Message>(&self, message: M) -> NetResult<()> {
  86. debug!(target: "net",
  87. "Channel::send() [START, command={:?}, address={}]",
  88. M::name(),
  89. self.address()
  90. );
  91. if self.stopped.load(Ordering::Relaxed) {
  92. return Err(NetError::ChannelStopped);
  93. }
  94. // Catch failure and stop channel, return a net error
  95. let result = match self.send_message(message).await {
  96. Ok(()) => Ok(()),
  97. Err(err) => {
  98. error!("Channel send error for [{}]: {}", self.address(), err);
  99. self.stop().await;
  100. Err(NetError::ChannelStopped)
  101. }
  102. };
  103. debug!(target: "net",
  104. "Channel::send() [END, command={:?}, address={}]",
  105. M::name(),
  106. self.address()
  107. );
  108. result
  109. }
  110. /// Implements send message functionality.
  111. async fn send_message<M: messages::Message>(&self, message: M) -> error::Result<()> {
  112. let mut payload = Vec::new();
  113. message.encode(&mut payload)?;
  114. let packet = messages::Packet {
  115. command: String::from(M::name()),
  116. payload,
  117. };
  118. let stream = &mut *self.writer.lock().await;
  119. messages::send_packet(stream, packet).await
  120. }
  121. /// Subscribe to a message type.
  122. pub async fn subscribe_msg<M: messages::Message>(&self) -> NetResult<MessageSubscription<M>> {
  123. debug!(target: "net",
  124. "Channel::subscribe_msg() [START, command={:?}, address={}]",
  125. M::name(),
  126. self.address()
  127. );
  128. let sub = self.message_subsystem.subscribe::<M>().await;
  129. debug!(target: "net",
  130. "Channel::subscribe_msg() [END, command={:?}, address={}]",
  131. M::name(),
  132. self.address()
  133. );
  134. sub
  135. }
  136. /// Return the local socket address.
  137. pub fn address(&self) -> SocketAddr {
  138. self.address
  139. }
  140. /// End of file error. Triggered when unexpected end of file occurs.
  141. fn is_eof_error(err: &error::Error) -> bool {
  142. match err {
  143. error::Error::Io(io_err) => io_err.kind() == std::io::ErrorKind::UnexpectedEof,
  144. _ => false,
  145. }
  146. }
  147. /// Perform network handshake for message subsystem dispatchers.
  148. async fn setup_dispatchers(message_subsystem: &MessageSubsystem) {
  149. message_subsystem
  150. .add_dispatch::<messages::VersionMessage>()
  151. .await;
  152. message_subsystem
  153. .add_dispatch::<messages::VerackMessage>()
  154. .await;
  155. message_subsystem
  156. .add_dispatch::<messages::PingMessage>()
  157. .await;
  158. message_subsystem
  159. .add_dispatch::<messages::PongMessage>()
  160. .await;
  161. message_subsystem
  162. .add_dispatch::<messages::GetAddrsMessage>()
  163. .await;
  164. message_subsystem
  165. .add_dispatch::<messages::AddrsMessage>()
  166. .await;
  167. }
  168. pub fn get_message_subsystem(&self) -> &MessageSubsystem {
  169. &self.message_subsystem
  170. }
  171. /// Run the receive loop. Start receiving messages or handle network failure.
  172. async fn main_receive_loop(self: Arc<Self>) -> NetResult<()> {
  173. debug!(target: "net",
  174. "Channel::receive_loop() [START, address={}]",
  175. self.address()
  176. );
  177. let reader = &mut *self.reader.lock().await;
  178. loop {
  179. let packet = match messages::read_packet(reader).await {
  180. Ok(packet) => packet,
  181. Err(err) => {
  182. if Self::is_eof_error(&err) {
  183. info!("Channel {} disconnected", self.address());
  184. } else {
  185. error!("Read error on channel: {}", err);
  186. }
  187. debug!(target: "net",
  188. "Channel::receive_loop() stopping channel {}",
  189. self.address()
  190. );
  191. self.stop().await;
  192. return Err(NetError::ChannelStopped);
  193. }
  194. };
  195. // Send result to our subscribers
  196. self.message_subsystem
  197. .notify(&packet.command, packet.payload)
  198. .await;
  199. }
  200. }
  201. /// Handle network errors. Panic if error passes silently, otherwise broadcast the error.
  202. async fn handle_stop(self: Arc<Self>, result: NetResult<()>) {
  203. debug!(target: "net", "Channel::handle_stop() [START, address={}]", self.address());
  204. match result {
  205. Ok(()) => panic!("Channel task should never complete without error status"),
  206. Err(err) => {
  207. // Send this error to all channel subscribers
  208. self.message_subsystem.trigger_error(err).await;
  209. }
  210. }
  211. debug!(target: "net", "Channel::handle_stop() [END, address={}]", self.address());
  212. }
  213. }