]> Sergey Matveev's repositories - btrtrc.git/commitdiff
sqlite storage: Batch writes synchronously instead of buffering them first
authorMatt Joiner <anacrolix@gmail.com>
Tue, 3 Nov 2020 04:16:57 +0000 (15:16 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 3 Nov 2020 04:16:57 +0000 (15:16 +1100)
storage/sqlite/sqlite-storage.go

index 8c2a770e1f8323ee5c8b4dfd1787af466da28217..c0e59ccbcad6f0fd7893b038b020456fc2a4c182 100644 (file)
@@ -325,33 +325,33 @@ func providerWriter(writes <-chan writeRequest, pool ConnPool) {
                if !ok {
                        return
                }
-               buf := []writeRequest{first}
-       buffer:
-               for {
-                       select {
-                       case wr, ok := <-writes:
-                               if !ok {
-                                       break buffer
-                               }
-                               buf = append(buf, wr)
-                       default:
-                               break buffer
-                       }
-               }
+               buf := []chan<- struct{}{first.done}
                var cantFail error
                func() {
                        conn := pool.Get(context.TODO())
                        defer pool.Put(conn)
                        defer sqlitex.Save(conn)(&cantFail)
-                       for _, wr := range buf {
-                               wr.query(conn)
+                       first.query(conn)
+                       for {
+                               select {
+                               case wr, ok := <-writes:
+                                       if ok {
+                                               buf = append(buf, wr.done)
+                                               wr.query(conn)
+                                               continue
+                                       }
+                               default:
+                               }
+                               break
                        }
                }()
+               // Not sure what to do if this failed.
                if cantFail != nil {
                        panic(cantFail)
                }
-               for _, wr := range buf {
-                       close(wr.done)
+               // Signal done after we know the transaction succeeded.
+               for _, done := range buf {
+                       close(done)
                }
                //log.Printf("batched %v write queries", len(buf))
        }