static pid_t create_pid;
/** Whether the pre-create-hook/rsync/post-create-hook is currently stopped. */
static int create_process_stopped;
-/** Process id of current rm process. */
-static pid_t rm_pid;
+/** Process id of current pre-remove/rm/post-remove process. */
+static pid_t remove_pid;
/** When the next snapshot is due. */
static struct timeval next_snapshot_time;
/** Creation time of the snapshot currently being created. */
/** Needed by the post-create hook. */
static char *path_to_last_complete_snapshot;
/** \sa \ref snap.h for details. */
-static unsigned snapshot_creation_status;
+enum hook_status snapshot_creation_status;
+/** \sa \ref snap.h for details. */
+enum hook_status snapshot_removal_status;
DEFINE_DSS_ERRLIST;
struct snapshot *s = NULL;
struct snapshot_list sl;
- assert(snapshot_creation_status == SCS_READY);
+ assert(snapshot_creation_status == HS_READY);
current_snapshot_creation_time = 0;
dss_get_snapshot_list(&sl);
FOR_EACH_SNAPSHOT(s, i, &sl) {
static int remove_snapshot(struct snapshot *s, char *why)
{
int fds[3] = {0, 0, 0};
- assert(!rm_pid);
+ assert(!remove_pid);
char *new_name = being_deleted_name(s);
int ret = dss_rename(s->name, new_name);
char *argv[] = {"rm", "-rf", new_name, NULL};
goto out;
DSS_NOTICE_LOG("removing %s snapshot %s (interval = %i)\n",
why, s->name, s->interval);
- ret = dss_exec(&rm_pid, argv[0], argv, fds);
+ ret = dss_exec(&remove_pid, argv[0], argv, fds);
out:
free(new_name);
return ret;
int ret, fds[3] = {0, 0, 0};
if (!conf.pre_create_hook_given) {
- snapshot_creation_status = SCS_PRE_HOOK_SUCCESS;
+ snapshot_creation_status = HS_PRE_SUCCESS;
return 0;
}
DSS_DEBUG_LOG("executing %s\n", conf.pre_create_hook_arg);
conf.pre_create_hook_arg, fds);
if (ret < 0)
return ret;
- snapshot_creation_status = SCS_PRE_HOOK_RUNNING;
+ snapshot_creation_status = HS_PRE_RUNNING;
return ret;
}
char *cmd;
if (!conf.post_create_hook_given) {
- snapshot_creation_status = SCS_READY;
+ snapshot_creation_status = HS_READY;
compute_next_snapshot_time();
return 0;
}
free(cmd);
if (ret < 0)
return ret;
- snapshot_creation_status = SCS_POST_HOOK_RUNNING;
+ snapshot_creation_status = HS_POST_RUNNING;
return ret;
}
static int handle_rm_exit(int status)
{
- rm_pid = 0;
+ remove_pid = 0;
if (!WIFEXITED(status))
return -E_INVOLUNTARY_EXIT;
if (WEXITSTATUS(status))
static int wait_for_rm_process(void)
{
- int status, ret = wait_for_process(rm_pid, &status);
+ int status, ret = wait_for_process(remove_pid, &status);
if (ret < 0)
return ret;
if (!WIFEXITED(status)) {
DSS_ERROR_LOG("rsync process %d died involuntary\n", (int)create_pid);
ret = -E_INVOLUNTARY_EXIT;
- snapshot_creation_status = SCS_READY;
+ snapshot_creation_status = HS_READY;
compute_next_snapshot_time();
goto out;
}
if (es == 13) { /* Errors with program diagnostics */
DSS_WARNING_LOG("rsync process %d returned %d -- restarting\n",
(int)create_pid, es);
- snapshot_creation_status = SCS_RSYNC_NEEDS_RESTART;
+ snapshot_creation_status = HS_NEEDS_RESTART;
gettimeofday(&next_snapshot_time, NULL);
next_snapshot_time.tv_sec += 60;
ret = 1;
if (es != 0 && es != 23 && es != 24) {
DSS_ERROR_LOG("rsync process %d returned %d\n", (int)create_pid, es);
ret = -E_BAD_EXIT_CODE;
- snapshot_creation_status = SCS_READY;
+ snapshot_creation_status = HS_READY;
compute_next_snapshot_time();
goto out;
}
ret = rename_incomplete_snapshot(current_snapshot_creation_time);
if (ret < 0)
goto out;
- snapshot_creation_status = SCS_RSYNC_SUCCESS;
+ snapshot_creation_status = HS_SUCCESS;
out:
create_pid = 0;
create_process_stopped = 0;
static int warn_count;
if (!WIFEXITED(status)) {
- snapshot_creation_status = SCS_READY;
+ snapshot_creation_status = HS_READY;
compute_next_snapshot_time();
ret = -E_INVOLUNTARY_EXIT;
goto out;
DSS_NOTICE_LOG("deferring snapshot creation...\n");
warn_count = 60; /* warn only once per hour */
}
- snapshot_creation_status = SCS_READY;
+ snapshot_creation_status = HS_READY;
compute_next_snapshot_time();
ret = 0;
goto out;
}
warn_count = 0;
- snapshot_creation_status = SCS_PRE_HOOK_SUCCESS;
+ snapshot_creation_status = HS_PRE_SUCCESS;
ret = 1;
out:
create_pid = 0;
if (pid == create_pid) {
switch (snapshot_creation_status) {
- case SCS_PRE_HOOK_RUNNING:
+ case HS_PRE_RUNNING:
return handle_pre_create_hook_exit(status);
- case SCS_RSYNC_RUNNING:
+ case HS_RUNNING:
return handle_rsync_exit(status);
- case SCS_POST_HOOK_RUNNING:
- snapshot_creation_status = SCS_READY;
+ case HS_POST_RUNNING:
+ snapshot_creation_status = HS_READY;
compute_next_snapshot_time();
return 1;
default:
return -E_BUG;
}
}
- if (pid == rm_pid)
+ if (pid == remove_pid)
return handle_rm_exit(status);
DSS_EMERG_LOG("BUG: unknown process %d died\n", (int)pid);
return -E_BUG;
case SIGTERM:
restart_create_process();
kill_process(create_pid);
- kill_process(rm_pid);
+ kill_process(remove_pid);
ret = -E_SIGNAL;
break;
case SIGHUP:
ret = dss_exec(&create_pid, argv[0], argv, fds);
if (ret < 0)
return ret;
- snapshot_creation_status = SCS_RSYNC_RUNNING;
+ snapshot_creation_status = HS_RUNNING;
return ret;
}
int low_disk_space;
struct timeval now, *tvp;
- if (rm_pid)
+ if (remove_pid)
tvp = NULL; /* sleep until rm process dies */
else { /* sleep one minute */
tv.tv_sec = 60;
if (ret < 0)
goto out;
}
- if (rm_pid)
+ if (remove_pid)
continue;
ret = disk_space_low();
if (ret < 0)
ret = try_to_free_disk_space(low_disk_space);
if (ret < 0)
goto out;
- if (rm_pid) {
+ if (remove_pid) {
stop_create_process();
continue;
}
if (tv_diff(&next_snapshot_time, &now, NULL) > 0)
continue;
switch (snapshot_creation_status) {
- case SCS_READY:
+ case HS_READY:
ret = pre_create_hook();
if (ret < 0)
goto out;
continue;
- case SCS_PRE_HOOK_RUNNING:
+ case HS_PRE_RUNNING:
continue;
- case SCS_RSYNC_NEEDS_RESTART:
+ case HS_NEEDS_RESTART:
ret = create_snapshot(rsync_argv);
if (ret < 0)
goto out;
continue;
- case SCS_PRE_HOOK_SUCCESS:
+ case HS_PRE_SUCCESS:
free_rsync_argv(rsync_argv);
create_rsync_argv(&rsync_argv, ¤t_snapshot_creation_time);
ret = create_snapshot(rsync_argv);
if (ret < 0)
goto out;
continue;
- case SCS_RSYNC_RUNNING:
+ case HS_RUNNING:
continue;
- case SCS_RSYNC_SUCCESS:
+ case HS_SUCCESS:
ret = post_create_hook();
if (ret < 0)
goto out;
continue;
- case SCS_POST_HOOK_RUNNING:
+ case HS_POST_RUNNING:
continue;
}
}
if (ret < 0)
return ret;
ret = handle_pre_create_hook_exit(status);
- if (ret < 0)
+ if (ret <= 0) /* error, or pre-create failed */
return ret;
}
create_rsync_argv(&rsync_argv, ¤t_snapshot_creation_time);