lib/model: Track puller creation times (fixes #3145)
GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3150
This commit is contained in:
committed by
Jakob Borg
parent
44290a66b7
commit
00be2bf18d
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user