forked from raj-prince/custom-go-client-benchmark
/
main.go
139 lines (109 loc) · 2.72 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package main
import (
"crypto/rand"
"flag"
"fmt"
"io"
"os"
"path"
"strconv"
"syscall"
"time"
"golang.org/x/sync/errgroup"
)
var (
fDir = flag.String("dir", "", "Directory file to be opened.")
fNumOfThreads = flag.Int("threads", 1, "Number of threads to read parallel")
fBlockSize = flag.Int("block-size", 256, "Block size in KB")
fileHandles []*os.File
eG errgroup.Group
OneKB = 1024
fFileSize = flag.Int("file-size", 1, "in KB")
fNumOfWrite = flag.Int("write-count", 1, "number of write iteration")
)
func openFile(index int) (err error) {
fileName := path.Join(*fDir, "file_"+strconv.Itoa(index))
fileHandle, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC|syscall.O_DIRECT, 0644)
if err != nil {
err = fmt.Errorf("while opening file: %w", err)
return
}
fileHandles[index] = fileHandle
return
}
// Expect file is already opened, otherwise throws error
func overWriteAlreadyOpenedFile(index int) (err error) {
for cnt := 0; cnt < *fNumOfWrite; cnt++ {
for i := 0; i < (*fFileSize / *fBlockSize); i++ {
b := make([]byte, *fBlockSize*OneKB)
startByte := int64(i * (*fBlockSize * OneKB))
_, err = rand.Read(b)
if err != nil {
return fmt.Errorf("while generating random bytest: %v", err)
}
_, err = fileHandles[index].Seek(startByte, io.SeekStart)
if err != nil {
return fmt.Errorf("while changing the seek position")
}
_, err = fileHandles[index].Write(b)
if err != nil {
return fmt.Errorf("while overwriting the file: %v", err)
}
err = fileHandles[index].Sync()
if err != nil {
return fmt.Errorf("while syncing the file: %v", err)
}
}
}
return
}
func runReadFileOperations() (err error) {
if *fDir == "" {
err = fmt.Errorf("you must set --dir flag")
return
}
if *fNumOfThreads <= 0 {
err = fmt.Errorf("threads count not valid")
return
}
fileHandles = make([]*os.File, *fNumOfThreads)
for i := 0; i < *fNumOfThreads; i++ {
err = openFile(i)
if err != nil {
err = fmt.Errorf("while opening file: %w", err)
return err
}
}
for i := 0; i < *fNumOfThreads; i++ {
index := i
eG.Go(func() error {
err := overWriteAlreadyOpenedFile(index)
if err != nil {
err = fmt.Errorf("while reading file: %w", err)
return err
}
return err
})
}
err = eG.Wait()
if err == nil {
fmt.Println("write benchmark completed successfully!")
fmt.Println("Waiting for 3 minutes")
time.Sleep(3 * time.Minute)
}
for i := 0; i < *fNumOfThreads; i++ {
if err = fileHandles[i].Close(); err != nil {
err = fmt.Errorf("while closing the fileHandle: %w", err)
return
}
}
return
}
func main() {
flag.Parse()
err := runReadFileOperations()
if err != nil {
fmt.Println(os.Stderr, err)
os.Exit(1)
}
}