We have opened this bug after revising the logic in the combination of the --rotate and --rotate-at arguments, as it is flawed in some cases.
One of our basic principles at designing (c)XSIBackup is that it must be conservative and that it has to keep on running even if some errors are returned.
Due to the previously exposed principle we leave pruning old backups or folders until the end, so that you at least have a new backup before pruning old data, which is recommendable in case of low rotation figures (2,3) as we see all the time.
The thing is that when you are short of space and you use --replica instead of --backup to accumulate full copies at some local or remote FS this may lead to being caught in the middle in such way that the --rotate argument can't operate before the FS is indeed full.
We are going to revise that so that the priority is to make room, still, take on account that we leave a 10% margin and that maneuvering at the limit of your FS capacity may always lead to unexpected results, as once the FS is full a system error will be raised and everything will stop working.
As said we will revise the full logic in the exposed scenario and write a monographic post on the subject, so that anybody can be confident on how to use --rotate.
We are revising the --rotate feature. It worked well for the most part, we detected some bug when using the --rotate=max argument that will be fixed in 18.104.22.168.
We have also taken the chance to add a feature that you have been asking for, namely: to consider size on-disk or non-zero data on sparse files instead of the full nominal size of the VHD. Nonetheless, as there is no possibility to know which FS you are using as the VM datastore in case of NFS shares or whether the remote end actually supports sparse files, we will add some options to:
1/ Set the FS block size which is usually 512 bytes, it it very rare that you have to set this, the feature will work out of the box 99% of the times with the default 512 byte size, still we added the possibility that the user sets it just in case.
2/ Select nominal full size of the disk (default) or non-zero data by using a flag.
There are two posts that treat this subject in more depth and that will be updated to reflect the new behaviour: