Serialize metadata-only document updates with the write lock
This commit is contained in:
parent
f02cde5ddf
commit
1ed424b50d
2 changed files with 29 additions and 1 deletions
|
|
@ -865,7 +865,8 @@ async def update_document(
|
||||||
existing_doc.uri = uri
|
existing_doc.uri = uri
|
||||||
|
|
||||||
if content is None and chunks is None and docling_document is None:
|
if content is None and chunks is None and docling_document is None:
|
||||||
updated = await client.document_repository.update_meta(existing_doc)
|
async with client.store._write_lock:
|
||||||
|
updated = await client.document_repository.update_meta(existing_doc)
|
||||||
if client._config.storage.auto_vacuum:
|
if client._config.storage.auto_vacuum:
|
||||||
client._schedule_vacuum()
|
client._schedule_vacuum()
|
||||||
return updated
|
return updated
|
||||||
|
|
|
||||||
|
|
@ -2264,3 +2264,30 @@ async def test_rebuild_rechunk_with_url_prefixed_stored_content(
|
||||||
assert doc_after is not None
|
assert doc_after is not None
|
||||||
assert "example.com" in doc_after.content
|
assert "example.com" in doc_after.content
|
||||||
assert "Stored" in doc_after.content
|
assert "Stored" in doc_after.content
|
||||||
|
|
||||||
|
|
||||||
|
async def test_metadata_only_update_waits_for_write_lock(temp_db_path):
|
||||||
|
"""The metadata-only update path serializes with other writers so it
|
||||||
|
cannot land inside another writer's critical section (e.g. between
|
||||||
|
create_tag's version snapshot and its per-table tag creation)."""
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
dim = Config.embeddings.model.vector_dim
|
||||||
|
docling_doc = DoclingDocument(name="d")
|
||||||
|
docling_doc.add_text(label=DocItemLabel.TEXT, text="body")
|
||||||
|
|
||||||
|
async with HaikuRAG(temp_db_path, create=True) as client:
|
||||||
|
doc = await client.import_document(
|
||||||
|
docling_doc,
|
||||||
|
[Chunk(content="body", embedding=[0.1] * dim, order=0)],
|
||||||
|
uri="mem://meta",
|
||||||
|
)
|
||||||
|
|
||||||
|
async with client.store._write_lock:
|
||||||
|
task = asyncio.create_task(
|
||||||
|
client.update_document(document_id=doc.id, metadata={"k": "v"})
|
||||||
|
)
|
||||||
|
await asyncio.sleep(0.1)
|
||||||
|
assert not task.done()
|
||||||
|
updated = await task
|
||||||
|
assert updated.metadata == {"k": "v"}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue