mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-26 08:35:17 +00:00
108 lines
2.2 KiB
Go
108 lines
2.2 KiB
Go
|
// Copyright 2019 The LevelDB-Go and Pebble Authors. All rights reserved. Use
|
||
|
// of this source code is governed by a BSD-style license that can be found in
|
||
|
// the LICENSE file.
|
||
|
|
||
|
//go:build linux && !arm
|
||
|
// +build linux,!arm
|
||
|
|
||
|
package vfs
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"syscall"
|
||
|
"testing"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
func TestSyncRangeSmokeTest(t *testing.T) {
|
||
|
testCases := []struct {
|
||
|
err error
|
||
|
expected bool
|
||
|
}{
|
||
|
{nil, true},
|
||
|
{syscall.EINVAL, true},
|
||
|
{syscall.ENOSYS, false},
|
||
|
}
|
||
|
for i, c := range testCases {
|
||
|
t.Run("", func(t *testing.T) {
|
||
|
ok := syncRangeSmokeTest(uintptr(i),
|
||
|
func(fd int, off int64, n int64, flags int) (err error) {
|
||
|
if i != fd {
|
||
|
t.Fatalf("expected fd %d, but got %d", i, fd)
|
||
|
}
|
||
|
return c.err
|
||
|
})
|
||
|
if c.expected != ok {
|
||
|
t.Fatalf("expected %t, but got %t: %v", c.expected, ok, c.err)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkDirectIOWrite(b *testing.B) {
|
||
|
const targetSize = 16 << 20
|
||
|
const alignment = 4096
|
||
|
|
||
|
var wsizes []int
|
||
|
if testing.Verbose() {
|
||
|
wsizes = []int{4 << 10, 8 << 10, 16 << 10, 32 << 10}
|
||
|
} else {
|
||
|
wsizes = []int{4096}
|
||
|
}
|
||
|
|
||
|
for _, wsize := range wsizes {
|
||
|
b.Run(fmt.Sprintf("wsize=%d", wsize), func(b *testing.B) {
|
||
|
tmpf, err := os.CreateTemp("", "pebble-db-syncing-file-")
|
||
|
if err != nil {
|
||
|
b.Fatal(err)
|
||
|
}
|
||
|
filename := tmpf.Name()
|
||
|
_ = tmpf.Close()
|
||
|
defer os.Remove(filename)
|
||
|
|
||
|
var f *os.File
|
||
|
var size int
|
||
|
buf := make([]byte, wsize+alignment)
|
||
|
if a := uintptr(unsafe.Pointer(&buf[0])) & uintptr(alignment-1); a != 0 {
|
||
|
buf = buf[alignment-a:]
|
||
|
}
|
||
|
buf = buf[:wsize]
|
||
|
init := true
|
||
|
|
||
|
b.SetBytes(int64(len(buf)))
|
||
|
b.ResetTimer()
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
if f == nil {
|
||
|
b.StopTimer()
|
||
|
f, err = os.OpenFile(filename, syscall.O_DIRECT|os.O_RDWR, 0666)
|
||
|
if err != nil {
|
||
|
b.Fatal(err)
|
||
|
}
|
||
|
if init {
|
||
|
for size = 0; size < targetSize; size += len(buf) {
|
||
|
if _, err := f.WriteAt(buf, int64(size)); err != nil {
|
||
|
b.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if err := f.Sync(); err != nil {
|
||
|
b.Fatal(err)
|
||
|
}
|
||
|
size = 0
|
||
|
b.StartTimer()
|
||
|
}
|
||
|
if _, err := f.WriteAt(buf, int64(size)); err != nil {
|
||
|
b.Fatal(err)
|
||
|
}
|
||
|
size += len(buf)
|
||
|
if size >= targetSize {
|
||
|
_ = f.Close()
|
||
|
f = nil
|
||
|
}
|
||
|
}
|
||
|
b.StopTimer()
|
||
|
})
|
||
|
}
|
||
|
}
|