@@ -4,12 +4,15 @@ import (
44 "context"
55 "database/sql"
66 "os"
7+ "time"
78
89 "github.com/mattn/go-sqlite3"
10+ "github.com/pkg/errors"
911 "github.com/rancher/kine/pkg/drivers/generic"
1012 "github.com/rancher/kine/pkg/logstructured"
1113 "github.com/rancher/kine/pkg/logstructured/sqllog"
1214 "github.com/rancher/kine/pkg/server"
15+ "github.com/sirupsen/logrus"
1316
1417 // sqlite db driver
1518 _ "github.com/mattn/go-sqlite3"
@@ -34,20 +37,20 @@ var (
3437 }
3538)
3639
37- func New (dataSourceName string ) (server.Backend , error ) {
38- backend , _ , err := NewVariant ("sqlite3" , dataSourceName )
40+ func New (ctx context. Context , dataSourceName string ) (server.Backend , error ) {
41+ backend , _ , err := NewVariant (ctx , "sqlite3" , dataSourceName )
3942 return backend , err
4043}
4144
42- func NewVariant (driverName , dataSourceName string ) (server.Backend , * generic.Generic , error ) {
45+ func NewVariant (ctx context. Context , driverName , dataSourceName string ) (server.Backend , * generic.Generic , error ) {
4346 if dataSourceName == "" {
4447 if err := os .MkdirAll ("./db" , 0700 ); err != nil {
4548 return nil , nil , err
4649 }
4750 dataSourceName = "./db/state.db?_journal=WAL&cache=shared"
4851 }
4952
50- dialect , err := generic .Open (driverName , dataSourceName , "?" , false )
53+ dialect , err := generic .Open (ctx , driverName , dataSourceName , "?" , false )
5154 if err != nil {
5255 return nil , nil , err
5356 }
@@ -59,9 +62,27 @@ func NewVariant(driverName, dataSourceName string) (server.Backend, *generic.Gen
5962 return err
6063 }
6164
62- if err := setup (dialect .DB ); err != nil {
63- return nil , nil , err
65+ // this is the first SQL that will be executed on a new DB conn so
66+ // loop on failure here because in the case of dqlite it could still be initializing
67+ for i := 0 ; i < 300 ; i ++ {
68+ err = setup (dialect .DB )
69+ if err == nil {
70+ break
71+ }
72+ logrus .Errorf ("failed to setup db: %v" , err )
73+ select {
74+ case <- ctx .Done ():
75+ return nil , nil , ctx .Err ()
76+ case <- time .After (time .Second ):
77+ }
78+ time .Sleep (time .Second )
79+ }
80+ if err != nil {
81+ return nil , nil , errors .Wrap (err , "setup db" )
6482 }
83+ //if err := setup(dialect.DB); err != nil {
84+ // return nil, nil, errors.Wrap(err, "setup db")
85+ //}
6586
6687 dialect .Migrate (context .Background ())
6788 return logstructured .New (sqllog .New (dialect )), dialect , nil
0 commit comments