(model *model, ignores *ignore.Matcher, cfg config.FolderConfiguration, evLogger events.Logger, ioLimiter *semaphore.Semaphore, ver versioner.Versioner)
| 102 | } |
| 103 | |
| 104 | func newFolder(model *model, ignores *ignore.Matcher, cfg config.FolderConfiguration, evLogger events.Logger, ioLimiter *semaphore.Semaphore, ver versioner.Versioner) *folder { |
| 105 | f := folder{ |
| 106 | stateTracker: newStateTracker(cfg.ID, evLogger), |
| 107 | FolderConfiguration: cfg, |
| 108 | FolderStatisticsReference: stats.NewFolderStatisticsReference(db.NewTyped(model.sdb, "folderstats/"+cfg.ID)), |
| 109 | ioLimiter: ioLimiter, |
| 110 | |
| 111 | model: model, |
| 112 | shortID: model.shortID, |
| 113 | db: model.sdb, |
| 114 | ignores: ignores, |
| 115 | mtimefs: cfg.Filesystem(fs.NewMtimeOption(model.sdb, cfg.ID)), |
| 116 | modTimeWindow: cfg.ModTimeWindow(), |
| 117 | done: make(chan struct{}), |
| 118 | sl: slog.Default().With(cfg.LogAttr()), |
| 119 | |
| 120 | scanInterval: time.Duration(cfg.RescanIntervalS) * time.Second, |
| 121 | scanTimer: time.NewTimer(0), // The first scan should be done immediately. |
| 122 | scanDelay: make(chan time.Duration), |
| 123 | initialScanFinished: make(chan struct{}), |
| 124 | scanScheduled: make(chan struct{}, 1), |
| 125 | versionCleanupInterval: time.Duration(cfg.Versioning.CleanupIntervalS) * time.Second, |
| 126 | versionCleanupTimer: time.NewTimer(time.Duration(cfg.Versioning.CleanupIntervalS) * time.Second), |
| 127 | |
| 128 | pullScheduled: make(chan struct{}, 1), // This needs to be 1-buffered so that we queue a pull if we're busy when it comes. |
| 129 | |
| 130 | doInSyncChan: make(chan syncRequest), |
| 131 | |
| 132 | forcedRescanRequested: make(chan struct{}, 1), |
| 133 | forcedRescanPaths: make(map[string]struct{}), |
| 134 | |
| 135 | watchCancel: func() {}, |
| 136 | restartWatchChan: make(chan struct{}, 1), |
| 137 | |
| 138 | versioner: ver, |
| 139 | } |
| 140 | f.pullPause = f.pullBasePause() |
| 141 | f.pullFailTimer = time.NewTimer(0) |
| 142 | <-f.pullFailTimer.C |
| 143 | |
| 144 | registerFolderMetrics(f.ID) |
| 145 | |
| 146 | return &f |
| 147 | } |
| 148 | |
| 149 | func (f *folder) Serve(ctx context.Context) error { |
| 150 | f.model.foldersRunning.Add(1) |
no test coverage detected