struct snapshot *s = NULL;
struct snapshot_list sl;
- current_snapshot_creation_time = 0;
dss_get_snapshot_list(&sl);
FOR_EACH_SNAPSHOT(s, i, &sl) {
if (!(s->flags & SS_COMPLETE))
{
int64_t now = get_current_time();
- assert(snapshot_creation_status == HS_READY);
if (!next_snapshot_time_is_valid())
next_snapshot_time = compute_next_snapshot_time();
if (next_snapshot_time <= now) {
cmd = make_message("%s %s/%s", conf.pre_remove_hook_arg,
conf.dest_dir_arg, s->name);
DSS_DEBUG_LOG("executing %s\n", cmd);
- ret = dss_exec_cmdline_pid(&remove_pid,
- conf.pre_remove_hook_arg, fds);
+ ret = dss_exec_cmdline_pid(&remove_pid, cmd, fds);
free(cmd);
if (ret < 0)
return ret;
{
if (!create_pid || create_process_stopped)
return;
+ DSS_INFO_LOG("suspending create process %d\n", (int)create_pid);
kill(SIGSTOP, create_pid);
create_process_stopped = 1;
}
{
if (!create_pid || !create_process_stopped)
return;
+ DSS_INFO_LOG("resuming create process %d\n", (int)create_pid);
kill (SIGCONT, create_pid);
create_process_stopped = 0;
}
if (pid == create_pid) {
switch (snapshot_creation_status) {
case HS_PRE_RUNNING:
- return handle_pre_create_hook_exit(status);
+ ret = handle_pre_create_hook_exit(status);
+ break;
case HS_RUNNING:
- return handle_rsync_exit(status);
+ ret = handle_rsync_exit(status);
+ break;
case HS_POST_RUNNING:
snapshot_creation_status = HS_READY;
- return 1;
+ ret = 1;
+ break;
default:
DSS_EMERG_LOG("BUG: create can't die in status %d\n",
snapshot_creation_status);
return -E_BUG;
}
create_pid = 0;
+ return ret;
}
if (pid == remove_pid) {
ret = handle_remove_exit(status);
case HS_POST_RUNNING:
continue;
case HS_PRE_SUCCESS:
- free_rsync_argv(rsync_argv);
- create_rsync_argv(&rsync_argv, ¤t_snapshot_creation_time);
+ if (!name_of_reference_snapshot) {
+ free_rsync_argv(rsync_argv);
+ create_rsync_argv(&rsync_argv, ¤t_snapshot_creation_time);
+ }
/* fall through */
case HS_NEEDS_RESTART:
+ if (!next_snapshot_is_due())
+ continue;
ret = create_snapshot(rsync_argv);
if (ret < 0)
goto out;