gateway.rs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. use async_std::sync::Arc;
  2. use std::convert::From;
  3. use std::net::SocketAddr;
  4. use std::path::Path;
  5. use super::reqrep::{PeerId, Publisher, RepProtocol, Reply, ReqProtocol, Request, Subscriber};
  6. use crate::{
  7. serial::deserialize, serial::serialize, slab::Slab, slabstore::SlabStore, Error, Result,
  8. };
  9. use async_executor::Executor;
  10. use log::*;
  11. pub type Slabs = Vec<Vec<u8>>;
  12. #[repr(u8)]
  13. enum GatewayCommand {
  14. PutSlab,
  15. GetSlab,
  16. GetLastIndex,
  17. }
  18. pub struct GatewayService {
  19. slabstore: Arc<SlabStore>,
  20. addr: SocketAddr,
  21. pub_addr: SocketAddr,
  22. }
  23. impl GatewayService {
  24. pub fn new(addr: SocketAddr, pub_addr: SocketAddr) -> Result<Arc<GatewayService>> {
  25. let slabstore = SlabStore::new(Path::new("slabstore.db"))?;
  26. Ok(Arc::new(GatewayService {
  27. slabstore,
  28. addr,
  29. pub_addr,
  30. }))
  31. }
  32. pub async fn start(self: Arc<Self>, executor: Arc<Executor<'_>>) -> Result<()> {
  33. let service_name = String::from("GATEWAY DAEMON");
  34. let mut protocol = RepProtocol::new(self.addr.clone(), service_name.clone());
  35. let (send, recv) = protocol.start().await?;
  36. let (publish_queue, publish_recv_queue) = async_channel::unbounded::<Vec<u8>>();
  37. let publisher_task = executor.spawn(Self::start_publisher(
  38. self.pub_addr,
  39. service_name,
  40. publish_recv_queue.clone(),
  41. ));
  42. let handle_request_task = executor.spawn(self.handle_request_loop(
  43. send.clone(),
  44. recv.clone(),
  45. publish_queue.clone(),
  46. executor.clone(),
  47. ));
  48. protocol.run(executor.clone()).await?;
  49. let _ = publisher_task.cancel().await;
  50. let _ = handle_request_task.cancel().await;
  51. Ok(())
  52. }
  53. async fn start_publisher(
  54. pub_addr: SocketAddr,
  55. service_name: String,
  56. publish_recv_queue: async_channel::Receiver<Vec<u8>>,
  57. ) -> Result<()> {
  58. let mut publisher = Publisher::new(pub_addr, service_name);
  59. publisher.start(publish_recv_queue).await?;
  60. Ok(())
  61. }
  62. async fn handle_request_loop(
  63. self: Arc<Self>,
  64. send_queue: async_channel::Sender<(PeerId, Reply)>,
  65. recv_queue: async_channel::Receiver<(PeerId, Request)>,
  66. publish_queue: async_channel::Sender<Vec<u8>>,
  67. executor: Arc<Executor<'_>>,
  68. ) -> Result<()> {
  69. loop {
  70. match recv_queue.recv().await {
  71. Ok(msg) => {
  72. let slabstore = self.slabstore.clone();
  73. let _ = executor
  74. .spawn(Self::handle_request(
  75. msg,
  76. slabstore,
  77. send_queue.clone(),
  78. publish_queue.clone(),
  79. ))
  80. .detach();
  81. }
  82. Err(_) => {
  83. break;
  84. }
  85. }
  86. }
  87. Ok(())
  88. }
  89. async fn handle_request(
  90. msg: (PeerId, Request),
  91. slabstore: Arc<SlabStore>,
  92. send_queue: async_channel::Sender<(PeerId, Reply)>,
  93. publish_queue: async_channel::Sender<Vec<u8>>,
  94. ) -> Result<()> {
  95. let request = msg.1;
  96. let peer = msg.0;
  97. match request.get_command() {
  98. 0 => {
  99. // PUTSLAB
  100. let slab = request.get_payload();
  101. // add to slabstore
  102. slabstore.put(slab.clone())?;
  103. // send reply
  104. let reply = Reply::from(&request, 0, vec![]);
  105. send_queue.send((peer, reply)).await?;
  106. // publish to all subscribes
  107. publish_queue.send(slab).await?;
  108. info!("Received putslab msg");
  109. }
  110. 1 => {
  111. let index = request.get_payload();
  112. let slab = slabstore.get(index)?;
  113. let mut payload = vec![];
  114. if let Some(sb) = slab {
  115. payload = sb;
  116. }
  117. let reply = Reply::from(&request, 0, payload);
  118. send_queue.send((peer, reply)).await?;
  119. // GETSLAB
  120. info!("Received getslab msg");
  121. }
  122. 2 => {
  123. let index = slabstore.get_last_index_as_bytes()?;
  124. let reply = Reply::from(&request, 0, index);
  125. send_queue.send((peer, reply)).await?;
  126. // GETLASTINDEX
  127. info!("Received getlastindex msg");
  128. }
  129. _ => {
  130. return Err(Error::ServicesError("received wrong command"));
  131. }
  132. }
  133. Ok(())
  134. }
  135. }
  136. pub struct GatewayClient {
  137. protocol: ReqProtocol,
  138. slabstore: Arc<SlabStore>,
  139. }
  140. impl GatewayClient {
  141. pub fn new(addr: SocketAddr, path: &Path) -> Result<Self> {
  142. let protocol = ReqProtocol::new(addr, String::from("GATEWAY CLIENT"));
  143. let slabstore = SlabStore::new(path)?;
  144. Ok(GatewayClient {
  145. protocol,
  146. slabstore,
  147. })
  148. }
  149. pub async fn start(&mut self) -> Result<()> {
  150. self.protocol.start().await?;
  151. info!("Start Syncing");
  152. let local_last_index = self.slabstore.get_last_index()?;
  153. let last_index = self.get_last_index().await?;
  154. if last_index > 0 {
  155. for index in (local_last_index + 1)..(last_index + 1) {
  156. self.get_slab(index).await?;
  157. }
  158. }
  159. info!("End Syncing");
  160. Ok(())
  161. }
  162. pub async fn get_slab(&mut self, index: u64) -> Result<Vec<u8>> {
  163. let slab = self
  164. .protocol
  165. .request(GatewayCommand::GetSlab as u8, serialize(&index))
  166. .await?;
  167. self.slabstore.put(slab.clone())?;
  168. Ok(slab)
  169. }
  170. pub async fn put_slab(&mut self, mut slab: Slab) -> Result<()> {
  171. let last_index = self.get_last_index().await?;
  172. slab.set_index(last_index + 1);
  173. let slab = serialize(&slab);
  174. self.protocol
  175. .request(GatewayCommand::PutSlab as u8, slab.clone())
  176. .await?;
  177. Ok(())
  178. }
  179. pub async fn get_last_index(&mut self) -> Result<u64> {
  180. let rep = self
  181. .protocol
  182. .request(GatewayCommand::GetLastIndex as u8, vec![])
  183. .await?;
  184. Ok(deserialize(&rep)?)
  185. }
  186. pub fn get_slabstore(&self) -> Arc<SlabStore> {
  187. self.slabstore.clone()
  188. }
  189. pub async fn start_subscriber(sub_addr: SocketAddr) -> Result<Subscriber> {
  190. let mut subscriber = Subscriber::new(sub_addr, String::from("GATEWAY CLIENT"));
  191. subscriber.start().await?;
  192. Ok(subscriber)
  193. }
  194. pub async fn subscribe(mut subscriber: Subscriber, slabstore: Arc<SlabStore>) -> Result<()> {
  195. loop {
  196. let slab: Vec<u8>;
  197. slab = subscriber.fetch().await?;
  198. slabstore.put(slab)?;
  199. }
  200. }
  201. }