@@ -20,6 +20,7 @@ package fs
20
20
21
21
import (
22
22
"bufio"
23
+ "context"
23
24
"fmt"
24
25
"os"
25
26
"os/exec"
@@ -29,6 +30,7 @@ import (
29
30
"strconv"
30
31
"strings"
31
32
"syscall"
33
+ "time"
32
34
33
35
zfs "github.com/mistifyio/go-zfs"
34
36
mount "github.com/moby/sys/mountinfo"
@@ -716,16 +718,41 @@ func (i *RealFsInfo) GetDirUsage(dir string) (UsageInfo, error) {
716
718
}
717
719
718
720
func getVfsStats (path string ) (total uint64 , free uint64 , avail uint64 , inodes uint64 , inodesFree uint64 , err error ) {
719
- var s syscall.Statfs_t
720
- if err = syscall .Statfs (path , & s ); err != nil {
721
- return 0 , 0 , 0 , 0 , 0 , err
722
- }
723
- total = uint64 (s .Frsize ) * s .Blocks
724
- free = uint64 (s .Frsize ) * s .Bfree
725
- avail = uint64 (s .Frsize ) * s .Bavail
726
- inodes = uint64 (s .Files )
727
- inodesFree = uint64 (s .Ffree )
728
- return total , free , avail , inodes , inodesFree , nil
721
+ // timeout the context with, default is 2sec
722
+ timeout := 2
723
+ ctx , cancel := context .WithTimeout (context .Background (), time .Duration (timeout )* time .Second )
724
+ defer cancel ()
725
+
726
+ type result struct {
727
+ total uint64
728
+ free uint64
729
+ avail uint64
730
+ inodes uint64
731
+ inodesFree uint64
732
+ err error
733
+ }
734
+
735
+ resultChan := make (chan result , 1 )
736
+
737
+ go func () {
738
+ var s syscall.Statfs_t
739
+ if err = syscall .Statfs (path , & s ); err != nil {
740
+ total , free , avail , inodes , inodesFree = 0 , 0 , 0 , 0 , 0
741
+ }
742
+ total = uint64 (s .Frsize ) * s .Blocks
743
+ free = uint64 (s .Frsize ) * s .Bfree
744
+ avail = uint64 (s .Frsize ) * s .Bavail
745
+ inodes = uint64 (s .Files )
746
+ inodesFree = uint64 (s .Ffree )
747
+ resultChan <- result {total : total , free : free , avail : avail , inodes : inodes , inodesFree : inodesFree , err : err }
748
+ }()
749
+
750
+ select {
751
+ case <- ctx .Done ():
752
+ return 0 , 0 , 0 , 0 , 0 , ctx .Err ()
753
+ case res := <- resultChan :
754
+ return res .total , res .free , res .avail , res .inodes , res .inodesFree , res .err
755
+ }
729
756
}
730
757
731
758
// Devicemapper thin provisioning is detailed at
0 commit comments