@@ -1043,6 +1043,26 @@ def _close_or_defer_writer_lease(
10431043 writer_lease .close ()
10441044
10451045
1046+ def _enter_daemon_writer_lease (
1047+ writer_lease : contextlib .ExitStack ,
1048+ palace_path : str ,
1049+ resolved_backend : str ,
1050+ ) -> None :
1051+ """Acquire lifetime ownership when the backend requires one writer."""
1052+ if not backend_requires_single_writer (resolved_backend ):
1053+ return
1054+
1055+ try :
1056+ writer_lease .enter_context (mine_palace_lock (palace_path ))
1057+ except MineAlreadyRunning as exc :
1058+ raise DaemonError (
1059+ "writable daemon startup refused: another writer owns "
1060+ f"local backend { resolved_backend !r} for { palace_path !r} ; "
1061+ "stop the existing writable MCP/direct/daemon owner, or "
1062+ "route all writes through that owner"
1063+ ) from exc
1064+
1065+
10461066def run_server (palace_path : str , * , backend : str | None = None , port : int = 0 ) -> None :
10471067 palace_path = canonical_palace_path (palace_path )
10481068 previous_env = {
@@ -1073,16 +1093,11 @@ def run_server(palace_path: str, *, backend: str | None = None, port: int = 0) -
10731093 writer_lease = contextlib .ExitStack ()
10741094 try :
10751095 resolved_backend = resolve_backend_name (palace_path , explicit = backend )
1076- if backend_requires_single_writer (resolved_backend ):
1077- try :
1078- writer_lease .enter_context (mine_palace_lock (palace_path ))
1079- except MineAlreadyRunning as exc :
1080- raise DaemonError (
1081- "writable daemon startup refused: another writer owns "
1082- f"local backend { resolved_backend !r} for { palace_path !r} ; "
1083- "stop the existing writable MCP/direct/daemon owner, or "
1084- "route all writes through that owner"
1085- ) from exc
1096+ _enter_daemon_writer_lease (
1097+ writer_lease ,
1098+ palace_path ,
1099+ resolved_backend ,
1100+ )
10861101
10871102 token = ensure_token (palace_path )
10881103 # Backend resolution above is only the ownership decision. Preserve
0 commit comments