mirror of
https://github.com/octoleo/syncthing.git
synced 2024-12-23 03:18:59 +00:00
lib/watchaggregator: Replace counter map by two integers (#7856)
This commit is contained in:
parent
734c2fc870
commit
37d0ba1660
@ -104,18 +104,32 @@ type aggregator struct {
|
|||||||
notifyTimer *time.Timer
|
notifyTimer *time.Timer
|
||||||
notifyTimerNeedsReset bool
|
notifyTimerNeedsReset bool
|
||||||
notifyTimerResetChan chan time.Duration
|
notifyTimerResetChan chan time.Duration
|
||||||
counts map[fs.EventType]int
|
counts eventCounter
|
||||||
root *eventDir
|
root *eventDir
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type eventCounter struct {
|
||||||
|
removes int // Includes mixed events.
|
||||||
|
nonRemoves int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *eventCounter) add(typ fs.EventType, n int) {
|
||||||
|
if typ&fs.Remove != 0 {
|
||||||
|
c.removes += n
|
||||||
|
} else {
|
||||||
|
c.nonRemoves += n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *eventCounter) total() int { return c.removes + c.nonRemoves }
|
||||||
|
|
||||||
func newAggregator(ctx context.Context, folderCfg config.FolderConfiguration) *aggregator {
|
func newAggregator(ctx context.Context, folderCfg config.FolderConfiguration) *aggregator {
|
||||||
a := &aggregator{
|
a := &aggregator{
|
||||||
folderID: folderCfg.ID,
|
folderID: folderCfg.ID,
|
||||||
folderCfgUpdate: make(chan config.FolderConfiguration),
|
folderCfgUpdate: make(chan config.FolderConfiguration),
|
||||||
notifyTimerNeedsReset: false,
|
notifyTimerNeedsReset: false,
|
||||||
notifyTimerResetChan: make(chan time.Duration),
|
notifyTimerResetChan: make(chan time.Duration),
|
||||||
counts: make(map[fs.EventType]int),
|
|
||||||
root: newEventDir(),
|
root: newEventDir(),
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
}
|
}
|
||||||
@ -176,7 +190,7 @@ func (a *aggregator) newEvent(event fs.Event, inProgress map[string]struct{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *aggregator) aggregateEvent(event fs.Event, evTime time.Time) {
|
func (a *aggregator) aggregateEvent(event fs.Event, evTime time.Time) {
|
||||||
if event.Name == "." || a.eventCount() == maxFiles {
|
if event.Name == "." || a.counts.total() == maxFiles {
|
||||||
l.Debugln(a, "Scan entire folder")
|
l.Debugln(a, "Scan entire folder")
|
||||||
firstModTime := evTime
|
firstModTime := evTime
|
||||||
if a.root.childCount() != 0 {
|
if a.root.childCount() != 0 {
|
||||||
@ -190,8 +204,8 @@ func (a *aggregator) aggregateEvent(event fs.Event, evTime time.Time) {
|
|||||||
lastModTime: evTime,
|
lastModTime: evTime,
|
||||||
evType: event.Type,
|
evType: event.Type,
|
||||||
}
|
}
|
||||||
a.counts = make(map[fs.EventType]int)
|
a.counts = eventCounter{}
|
||||||
a.counts[event.Type]++
|
a.counts.add(event.Type, 1)
|
||||||
a.resetNotifyTimerIfNeeded()
|
a.resetNotifyTimerIfNeeded()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -212,9 +226,9 @@ func (a *aggregator) aggregateEvent(event fs.Event, evTime time.Time) {
|
|||||||
if ev, ok := parentDir.events[name]; ok {
|
if ev, ok := parentDir.events[name]; ok {
|
||||||
ev.lastModTime = evTime
|
ev.lastModTime = evTime
|
||||||
if merged := event.Type.Merge(ev.evType); ev.evType != merged {
|
if merged := event.Type.Merge(ev.evType); ev.evType != merged {
|
||||||
a.counts[ev.evType]--
|
a.counts.add(ev.evType, -1)
|
||||||
|
a.counts.add(merged, 1)
|
||||||
ev.evType = merged
|
ev.evType = merged
|
||||||
a.counts[ev.evType]++
|
|
||||||
}
|
}
|
||||||
l.Debugf("%v Parent %s (type %s) already tracked: %s", a, currPath, ev.evType, event.Name)
|
l.Debugf("%v Parent %s (type %s) already tracked: %s", a, currPath, ev.evType, event.Name)
|
||||||
return
|
return
|
||||||
@ -249,9 +263,9 @@ func (a *aggregator) aggregateEvent(event fs.Event, evTime time.Time) {
|
|||||||
if ev, ok := parentDir.events[name]; ok {
|
if ev, ok := parentDir.events[name]; ok {
|
||||||
ev.lastModTime = evTime
|
ev.lastModTime = evTime
|
||||||
if merged := event.Type.Merge(ev.evType); ev.evType != merged {
|
if merged := event.Type.Merge(ev.evType); ev.evType != merged {
|
||||||
a.counts[ev.evType]--
|
a.counts.add(ev.evType, -1)
|
||||||
|
a.counts.add(merged, 1)
|
||||||
ev.evType = merged
|
ev.evType = merged
|
||||||
a.counts[ev.evType]++
|
|
||||||
}
|
}
|
||||||
l.Debugf("%v Already tracked (type %v): %s", a, ev.evType, event.Name)
|
l.Debugf("%v Already tracked (type %v): %s", a, ev.evType, event.Name)
|
||||||
return
|
return
|
||||||
@ -272,7 +286,7 @@ func (a *aggregator) aggregateEvent(event fs.Event, evTime time.Time) {
|
|||||||
if ok {
|
if ok {
|
||||||
firstModTime = childDir.firstModTime()
|
firstModTime = childDir.firstModTime()
|
||||||
if merged := event.Type.Merge(childDir.eventType()); event.Type != merged {
|
if merged := event.Type.Merge(childDir.eventType()); event.Type != merged {
|
||||||
a.counts[event.Type]--
|
a.counts.add(event.Type, -1)
|
||||||
event.Type = merged
|
event.Type = merged
|
||||||
}
|
}
|
||||||
delete(parentDir.dirs, name)
|
delete(parentDir.dirs, name)
|
||||||
@ -283,7 +297,7 @@ func (a *aggregator) aggregateEvent(event fs.Event, evTime time.Time) {
|
|||||||
lastModTime: evTime,
|
lastModTime: evTime,
|
||||||
evType: event.Type,
|
evType: event.Type,
|
||||||
}
|
}
|
||||||
a.counts[event.Type]++
|
a.counts.add(event.Type, 1)
|
||||||
a.resetNotifyTimerIfNeeded()
|
a.resetNotifyTimerIfNeeded()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,7 +316,7 @@ func (a *aggregator) resetNotifyTimer(duration time.Duration) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *aggregator) actOnTimer(out chan<- []string) {
|
func (a *aggregator) actOnTimer(out chan<- []string) {
|
||||||
c := a.eventCount()
|
c := a.counts.total()
|
||||||
if c == 0 {
|
if c == 0 {
|
||||||
l.Debugln(a, "No tracked events, waiting for new event.")
|
l.Debugln(a, "No tracked events, waiting for new event.")
|
||||||
a.notifyTimerNeedsReset = true
|
a.notifyTimerNeedsReset = true
|
||||||
@ -310,7 +324,7 @@ func (a *aggregator) actOnTimer(out chan<- []string) {
|
|||||||
}
|
}
|
||||||
oldEvents := make(map[string]*aggregatedEvent, c)
|
oldEvents := make(map[string]*aggregatedEvent, c)
|
||||||
a.popOldEventsTo(oldEvents, a.root, ".", time.Now(), true)
|
a.popOldEventsTo(oldEvents, a.root, ".", time.Now(), true)
|
||||||
if a.notifyDelay != a.notifyTimeout && a.counts[fs.NonRemove] == 0 && a.counts[fs.Remove]+a.counts[fs.Mixed] != 0 {
|
if a.notifyDelay != a.notifyTimeout && a.counts.nonRemoves == 0 && a.counts.removes != 0 {
|
||||||
// Only delayed events remaining, no need to delay them additionally
|
// Only delayed events remaining, no need to delay them additionally
|
||||||
a.popOldEventsTo(oldEvents, a.root, ".", time.Now(), false)
|
a.popOldEventsTo(oldEvents, a.root, ".", time.Now(), false)
|
||||||
}
|
}
|
||||||
@ -376,7 +390,7 @@ func (a *aggregator) popOldEventsTo(to map[string]*aggregatedEvent, dir *eventDi
|
|||||||
if a.isOld(event, currTime, delayRem) {
|
if a.isOld(event, currTime, delayRem) {
|
||||||
to[filepath.Join(dirPath, name)] = event
|
to[filepath.Join(dirPath, name)] = event
|
||||||
delete(dir.events, name)
|
delete(dir.events, name)
|
||||||
a.counts[event.evType]--
|
a.counts.add(event.evType, -1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -401,14 +415,6 @@ func (a *aggregator) isOld(ev *aggregatedEvent, currTime time.Time, delayRem boo
|
|||||||
return currTime.Sub(ev.firstModTime) > a.notifyTimeout
|
return currTime.Sub(ev.firstModTime) > a.notifyTimeout
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *aggregator) eventCount() int {
|
|
||||||
c := 0
|
|
||||||
for _, v := range a.counts {
|
|
||||||
c += v
|
|
||||||
}
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *aggregator) String() string {
|
func (a *aggregator) String() string {
|
||||||
return fmt.Sprintf("aggregator/%s:", a.folderCfg.Description())
|
return fmt.Sprintf("aggregator/%s:", a.folderCfg.Description())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user