static int remove_oldest_snapshot(struct snapshot_list *sl)
{
+ int ret;
struct snapshot *s = get_oldest_snapshot(sl);
if (!s) /* no snapshot found */
DSS_INFO_LOG("oldest snapshot: %s\n", s->name);
if (snapshot_is_being_created(s))
return 0;
- return pre_remove_hook(s, "oldest");
+ ret = pre_remove_hook(s, "oldest");
+ if (ret < 0)
+ return ret;
+ return 1;
}
static int rename_incomplete_snapshot(int64_t start)
snapshot_removal_status = HS_READY;
return -E_BAD_EXIT_CODE;
}
- snapshot_removal_status = HS_SUCCESS;
+ if (conf.post_remove_hook_given)
+ snapshot_removal_status = HS_SUCCESS;
+ else
+ snapshot_removal_status = HS_READY;
return 1;
}
goto out;
}
es = WEXITSTATUS(status);
- if (es == 13) { /* Errors with program diagnostics */
+ /*
+ * Restart rsync on non-fatal errors:
+ * 12: Error in rsync protocol data stream
+ * 13: Errors with program diagnostics
+ */
+ if (es == 12 || es == 13) {
DSS_WARNING_LOG("rsync process %d returned %d -- restarting\n",
(int)create_pid, es);
snapshot_creation_status = HS_NEEDS_RESTART;