From: Matt Joiner Date: Mon, 17 May 2021 01:42:27 +0000 (+1000) Subject: Make synchronous=off the default X-Git-Tag: v1.29.0~41 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=7798e2a3067ec27f89d73ea668473a024b983a26;p=btrtrc.git Make synchronous=off the default --- diff --git a/storage/sqlite/sqlite-storage.go b/storage/sqlite/sqlite-storage.go index a0450db7..172f1d35 100644 --- a/storage/sqlite/sqlite-storage.go +++ b/storage/sqlite/sqlite-storage.go @@ -26,19 +26,12 @@ import ( type conn = *sqlite.Conn type InitConnOpts struct { - SetSynchronous string + SetSynchronous int SetJournalMode string MmapSizeOk bool // If false, a package-specific default will be used. MmapSize int64 // If MmapSizeOk is set, use sqlite default if < 0, otherwise this value. } -func (me InitConnOpts) JournalMode() string { - if me.SetJournalMode != "" { - return me.SetJournalMode - } - return "wal" -} - type UnexpectedJournalMode struct { JournalMode string } @@ -47,19 +40,43 @@ func (me UnexpectedJournalMode) Error() string { return fmt.Sprintf("unexpected journal mode: %q", me.JournalMode) } +func setSynchronous(conn conn, syncInt int) (err error) { + err = sqlitex.ExecTransient(conn, fmt.Sprintf(`pragma synchronous=%v`, syncInt), nil) + if err != nil { + return err + } + var ( + actual int + actualOk bool + ) + err = sqlitex.ExecTransient(conn, `pragma synchronous`, func(stmt *sqlite.Stmt) error { + actual = stmt.ColumnInt(0) + actualOk = true + return nil + }) + if err != nil { + return + } + if !actualOk { + return errors.New("synchronous setting query didn't return anything") + } + if actual != syncInt { + return fmt.Errorf("set synchronous %q, got %q", syncInt, actual) + } + return nil +} + func initConn(conn conn, opts InitConnOpts) (err error) { + err = setSynchronous(conn, opts.SetSynchronous) + if err != nil { + return + } // Recursive triggers are required because we need to trim the blob_meta size after trimming to // capacity. Hopefully we don't hit the recursion limit, and if we do, there's an error thrown. err = sqlitex.ExecTransient(conn, "pragma recursive_triggers=on", nil) if err != nil { return err } - if opts.SetSynchronous != "" { - err = sqlitex.ExecTransient(conn, `pragma synchronous=`+opts.SetSynchronous, nil) - if err != nil { - return err - } - } if opts.SetJournalMode != "" { err = sqlitex.ExecTransient(conn, fmt.Sprintf(`pragma journal_mode=%s`, opts.SetJournalMode), func(stmt *sqlite.Stmt) error { ret := stmt.ColumnText(0) diff --git a/storage/sqlite/sqlite-storage_test.go b/storage/sqlite/sqlite-storage_test.go index b19556b2..409220f3 100644 --- a/storage/sqlite/sqlite-storage_test.go +++ b/storage/sqlite/sqlite-storage_test.go @@ -27,6 +27,7 @@ func newConnsAndProv(t *testing.T, opts NewPoolOpts) (ConnPool, *provider) { // sqlitex.Pool.Close doesn't like being called more than once. Let it slide for now. //t.Cleanup(func() { pool.Close() }) qt.Assert(t, initPoolDatabase(pool, InitDbOpts{}), qt.IsNil) + qt.Assert(t, initPoolConns(nil, pool, opts.InitConnOpts), qt.IsNil) prov, err := NewProvider(pool, ProviderOpts{BatchWrites: pool.NumConns() > 1}) require.NoError(t, err) t.Cleanup(func() { prov.Close() })