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

+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(())