Delete deadlock

This commit is contained in:
Jakob Borg 2014-01-14 17:47:27 -07:00
parent 8d5aed410f
commit fff50b5472
1 changed files with 12 additions and 3 deletions

View File

@ -138,7 +138,7 @@ func (m *Model) StartRW(del bool, threads int) {
go m.cleanTempFiles() go m.cleanTempFiles()
if del { if del {
go m.deleteFiles() go m.deleteLoop()
} }
} }
@ -654,6 +654,8 @@ func (m *Model) recomputeGlobal() {
// Must be called with the write lock held. // Must be called with the write lock held.
func (m *Model) recomputeNeed() { func (m *Model) recomputeNeed() {
var toDelete []File
for n, gf := range m.global { for n, gf := range m.global {
if m.fq.Queued(n) { if m.fq.Queued(n) {
continue continue
@ -677,7 +679,7 @@ func (m *Model) recomputeNeed() {
} }
if gf.Flags&protocol.FlagDeleted != 0 { if gf.Flags&protocol.FlagDeleted != 0 {
m.dq <- gf toDelete = append(toDelete, gf)
} else { } else {
local, remote := BlockDiff(lf.Blocks, gf.Blocks) local, remote := BlockDiff(lf.Blocks, gf.Blocks)
fm := fileMonitor{ fm := fileMonitor{
@ -691,6 +693,13 @@ func (m *Model) recomputeNeed() {
} }
} }
} }
go func() {
for _, gf := range toDelete {
// The receive side needs the lock, which we are holding
m.dq <- gf
}
}()
} }
func (m *Model) WhoHas(name string) []string { func (m *Model) WhoHas(name string) []string {
@ -713,7 +722,7 @@ func (m *Model) whoHas(name string) []string {
return remote return remote
} }
func (m *Model) deleteFiles() { func (m *Model) deleteLoop() {
for file := range m.dq { for file := range m.dq {
if m.trace["file"] { if m.trace["file"] {
log.Println("FILE: Delete", file.Name) log.Println("FILE: Delete", file.Name)