- --delete-delay: state that the reported count advances on actual removal while --max-delete is charged at plan/snapshot time (defer_add/planned). A new differential shows rsync instead charges on actual removals and recursively removes a queued directory, so the row moves to Caveat (matrix 111/13/33) and the residual is pinned by tests. - Add a deterministic unit test (plan-time budget charge), a FastSync integration test (byte-barrier refill + --max-delete), and an rsync differential for a refilled deferred directory. - Soften the --fuzzy summary: the tree is byte-exact by design, so it is pinned by the threshold suite, not a byte-level differential. - README: describe what -m parity actually selects; fix the allowlist example to the real max_delete entry. - xdist-safe delete-timing fixture names (timing and --threads mode). - Renumber the duplicate HANDOFF item 9 to 10; add the missing final newline to test_checksum.c. - Expose ignore_errors_allows_delete and unit-test the deletion gate without a privileged source directory; update the stale deleted-count doc comment. No production behavior changes.
37 lines
1.6 KiB
C
37 lines
1.6 KiB
C
#ifndef CLIENT_SEND_H
|
|
#define CLIENT_SEND_H
|
|
|
|
#include "chunk.h"
|
|
#include "config.h"
|
|
#include "transport_tcp.h"
|
|
#include <signal.h>
|
|
#include <stdbool.h>
|
|
|
|
/* Set ONLY by the client's SIGINT/SIGTERM handler (async-signal-safe: the
|
|
* handler stores 1 and does nothing else). The send loops poll it via
|
|
* client_abort_pending() and, when set, best-effort send STATUS_ABORT so the
|
|
* receiver can clean up before the client exits. */
|
|
extern volatile sig_atomic_t client_abort_requested;
|
|
bool client_abort_pending(void);
|
|
/* Arm/disarm abort handling around the network phase. While disarmed, a
|
|
* SIGINT/SIGTERM takes the default action (immediate termination) so local-only
|
|
* modes are not left unresponsive. Defined in client_cli.c. */
|
|
void client_set_abort_armed(bool armed);
|
|
|
|
/* Both sender entry points BORROW `config` for the duration of the call; they
|
|
* never free it, and the caller retains ownership (freeing it with
|
|
* config_delete() once the call returns). */
|
|
int send_files(Config* config);
|
|
int send_files_multithreaded(Config** config);
|
|
/* rsync's --ignore-errors deletion gate: with no I/O error during the scan the
|
|
* deletion phase always proceeds; with one it is suppressed unless
|
|
* `--ignore-errors` was given. Exposed so the decision can be unit-tested
|
|
* without a privileged (mode-000) source directory. See client_send.c. */
|
|
bool ignore_errors_allows_delete(const Config* config, bool had_io_error);
|
|
|
|
/* Phase 6 residual-batch (client-only). See client_send.c. */
|
|
int write_batch_from_source(const Config* config, const char* batch_path);
|
|
int apply_batch_to_dest(const Config* config, const char* batch_path, const char* dest_root);
|
|
|
|
#endif
|