fix: only count hard-links once when calculating filesystem usage (#181)
This commit is contained in:
parent
934bf2493d
commit
1d8b383682
|
@ -1,6 +1,8 @@
|
||||||
package filesystem
|
package filesystem
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
"slices"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
@ -164,6 +166,8 @@ func (fs *Filesystem) DirectorySize(root string) (int64, error) {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var hardLinks []uint64
|
||||||
|
|
||||||
var size atomic.Int64
|
var size atomic.Int64
|
||||||
err = fs.unixFS.WalkDirat(dirfd, name, func(dirfd int, name, _ string, d ufs.DirEntry, err error) error {
|
err = fs.unixFS.WalkDirat(dirfd, name, func(dirfd int, name, _ string, d ufs.DirEntry, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -180,8 +184,16 @@ func (fs *Filesystem) DirectorySize(root string) (int64, error) {
|
||||||
return errors.Wrap(err, "lstatat err")
|
return errors.Wrap(err, "lstatat err")
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: detect if info is a hard-link and de-duplicate it.
|
var sysFileInfo = info.Sys().(*unix.Stat_t)
|
||||||
// ref; https://github.com/pterodactyl/wings/pull/181/files
|
if sysFileInfo.Nlink > 1 {
|
||||||
|
// Hard links have the same inode number
|
||||||
|
if slices.Contains(hardLinks, sysFileInfo.Ino) {
|
||||||
|
// Don't add hard links size twice
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
hardLinks = append(hardLinks, sysFileInfo.Ino)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size.Add(info.Size())
|
size.Add(info.Size())
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in New Issue
Block a user