From 9307b4aacb945b5e2c786edbb578a5578a4975b2 Mon Sep 17 00:00:00 2001 From: mzl92 Date: Fri, 28 Aug 2026 13:45:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B3=E9=94=AE=E4=BF=AE=E5=A4=8D:=20rename?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E5=BF=AB=E7=85=A7=E5=90=8E=E6=97=A7=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E4=BB=8D=E8=AF=BB=E6=97=A7inode=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=99=88=E6=97=A7(=E4=BB=8A=E6=97=A5?= =?UTF-8?q?=E6=B0=B8=E8=BF=9C0),=20=E5=BF=AB=E7=85=A7=E5=90=8E=E9=87=8D?= =?UTF-8?q?=E5=BC=80=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index 39f85ad..747b030 100644 --- a/server.js +++ b/server.js @@ -76,8 +76,10 @@ function makeSnapshot() { src.exec(`VACUUM INTO '${tmp}'`); src.close(); fs.renameSync(tmp, SNAP_PATH); + try { rdb.close(); } catch (_) {} + rdb = new Database(SNAP_PATH, { readonly: true }); snapshotAt = new Date().toISOString(); - console.log(`[snapshot] ok ${snapshotAt}`); + console.log(`[snapshot] ok ${snapshotAt} (reopened)`); } catch (e) { console.log(`[snapshot] failed(继续用旧快照): ${String(e.message).slice(0, 120)}`); } @@ -88,7 +90,9 @@ if (RECRUITMENT_SRC) { } else { snapshotAt = fs.existsSync(SNAP_PATH) ? fs.statSync(SNAP_PATH).mtime.toISOString() : null; } -const rdb = new Database(SNAP_PATH, { readonly: true }); +let rdb = new Database(SNAP_PATH, { readonly: true }); +// 注意: makeSnapshot 用 rename 覆盖快照文件后, 已打开的连接仍指向旧 inode(读到陈旧数据), +// 必须在每次快照后重开连接(rdb 为 let 就是为此)。 // ---------- 会话(内存态,重启需重登) ---------- const sessions = new Map(); // sid -> { uid, role, expires }