From 0c5a8a2f04195fdddb9e3a5d4b8123bccdf70bce Mon Sep 17 00:00:00 2001 From: Bernhard Guillon Date: Tue, 7 Jul 2026 12:35:08 +0200 Subject: Add robust error handling for TCP communication Windows side: - sendManifest/sendEvent now return errors - Callers log errors and reconnect on failure Linux side: - 30s read timeout to detect dead connections - Better batch counting and logging - Proper error logging on disconnect --- cmd_windows.go | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) (limited to 'cmd_windows.go') 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 { -- cgit v1.2.3