v2.0.5
Signed-off-by: Guenther Alka gea@napp-it.org
Concept Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
Tested sync variants (live, 2026-07-25)
| Mode | Hosts | Result |
|---|---|---|
| Local bidir (primary <-> secondary) | Linux .112 (ZFS posixacl) | OK |
| Local bidir | FreeBSD 15.1 .191 (ZFS nfs4) | OK after B4 fix |
| Local bidir | macOS .195 (APFS, acltype=none) | OK after B5 fix |
| Local bidir | Windows winpool (ZFS nfs4, ACL via SDDL) | OK |
| Remote backup Linux -> FreeBSD | .112 -> .191:9010 | OK |
| Remote backup Linux -> OmniOS | .112 -> .189:9010 | OK |
| Remote backup Linux -> macOS | .112 -> .195:9010 | OK |
| Remote backup Linux -> Windows | .112 -> .65:9010 | OK |
| Remote backup Windows -> Linux | .65 -> .112:9010 | OK |
| Remote backup Windows -> OmniOS | .65 -> .189:9010 | OK |
| Remote backup Windows -> FreeBSD | .65 -> .191:9010 | OK |
| Rename across network | .112 -> .191 | OK -- metadata op, no re-transfer |
| Mass-delete guard + freeze/approve flow | sandbox | OK |
| Transfer key mismatch | sandbox | OK -- REFUSED immediately, clean log |
| Disconnect / reconnect + queue drain | sandbox | OK |
Bugfixes vs v2.0.0
- B1 Sender logged
emote connected before receiver validated the transfer key -- fix: explicit accept-ack from receiver, sender waits for it before declaring connected - B2 Nil-pointer panic in Sender.connect(): double-close of already-nil connection after transport error
- B3 Delete-freeze loop: deleting delete-freeze.txt re-tripped the same budget on the next pass -- fix: one-shot rename-to-delete-approve.txt protocol (approve file is consumed after one pass)
- B4 FreeBSD 15.1: ZFS property acltype=posixacl is a compat label even on NFS4 datasets, caused WARN spam on every reconcile pass -- fix: FreeBSD treated like illumos, acltype read skipped, always returns nfs4
- B5 macOS without ZFS (APFS/HFS+): FATAL on missing zfs binary -- fix: graceful fallback to acltype=none (file sync only, no ACL propagation), parallel to the existing Windows fallback
- B6 Log line incorrectly said aclinherit=passthrough set on both parent datasets when acltype=none
- B7 --key flag was wired through Sender/Receiver structs but missing from main.go flag definitions -- caused lag provided but not defined: -key on all platforms
- B8 Protocol handshake incompatibility between v2.0.0 (no accept-ack) and v2.0.1+ (accept-ack added in B1 fix): receivers logged handshake recv failed: EOF when contacted by older senders -- fix: update all members to the same version; ProtoVersion bump on any handshake flow change is tracked as TODO for v2.1