refactor(maizone): 重构数据迁移以尽早关闭文件句柄

数据迁移逻辑已更新为先将整个文件读入内存,然后立即关闭文件句柄。

这可以防止旧数据文件在随后的 JSON 解析、验证和写入新存储的过程中保持打开状态,从而提高迁移过程的稳健性。
This commit is contained in:
tt-P607
2025-11-15 20:07:48 +08:00
committed by Windpicker-owo
parent 07a70e1dd5
commit fea007b429

View File

@@ -80,37 +80,39 @@ class ReplyTrackerService:
if old_data_file.exists(): if old_data_file.exists():
logger.info(f"检测到旧的数据文件 '{old_data_file}',开始执行一次性迁移...") logger.info(f"检测到旧的数据文件 '{old_data_file}',开始执行一次性迁移...")
try: try:
# 读取旧文件内容 # 步骤1: 读取旧文件内容并立即关闭文件
with open(old_data_file, "rb") as f: with open(old_data_file, "rb") as f:
file_content = f.read() file_content = f.read()
# 如果文件为空,直接删除,无需迁移
if not file_content.strip():
logger.warning("旧数据文件为空,无需迁移。")
os.remove(old_data_file)
logger.info(f"空的旧数据文件 '{old_data_file}' 已被删除。")
return
# 解析JSON数据 # 步骤2: 处理文件内容
old_data = orjson.loads(file_content) # 如果文件为空,直接删除,无需迁移
if not file_content.strip():
logger.warning("旧数据文件为空,无需迁移。")
os.remove(old_data_file)
logger.info(f"空的旧数据文件 '{old_data_file}' 已被删除。")
return
# 验证数据格式是否正确 # 解析JSON数据
if self._validate_data(old_data): old_data = orjson.loads(file_content)
# 验证通过将数据写入新的存储API
self.storage.set("data", old_data)
# 立即强制保存,确保迁移数据落盘
self.storage._save_data()
logger.info("旧数据已成功迁移到新的存储API。")
# 将旧文件重命名为备份文件,而不是直接删除,以防万一 # 步骤3: 验证数据并执行迁移/备份
backup_file = old_data_file.with_suffix(f".json.bak.migrated.{int(time.time())}") if self._validate_data(old_data):
old_data_file.rename(backup_file) # 验证通过将数据写入新的存储API
logger.info(f"旧数据文件已成功迁移并备份为: {backup_file}") self.storage.set("data", old_data)
else: # 立即强制保存,确保迁移数据落盘
# 如果数据格式无效,迁移中止,并备份损坏的文件 self.storage._save_data()
logger.error("旧数据文件格式无效,迁移中止") logger.info("旧数据已成功迁移到新的存储API")
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}") 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: except Exception as e:
# 捕获迁移过程中可能出现的任何异常 # 捕获迁移过程中可能出现的任何异常