func globalList(s *files.Set) []protocol.FileInfo { var fs []protocol.FileInfo s.WithGlobal(func(f protocol.FileInfo) bool { fs = append(fs, f) return true }) return fs }
func needList(s *files.Set, n protocol.NodeID) []protocol.FileInfo { var fs []protocol.FileInfo s.WithNeed(n, func(f protocol.FileInfo) bool { fs = append(fs, f) return true }) return fs }
func sendIndexes(conn protocol.Connection, repo string, fs *files.Set) { nodeID := conn.ID() name := conn.Name() if debug { l.Debugf("sendIndexes for %s-%s@/%q starting", nodeID, name, repo) } initial := true minLocalVer := uint64(0) var err error defer func() { if debug { l.Debugf("sendIndexes for %s-%s@/%q exiting: %v", nodeID, name, repo, err) } }() for err == nil { if !initial && fs.LocalVersion(protocol.LocalNodeID) <= minLocalVer { time.Sleep(1 * time.Second) continue } batch := make([]protocol.FileInfo, 0, indexBatchSize) maxLocalVer := uint64(0) fs.WithHave(protocol.LocalNodeID, func(f protocol.FileInfo) bool { if f.LocalVersion <= minLocalVer { return true } if f.LocalVersion > maxLocalVer { maxLocalVer = f.LocalVersion } if len(batch) == indexBatchSize { if initial { if err = conn.Index(repo, batch); err != nil { return false } if debug { l.Debugf("sendIndexes for %s-%s/%q: %d files (initial index)", nodeID, name, repo, len(batch)) } initial = false } else { if err = conn.IndexUpdate(repo, batch); err != nil { return false } if debug { l.Debugf("sendIndexes for %s-%s/%q: %d files (batched update)", nodeID, name, repo, len(batch)) } } batch = make([]protocol.FileInfo, 0, indexBatchSize) } batch = append(batch, f) return true }) if initial { err = conn.Index(repo, batch) if debug && err == nil { l.Debugf("sendIndexes for %s-%s/%q: %d files (small initial index)", nodeID, name, repo, len(batch)) } initial = false } else if len(batch) > 0 { err = conn.IndexUpdate(repo, batch) if debug && err == nil { l.Debugf("sendIndexes for %s-%s/%q: %d files (last batch)", nodeID, name, repo, len(batch)) } } minLocalVer = maxLocalVer } }