code: func (f *folder) startWatchAsync(ctx context.Context) {
  	timer := time.NewTimer(0)
  	for {
  		select {
  		case <-timer.C:
  			eventChan, err := f.Filesystem().Watch(".", f.ignores, ctx, f.IgnorePerms)
  			f.watchMut.Lock()
  			prevErr := f.watchErr
  			f.watchErr = err
  			f.watchMut.Unlock()
  			if err != prevErr {
  				data := map[string]interface{}{
  					"folder": f.ID,
  				}
  				if prevErr != nil {
  					data["from"] = prevErr.Error()
  				}
  				if err != nil {
  					data["to"] = err.Error()
  				}
  				events.Default.Log(events.FolderWatchStateChanged, data)
  			}
  			if err != nil {
  				if prevErr == errWatchNotStarted {
  					l.Infof("Error while trying to start filesystem watcher for folder %s, trying again in 1min: %v", f.Description(), err)
  				} else {
  					l.Debugf("Repeat error while trying to start filesystem watcher for folder %s, trying again in 1min: %v", f.Description(), err)
  				}
  				timer.Reset(time.Minute)
  				continue
  			}
  			f.watchMut.Lock()
  			defer f.watchMut.Unlock()
  			watchaggregator.Aggregate(eventChan, f.watchChan, f.FolderConfiguration, f.model.cfg, ctx)
  			l.Debugln("Started filesystem watcher for folder", f.Description())
  			return
  		case <-ctx.Done():
  			return
  		}
  	}
  }
docs: // startWatchAsync tries to start the filesystem watching and retries every minute on failure.
  // It is a convenience function that should not be used except in startWatch.