vfs: fix applying modtime for an open Write Handle

The symptom of this was that the time set when the file was open was
lost.  This was causing one of the mount tests to fail too.
This commit is contained in:
Nick Craig-Wood 2018-03-06 20:47:11 +00:00
parent 85e0b87c99
commit 0175332987
3 changed files with 54 additions and 1 deletions

View File

@ -5,6 +5,7 @@ import (
"io/ioutil"
"os"
"testing"
"time"
"github.com/ncw/rclone/fs"
"github.com/ncw/rclone/fstest"
@ -562,3 +563,27 @@ func TestRWFileHandleOpenTests(t *testing.T) {
testRWFileHandleOpenTest(t, vfs, &test)
}
}
// tests mod time on open files
func TestRWFileModTimeWithOpenWriters(t *testing.T) {
r := fstest.NewRun(t)
defer r.Finalise()
vfs, fh := rwHandleCreateWriteOnly(t, r)
mtime := time.Date(2012, 11, 18, 17, 32, 31, 0, time.UTC)
_, err := fh.Write([]byte{104, 105})
require.NoError(t, err)
err = fh.Node().SetModTime(mtime)
require.NoError(t, err)
err = fh.Close()
require.NoError(t, err)
info, err := vfs.Stat("file1")
require.NoError(t, err)
// avoid errors because of timezone differences
assert.Equal(t, info.ModTime().Unix(), mtime.Unix())
}

View File

@ -181,7 +181,10 @@ func (fh *WriteFileHandle) close() (err error) {
}
fh.closed = true
// leave writer open until file is transferred
defer fh.file.delWriter(fh, false)
defer func() {
fh.file.delWriter(fh, false)
fh.file.finishWriterClose()
}()
// If file not opened and not safe to truncate then then leave file intact
if !fh.opened && !fh.safeToTruncate() {
return nil

View File

@ -3,6 +3,7 @@ package vfs
import (
"os"
"testing"
"time"
"github.com/ncw/rclone/fs"
"github.com/ncw/rclone/fstest"
@ -214,3 +215,27 @@ func TestWriteFileHandleRelease(t *testing.T) {
assert.NoError(t, err)
assert.True(t, fh.closed)
}
// tests mod time on open files
func TestWriteFileModTimeWithOpenWriters(t *testing.T) {
r := fstest.NewRun(t)
defer r.Finalise()
vfs, fh := writeHandleCreate(t, r)
mtime := time.Date(2012, 11, 18, 17, 32, 31, 0, time.UTC)
_, err := fh.Write([]byte{104, 105})
require.NoError(t, err)
err = fh.Node().SetModTime(mtime)
require.NoError(t, err)
err = fh.Close()
require.NoError(t, err)
info, err := vfs.Stat("file1")
require.NoError(t, err)
// avoid errors because of timezone differences
assert.Equal(t, info.ModTime().Unix(), mtime.Unix())
}