From aa92abe73c3cca4ddc123863dfa6585f1a108228 Mon Sep 17 00:00:00 2001 From: eason <85663565+mango766@users.noreply.github.com> Date: Fri, 10 Apr 2026 12:16:49 +0800 Subject: [PATCH] fix: close file handles properly in json.load() calls (#13997) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Fixes #13996 Replace `json.load(open(...))` with `with open(...) as f: json.load(f)` in two files to ensure file descriptors are properly closed. **Affected files:** - `common/doc_store/infinity_conn_base.py` — schema loading for Infinity doc store - `api/db/init_data.py` — agent template loading at startup ## Why this matters In a long-running server process like RAGFlow, leaked file descriptors from `json.load(open(...))` can accumulate over time. While CPython's refcounting usually cleans these up, it's not guaranteed (especially under memory pressure or with alternative Python runtimes), and can lead to `OSError: [Errno 24] Too many open files`. ## Test plan - [ ] Verify Infinity doc store schema loading still works correctly - [ ] Verify agent templates load correctly on startup ## Summary by CodeRabbit * **Refactor** * Improved file handling in internal data processing to ensure proper resource cleanup. Co-authored-by: easonysliu Co-authored-by: Claude Opus 4.6 (1M context) --- api/db/init_data.py | 3 ++- common/doc_store/infinity_conn_base.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/api/db/init_data.py b/api/db/init_data.py index 26f53051d7..59ecfb2ba4 100644 --- a/api/db/init_data.py +++ b/api/db/init_data.py @@ -168,7 +168,8 @@ def add_graph_templates(): for fnm in os.listdir(dir): try: - cnvs = json.load(open(os.path.join(dir, fnm), "r",encoding="utf-8")) + with open(os.path.join(dir, fnm), "r", encoding="utf-8") as f: + cnvs = json.load(f) try: CanvasTemplateService.save(**cnvs) except Exception: diff --git a/common/doc_store/infinity_conn_base.py b/common/doc_store/infinity_conn_base.py index c5d9eb48e8..35459aaf40 100644 --- a/common/doc_store/infinity_conn_base.py +++ b/common/doc_store/infinity_conn_base.py @@ -270,7 +270,8 @@ class InfinityConnectionBase(DocStoreConnection): fp_mapping = os.path.join(get_project_base_directory(), "conf", self.mapping_file_name) if not os.path.exists(fp_mapping): raise Exception(f"Mapping file not found at {fp_mapping}") - schema = json.load(open(fp_mapping)) + with open(fp_mapping) as f: + schema = json.load(f) if parser_id is not None: from common.constants import ParserType