X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=blobdiff_plain;f=dss.c;h=12ad11cfdfc22e9707cb340a291785bfbfc2bf87;hp=2a18857ecd1f3db9f12a698710385f415be8b53b;hb=df4a2d392aa10cc73e66fedc24a4e3703ec5335e;hpb=2c323390175ba8d8d8b9f8dcd5201abb6039aad6;ds=sidebyside diff --git a/dss.c b/dss.c index 2a18857..12ad11c 100644 --- a/dss.c +++ b/dss.c @@ -44,8 +44,8 @@ static int signal_pipe; 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. */ @@ -53,7 +53,9 @@ static int64_t current_snapshot_creation_time; /** 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; @@ -155,7 +157,7 @@ static void compute_next_snapshot_time(void) 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) { @@ -191,7 +193,7 @@ out: 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}; @@ -200,7 +202,7 @@ static int remove_snapshot(struct snapshot *s, char *why) 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; @@ -364,7 +366,7 @@ static int pre_create_hook(void) 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); @@ -372,7 +374,7 @@ static int pre_create_hook(void) 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; } @@ -382,7 +384,7 @@ static int post_create_hook(void) char *cmd; if (!conf.post_create_hook_given) { - snapshot_creation_status = SCS_READY; + snapshot_creation_status = HS_READY; compute_next_snapshot_time(); return 0; } @@ -393,7 +395,7 @@ static int post_create_hook(void) free(cmd); if (ret < 0) return ret; - snapshot_creation_status = SCS_POST_HOOK_RUNNING; + snapshot_creation_status = HS_POST_RUNNING; return ret; } @@ -474,7 +476,7 @@ static int wait_for_process(pid_t pid, int *status) static int handle_rm_exit(int status) { - rm_pid = 0; + remove_pid = 0; if (!WIFEXITED(status)) return -E_INVOLUNTARY_EXIT; if (WEXITSTATUS(status)) @@ -484,7 +486,7 @@ static int handle_rm_exit(int 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; @@ -498,7 +500,7 @@ static int handle_rsync_exit(int status) 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; } @@ -506,7 +508,7 @@ static int handle_rsync_exit(int status) 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; @@ -515,14 +517,14 @@ static int handle_rsync_exit(int status) 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; @@ -535,7 +537,7 @@ static int handle_pre_create_hook_exit(int status) 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; @@ -548,13 +550,13 @@ static int handle_pre_create_hook_exit(int status) 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; @@ -571,12 +573,12 @@ static int handle_sigchld(void) 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: @@ -585,7 +587,7 @@ static int handle_sigchld(void) 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; @@ -709,7 +711,7 @@ static int handle_signal(void) case SIGTERM: restart_create_process(); kill_process(create_pid); - kill_process(rm_pid); + kill_process(remove_pid); ret = -E_SIGNAL; break; case SIGHUP: @@ -799,7 +801,7 @@ static int create_snapshot(char **argv) 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; } @@ -815,7 +817,7 @@ static int select_loop(void) 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; @@ -833,7 +835,7 @@ static int select_loop(void) if (ret < 0) goto out; } - if (rm_pid) + if (remove_pid) continue; ret = disk_space_low(); if (ret < 0) @@ -842,7 +844,7 @@ static int select_loop(void) ret = try_to_free_disk_space(low_disk_space); if (ret < 0) goto out; - if (rm_pid) { + if (remove_pid) { stop_create_process(); continue; } @@ -851,33 +853,33 @@ static int select_loop(void) 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; } } @@ -983,7 +985,7 @@ static int com_create(void) 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);