InitDbOpts
InitConnOpts
GcBlobs bool
- CacheBlobs bool
+ NoCacheBlobs bool
BlobFlushInterval time.Duration
}
if err != nil {
return
}
+ if opts.PageSize == 0 {
+ // The largest size sqlite supports. I think we want this to be the smallest piece size we
+ // can expect, which is probably 1<<17.
+ opts.PageSize = 1 << 16
+ }
err = initDatabase(conn, opts.InitDbOpts)
if err != nil {
conn.Close()
conn.Close()
return
}
+ if opts.BlobFlushInterval == 0 && !opts.GcBlobs {
+ // This is influenced by typical busy timeouts, of 5-10s. We want to give other connections
+ // a few chances at getting a transaction through.
+ opts.BlobFlushInterval = time.Second
+ }
cl := &client{
conn: conn,
blobs: make(map[string]*sqlite.Blob),
) (n int, err error) {
p.l.Lock()
defer p.l.Unlock()
- if !p.opts.CacheBlobs {
+ if p.opts.NoCacheBlobs {
defer p.forgetBlob()
}
blob, err := p.getBlob(create)
if err != nil {
return
}
+ if opts.PageSize == 0 {
+ opts.PageSize = 1 << 14
+ }
err = initPoolDatabase(conns, opts.InitDbOpts)
if err != nil {
conns.Close()
func initDatabase(conn conn, opts InitDbOpts) (err error) {
if !opts.DontInitSchema {
- if opts.PageSize == 0 {
- // There doesn't seem to be an optimal size. I did try with the standard chunk size, but
- // the difference is not convincing.
-
- opts.PageSize = 1 << 14
- }
err = InitSchema(conn, opts.PageSize, !opts.NoTriggers)
if err != nil {
return
b.Run("CustomDirect", func(b *testing.B) {
var opts NewDirectStorageOpts
opts.Capacity = capacity
- opts.BlobFlushInterval = time.Second
- opts.CacheBlobs = true
- opts.SetJournalMode = "off"
+ opts.NoTriggers = noTriggers
benchOpts := func(b *testing.B) {
opts.Path = filepath.Join(b.TempDir(), "storage.db")
ci, err := NewDirectStorage(opts)
defer ci.Close()
runBench(b, ci)
}
- b.Run("Control", benchOpts)
- opts.PageSize = 1 << 16
- b.Run("64KiB_PageSize", benchOpts)
+ b.Run("Default", benchOpts)
})
for _, memory := range []bool{false, true} {
b.Run(fmt.Sprintf("Memory=%v", memory), func(b *testing.B) {
var opts NewDirectStorageOpts
opts.Memory = memory
opts.Capacity = capacity
- opts.CacheBlobs = true
//opts.GcBlobs = true
opts.BlobFlushInterval = time.Second
opts.NoTriggers = noTriggers
for _, journalMode := range []string{"", "wal", "off", "truncate", "delete", "persist", "memory"} {
opts.SetJournalMode = journalMode
b.Run("JournalMode="+journalMode, func(b *testing.B) {
- for _, mmapSize := range []int64{-1, 0, 1 << 23, 1 << 24, 1 << 25} {
+ for _, mmapSize := range []int64{-1} {
if memory && mmapSize >= 0 {
continue
}