# Cleanup

In order to remove of old backup versions, Benji uses a two step process.

## Removing old versions

In order to remove an old version, use `benji rm`:

    $ benji rm --help
    usage: benji rm [-h] [-f] [-k] [--override-lock] version_uid [version_uid ...]

    positional arguments:
      version_uid           Version UID

    optional arguments:
      -h, --help            show this help message and exit
      -f, --force           Force removal (overrides protection of recent
                            versions)
      -k, --keep-metadata-backup
                            Keep version metadata backup
      --override-lock       Override and release any held locks (dangerous)

Example:

    $ benji rm -f V1
        INFO: $ benji rm -f V1
        INFO: Removed version V0000000001 metadata from backend storage.
        INFO: Removed backup version V0000000001 with 10 blocks.

Versions can only be removed if they are older than the number of days configured with the `disallowRemoveWhenYounger` option:

    $ benji rm V1
           INFO: $ benji rm V1
          ERROR: Version V0000000001 is too young. Will not delete.

It is possible to force the removal of a version by using `--force`.

`benji rm` removes the version’s metadata and corresponding block list from the database. It also adds the removed block entries into a deletion candidate list. By default it also removes the backup of the version’s metadata on the storage. If you want to keep this data, you can use the `-k` or `--keep-metadata-backup` option.

`benji rm` only affects the database. To actually delete unused blocks on the storages a `benji cleanup` is required.

## Cleanup

To free up space on the storage, you need to cleanup. There are two different cleanup methods, but you’ll usually only need the so-called fast-cleanup.

    $ benji cleanup --help
    usage: benji cleanup [-h] [--override-lock]

    optional arguments:
      -h, --help       show this help message and exit
      --override-lock  Override and release any held lock (dangerous)

`benji cleanup` will go through the list of deletion candidates and check if there are blocks which aren’t referenced from any other version anymore.

These blocks are then deleted from the storage. The still-in-use blocks are removed from the list of candidates. Due to fact that Benji needs to prevent a race-conditions between removing a block completely and referencing this block from another version `benji cleanup` will only remove data blocks once they’re on the list of deletion candidates for more than one hour.