b2: Enable mod time syncing - fixes #348

This commit is contained in:
Nick Craig-Wood 2016-03-22 15:23:37 +00:00
parent 414b35ea56
commit cb22583212
5 changed files with 19 additions and 14 deletions

View File

@ -615,7 +615,7 @@ func (f *Fs) Rmdir() error {
// Precision of the remote // Precision of the remote
func (f *Fs) Precision() time.Duration { func (f *Fs) Precision() time.Duration {
return fs.ModTimeNotSupported return time.Second
} }
// deleteByID deletes a file version given Name and ID // deleteByID deletes a file version given Name and ID

View File

@ -96,9 +96,10 @@ The modified time is stored as metadata on the object as
in the Backblaze standard. Other tools should be able to use this as in the Backblaze standard. Other tools should be able to use this as
a modified time. a modified time.
Modified times are set on upload, read on download and shown in Modified times are used in syncing and are fully supported except in
listings. They are not used in syncing as unfortunately B2 doesn't the case of updating a modification time on an existing object. In
have an API method to set them independently of doing an upload. this case the object will be uploaded again as B2 doesn't have an API
method to set the modification time independent of doing an upload.
### SHA1 checksums ### ### SHA1 checksums ###
@ -124,6 +125,3 @@ the old versions will be deleted.
Here are [some notes I made on the backblaze Here are [some notes I made on the backblaze
API](https://gist.github.com/ncw/166dabf352b399f1cc1c) while API](https://gist.github.com/ncw/166dabf352b399f1cc1c) while
integrating it with rclone which detail the changes I'd like to see. integrating it with rclone which detail the changes I'd like to see.
With a couple of small tweaks Backblaze could enable rclone to not
make a temporary copy of files when doing cloud to cloud copies and
fully support modification times.

View File

@ -25,7 +25,7 @@ Here is an overview of the major features of each cloud storage system.
| Amazon Cloud Drive | MD5 | No | Yes | No | | Amazon Cloud Drive | MD5 | No | Yes | No |
| Microsoft One Drive | SHA1 | Yes | Yes | No | | Microsoft One Drive | SHA1 | Yes | Yes | No |
| Hubic | MD5 | Yes | No | No | | Hubic | MD5 | Yes | No | No |
| Backblaze B2 | SHA1 | Partial | No | No | | Backblaze B2 | SHA1 | Yes | No | No |
| Yandex Disk | MD5 | Yes | No | No | | Yandex Disk | MD5 | Yes | No | No |
| The local filesystem | All | Yes | Depends | No | | The local filesystem | All | Yes | Depends | No |
@ -49,9 +49,6 @@ default, though the MD5SUM can be checked with the `--checksum` flag.
All cloud storage systems support some kind of date on the object and All cloud storage systems support some kind of date on the object and
these will be set when transferring from the cloud storage system. these will be set when transferring from the cloud storage system.
Backblaze B2 preserves file modification times on files uploaded and
downloaded, but doesn't use them to decide which objects to sync.
### Case Insensitive ### ### Case Insensitive ###
If a cloud storage systems is case sensitive then it is possible to If a cloud storage systems is case sensitive then it is possible to
@ -78,4 +75,5 @@ systems.
If a cloud storage system allows duplicate files then it can have two If a cloud storage system allows duplicate files then it can have two
objects with the same name. objects with the same name.
This confuses rclone greatly when syncing. This confuses rclone greatly when syncing - use the `rclone dedupe`
command to rename or remove duplicates.

View File

@ -146,7 +146,10 @@ func Equal(src, dst Object) bool {
// Size and hash the same but mtime different so update the // Size and hash the same but mtime different so update the
// mtime of the dst object here // mtime of the dst object here
err := dst.SetModTime(srcModTime) err := dst.SetModTime(srcModTime)
if err != nil { if err == ErrorCantSetModTime {
Debug(src, "src and dst identical but can't set mod time without re-uploading")
return false
} else if err != nil {
Stats.Error() Stats.Error()
ErrorLog(dst, "Failed to read set modification time: %s", err) ErrorLog(dst, "Failed to read set modification time: %s", err)
} }

View File

@ -497,7 +497,13 @@ func TestObjectSetModTime(t *testing.T) {
skipIfNotOk(t) skipIfNotOk(t)
newModTime := fstest.Time("2011-12-13T14:15:16.999999999Z") newModTime := fstest.Time("2011-12-13T14:15:16.999999999Z")
obj := findObject(t, file1.Path) obj := findObject(t, file1.Path)
obj.SetModTime(newModTime) err := obj.SetModTime(newModTime)
if err == fs.ErrorCantSetModTime {
t.Log(err)
return
} else if err != nil {
t.Fatal(err)
}
file1.ModTime = newModTime file1.ModTime = newModTime
file1.CheckModTime(t, obj, obj.ModTime(), remote.Precision()) file1.CheckModTime(t, obj, obj.ModTime(), remote.Precision())
// And make a new object and read it from there too // And make a new object and read it from there too