Fix unawaited Tokio spawn locks by moving macro clones and formatting allocations to blocking executor

This commit is contained in:
Riz Ashraf committed 2026-09-21 06:32:06 +01:00
1 parent e098c257c2
commit 7a48fa5d34
2 files changed
+87 -55

No files matched your search

+31 -27
View File
@@ -625,36 +625,40 @@ impl MemoryHandler {
to_draw.push(r);
}
}
let mut output = String::from("graph TD;\n");
use std::fmt::Write;
let mut output = String::with_capacity(included.len() * 40 + to_draw.len() * 60);
output.push_str("graph TD;\n");
let sanitize = |s: &str, id_mode: bool| -> String {
let mut out = String::with_capacity(s.len());
for c in s.chars() {
if c != '"' && c != '(' && c != ')' {
if id_mode && (c == ' ' || c == '-' || c == '.') {
out.push('_');
} else {
out.push(c);
}
}
}
out
};
for name in &included {
let safe = name.replace("\"", "").replace("(", "").replace(")", "");
output.push_str(&format!(
" id_{}[\"{}\"];\n",
safe.replace(" ", "_").replace("-", "_").replace(".", "_"),
safe
));
let _ = writeln!(
output,
" id_{}[\"{}\"];",
sanitize(name, true),
sanitize(name, false)
);
}
for r in to_draw {
let safe_f = r
.from
.replace(" ", "_")
.replace("-", "_")
.replace(".", "_")
.replace("\"", "")
.replace("(", "")
.replace(")", "");
let safe_t =
r.to.replace(" ", "_")
.replace("-", "_")
.replace(".", "_")
.replace("\"", "")
.replace("(", "")
.replace(")", "");
let safe_r = r.relation_type.replace("\"", "");
output.push_str(&format!(
" id_{}-->|\"{}\"|id_{};\n",
safe_f, safe_r, safe_t
));
let _ = writeln!(
output,
" id_{}-->|\"{}\"|id_{};",
sanitize(&r.from, true),
r.relation_type.replace("\"", ""),
sanitize(&r.to, true)
);
}
if output == "graph TD;\n" {
output = "No nodes found to visualize.".to_string();
+56 -28
View File
@@ -54,14 +54,21 @@ impl MemoryIndex {
pub fn index_entity(&self, e: &Entity) -> tokio::task::JoinHandle<tantivy::Result<()>> {
let writer = Arc::clone(&self.writer);
let doc = doc!(
self.id_field => e.name.clone(),
self.title_field => e.name.clone(),
self.body_field => e.observations.join(" "),
self.type_field => "entity",
self.namespace_field => e.namespace.clone()
);
let e = e.clone();
let id_field = self.id_field;
let title_field = self.title_field;
let body_field = self.body_field;
let type_field = self.type_field;
let namespace_field = self.namespace_field;
tokio::task::spawn_blocking(move || {
let doc = doc!(
id_field => e.name.clone(),
title_field => e.name.clone(),
body_field => e.observations.join(" "),
type_field => "entity",
namespace_field => e.namespace.clone()
);
let writer = writer.lock().unwrap();
writer.add_document(doc)?;
Ok(())
@@ -70,14 +77,21 @@ impl MemoryIndex {
pub fn index_task(&self, t: &Task) -> tokio::task::JoinHandle<tantivy::Result<()>> {
let writer = Arc::clone(&self.writer);
let doc = doc!(
self.id_field => t.id.clone(),
self.title_field => t.title.clone(),
self.body_field => t.description.clone(),
self.type_field => "task",
self.namespace_field => "global"
);
let t = t.clone();
let id_field = self.id_field;
let title_field = self.title_field;
let body_field = self.body_field;
let type_field = self.type_field;
let namespace_field = self.namespace_field;
tokio::task::spawn_blocking(move || {
let doc = doc!(
id_field => t.id.clone(),
title_field => t.title.clone(),
body_field => t.description.clone(),
type_field => "task",
namespace_field => "global"
);
let writer = writer.lock().unwrap();
writer.add_document(doc)?;
Ok(())
@@ -151,14 +165,21 @@ impl MemoryIndex {
pub fn index_snippet(&self, s: &Snippet) -> tokio::task::JoinHandle<tantivy::Result<()>> {
let writer = Arc::clone(&self.writer);
let doc = doc!(
self.id_field => s.name.clone(),
self.title_field => s.name.clone(),
self.body_field => format!("{} {}", s.language, s.description),
self.type_field => "snippet",
self.namespace_field => "global"
);
let s = s.clone();
let id_field = self.id_field;
let title_field = self.title_field;
let body_field = self.body_field;
let type_field = self.type_field;
let namespace_field = self.namespace_field;
tokio::task::spawn_blocking(move || {
let doc = doc!(
id_field => s.name.clone(),
title_field => s.name.clone(),
body_field => format!("{} {}", s.language, s.description),
type_field => "snippet",
namespace_field => "global"
);
let writer = writer.lock().unwrap();
writer.add_document(doc)?;
Ok(())
@@ -167,14 +188,21 @@ impl MemoryIndex {
pub fn index_adr(&self, a: &Adr) -> tokio::task::JoinHandle<tantivy::Result<()>> {
let writer = Arc::clone(&self.writer);
let doc = doc!(
self.id_field => a.id.clone(),
self.title_field => a.title.clone(),
self.body_field => format!("{} {} {}", a.context, a.decision, a.consequence),
self.type_field => "adr",
self.namespace_field => "global"
);
let a = a.clone();
let id_field = self.id_field;
let title_field = self.title_field;
let body_field = self.body_field;
let type_field = self.type_field;
let namespace_field = self.namespace_field;
tokio::task::spawn_blocking(move || {
let doc = doc!(
id_field => a.id.clone(),
title_field => a.title.clone(),
body_field => format!("{} {} {}", a.context, a.decision, a.consequence),
type_field => "adr",
namespace_field => "global"
);
let writer = writer.lock().unwrap();
writer.add_document(doc)?;
Ok(())