/
purge.go
50 lines (40 loc) · 971 Bytes
/
purge.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
package cachectl
import (
"fmt"
"log"
"os"
"golang.org/x/sys/unix"
)
func purgePages(fpath string, fsize int64, rate float64) error {
if rate < 0.0 || rate > 1.0 {
return fmt.Errorf("%.1f: rate should be over 0.0 and less than 1.0\n", rate)
}
f, err := os.Open(fpath)
if err != nil {
return err
}
defer f.Close()
err = unix.Fadvise(int(f.Fd()), 0, int64(float64(fsize)*rate), unix.FADV_DONTNEED)
if err != nil {
return fmt.Errorf("failed to purge page cache for %s", fpath)
}
return nil
}
func RunPurgePages(path string, fsize int64, rate float64, verbose bool) error {
if verbose {
fmt.Printf("Before purging %s 's page cache\n\n", path)
PrintPagesStat(path, fsize)
} else {
log.Printf("purging %s 's page cache\n", path)
}
err := purgePages(path, fsize, rate)
if err != nil {
return err
}
if verbose {
fmt.Printf("\nAfter purging %s 's page cache\n\n", path)
PrintPagesStat(path, fsize)
fmt.Println()
}
return nil
}