]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Make synchronous=off the default
authorMatt Joiner <anacrolix@gmail.com>
Mon, 17 May 2021 01:42:27 +0000 (11:42 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 17 May 2021 01:56:10 +0000 (11:56 +1000)
storage/sqlite/sqlite-storage.go
storage/sqlite/sqlite-storage_test.go

index a0450db7eba366c9fe8ca4bc7cdd6a9c69e09c1c..172f1d352b0157a4372cf11557ffe58ce801aa59 100644 (file)
@@ -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)
index b19556b2f03d83fb70e543ccc019d2cc264786c6..409220f346a06520bde6cd328adca14fd8b7608e 100644 (file)
@@ -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() })