forked from TrueCloudLab/rclone
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:
parent
85e0b87c99
commit
0175332987
3 changed files with 54 additions and 1 deletions
|
@ -5,6 +5,7 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/ncw/rclone/fs"
|
"github.com/ncw/rclone/fs"
|
||||||
"github.com/ncw/rclone/fstest"
|
"github.com/ncw/rclone/fstest"
|
||||||
|
@ -562,3 +563,27 @@ func TestRWFileHandleOpenTests(t *testing.T) {
|
||||||
testRWFileHandleOpenTest(t, vfs, &test)
|
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())
|
||||||
|
}
|
||||||
|
|
|
@ -181,7 +181,10 @@ func (fh *WriteFileHandle) close() (err error) {
|
||||||
}
|
}
|
||||||
fh.closed = true
|
fh.closed = true
|
||||||
// leave writer open until file is transferred
|
// 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 file not opened and not safe to truncate then then leave file intact
|
||||||
if !fh.opened && !fh.safeToTruncate() {
|
if !fh.opened && !fh.safeToTruncate() {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -3,6 +3,7 @@ package vfs
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/ncw/rclone/fs"
|
"github.com/ncw/rclone/fs"
|
||||||
"github.com/ncw/rclone/fstest"
|
"github.com/ncw/rclone/fstest"
|
||||||
|
@ -214,3 +215,27 @@ func TestWriteFileHandleRelease(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, fh.closed)
|
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())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue