Add calling of supervisor over mycelium
Signed-off-by: Lee Smet <lee.smet@hotmail.com>
This commit is contained in:
@@ -163,7 +163,11 @@ impl RedisDriver {
|
||||
.and_then(|v| v.as_u64())
|
||||
.ok_or("Context.id missing or not a number")? as u32;
|
||||
let key = Self::context_key(id);
|
||||
self.hset_model(id, &key, ctx).await
|
||||
// Write the context hash in its own DB
|
||||
self.hset_model(id, &key, ctx).await?;
|
||||
// Register this context id in the global registry (DB 0)
|
||||
let _ = self.register_context_id(id).await;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Load a Context from its own DB (db index = id)
|
||||
@@ -551,4 +555,70 @@ impl RedisDriver {
|
||||
let key = Self::message_key(caller_id, id);
|
||||
self.lpush_list(db, "msg_out", &key).await
|
||||
}
|
||||
|
||||
/// Block-pop from msg_out with timeout (seconds). Returns the message key if present.
|
||||
/// Uses BRPOP so that the queue behaves FIFO with LPUSH producer.
|
||||
pub async fn brpop_msg_out(&self, db: u32, timeout_secs: usize) -> Result<Option<String>> {
|
||||
let mut cm = self.manager_for_db(db).await?;
|
||||
// BRPOP returns (list, element) on success
|
||||
let res: Option<(String, String)> = redis::cmd("BRPOP")
|
||||
.arg("msg_out")
|
||||
.arg(timeout_secs)
|
||||
.query_async(&mut cm)
|
||||
.await?;
|
||||
Ok(res.map(|(_, v)| v))
|
||||
}
|
||||
|
||||
/// Scan all runner:* keys in this DB and return the deserialized Runner entries.
|
||||
pub async fn scan_runners(&self, db: u32) -> Result<Vec<Runner>> {
|
||||
let mut cm = self.manager_for_db(db).await?;
|
||||
let mut out: Vec<Runner> = Vec::new();
|
||||
let mut cursor: u64 = 0;
|
||||
loop {
|
||||
let (next, keys): (u64, Vec<String>) = redis::cmd("SCAN")
|
||||
.arg(cursor)
|
||||
.arg("MATCH")
|
||||
.arg("runner:*")
|
||||
.arg("COUNT")
|
||||
.arg(100)
|
||||
.query_async(&mut cm)
|
||||
.await?;
|
||||
for k in keys {
|
||||
if let Ok(r) = self.hget_model::<Runner>(db, &k).await {
|
||||
out.push(r);
|
||||
}
|
||||
}
|
||||
if next == 0 {
|
||||
break;
|
||||
}
|
||||
cursor = next;
|
||||
}
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
// -----------------------------
|
||||
// Global registry (DB 0) for Context IDs
|
||||
// -----------------------------
|
||||
|
||||
/// Register a context id in the global set "contexts" stored in DB 0.
|
||||
pub async fn register_context_id(&self, id: u32) -> Result<()> {
|
||||
let mut cm = self.manager_for_db(0).await?;
|
||||
let _: i64 = redis::cmd("SADD").arg("contexts").arg(id).query_async(&mut cm).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// List all registered context ids from the global set in DB 0.
|
||||
pub async fn list_context_ids(&self) -> Result<Vec<u32>> {
|
||||
let mut cm = self.manager_for_db(0).await?;
|
||||
// Using SMEMBERS and parsing into u32
|
||||
let vals: Vec<String> = redis::cmd("SMEMBERS").arg("contexts").query_async(&mut cm).await?;
|
||||
let mut out = Vec::with_capacity(vals.len());
|
||||
for v in vals {
|
||||
if let Ok(n) = v.parse::<u32>() {
|
||||
out.push(n);
|
||||
}
|
||||
}
|
||||
out.sort_unstable();
|
||||
Ok(out)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user