Actually send index updates for version bumps

This commit is contained in:
Jakob Borg 2014-01-08 14:21:47 +01:00
parent 884a7d6a1b
commit 1ef86379fb
2 changed files with 30 additions and 20 deletions

View File

@ -228,6 +228,13 @@ func (m *Model) Index(nodeID string, fs []protocol.FileInfo) {
m.remote[nodeID] = make(map[string]File) m.remote[nodeID] = make(map[string]File)
for _, f := range fs { for _, f := range fs {
m.remote[nodeID][f.Name] = fileFromFileInfo(f) m.remote[nodeID][f.Name] = fileFromFileInfo(f)
if m.trace["idx"] {
var flagComment string
if f.Flags&protocol.FlagDeleted != 0 {
flagComment = " (deleted)"
}
log.Printf("IDX(in): %q m=%d f=%o%s v=%d (%d blocks)", f.Name, f.Modified, f.Flags, flagComment, f.Version, len(f.Blocks))
}
} }
m.recomputeGlobal() m.recomputeGlobal()
@ -250,11 +257,14 @@ func (m *Model) IndexUpdate(nodeID string, fs []protocol.FileInfo) {
} }
for _, f := range fs { for _, f := range fs {
if f.Flags&protocol.FlagDeleted != 0 && !m.delete {
// Files marked as deleted do not even enter the model
continue
}
repo[f.Name] = fileFromFileInfo(f) repo[f.Name] = fileFromFileInfo(f)
if m.trace["idx"] {
var flagComment string
if f.Flags&protocol.FlagDeleted != 0 {
flagComment = " (deleted)"
}
log.Printf("IDX(in-up): %q m=%d f=%o%s v=%d (%d blocks)", f.Name, f.Modified, f.Flags, flagComment, f.Version, len(f.Blocks))
}
} }
m.recomputeGlobal() m.recomputeGlobal()
@ -437,7 +447,7 @@ func (m *Model) protocolIndex() []protocol.FileInfo {
if mf.Flags&protocol.FlagDeleted != 0 { if mf.Flags&protocol.FlagDeleted != 0 {
flagComment = " (deleted)" flagComment = " (deleted)"
} }
log.Printf("IDX: %q m=%d f=%o%s (%d blocks)", mf.Name, mf.Modified, mf.Flags, flagComment, len(mf.Blocks)) log.Printf("IDX(out): %q m=%d f=%o%s v=%d (%d blocks)", mf.Name, mf.Modified, mf.Flags, flagComment, mf.Version, len(mf.Blocks))
} }
index = append(index, mf) index = append(index, mf)
} }
@ -533,9 +543,9 @@ func (m *Model) recomputeGlobal() {
} }
for _, fs := range m.remote { for _, fs := range m.remote {
for n, f := range fs { for n, nf := range fs {
if cf, ok := newGlobal[n]; !ok || f.NewerThan(cf) { if lf, ok := newGlobal[n]; !ok || nf.NewerThan(lf) {
newGlobal[n] = f newGlobal[n] = nf
} }
} }
} }
@ -563,23 +573,23 @@ 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() {
m.need = make(map[string]bool) m.need = make(map[string]bool)
for n, f := range m.global { for n, gf := range m.global {
hf, ok := m.local[n] lf, ok := m.local[n]
if !ok || f.NewerThan(hf) { if !ok || gf.NewerThan(lf) {
if f.Flags&protocol.FlagInvalid != 0 { if gf.Flags&protocol.FlagInvalid != 0 {
// Never attempt to sync invalid files // Never attempt to sync invalid files
continue continue
} }
if f.Flags&protocol.FlagDeleted != 0 && !m.delete { if gf.Flags&protocol.FlagDeleted != 0 && !m.delete {
// Don't want to delete files, so forget this need // Don't want to delete files, so forget this need
continue continue
} }
if f.Flags&protocol.FlagDeleted != 0 && !ok { if gf.Flags&protocol.FlagDeleted != 0 && !ok {
// Don't have the file, so don't need to delete it // Don't have the file, so don't need to delete it
continue continue
} }
if m.trace["need"] { if m.trace["need"] {
log.Println("NEED:", ok, hf, f) log.Println("NEED:", ok, lf, gf)
} }
m.need[n] = true m.need[n] = true
} }

View File

@ -61,7 +61,7 @@ type Connection struct {
closed bool closed bool
awaiting map[int]chan asyncResult awaiting map[int]chan asyncResult
nextId int nextId int
indexSent map[string]int64 indexSent map[string][2]int64
hasSentIndex bool hasSentIndex bool
hasRecvdIndex bool hasRecvdIndex bool
@ -112,18 +112,18 @@ func (c *Connection) Index(idx []FileInfo) {
// This is the first time we send an index. // This is the first time we send an index.
msgType = messageTypeIndex msgType = messageTypeIndex
c.indexSent = make(map[string]int64) c.indexSent = make(map[string][2]int64)
for _, f := range idx { for _, f := range idx {
c.indexSent[f.Name] = f.Modified c.indexSent[f.Name] = [2]int64{f.Modified, int64(f.Version)}
} }
} else { } else {
// We have sent one full index. Only send updates now. // We have sent one full index. Only send updates now.
msgType = messageTypeIndexUpdate msgType = messageTypeIndexUpdate
var diff []FileInfo var diff []FileInfo
for _, f := range idx { for _, f := range idx {
if modified, ok := c.indexSent[f.Name]; !ok || f.Modified != modified { if vs, ok := c.indexSent[f.Name]; !ok || f.Modified != vs[0] || int64(f.Version) != vs[1] {
diff = append(diff, f) diff = append(diff, f)
c.indexSent[f.Name] = f.Modified c.indexSent[f.Name] = [2]int64{f.Modified, int64(f.Version)}
} }
} }
idx = diff idx = diff