1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Select polling based watcher for Windows log watcher

Signed-off-by: Tejaswini Duggaraju <naduggar@microsoft.com>
This commit is contained in:
Tejaswini Duggaraju 2018-07-06 15:48:59 -07:00
parent 86a41e4ef7
commit df84cdd091

View file

@ -8,6 +8,7 @@ import (
"fmt"
"io"
"os"
"runtime"
"strconv"
"strings"
"sync"
@ -641,9 +642,20 @@ func followLogs(f *os.File, logWatcher *logger.LogWatcher, notifyRotate chan int
}
func watchFile(name string) (filenotify.FileWatcher, error) {
fileWatcher, err := filenotify.New()
if err != nil {
return nil, err
var fileWatcher filenotify.FileWatcher
if runtime.GOOS == "windows" {
// FileWatcher on Windows files is based on the syscall notifications which has an issue becuase of file caching.
// It is based on ReadDirectoryChangesW() which doesn't detect writes to the cache. It detects writes to disk only.
// Becuase of the OS lazy writing, we don't get notifications for file writes and thereby the watcher
// doesn't work. Hence for Windows we will use poll based notifier.
fileWatcher = filenotify.NewPollingWatcher()
} else {
var err error
fileWatcher, err = filenotify.New()
if err != nil {
return nil, err
}
}
logger := logrus.WithFields(logrus.Fields{
@ -652,6 +664,7 @@ func watchFile(name string) (filenotify.FileWatcher, error) {
})
if err := fileWatcher.Add(name); err != nil {
// we will retry using file poller.
logger.WithError(err).Warnf("falling back to file poller")
fileWatcher.Close()
fileWatcher = filenotify.NewPollingWatcher()
@ -662,5 +675,6 @@ func watchFile(name string) (filenotify.FileWatcher, error) {
return nil, err
}
}
return fileWatcher, nil
}