Watch slots for Solana liveness monitoring (#141)

* add slot notifications to the agent

* fix proto field naming
This commit is contained in:
Hendrik Hofstadt 2021-01-11 12:43:05 +01:00 committed by GitHub
parent 03ef5e1017
commit 12a6ae31bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 0 deletions

View File

@ -35,6 +35,7 @@ message LockupEvent {
LockupEventNew new = 4;
LockupEventVAAPosted vaaPosted = 5;
Empty empty = 6;
Empty slotEvent = 7;
}
}

View File

@ -161,9 +161,12 @@ impl Agent for AgentImpl {
_req: Request<WatchLockupsRequest>,
) -> Result<Response<Self::WatchLockupsStream>, Status> {
let (mut tx, rx) = mpsc::channel(1);
let mut tx2 = tx.clone();
let url = self.url.clone();
let url2 = self.url.clone();
let bridge = self.bridge.clone();
let rpc_url = self.rpc_url.clone();
let rpc_url2 = self.rpc_url.clone();
tokio::spawn(async move {
let _rpc = RpcClient::new(rpc_url.to_string());
@ -264,6 +267,37 @@ impl Agent for AgentImpl {
}
});
tokio::spawn(async move {
let _rpc = RpcClient::new(rpc_url2.to_string());
let sub = solana_client::pubsub_client::PubsubClient::slot_subscribe(&url2).unwrap();
// looping and sending our response using stream
loop {
let item = sub.1.recv();
match item {
Ok(v) => {
if let Err(e) = tx2
.send(Ok(LockupEvent {
slot: v.slot,
time: 0,
lockup_address: String::from(""),
event: Some(Event::SlotEvent(Empty {})),
}))
.await
{
println!("sending event failed: {}", e);
return;
};
}
Err(e) => {
println!("watcher died: {}", e);
tx2.send(Err(Status::new(Code::Aborted, "watcher died")))
.await;
return;
}
};
}
});
Ok(Response::new(rx))
}
}