aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd_linux.go19
-rw-r--r--cmd_windows.go45
2 files changed, 47 insertions, 17 deletions
diff --git a/cmd_linux.go b/cmd_linux.go
index b80b197..d937000 100644
--- a/cmd_linux.go
+++ b/cmd_linux.go
@@ -87,11 +87,19 @@ func run() {
func handleClient(conn net.Conn, stack *GitignoreStack) {
defer conn.Close()
+ remoteManifest := &Manifest{Files: make(map[string]FileMeta)}
+ batches := 0
+
scanner := bufio.NewScanner(conn)
scanner.Buffer(make([]byte, 0, 1024*1024), 1024*1024) // 1MB buffer per batch
- remoteManifest := &Manifest{Files: make(map[string]FileMeta)}
- for scanner.Scan() {
+ for {
+ conn.SetReadDeadline(time.Now().Add(30 * time.Second))
+ if !scanner.Scan() {
+ break
+ }
+ conn.SetReadDeadline(time.Time{}) // reset deadline
+
msg, err := DecodeMessage(scanner.Bytes())
if err != nil {
logDebug("bad message: %v", err)
@@ -108,10 +116,11 @@ func handleClient(conn net.Conn, stack *GitignoreStack) {
Symlink: v.Symlink,
}
}
- logDebug("manifest: received batch (%d files, total: %d)", len(msg.Files), len(remoteManifest.Files))
+ batches++
+ logDebug("manifest: batch %d received (%d files, total: %d)", batches, len(msg.Files), len(remoteManifest.Files))
case "manifest_done":
- logInfo("manifest: received %d files from host", len(remoteManifest.Files))
+ logInfo("manifest: received %d files in %d batches from host", len(remoteManifest.Files), batches)
logInfo("manifest: comparing with local state ...")
syncFromManifest(remoteManifest, stack)
logInfo("sync: done")
@@ -149,7 +158,7 @@ func handleClient(conn net.Conn, stack *GitignoreStack) {
}
if err := scanner.Err(); err != nil {
- logErrorf("read: %v", err)
+ logErrorf("client read: %v", err)
}
}
diff --git a/cmd_windows.go b/cmd_windows.go
index dfe137a..621cf3b 100644
--- a/cmd_windows.go
+++ b/cmd_windows.go
@@ -86,7 +86,11 @@ func run() {
logInfo("watcher: connected, sending manifest ...")
- sendManifest(conn, manifest)
+ if err := sendManifest(conn, manifest); err != nil {
+ logErrorf("send manifest: %v", err)
+ conn.Close()
+ continue
+ }
logInfo("watcher: monitoring for changes ...")
@@ -210,7 +214,9 @@ func watchLoop(ctx context.Context, conn net.Conn, watcher *fsnotify.Watcher, ma
delete(manifest.Files, path)
}
- sendEvent(conn, evt)
+ if err := sendEvent(conn, evt); err != nil {
+ logErrorf("send event: %v", err)
+ }
})
mu.Unlock()
@@ -274,7 +280,7 @@ func scanDirectory(root string, stack *GitignoreStack) *Manifest {
return manifest
}
-func sendManifest(conn net.Conn, manifest *Manifest) {
+func sendManifest(conn net.Conn, manifest *Manifest) error {
const batchSize = 1000
files := make([]FileMetaJSON, 0, batchSize)
paths := make([]string, 0, batchSize)
@@ -291,9 +297,14 @@ func sendManifest(conn net.Conn, manifest *Manifest) {
for i, p := range paths {
msg.Files[p] = files[i]
}
- data, _ := EncodeMessage(msg)
+ data, err := EncodeMessage(msg)
+ if err != nil {
+ return err
+ }
data = append(data, '\n')
- conn.Write(data)
+ if _, err := conn.Write(data); err != nil {
+ return err
+ }
files = files[:0]
paths = paths[:0]
}
@@ -307,18 +318,27 @@ func sendManifest(conn net.Conn, manifest *Manifest) {
for i, p := range paths {
msg.Files[p] = files[i]
}
- data, _ := EncodeMessage(msg)
+ data, err := EncodeMessage(msg)
+ if err != nil {
+ return err
+ }
data = append(data, '\n')
- conn.Write(data)
+ if _, err := conn.Write(data); err != nil {
+ return err
+ }
}
done := &ProtocolMessage{Type: "manifest_done"}
- doneData, _ := EncodeMessage(done)
+ doneData, err := EncodeMessage(done)
+ if err != nil {
+ return err
+ }
doneData = append(doneData, '\n')
- conn.Write(doneData)
+ _, err = conn.Write(doneData)
+ return err
}
-func sendEvent(conn net.Conn, evt FileEvent) {
+func sendEvent(conn net.Conn, evt FileEvent) error {
msg := &ProtocolMessage{Path: evt.Path}
switch evt.Op {
case "create":
@@ -330,10 +350,11 @@ func sendEvent(conn net.Conn, evt FileEvent) {
}
data, err := EncodeMessage(msg)
if err != nil {
- return
+ return err
}
data = append(data, '\n')
- conn.Write(data)
+ _, err = conn.Write(data)
+ return err
}
func addWatchersRecursively(watcher *fsnotify.Watcher, root string, stack *GitignoreStack) error {