Problems with cleanup on zfs

It seems like my server never automatically deletes any backups during the cleanup window. I have global quota set to 90% and e.g. a maximum of 14 daily incremental backups. Yet, I have hundreds of incremental backups for each client.
It took almost a year for my 8x 10TB raidz2 to fill up; I was waiting to see if the server would start deleting backups when the quota is hit. Now I’m at 1% free (reported by zfs list) and the server does emergency cleanups during normal backup operation. That does not work reliably as zfs takes some time to reclaim space after deletions. Manually stopping the server and running ‘urbackupsrv cleanup’ works as expected.

The backup window is at the default 1-7/3-4. Is there anything I could have misconfigured? Is there a way to enforce the maximum number of backups to keep? It’s quite possible that the server has problems checking the available space on the backup volume, if it is using the posix interface (see output of df below):

root@backup:~# zfs list tank/urbackup/images
NAME                   USED  AVAIL  REFER  MOUNTPOINT
tank/urbackup/images  1.61T  82.2G   205K  /tank/urbackup/images

root@backup:~# zfs list tank/urbackup/files
NAME                  USED  AVAIL  REFER  MOUNTPOINT
tank/urbackup/files  48.1T  82.2G   205K  /tank/urbackup/files

root@backup:~# zfs list tank
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank  49.9T  82.2G  56.0M  /tank

root@backup:~# df -h /tank/urbackup/images
Filesystem      Size  Used Avail Use% Mounted on
tank             83G   56M   83G   1% /tank

root@backup:~# cat /etc/urbackup/dataset
tank/urbackup/images
root@backup:~# cat /etc/urbackup/dataset_file 
tank/urbackup/files
root@backup:~# cat /etc/urbackup/backupfolder 
/tank/urbackup/backupfolder

Edit:

Manually stopping the server and running ‘urbackupsrv cleanup’ works as expected

Well, i ran urbackupsrv cleanup -a 20% and it removed a few TB. But I still have more than the configured maximum backups for some clients.

It uses the output of df -h /tank/urbackup/backupfolder as reference point on how much storage is used.

W.r.t. to the more than configured amount, you should check if it propagated properly to the client settings (greyed out values).

You are right, the problem is settings made via group are not applied to the individual clients. When I change a settting in the group, it does not update the client settings.

The output of df is not useful to get the free space of btrfs and zfs systems. Can you consider intergrating the appropriate btrfs and zfs tools? Or alternatively, make it possible to call an external script.

I stumbled across another problem; When the server deletes a backup the corresponding zfs dataset is not deleted. I didn’t notice before because I thought full backups were being kept as the base for incremental backups.
My server is already logging with debug level, yet I can’t find any log output relating to the cleanup process. I am aware the zfs support was contributed by a third party; If you don’t have the time to look into this please refer me to them. With a little bit of help I might be able to start working on fixes myself, hopefully I’ll find some time to look at the codebase in the winter months.

The server is listing 3 full and 7 incremental backups for this specific client. Zfs however has 60 datasets for it, totalling 32.8TB of used storage (urbackup statistics page says 7.23TB):

root@backup:~# zfs list tank/urbackup/files/john.local.[...] -d 2
    NAME                                                          USED  AVAIL  REFER  MOUNTPOINT
    tank/urbackup/files/john.local.[...]              32.8T  3.43T   205K  /tank/urbackup/files/john.local.[...]
    tank/urbackup/files/john.local.[...]/180503-0451  3.22T  3.43T  3.22T  /tank/urbackup/files/john.local.[...]/180503-0451
    tank/urbackup/files/john.local.[...]/180510-0615  13.4G  3.43T  3.21T  /tank/urbackup/files/john.local.[...]/180510-0615
    tank/urbackup/files/john.local.[...]/180616-1354      0  3.43T  4.33T  /tank/urbackup/files/john.local.[...]/180616-1354
    tank/urbackup/files/john.local.[...]/180618-0908  4.39T  3.43T  4.38T  /tank/urbackup/files/john.local.[...]/180618-0908
    tank/urbackup/files/john.local.[...]/180618-1556  4.44T  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180618-1556
    tank/urbackup/files/john.local.[...]/180620-0843  7.85G  3.43T  4.43T  /tank/urbackup/files/john.local.[...]/180620-0843
    tank/urbackup/files/john.local.[...]/180620-2049   663M  3.43T  4.43T  /tank/urbackup/files/john.local.[...]/180620-2049
    tank/urbackup/files/john.local.[...]/180621-0857  23.0G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180621-0857
    tank/urbackup/files/john.local.[...]/180621-2106  6.53G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180621-2106
    tank/urbackup/files/john.local.[...]/180622-0913  1.57G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180622-0913
    tank/urbackup/files/john.local.[...]/180622-2121  6.52G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180622-2121
    tank/urbackup/files/john.local.[...]/180623-0929  5.67G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180623-0929
    tank/urbackup/files/john.local.[...]/180623-2134  6.08M  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180623-2134
    tank/urbackup/files/john.local.[...]/180624-0939  1.90G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180624-0939
    tank/urbackup/files/john.local.[...]/180624-2147   522M  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180624-2147
    tank/urbackup/files/john.local.[...]/180625-0955  1.53G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180625-0955
    tank/urbackup/files/john.local.[...]/180625-2201   168M  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180625-2201
    tank/urbackup/files/john.local.[...]/180626-1009  6.21G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180626-1009
    tank/urbackup/files/john.local.[...]/180626-2215  6.39G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180626-2215
    tank/urbackup/files/john.local.[...]/180627-1023  16.4G  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180627-1023
    tank/urbackup/files/john.local.[...]/180627-2228  4.27G  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180627-2228
    tank/urbackup/files/john.local.[...]/180628-1033   109M  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180628-1033
    tank/urbackup/files/john.local.[...]/180628-2238   255M  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180628-2238
    tank/urbackup/files/john.local.[...]/180629-1044   192M  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180629-1044
    tank/urbackup/files/john.local.[...]/180629-2250  1.73G  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180629-2250
    tank/urbackup/files/john.local.[...]/180630-1058  6.27M  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180630-1058
    tank/urbackup/files/john.local.[...]/180630-2303   845K  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180630-2303
    tank/urbackup/files/john.local.[...]/180701-1107  8.77M  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180701-1107
    tank/urbackup/files/john.local.[...]/180701-2313  38.4M  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180701-2313
    tank/urbackup/files/john.local.[...]/180702-1118   311M  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180702-1118
    tank/urbackup/files/john.local.[...]/180702-2324   298M  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180702-2324
    tank/urbackup/files/john.local.[...]/180703-1132   691M  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180703-1132
    tank/urbackup/files/john.local.[...]/180703-2339  2.49G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180703-2339
    tank/urbackup/files/john.local.[...]/180704-1146  6.49G  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180704-1146
    tank/urbackup/files/john.local.[...]/180704-2355  17.5G  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180704-2355
    tank/urbackup/files/john.local.[...]/180705-1202   124M  3.43T  4.45T  /tank/urbackup/files/john.local.[...]/180705-1202
    tank/urbackup/files/john.local.[...]/180706-0008  17.3G  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180706-0008
    tank/urbackup/files/john.local.[...]/180706-1215  12.0G  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180706-1215
    tank/urbackup/files/john.local.[...]/180707-0022  2.37G  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180707-0022
    tank/urbackup/files/john.local.[...]/180707-1229   316K  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180707-1229
    tank/urbackup/files/john.local.[...]/180708-0033  1.88G  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180708-0033
    tank/urbackup/files/john.local.[...]/180708-1238  40.2M  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180708-1238
    tank/urbackup/files/john.local.[...]/180709-0043  1.91G  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180709-0043
    tank/urbackup/files/john.local.[...]/180712-1125  1.70G  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180712-1125
    tank/urbackup/files/john.local.[...]/180712-1303  17.1K  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180712-1303
    tank/urbackup/files/john.local.[...]/180718-1413  46.5G  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180718-1413
    tank/urbackup/files/john.local.[...]/180804-0648  4.46T  3.43T  4.46T  /tank/urbackup/files/john.local.[...]/180804-0648
    tank/urbackup/files/john.local.[...]/180811-2209  4.24T  3.43T  4.24T  /tank/urbackup/files/john.local.[...]/180811-2209
    tank/urbackup/files/john.local.[...]/180813-1510   205K  3.43T   205K  /tank/urbackup/files/john.local.[...]/180813-1510
    tank/urbackup/files/john.local.[...]/180813-1531  4.44T  3.43T  4.44T  /tank/urbackup/files/john.local.[...]/180813-1531
    tank/urbackup/files/john.local.[...]/180818-0828   274G  3.43T  4.70T  /tank/urbackup/files/john.local.[...]/180818-0828
    tank/urbackup/files/john.local.[...]/180819-0923  1.49G  3.43T  4.64T  /tank/urbackup/files/john.local.[...]/180819-0923
    tank/urbackup/files/john.local.[...]/180820-0931   258G  3.43T  4.89T  /tank/urbackup/files/john.local.[...]/180820-0931
    tank/urbackup/files/john.local.[...]/180821-0941  4.90T  3.43T  4.90T  /tank/urbackup/files/john.local.[...]/180821-0941
    tank/urbackup/files/john.local.[...]/180825-0120  4.29G  3.43T  4.42T  /tank/urbackup/files/john.local.[...]/180825-0120
    tank/urbackup/files/john.local.[...]/180826-0129  2.54M  3.43T  4.42T  /tank/urbackup/files/john.local.[...]/180826-0129
    tank/urbackup/files/john.local.[...]/180827-0136   700K  3.43T  4.42T  /tank/urbackup/files/john.local.[...]/180827-0136
    tank/urbackup/files/john.local.[...]/180828-0139  3.68G  3.43T  4.42T  /tank/urbackup/files/john.local.[...]/180828-0139
    tank/urbackup/files/john.local.[...]/180829-0146  1.31T  3.43T  1.31T  /tank/urbackup/files/john.local.[...]/180829-0146
    tank/urbackup/files/john.local.[...]/180830-0343   714G  3.43T   714G  /tank/urbackup/files/john.local.[...]/180830-0343
    root@backup:~# zfs list tank/urbackup/files/john.local.[...] -d 2 | tail -n+3 | wc -l
    60

You could manually test dataset removal by running e.g.

urbackup_snapshot_helper 1 remove john.local.[...] 180821-0941

Did you create any additional snapshots of the backups to e.g. replicate them?

Ah I didn’t realize that script contains the deletion logic for the server. I’ve only played with the client side bash scripts, where I replaced most of the logic with python.
I’m going to try your suggestion on Monday. In the meantime, would it be worthwhile to polish my scripts and contribute them for integration? You’d have to pick up python3 and some py modules as dependencies, but my scripts are much easier to read and to maintain for all the different snapshot capable filesystems.

Not sure if this is the right spot, but trying to understand ZFS and Full file backups. It seems that if you run a full file backup (AFTER initial full backup and subsequent incrementals) with a ZFS back end, then ALL data is stored again on the new dataset, and not just the changes on top of the previous ro snapshot as in an incremental. Should not just the changes be stored? Kind of defeats the purpose of using ZFS…Is it recommended to not use Full file backups at all for ZFS (ie incremental forever?) If I want to keep a year’s worth of backups that leads to a huge! number of datasets…I would like to use a “traditional” setup with say 12 monthly backups and 30 dailies…without! storing all the full data 12 times…seems to me that should be possible with zfs?

1 Like

p.s. if incremental forever, do we need to set max # of full file backups to 1?

Likewise for image backups with raw/zfs, to use minimum space, do we disable full image backups and/or set max number of full images to 1?

1 Like