lib/model: Sort and group model initialization better (ref #6303)

This commit is contained in:
Jakob Borg 2020-02-01 08:12:25 +01:00
parent 55937b61ca
commit 5823e7a5ce

View File

@ -111,26 +111,29 @@ type Model interface {
type model struct { type model struct {
*suture.Supervisor *suture.Supervisor
cfg config.Wrapper // constructor parameters
db *db.Lowlevel cfg config.Wrapper
id protocol.DeviceID
clientName string
clientVersion string
db *db.Lowlevel
protectedFiles []string
evLogger events.Logger
// constant or concurrency safe fields
finder *db.BlockFinder finder *db.BlockFinder
progressEmitter *ProgressEmitter progressEmitter *ProgressEmitter
id protocol.DeviceID
shortID protocol.ShortID shortID protocol.ShortID
cacheIgnoredFiles bool cacheIgnoredFiles bool
protectedFiles []string // globalRequestLimiter limits the amount of data in concurrent incoming
evLogger events.Logger // requests
// globalRequestLimiter limits the amount of data in concurrent incoming requests
globalRequestLimiter *byteSemaphore globalRequestLimiter *byteSemaphore
// folderIOLimiter limits the number of concurrent I/O heavy operations, // folderIOLimiter limits the number of concurrent I/O heavy operations,
// such as scans and pulls. A limit of zero means no limit. // such as scans and pulls.
folderIOLimiter *byteSemaphore folderIOLimiter *byteSemaphore
clientName string // fields protected by fmut
clientVersion string fmut sync.RWMutex
fmut sync.RWMutex // protects the below
folderCfgs map[string]config.FolderConfiguration // folder -> cfg folderCfgs map[string]config.FolderConfiguration // folder -> cfg
folderFiles map[string]*db.FileSet // folder -> files folderFiles map[string]*db.FileSet // folder -> files
deviceStatRefs map[protocol.DeviceID]*stats.DeviceStatisticsReference // deviceID -> statsRef deviceStatRefs map[protocol.DeviceID]*stats.DeviceStatisticsReference // deviceID -> statsRef
@ -140,7 +143,8 @@ type model struct {
folderRestartMuts syncMutexMap // folder -> restart mutex folderRestartMuts syncMutexMap // folder -> restart mutex
folderVersioners map[string]versioner.Versioner // folder -> versioner (may be nil) folderVersioners map[string]versioner.Versioner // folder -> versioner (may be nil)
pmut sync.RWMutex // protects the below // fields protected by pmut
pmut sync.RWMutex
conn map[protocol.DeviceID]connections.Connection conn map[protocol.DeviceID]connections.Connection
connRequestLimiters map[protocol.DeviceID]*byteSemaphore connRequestLimiters map[protocol.DeviceID]*byteSemaphore
closed map[protocol.DeviceID]chan struct{} closed map[protocol.DeviceID]chan struct{}
@ -183,34 +187,42 @@ func NewModel(cfg config.Wrapper, id protocol.DeviceID, clientName, clientVersio
}, },
PassThroughPanics: true, PassThroughPanics: true,
}), }),
cfg: cfg,
db: ldb, // constructor parameters
cfg: cfg,
id: id,
clientName: clientName,
clientVersion: clientVersion,
db: ldb,
protectedFiles: protectedFiles,
evLogger: evLogger,
// constant or concurrency safe fields
finder: db.NewBlockFinder(ldb), finder: db.NewBlockFinder(ldb),
progressEmitter: NewProgressEmitter(cfg, evLogger), progressEmitter: NewProgressEmitter(cfg, evLogger),
id: id,
shortID: id.Short(), shortID: id.Short(),
cacheIgnoredFiles: cfg.Options().CacheIgnoredFiles, cacheIgnoredFiles: cfg.Options().CacheIgnoredFiles,
protectedFiles: protectedFiles,
evLogger: evLogger,
globalRequestLimiter: newByteSemaphore(1024 * cfg.Options().MaxConcurrentIncomingRequestKiB()), globalRequestLimiter: newByteSemaphore(1024 * cfg.Options().MaxConcurrentIncomingRequestKiB()),
folderIOLimiter: newByteSemaphore(cfg.Options().MaxFolderConcurrency()), folderIOLimiter: newByteSemaphore(cfg.Options().MaxFolderConcurrency()),
clientName: clientName,
clientVersion: clientVersion, // fields protected by fmut
folderCfgs: make(map[string]config.FolderConfiguration), fmut: sync.NewRWMutex(),
folderFiles: make(map[string]*db.FileSet), folderCfgs: make(map[string]config.FolderConfiguration),
deviceStatRefs: make(map[protocol.DeviceID]*stats.DeviceStatisticsReference), folderFiles: make(map[string]*db.FileSet),
folderIgnores: make(map[string]*ignore.Matcher), deviceStatRefs: make(map[protocol.DeviceID]*stats.DeviceStatisticsReference),
folderRunners: make(map[string]service), folderIgnores: make(map[string]*ignore.Matcher),
folderRunnerTokens: make(map[string][]suture.ServiceToken), folderRunners: make(map[string]service),
folderVersioners: make(map[string]versioner.Versioner), folderRunnerTokens: make(map[string][]suture.ServiceToken),
conn: make(map[protocol.DeviceID]connections.Connection), folderVersioners: make(map[string]versioner.Versioner),
connRequestLimiters: make(map[protocol.DeviceID]*byteSemaphore),
closed: make(map[protocol.DeviceID]chan struct{}), // fields protected by pmut
helloMessages: make(map[protocol.DeviceID]protocol.HelloResult), pmut: sync.NewRWMutex(),
deviceDownloads: make(map[protocol.DeviceID]*deviceDownloadState), conn: make(map[protocol.DeviceID]connections.Connection),
remotePausedFolders: make(map[protocol.DeviceID][]string), connRequestLimiters: make(map[protocol.DeviceID]*byteSemaphore),
fmut: sync.NewRWMutex(), closed: make(map[protocol.DeviceID]chan struct{}),
pmut: sync.NewRWMutex(), helloMessages: make(map[protocol.DeviceID]protocol.HelloResult),
deviceDownloads: make(map[protocol.DeviceID]*deviceDownloadState),
remotePausedFolders: make(map[protocol.DeviceID][]string),
} }
for devID := range cfg.Devices() { for devID := range cfg.Devices() {
m.deviceStatRefs[devID] = stats.NewDeviceStatisticsReference(m.db, devID.String()) m.deviceStatRefs[devID] = stats.NewDeviceStatisticsReference(m.db, devID.String())