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