Adjust sizes on the fly when files are written/decompressed
This commit is contained in:
parent
b8dfb02c10
commit
999947e387
|
@ -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)
|
||||||
|
|
|
@ -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 errors.WithStack(err)
|
||||||
|
}
|
||||||
|
|
||||||
return cerr
|
atomic.AddInt64(&fs.diskUsage, sz)
|
||||||
}
|
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user