lib/model: Track puller creation times (fixes #3145)

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3150
This commit is contained in:
Audrius Butkevicius
2016-05-22 10:16:09 +00:00
committed by Jakob Borg
parent 44290a66b7
commit 00be2bf18d
4 changed files with 21 additions and 3 deletions

View File

@@ -245,6 +245,18 @@ func TestSendDownloadProgressMessages(t *testing.T) {
expect(1, state1, protocol.UpdateTypeAppend, v2, []int32{1, 2}, true) expect(1, state1, protocol.UpdateTypeAppend, v2, []int32{1, 2}, true)
expectEmpty() expectEmpty()
// Returns forget and append if sharedPullerState creation timer changes.
state1.available = []int32{1}
state1.availableUpdated = tick()
state1.created = tick()
p.sendDownloadProgressMessages()
expect(0, state1, protocol.UpdateTypeForget, v2, nil, false)
expect(1, state1, protocol.UpdateTypeAppend, v2, []int32{1}, true)
expectEmpty()
// Sends an empty update if new file exists, but does not have any blocks yet. (To indicate that the old blocks are no longer available) // Sends an empty update if new file exists, but does not have any blocks yet. (To indicate that the old blocks are no longer available)
state1.file.Version = v1 state1.file.Version = v1
state1.available = nil state1.available = nil

View File

@@ -1011,6 +1011,7 @@ func (f *rwFolder) handleFile(file protocol.FileInfo, copyChan chan<- copyBlocks
version: curFile.Version, version: curFile.Version,
mut: sync.NewRWMutex(), mut: sync.NewRWMutex(),
sparse: f.allowSparse, sparse: f.allowSparse,
created: time.Now(),
} }
l.Debugf("%v need file %s; copy %d, reused %v", f, file.Name, len(blocks), reused) l.Debugf("%v need file %s; copy %d, reused %v", f, file.Name, len(blocks), reused)

View File

@@ -18,6 +18,7 @@ type sentFolderFileDownloadState struct {
blockIndexes []int32 blockIndexes []int32
version protocol.Vector version protocol.Vector
updated time.Time updated time.Time
created time.Time
} }
// sentFolderDownloadState represents a state of what we've announced as available // sentFolderDownloadState represents a state of what we've announced as available
@@ -41,6 +42,7 @@ func (s *sentFolderDownloadState) update(pullers []*sharedPullerState) []protoco
pullerBlockIndexes := puller.Available() pullerBlockIndexes := puller.Available()
pullerVersion := puller.file.Version pullerVersion := puller.file.Version
pullerBlockIndexesUpdated := puller.AvailableUpdated() pullerBlockIndexesUpdated := puller.AvailableUpdated()
pullerCreated := puller.created
localFile, ok := s.files[name] localFile, ok := s.files[name]
@@ -52,6 +54,7 @@ func (s *sentFolderDownloadState) update(pullers []*sharedPullerState) []protoco
blockIndexes: pullerBlockIndexes, blockIndexes: pullerBlockIndexes,
updated: pullerBlockIndexesUpdated, updated: pullerBlockIndexesUpdated,
version: pullerVersion, version: pullerVersion,
created: pullerCreated,
} }
updates = append(updates, protocol.FileDownloadProgressUpdate{ updates = append(updates, protocol.FileDownloadProgressUpdate{
@@ -70,9 +73,9 @@ func (s *sentFolderDownloadState) update(pullers []*sharedPullerState) []protoco
continue continue
} }
if !pullerVersion.Equal(localFile.version) { if !pullerVersion.Equal(localFile.version) || !pullerCreated.Equal(localFile.created) {
// The version has changed, clean up whatever we had for the old // The version has changed or the puller was reconstrcuted due to failure.
// file, and advertise the new file. // Clean up whatever we had for the old file, and advertise the new file.
updates = append(updates, protocol.FileDownloadProgressUpdate{ updates = append(updates, protocol.FileDownloadProgressUpdate{
Name: name, Name: name,
Version: localFile.version, Version: localFile.version,
@@ -87,6 +90,7 @@ func (s *sentFolderDownloadState) update(pullers []*sharedPullerState) []protoco
localFile.blockIndexes = pullerBlockIndexes localFile.blockIndexes = pullerBlockIndexes
localFile.updated = pullerBlockIndexesUpdated localFile.updated = pullerBlockIndexesUpdated
localFile.version = pullerVersion localFile.version = pullerVersion
localFile.created = pullerCreated
continue continue
} }

View File

@@ -29,6 +29,7 @@ type sharedPullerState struct {
ignorePerms bool ignorePerms bool
version protocol.Vector // The current (old) version version protocol.Vector // The current (old) version
sparse bool sparse bool
created time.Time
// Mutable, must be locked for access // Mutable, must be locked for access
err error // The first error we hit err error // The first error we hit