Skip to content

Commit 0d51bfd

Browse files
committed
sqlite: turn off autocheckpointing
Temporary workaround for tailscale/corp#2730.
1 parent 1cb802b commit 0d51bfd

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

cgosqlite/cgosqlite.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ func (db *DB) Checkpoint(dbName string, mode sqliteh.Checkpoint) (int, int, erro
131131
return int(nLog), int(nCkpt), errCode(res)
132132
}
133133

134+
func (db *DB) AutoCheckpoint(n int) error {
135+
res := C.sqlite3_wal_autocheckpoint(db.db, C.int(n))
136+
return errCode(res)
137+
}
138+
134139
func (db *DB) TxnState(schema string) sqliteh.TxnState {
135140
var cSchema *C.char
136141
if schema != "" {

sqlite.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,9 @@ type connector struct {
120120
traceFunc TraceFunc
121121
}
122122

123-
func (c *connector) Driver() driver.Driver { return drv{} }
124-
func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
125-
db, err := Open(c.name, sqliteh.OpenFlagsDefault, "")
123+
func (p *connector) Driver() driver.Driver { return drv{} }
124+
func (p *connector) Connect(ctx context.Context) (driver.Conn, error) {
125+
db, err := Open(p.name, sqliteh.OpenFlagsDefault, "")
126126
if err != nil {
127127
if ec, ok := err.(sqliteh.ErrCode); ok {
128128
e := &Error{
@@ -139,8 +139,16 @@ func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
139139
}
140140
return nil, err
141141
}
142+
142143
db.BusyTimeout(2 * time.Second) // TODO: justify choice; make configurable?
143-
return &conn{db: db, traceFunc: c.traceFunc}, nil
144+
145+
if err := db.AutoCheckpoint(0); err != nil {
146+
db.Close()
147+
return nil, fmt.Errorf("sqlite.Open: wal_autocheckpoint: %w", err)
148+
}
149+
150+
c := &conn{db: db, traceFunc: p.traceFunc}
151+
return c, nil
144152
}
145153

146154
type conn struct {
@@ -722,7 +730,7 @@ func TxnState(sqlconn SQLConn, schema string) (state sqliteh.TxnState, err error
722730
return state, sqlconn.Raw(func(driverConn interface{}) error {
723731
c, ok := driverConn.(*conn)
724732
if !ok {
725-
return fmt.Errorf("sqlite.BusyTimeout: sql.Conn is not the sqlite driver: %T", driverConn)
733+
return fmt.Errorf("sqlite.TxnState: sql.Conn is not the sqlite driver: %T", driverConn)
726734
}
727735
state = c.db.TxnState(schema)
728736
return nil
@@ -734,7 +742,7 @@ func Checkpoint(sqlconn SQLConn, dbName string, mode sqliteh.Checkpoint) (numFra
734742
err = sqlconn.Raw(func(driverConn interface{}) error {
735743
c, ok := driverConn.(*conn)
736744
if !ok {
737-
return fmt.Errorf("sqlite.BusyTimeout: sql.Conn is not the sqlite driver: %T", driverConn)
745+
return fmt.Errorf("sqlite.Checkpoint: sql.Conn is not the sqlite driver: %T", driverConn)
738746
}
739747
numFrames, numFramesCheckpointed, err = c.db.Checkpoint(dbName, mode)
740748
return reserr(c.db, "Checkpoint", dbName, err)

sqliteh/sqliteh.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ type DB interface {
4747
BusyTimeout(time.Duration)
4848
// Checkpoint is sqlite3_wal_checkpoint_v2.
4949
Checkpoint(db string, mode Checkpoint) (numFrames, numFramesCheckpointed int, err error)
50+
// AutoCheckpoint is sqlite3_wal_autocheckpoint.
51+
// https://sqlite.org/c3ref/wal_autocheckpoint.html
52+
AutoCheckpoint(n int) error
5053
// TxnState is sqlite3_txn_state.
5154
TxnState(schema string) TxnState
5255
}

0 commit comments

Comments
 (0)