Register instance_guard for copy and avoid recycled inodes
ci / vet-and-test (pull_request) Failing after 54s
ci / vet-and-test (pull_request) Failing after 54s
Why: CI rejected the new table as missing from the storage-migrate copy list, and the replacement test passed on filesystems that reused the deleted inode. Evidence: SELF go test TestCopyOrderCoversAllFixtureTables and TestDatabaseReplacementRefusedBeforeOpen. Impact: SQLite to PostgreSQL copy keeps the guard row. The replacement test burns inodes until the new file is distinct. Refs: docs/recovery/u8-sqlite-instance-guard.md Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -295,6 +295,8 @@ var copyOrder = []string{
|
||||
"login_keys",
|
||||
// U1 I3:服务实例 DB 身份(无外键;迁移须保留以免目标库丢锚)
|
||||
"agent_system_identity",
|
||||
// U8:活动服务锁的库内标记(无外键;迁移须保留以免目标库丢掉锁根)
|
||||
"instance_guard",
|
||||
}
|
||||
|
||||
const controlDDL = `
|
||||
|
||||
@@ -75,9 +75,32 @@ func TestDatabaseReplacementRefusedBeforeOpen(t *testing.T) {
|
||||
if err := os.Remove(db); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := os.WriteFile(db, []byte("replaced"), 0o600); err != nil {
|
||||
raw, err := os.ReadFile(db + ".lock")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
rec, err := parseRecord(string(raw))
|
||||
if err != nil || rec == nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for i := 0; i < 16; i++ {
|
||||
if err := os.WriteFile(db, []byte("replaced"), 0o600); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_, ino, exists, err := statFile(db)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if exists && ino != rec.DBIno {
|
||||
break
|
||||
}
|
||||
if err := os.Remove(db); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := os.WriteFile(filepath.Join(dir, "inode-burn-"+string(rune('a'+i))), []byte("x"), 0o600); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
lease, err := Acquire(dir)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
Reference in New Issue
Block a user