Retention policy job for Acronis or FalconStor servers runs every hour. If a previous job instance has not finished yet, the next one doesn't run.
Retention policy does not use current time, but is counted from the last backup time.
Retention schedule consists of time buckets - hourly, daily, weekly, monthly.
Buckets go on-by-one in sequence from the last backup.
By design, the newest backup is never deleted.
By design, all backups from hourly buckets are never deleted.
For backups in daily, weekly and monthly buckets only the oldest one is left.
If one bucket has no backups, but its right neighbour has one very close to buckets border (within 15 minutes from the border), then this bucket will borrow this backup.
If a bucket has more than one backup and its right backup is very close to buckets border (within 15 minutes from the border), then this bucket will loan such backup to its right neighbour.
At this point, all backups are assigned to buckets and marked for either retention or removal:
We go through each interval spanning 2 backups marked for retention (with at least 1.5 bucket length between them) and find one backup marked for deletion in that interval which is the closest to the middle of the interval (but no closer than 0.5 of the bucket length from either beginning or ending of the interval).
If such a backup is found then it is marked for retention and won't be deleted.
The number of threads used to delete all condemned backups depends on the number of the storage nodes - one thread per node.
Please, remember that retention policy algorithm doesn't keep any state. Therefore, to reproduce the production retention case for more than one retention cycle, you have to reproduce all steps, not just run the algorithm for yesterday morning backups sequence one time.