From afe3bca1c18d15841db94bab0846228dff0c0043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=E1=BA=A7n=20Ho=C3=A0ng=20T=C3=BA?= Date: Sat, 28 Mar 2026 17:15:00 +0700 Subject: [PATCH] fix: use user-specific temp directories to avoid permission errors Append username to default temp directory names so multiple users on the same machine don't collide. Fixes PermissionError when user B tries to write to directories created by user A. Affected paths: - /tmp/of3_colabfold_msas_{username} - /tmp/of3_template_data_{username} Closes #150 --- .../core/data/pipelines/preprocessing/template.py | 3 ++- openfold3/core/data/tools/colabfold_msa_server.py | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/openfold3/core/data/pipelines/preprocessing/template.py b/openfold3/core/data/pipelines/preprocessing/template.py index 865939f55..94978b472 100644 --- a/openfold3/core/data/pipelines/preprocessing/template.py +++ b/openfold3/core/data/pipelines/preprocessing/template.py @@ -14,6 +14,7 @@ """Preprocessing pipelines for template data ran before training/evaluation.""" +import getpass import logging import multiprocessing as mp import os @@ -1602,7 +1603,7 @@ def _prepare_output_directories(self) -> "TemplatePreprocessorSettings": ) self.output_directory = ( - self.output_directory or Path(tempfile.gettempdir()) / "of3_template_data" + self.output_directory or Path(tempfile.gettempdir()) / f"of3_template_data_{getpass.getuser()}" ) base = self.output_directory diff --git a/openfold3/core/data/tools/colabfold_msa_server.py b/openfold3/core/data/tools/colabfold_msa_server.py index e4b12f295..4da82a0e0 100644 --- a/openfold3/core/data/tools/colabfold_msa_server.py +++ b/openfold3/core/data/tools/colabfold_msa_server.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import getpass import json import logging import os @@ -19,6 +20,14 @@ import shutil import tarfile import tempfile + + +def _get_username() -> str: + """Get current username for user-specific temp directories.""" + try: + return getpass.getuser() + except Exception: + return str(os.getuid()) if hasattr(os, "getuid") else "default" import time import warnings from dataclasses import dataclass, field @@ -997,7 +1006,7 @@ class MsaComputationSettings(BaseModel): server_user_agent: str = "openfold" server_url: Url = Url("https://api.colabfold.com") save_mappings: bool = True - msa_output_directory: Path = Path(tempfile.gettempdir()) / "of3_colabfold_msas" + msa_output_directory: Path = Path(tempfile.gettempdir()) / f"of3_colabfold_msas_{_get_username()}" cleanup_msa_dir: bool = True @model_validator(mode="after")