*/
dss_get_snapshot_list(&sl);
ret = 0;
- if (!low_disk_space && sl.num_snapshots <= 1)
+ /*
+ * Don't remove anything if there is free space and we have fewer
+ * snapshots than configured, plus one. This way there is always one
+ * snapshot that can be recycled.
+ */
+ if (!low_disk_space && sl.num_snapshots <= 1 << conf.num_intervals_arg)
goto out;
why = "outdated";
victim = find_outdated_snapshot(&sl);
victim = find_redundant_snapshot(&sl);
if (victim)
goto remove;
- /* try harder only if disk space is low */
- if (!low_disk_space)
- goto out;
why = "orphaned";
victim = find_orphaned_snapshot(&sl);
if (victim)
goto remove;
+ /* try harder only if disk space is low */
+ if (!low_disk_space)
+ goto out;
DSS_WARNING_LOG(("disk space low and nothing obvious to remove\n"));
victim = find_oldest_removable_snapshot(&sl);
if (victim)
if (es != 0 && es != 24) {
DSS_WARNING_LOG(("rsync exit code %d, error count %d\n",
es, ++num_consecutive_rsync_errors));
+ if (conf.create_given) {
+ ret = -E_BAD_EXIT_CODE;
+ goto out;
+ }
if (num_consecutive_rsync_errors > conf.max_rsync_errors_arg) {
ret = -E_TOO_MANY_RSYNC_ERRORS;
snapshot_creation_status = HS_READY;
return install_sighandler(SIGCHLD);
}
-/**
- * The main function of dss.
- *
- * \param argc Usual argument count.
- * \param argv Usual argument vector.
- */
int main(int argc, char **argv)
{
int ret;