oetiker / znapzend

zfs backup with remote capabilities and mbuffer integration.
www.znapzend.org
GNU General Public License v3.0
604 stars 136 forks source link

Allow configuring `mbuffer` path and size separately for each destination (and source) system #630

Closed jimklimov closed 5 months ago

jimklimov commented 5 months ago

Closes: #629

See rationale and investigation details in the linked issue above.

Practical run with legacy-only setup (and debug mode):

...
# zfs list -H -o name -t filesystem,volume rpool/home/abuild
[2024-01-16 14:33:55.30202] [623247] [info] WARNING: property 'src_mbuffer_size' not set on backup for rpool/home/abuild, inheriting from legacy 'mbuffer_size': 128M
# ssh -o batchMode=yes -o ConnectTimeout=30 znapzend zfs list -H -o name -t 'filesystem,volume' pond/export/DUMP/NUTCI/znapzend/ci-deb/rpool/home/abuild
[2024-01-16 14:33:55.59895] [623247] [info] WARNING: property 'dst_0_mbuffer' not set on backup for rpool/home/abuild, inheriting path[:port] from legacy 'mbuffer': mbuffer
[2024-01-16 14:33:55.59917] [623247] [info] WARNING: property 'dst_0_mbuffer_size' not set on backup for rpool/home/abuild, inheriting from legacy 'mbuffer_size': 128M
# ssh -o batchMode=yes -o ConnectTimeout=30 znapzend test -x mbuffer || ssh -o batchMode=yes -o ConnectTimeout=30 znapzend command -v mbuffer
WARNING: Only found executable file basename 'mbuffer' with 'command -v': /home/znapzend-ci-oi/bin/mbuffer

...

[2024-01-16 14:36:25.82687] [624979] [debug] sending snapshots from rpool/home/abuild to znapzend:pond/export/DUMP/NUTCI/znapzend/ci-deb/rpool/home/abuild
[2024-01-16 14:36:25.82715] [624979] [debug] Are we sending "--since"? since=="0", skipIntermediates=="0", forbidDestRollback=="0", justCreated=="false"
# zfs list -H -o name -t snapshot -s creation -d 1 rpool/home/abuild
# ssh -o batchMode=yes -o ConnectTimeout=30 znapzend zfs list -H -o name -t snapshot -s creation -d 1 pond/export/DUMP/NUTCI/znapzend/ci-deb/rpool/home/abuild
# zfs send -Lce -I 'rpool/home/abuild@znapzend-auto-2024-01-16T11:51:05Z' 'rpool/home/abuild@znapzend-auto-2024-01-16T14:36:24Z'|ssh -o batchMode=yes -o ConnectTimeout=30 znapzend 'mbuffer -q -s 256k -W 600 -m 128M|zfs recv -u -F pond/export/DUMP/NUTCI/znapzend/ci-deb/rpool/home/abuild'
# zfs list -H -o name -t snapshot rpool/home/abuild@znapzend-auto-2024-01-16T14:36:24Z
# zfs set org.znapzend:dst_0_synced=1 rpool/home/abuild@znapzend-auto-2024-01-16T14:36:24Z
# zfs set org.znapzend:dst_0=znapzend:pond/export/DUMP/NUTCI/znapzend/ci-deb/rpool/home/abuild rpool/home/abuild@znapzend-auto-2024-01-16T14:36:24Z

And for a setup with dedicated values:

src# zfs set org.znapzend:src_mbuffer=`which mbuffer` rpool/home
src# zfs set org.znapzend:dst_0_mbuffer="/home/znapzend-ci-oi/bin/mbuffer" rpool/home
src# zfs set org.znapzend:dst_0_mbuffer_size=1G rpool/home
src# zfs set org.znapzend:src_mbuffer_size=128M rpool/home

src# ./bin/znapzend --pidfile=/dev/null --features=compressed,recvu,sendIntermediates --inherited --runonce=rpool/home/abuild --debug
...
[2024-01-16 14:40:13.89197] [627314] [debug] === getDataSetProperties():
        Collected: $VAR1 = {
          'pre_znap_cmd' => 'off',
          'recursive' => 'on',
          'src_mbuffer_size' => '128M',
          'dst_0_mbuffer' => '/home/znapzend-ci-oi/bin/mbuffer',
          'dst_0_plan' => '1weeks=>1days,1months=>1weeks,1years=>1months,10years=>6months',
          'zend_delay' => '0',
          'tsformat' => 'znapzend-auto-%Y-%m-%dT%H:%M:%SZ',
          'post_znap_cmd' => 'off',
          'mbuffer' => 'mbuffer',
          'enabled' => 'on',
          'mbuffer_size' => '128M',
          'src' => 'rpool/home/abuild',
          'dst_0_mbuffer_size' => '1G',
          'src_plan' => '1weeks=>1days,1months=>1weeks,1years=>1months,10years=>6months',
          'src_mbuffer' => '/usr/bin/mbuffer',
          'dst_0' => 'znapzend:pond/export/DUMP/NUTCI/znapzend/ci-deb/rpool/home/abuild'
        };
# zfs list -H -o name -t filesystem,volume rpool/home/abuild
# test -x /usr/bin/mbuffer || command -v /usr/bin/mbuffer
# ssh -o batchMode=yes -o ConnectTimeout=30 znapzend zfs list -H -o name -t 'filesystem,volume' pond/export/DUMP/NUTCI/znapzend/ci-deb/rpool/home/abuild
# ssh -o batchMode=yes -o ConnectTimeout=30 znapzend test -x /home/znapzend-ci-oi/bin/mbuffer || ssh -o batchMode=yes -o ConnectTimeout=30 znapzend command -v /home/znapzend-ci-oi/bin/mbuffer
=== getBackupSet() : got 1 dataset(s) with a local or inherited backup plan
...
# zfs send -Lce -I 'rpool/home/abuild@znapzend-auto-2024-01-16T14:36:24Z' 'rpool/home/abuild@znapzend-auto-2024-01-16T14:40:14Z'|ssh -o batchMode=yes -o ConnectTimeout=30 znapzend '/home/znapzend-ci-oi/bin/mbuffer -q -s 256k -W 600 -m 1G|zfs recv -u -F pond/export/DUMP/NUTCI/znapzend/ci-deb/rpool/home/abuild'
jimklimov commented 5 months ago

Hm, it did honour the destination settings but did not add a sender mbuffer. Checking...

jimklimov commented 5 months ago

A few typo fixes and a force-push later, the test with local settings passes (uses zfs | mbuffer | ssh "mbuffer|zfs" chain), wrapped for readability below:

# zfs send -Lce -I 'rpool/home/abuild@znapzend-auto-2024-01-16T14:36:24Z' 'rpool/home/abuild@znapzend-auto-2024-01-16T14:53:57Z' \
    |/usr/bin/mbuffer -q -s 256k -W 600 -m 128M \
    |ssh -o batchMode=yes -o ConnectTimeout=30 znapzend '\
        mbuffer -q -s 256k -W 600 -m 1G\
        |zfs recv -u -F pond/export/DUMP/NUTCI/znapzend/ci-deb/rpool/home/abuild'