Adjust sizes on the fly when files are written/decompressed

This commit is contained in:
Dane Everitt 2020-08-23 15:58:56 -07:00
parent b8dfb02c10
commit 999947e387
No known key found for this signature in database
GPG Key ID: EEA66103B3D71F53
2 changed files with 30 additions and 12 deletions

View File

@ -305,17 +305,21 @@ func (fs *Filesystem) Readfile(p string) (io.Reader, error) {
} }
// Writes a file to the system. If the file does not already exist one will be created. // Writes a file to the system. If the file does not already exist one will be created.
//
// @todo should probably have a write lock here so we don't write twice at once.
func (fs *Filesystem) Writefile(p string, r io.Reader) error { func (fs *Filesystem) Writefile(p string, r io.Reader) error {
cleaned, err := fs.SafePath(p) cleaned, err := fs.SafePath(p)
if err != nil { if err != nil {
return errors.WithStack(err) return errors.WithStack(err)
} }
var currentSize int64
// If the file does not exist on the system already go ahead and create the pathway // If the file does not exist on the system already go ahead and create the pathway
// to it and an empty file. We'll then write to it later on after this completes. // to it and an empty file. We'll then write to it later on after this completes.
if stat, err := os.Stat(cleaned); err != nil && os.IsNotExist(err) { if stat, err := os.Stat(cleaned); err != nil {
if !os.IsNotExist(err) {
return errors.WithStack(err)
}
if err := os.MkdirAll(filepath.Dir(cleaned), 0755); err != nil { if err := os.MkdirAll(filepath.Dir(cleaned), 0755); err != nil {
return errors.WithStack(err) return errors.WithStack(err)
} }
@ -323,10 +327,12 @@ func (fs *Filesystem) Writefile(p string, r io.Reader) error {
if err := fs.Chown(filepath.Dir(cleaned)); err != nil { if err := fs.Chown(filepath.Dir(cleaned)); err != nil {
return errors.WithStack(err) return errors.WithStack(err)
} }
} else if err != nil { } else {
return errors.WithStack(err) if stat.IsDir() {
} else if stat.IsDir() { return errors.New("cannot write file contents to a directory")
return errors.New("cannot use a directory as a file for writing") }
currentSize = stat.Size()
} }
// This will either create the file if it does not already exist, or open and // This will either create the file if it does not already exist, or open and
@ -340,8 +346,10 @@ func (fs *Filesystem) Writefile(p string, r io.Reader) error {
// Create a new buffered writer that will write to the file we just opened // Create a new buffered writer that will write to the file we just opened
// and stream in the contents from the reader. // and stream in the contents from the reader.
w := bufio.NewWriter(file) w := bufio.NewWriter(file)
buf := make([]byte, 1024) buf := make([]byte, 1024)
var sizeWritten int
for { for {
n, err := r.Read(buf) n, err := r.Read(buf)
if err != nil && err != io.EOF { if err != nil && err != io.EOF {
@ -352,8 +360,10 @@ func (fs *Filesystem) Writefile(p string, r io.Reader) error {
break break
} }
if _, err := w.Write(buf[:n]); err != nil { if sz, err := w.Write(buf[:n]); err != nil {
return errors.WithStack(err) return errors.WithStack(err)
} else {
sizeWritten += sz
} }
} }
@ -361,6 +371,9 @@ func (fs *Filesystem) Writefile(p string, r io.Reader) error {
return errors.WithStack(err) return errors.WithStack(err)
} }
// Adjust the disk usage to account for the old size and the new size of the file.
atomic.AddInt64(&fs.diskUsage, int64(sizeWritten) - currentSize)
// Finally, chown the file to ensure the permissions don't end up out-of-whack // Finally, chown the file to ensure the permissions don't end up out-of-whack
// if we had just created it. // if we had just created it.
return fs.Chown(cleaned) return fs.Chown(cleaned)

View File

@ -129,7 +129,12 @@ func (fs *Filesystem) extractFileFromArchive(f archiver.File) error {
defer o.Close() defer o.Close()
_, cerr := io.Copy(o, f) sz, cerr := io.Copy(o, f)
if cerr != nil {
return cerr return errors.WithStack(err)
}
atomic.AddInt64(&fs.diskUsage, sz)
return nil
} }