Speed up continuserv

Ignore .git directory as that shouldn't affect spec generation. Also, when
we receive writes from the OS, wait a bit before re-generating the spec to
clump together multiple writes rather than re-generating one after another
and waiting for no more writes before serving the request.
pull/977/head
Kegan Dougal 9 years ago
parent 4aad6976fd
commit b6f0b67da6

@ -17,6 +17,7 @@ import (
"strings" "strings"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time"
fsnotify "gopkg.in/fsnotify.v1" fsnotify "gopkg.in/fsnotify.v1"
) )
@ -67,7 +68,6 @@ func watchFS(ch chan struct{}, w *fsnotify.Watcher) {
select { select {
case e := <-w.Events: case e := <-w.Events:
if filter(e) { if filter(e) {
wg.Add(1)
fmt.Printf("Noticed change to %s, re-generating spec\n", e.Name) fmt.Printf("Noticed change to %s, re-generating spec\n", e.Name)
ch <- struct{}{} ch <- struct{}{}
} }
@ -98,6 +98,11 @@ func filter(e fsnotify.Event) bool {
return false return false
} }
// Ignore the .git directory - It's very noisy
if strings.Contains(e.Name, "/.git/") {
return false
}
// Avoid infinite cycles being caused by writing actual output // Avoid infinite cycles being caused by writing actual output
if strings.Contains(e.Name, "/tmp/") || strings.Contains(e.Name, "/gen/") { if strings.Contains(e.Name, "/tmp/") || strings.Contains(e.Name, "/gen/") {
return false return false
@ -133,10 +138,22 @@ func populateOnce(dir string) {
} }
func doPopulate(ch chan struct{}, dir string) { func doPopulate(ch chan struct{}, dir string) {
for _ = range ch { var pending int
for {
select {
case <-ch:
if pending == 0 {
wg.Add(1)
}
pending++
case <-time.After(10 * time.Millisecond):
if pending > 0 {
pending = 0
populateOnce(dir) populateOnce(dir)
} }
} }
}
}
func exists(path string) bool { func exists(path string) bool {
_, err := os.Stat(path) _, err := os.Stat(path)

Loading…
Cancel
Save