fix: keep status from taking writer lease

This commit is contained in:
Igor Lins e Silva 2026-07-06 09:26:16 -03:00
parent 9815f0ae23
commit b459293e6f
4 changed files with 23 additions and 3 deletions

View File

@ -1693,9 +1693,6 @@ def tool_status():
# is detected so status stays reachable.
db_exists = _backend_db_exists()
_refresh_vector_disabled_flag()
writer_ok, writer_reason = _acquire_mcp_writer_lock()
if not writer_ok:
logger.warning("%s; mutating MCP tools will run read-only", writer_reason)
if _vector_disabled:
return _tool_status_via_sqlite()

View File

@ -55,6 +55,7 @@ WRITE_TOOLS = frozenset(
{
"mempalace_add_drawer",
"mempalace_checkpoint",
"mempalace_delete_by_source",
"mempalace_delete_drawer",
"mempalace_update_drawer",
"mempalace_diary_write",

View File

@ -174,6 +174,7 @@ def test_service_tool_classification():
assert service.classify_tool("mempalace_search") == "read"
assert service.classify_tool("mempalace_add_drawer") == "write"
assert service.classify_tool("mempalace_checkpoint") == "write"
assert service.classify_tool("mempalace_delete_by_source") == "write"
assert service.classify_tool("mempalace_mine") == "maintenance"
assert service.classify_tool("unknown") == "unknown"

View File

@ -4832,6 +4832,27 @@ def test_peer_writer_guard_does_not_gate_read_tool(monkeypatch):
assert '"ok": true' in response["result"]["content"][0]["text"]
def test_status_tool_does_not_acquire_peer_writer_lock(monkeypatch):
from mempalace import mcp_server
def forbidden_lock():
raise AssertionError("status should not acquire the peer-writer lock")
monkeypatch.setattr(mcp_server, "_ensure_sqlite_integrity_status", lambda: None)
monkeypatch.setattr(mcp_server, "_sqlite_integrity_errors", None)
monkeypatch.setattr(mcp_server, "_backend_db_exists", lambda: True)
monkeypatch.setattr(mcp_server, "_refresh_vector_disabled_flag", lambda: None)
monkeypatch.setattr(mcp_server, "_vector_disabled", True)
monkeypatch.setattr(
mcp_server,
"_tool_status_via_sqlite",
lambda: {"total_drawers": 0, "wings": {}, "rooms": {}},
)
monkeypatch.setattr(mcp_server, "_acquire_mcp_writer_lock", forbidden_lock)
assert mcp_server.tool_status()["total_drawers"] == 0
def test_peer_writer_lock_setup_failure_is_cached(monkeypatch):
from mempalace import mcp_server, palace