diff options
| author | Bernhard Guillon <Bernhard.Guillon@begu.org> | 2026-07-07 12:35:08 +0200 |
|---|---|---|
| committer | Bernhard Guillon <Bernhard.Guillon@begu.org> | 2026-07-07 12:35:08 +0200 |
| commit | 0c5a8a2f04195fdddb9e3a5d4b8123bccdf70bce (patch) | |
| tree | 1650c2937f534efdf7e87529111b5db94507b2ce /cmd_windows.go | |
| parent | 85301b69f478c34e3ee7488f5b04ae4ac5b3ba1e (diff) | |
| download | sourcewatch-0c5a8a2f04195fdddb9e3a5d4b8123bccdf70bce.tar.gz sourcewatch-0c5a8a2f04195fdddb9e3a5d4b8123bccdf70bce.zip | |
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
Diffstat (limited to 'cmd_windows.go')
| -rw-r--r-- | cmd_windows.go | 45 |
1 files changed, 33 insertions, 12 deletions
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 { |
