From fea007b42938f00df940974145a8054dc356ea7e Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Sat, 15 Nov 2025 20:07:48 +0800 Subject: [PATCH] =?UTF-8?q?refactor(maizone):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=BF=81=E7=A7=BB=E4=BB=A5=E5=B0=BD=E6=97=A9?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=96=87=E4=BB=B6=E5=8F=A5=E6=9F=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 数据迁移逻辑已更新为先将整个文件读入内存,然后立即关闭文件句柄。 这可以防止旧数据文件在随后的 JSON 解析、验证和写入新存储的过程中保持打开状态,从而提高迁移过程的稳健性。 --- .../services/reply_tracker_service.py | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/plugins/built_in/maizone_refactored/services/reply_tracker_service.py b/src/plugins/built_in/maizone_refactored/services/reply_tracker_service.py index 22b833cec..30984cd3e 100644 --- a/src/plugins/built_in/maizone_refactored/services/reply_tracker_service.py +++ b/src/plugins/built_in/maizone_refactored/services/reply_tracker_service.py @@ -80,37 +80,39 @@ class ReplyTrackerService: if old_data_file.exists(): logger.info(f"检测到旧的数据文件 '{old_data_file}',开始执行一次性迁移...") try: - # 读取旧文件内容 + # 步骤1: 读取旧文件内容并立即关闭文件 with open(old_data_file, "rb") as f: file_content = f.read() - # 如果文件为空,直接删除,无需迁移 - if not file_content.strip(): - logger.warning("旧数据文件为空,无需迁移。") - os.remove(old_data_file) - logger.info(f"空的旧数据文件 '{old_data_file}' 已被删除。") - return - # 解析JSON数据 - old_data = orjson.loads(file_content) + # 步骤2: 处理文件内容 + # 如果文件为空,直接删除,无需迁移 + if not file_content.strip(): + logger.warning("旧数据文件为空,无需迁移。") + os.remove(old_data_file) + logger.info(f"空的旧数据文件 '{old_data_file}' 已被删除。") + return - # 验证数据格式是否正确 - if self._validate_data(old_data): - # 验证通过,将数据写入新的存储API - self.storage.set("data", old_data) - # 立即强制保存,确保迁移数据落盘 - self.storage._save_data() - logger.info("旧数据已成功迁移到新的存储API。") + # 解析JSON数据 + old_data = orjson.loads(file_content) - # 将旧文件重命名为备份文件,而不是直接删除,以防万一 - backup_file = old_data_file.with_suffix(f".json.bak.migrated.{int(time.time())}") - old_data_file.rename(backup_file) - logger.info(f"旧数据文件已成功迁移并备份为: {backup_file}") - else: - # 如果数据格式无效,迁移中止,并备份损坏的文件 - logger.error("旧数据文件格式无效,迁移中止。") - backup_file = old_data_file.with_suffix(f".json.bak.invalid.{int(time.time())}") - old_data_file.rename(backup_file) - logger.warning(f"已将无效的旧数据文件备份为: {backup_file}") + # 步骤3: 验证数据并执行迁移/备份 + if self._validate_data(old_data): + # 验证通过,将数据写入新的存储API + self.storage.set("data", old_data) + # 立即强制保存,确保迁移数据落盘 + self.storage._save_data() + logger.info("旧数据已成功迁移到新的存储API。") + + # 将旧文件重命名为备份文件 + backup_file = old_data_file.with_suffix(f".json.bak.migrated.{int(time.time())}") + old_data_file.rename(backup_file) + logger.info(f"旧数据文件已成功迁移并备份为: {backup_file}") + else: + # 如果数据格式无效,迁移中止,并备份损坏的文件 + logger.error("旧数据文件格式无效,迁移中止。") + backup_file = old_data_file.with_suffix(f".json.bak.invalid.{int(time.time())}") + old_data_file.rename(backup_file) + logger.warning(f"已将无效的旧数据文件备份为: {backup_file}") except Exception as e: # 捕获迁移过程中可能出现的任何异常