//go:build linux package host import ( "context" "github.com/carlosframework/platform/internal/instancefs" "os" "time" "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/instancectl" "golang.org/x/sys/unix" ) func (f *servingParkFS) room() error { parent, _, err := f.parent() if err != nil { return err } defer parent.Close() return servingRoomFile(parent) } func servingRoomFile(parent *os.File) error { var s unix.Statfs_t if err := unix.Fstatfs(int(parent.Fd()), &s); err != nil { return err } if s.Bsize <= 0 || s.Blocks > ^uint64(0)/uint64(s.Bsize) || s.Bavail > ^uint64(0)/uint64(s.Bsize) { return hostbox.ErrChanged } if s.Bavail*uint64(s.Bsize) < instancectl.DiskFloor(s.Blocks*uint64(s.Bsize)) { return instancectl.ErrDiskFull } return nil } func (p *servingParkRoot) maintainServingParks(ctx context.Context, after string) (string, error) { fs, ok := p.ledger.fs.(*servingParkFS) if !ok { return after, hostbox.ErrUnsupported } return maintainServingParkPass(ctx, after, func(call context.Context) error { return p.ledger.maintainParks(call, fs.room) }, p.recoverServingParks, 10*time.Second) } func claimServingRoom(data string) error { parent, err := instancefs.OpenDirBeneath(data, "instances") if err != nil { return err } defer parent.Close() return servingRoomFile(parent) }