8
8
"github.com/pkg/errors"
9
9
sqlite "github.com/uglyer/go-sqlite3" // Go SQLite bindings with wal hook
10
10
"github.com/uglyer/ha-sqlite/db/walfs"
11
+ "github.com/uglyer/ha-sqlite/log"
11
12
"github.com/uglyer/ha-sqlite/proto"
12
13
"github.com/uglyer/ha-sqlite/s3"
13
14
"io"
@@ -57,6 +58,23 @@ func NewHaSqliteDB(dataSourceName string) (*HaSqliteDB, error) {
57
58
return nil , errors .Wrap (err , "failed to create dir" )
58
59
}
59
60
}
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 ) {
60
78
enabledVFS := false
61
79
url := fmt .Sprintf ("file:%s?_txlock=exclusive&_busy_timeout=30000&_synchronous=OFF" , dataSourceName )
62
80
if enabledVFS {
@@ -74,17 +92,10 @@ func NewHaSqliteDB(dataSourceName string) (*HaSqliteDB, error) {
74
92
//}
75
93
_ , err = db .Exec ("PRAGMA journal_mode=WAL" )
76
94
if err != nil {
95
+ db .Close ()
77
96
return nil , fmt .Errorf ("set journal_mode = WAL error:%v" , err )
78
97
}
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
88
99
}
89
100
90
101
// addUseCount 添加引用次数
@@ -212,7 +223,18 @@ func (d *HaSqliteDB) Restore(s3Store s3.S3Store, remotePath string) (int64, erro
212
223
if err != nil {
213
224
return 0 , fmt .Errorf ("restore close db error:%v" , err )
214
225
}
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
+ }()
216
238
_ , err = io .Copy (fileBackup , dbFile )
217
239
if err != nil {
218
240
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
228
250
if err != nil {
229
251
break
230
252
}
253
+ log .Error (fmt .Sprintf ("Restore rollback db error(%d):%v(%s)" , i , err , d .dataSourceName ))
231
254
}
232
255
}
233
256
size , err := io .Copy (dbFile , file )
0 commit comments