Bug: rsync Live-Log aktualisiert sich nicht in Echtzeit #2

Open
opened 2026-09-07 17:45:17 +00:00 by x3 · 0 comments
Owner

Problem

Das Live-Log und das Backup-Fenster zeigen rsync-Output nicht in Echtzeit an. Die Ausgabe erscheint erst wenn der Backup-Job komplett abgeschlossen ist.

Ursache

rsync nutzt \r (Carriage Return) fuer Fortschritts-Updates, nicht \n (Newline). fgets() in popen() blockiert bis zum naechsten \n und liest erst dann den ganzen Puffer.

Außerdem puffert rsync die Ausgabe wenn stdout ein Pipe ist (kein Terminal).

Loesung

  1. read() + poll() statt fgets() fuer non-blocking Input
  2. \r und \n werden beide als Zeilentrenner behandelt
  3. stdbuf -oL erzwingt line-buffered Output
  4. poll() mit 200ms Timeout fuer responsive Cancel-Unterstuetzung
// Vorher (blockiert):
while (fgets(buf, sizeof(buf), pipe)) { ... }

// Nachher (non-blocking):
while (true) {
    struct pollfd pfd = {fd, POLLIN, 0};
    int pret = poll(&pfd, 1, 200);
    ssize_t n = read(fd, raw, sizeof(raw) - 1);
    // Split on \r and \n
}

Betroffene Dateien

  • src/rsync_manager.cpp

Gefixt in Commit 7b50af6.

## Problem Das Live-Log und das Backup-Fenster zeigen rsync-Output nicht in Echtzeit an. Die Ausgabe erscheint erst wenn der Backup-Job komplett abgeschlossen ist. ## Ursache rsync nutzt `\r` (Carriage Return) fuer Fortschritts-Updates, nicht `\n` (Newline). `fgets()` in `popen()` blockiert bis zum naechsten `\n` und liest erst dann den ganzen Puffer. Außerdem puffert rsync die Ausgabe wenn stdout ein Pipe ist (kein Terminal). ## Loesung 1. `read()` + `poll()` statt `fgets()` fuer non-blocking Input 2. `\r` und `\n` werden beide als Zeilentrenner behandelt 3. `stdbuf -oL` erzwingt line-buffered Output 4. `poll()` mit 200ms Timeout fuer responsive Cancel-Unterstuetzung ```cpp // Vorher (blockiert): while (fgets(buf, sizeof(buf), pipe)) { ... } // Nachher (non-blocking): while (true) { struct pollfd pfd = {fd, POLLIN, 0}; int pret = poll(&pfd, 1, 200); ssize_t n = read(fd, raw, sizeof(raw) - 1); // Split on \r and \n } ``` ## Betroffene Dateien - `src/rsync_manager.cpp` Gefixt in Commit `7b50af6`.
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: x3/x3-backup#2