vfs: update cached copy if we know it has changed even if pending opens

This fixes a problem with Caddy serving corrupted files out of the VFS
cache when the file on the remote changed.
This commit is contained in:
Nick Craig-Wood 2018-03-02 16:01:13 +00:00
parent 9b011ce7e4
commit 5795bd7db6

View File

@ -112,8 +112,8 @@ func (fh *RWFileHandle) openPending(truncate bool) (err error) {
// if not truncating the file, need to read it first // if not truncating the file, need to read it first
if fh.flags&os.O_TRUNC == 0 && !truncate { if fh.flags&os.O_TRUNC == 0 && !truncate {
// If the remote object exists AND its cached file exists locally AND there are no // If the remote object exists AND its cached file exists locally AND there are no
// other handles with it open writers, then attempt to update it. // other RW handles with it open, then attempt to update it.
if o != nil && fh.d.vfs.cache.opens(fh.remote) <= 1 { if o != nil && fh.file.rwOpens() == 0 {
cacheObj, err := fh.d.vfs.cache.f.NewObject(fh.remote) cacheObj, err := fh.d.vfs.cache.f.NewObject(fh.remote)
if err == nil && cacheObj != nil { if err == nil && cacheObj != nil {
cacheObj, err = copyObj(fh.d.vfs.cache.f, cacheObj, fh.remote, o) cacheObj, err = copyObj(fh.d.vfs.cache.f, cacheObj, fh.remote, o)