Skip to content

Commit b3b50f5

Browse files
committed
🚧 Restore 完成后重新打开库
1 parent 2ae918a commit b3b50f5

File tree

1 file changed

+33
-10
lines changed

1 file changed

+33
-10
lines changed

db/ha_sqlite_db.go

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/pkg/errors"
99
sqlite "github.com/uglyer/go-sqlite3" // Go SQLite bindings with wal hook
1010
"github.com/uglyer/ha-sqlite/db/walfs"
11+
"github.com/uglyer/ha-sqlite/log"
1112
"github.com/uglyer/ha-sqlite/proto"
1213
"github.com/uglyer/ha-sqlite/s3"
1314
"io"
@@ -57,6 +58,23 @@ func NewHaSqliteDB(dataSourceName string) (*HaSqliteDB, error) {
5758
return nil, errors.Wrap(err, "failed to create dir")
5859
}
5960
}
61+
db, err := openDB(dataSourceName)
62+
if err != nil {
63+
return nil, err
64+
}
65+
66+
sourceWalFile := fmt.Sprintf("%s-wal", dataSourceName)
67+
return &HaSqliteDB{
68+
dataSourceName: dataSourceName,
69+
sourceWalFile: sourceWalFile,
70+
db: db,
71+
txMap: make(map[string]*sql.Tx),
72+
enabledVFS: false,
73+
}, nil
74+
}
75+
76+
// openDB 打开数据库
77+
func openDB(dataSourceName string) (*sql.DB, error) {
6078
enabledVFS := false
6179
url := fmt.Sprintf("file:%s?_txlock=exclusive&_busy_timeout=30000&_synchronous=OFF", dataSourceName)
6280
if enabledVFS {
@@ -74,17 +92,10 @@ func NewHaSqliteDB(dataSourceName string) (*HaSqliteDB, error) {
7492
//}
7593
_, err = db.Exec("PRAGMA journal_mode=WAL")
7694
if err != nil {
95+
db.Close()
7796
return nil, fmt.Errorf("set journal_mode = WAL error:%v", err)
7897
}
79-
80-
sourceWalFile := fmt.Sprintf("%s-wal", dataSourceName)
81-
return &HaSqliteDB{
82-
dataSourceName: dataSourceName,
83-
sourceWalFile: sourceWalFile,
84-
db: db,
85-
txMap: make(map[string]*sql.Tx),
86-
enabledVFS: enabledVFS,
87-
}, nil
98+
return db, nil
8899
}
89100

90101
// addUseCount 添加引用次数
@@ -212,7 +223,18 @@ func (d *HaSqliteDB) Restore(s3Store s3.S3Store, remotePath string) (int64, erro
212223
if err != nil {
213224
return 0, fmt.Errorf("restore close db error:%v", err)
214225
}
215-
// TODO reopen db
226+
// reopen db
227+
defer func() {
228+
for i := 0; i < 5; i++ {
229+
db, err := openDB(d.dataSourceName)
230+
if err != nil {
231+
log.Error(fmt.Sprintf("Restore reopen db error(%d):%v(%s)", i, err, d.dataSourceName))
232+
continue
233+
}
234+
d.db = db
235+
break
236+
}
237+
}()
216238
_, err = io.Copy(fileBackup, dbFile)
217239
if err != nil {
218240
return 0, fmt.Errorf("restore backup db file error:%v", err)
@@ -228,6 +250,7 @@ func (d *HaSqliteDB) Restore(s3Store s3.S3Store, remotePath string) (int64, erro
228250
if err != nil {
229251
break
230252
}
253+
log.Error(fmt.Sprintf("Restore rollback db error(%d):%v(%s)", i, err, d.dataSourceName))
231254
}
232255
}
233256
size, err := io.Copy(dbFile, file)

0 commit comments

Comments
 (0)