func needList(s *db.FileSet, n protocol.DeviceID) []protocol.FileInfo { var fs []protocol.FileInfo s.WithNeed(n, func(fi db.FileIntf) bool { f := fi.(protocol.FileInfo) fs = append(fs, f) return true }) return fs }
func globalList(s *db.FileSet) []protocol.FileInfo { var fs []protocol.FileInfo s.WithGlobal(func(fi db.FileIntf) bool { f := fi.(protocol.FileInfo) fs = append(fs, f) return true }) return fs }
func sendIndexes(conn protocol.Connection, folder string, fs *db.FileSet, ignores *ignore.Matcher) { deviceID := conn.ID() name := conn.Name() var err error if debug { l.Debugf("sendIndexes for %s-%s/%q starting", deviceID, name, folder) } minLocalVer, err := sendIndexTo(true, 0, conn, folder, fs, ignores) for err == nil { time.Sleep(5 * time.Second) if fs.LocalVersion(protocol.LocalDeviceID) <= minLocalVer { continue } minLocalVer, err = sendIndexTo(false, minLocalVer, conn, folder, fs, ignores) } if debug { l.Debugf("sendIndexes for %s-%s/%q exiting: %v", deviceID, name, folder, err) } }
func sendIndexTo(initial bool, minLocalVer int64, conn protocol.Connection, folder string, fs *db.FileSet, ignores *ignore.Matcher) (int64, error) { deviceID := conn.ID() name := conn.Name() batch := make([]protocol.FileInfo, 0, indexBatchSize) currentBatchSize := 0 maxLocalVer := int64(0) var err error fs.WithHave(protocol.LocalDeviceID, func(fi db.FileIntf) bool { f := fi.(protocol.FileInfo) if f.LocalVersion <= minLocalVer { return true } if f.LocalVersion > maxLocalVer { maxLocalVer = f.LocalVersion } if ignores.Match(f.Name) || symlinkInvalid(folder, f) { if debug { l.Debugln("not sending update for ignored/unsupported symlink", f) } return true } if len(batch) == indexBatchSize || currentBatchSize > indexTargetSize { if initial { if err = conn.Index(folder, batch, 0, nil); err != nil { return false } if debug { l.Debugf("sendIndexes for %s-%s/%q: %d files (<%d bytes) (initial index)", deviceID, name, folder, len(batch), currentBatchSize) } initial = false } else { if err = conn.IndexUpdate(folder, batch, 0, nil); err != nil { return false } if debug { l.Debugf("sendIndexes for %s-%s/%q: %d files (<%d bytes) (batched update)", deviceID, name, folder, len(batch), currentBatchSize) } } batch = make([]protocol.FileInfo, 0, indexBatchSize) currentBatchSize = 0 } batch = append(batch, f) currentBatchSize += indexPerFileSize + len(f.Blocks)*indexPerBlockSize return true }) if initial && err == nil { err = conn.Index(folder, batch, 0, nil) if debug && err == nil { l.Debugf("sendIndexes for %s-%s/%q: %d files (small initial index)", deviceID, name, folder, len(batch)) } } else if len(batch) > 0 && err == nil { err = conn.IndexUpdate(folder, batch, 0, nil) if debug && err == nil { l.Debugf("sendIndexes for %s-%s/%q: %d files (last batch)", deviceID, name, folder, len(batch)) } } return maxLocalVer, err }