X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=blobdiff_plain;f=dss.c;h=6dbe11f6ba7e5fd3541a0364228b6fc81562b793;hp=fd876e5ddc1d340dec79dee84f9706dc9a09912f;hb=0ca40f54698dc00d81e40f784e27628f8fe802c0;hpb=d775cef639649be13a99c4d42fb7abda69ea7d09 diff --git a/dss.c b/dss.c index fd876e5..6dbe11f 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. */ @@ -54,6 +54,8 @@ static int64_t current_snapshot_creation_time; static char *path_to_last_complete_snapshot; /** \sa \ref snap.h for details. */ static unsigned snapshot_creation_status; +/** \sa \ref snap.h for details. */ +static unsigned snapshot_removal_status; DEFINE_DSS_ERRLIST; @@ -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; @@ -367,7 +369,7 @@ static int pre_create_hook(void) snapshot_creation_status = SCS_PRE_HOOK_SUCCESS; return 0; } - DSS_NOTICE_LOG("executing %s\n", conf.pre_create_hook_arg); + DSS_DEBUG_LOG("executing %s\n", conf.pre_create_hook_arg); ret = dss_exec_cmdline_pid(&create_pid, conf.pre_create_hook_arg, fds); if (ret < 0) @@ -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; @@ -532,6 +534,7 @@ out: static int handle_pre_create_hook_exit(int status) { int es, ret; + static int warn_count; if (!WIFEXITED(status)) { snapshot_creation_status = SCS_READY; @@ -541,11 +544,18 @@ static int handle_pre_create_hook_exit(int status) } es = WEXITSTATUS(status); if (es) { + if (!warn_count--) { + DSS_NOTICE_LOG("pre_create_hook %s returned %d\n", + conf.pre_create_hook_arg, es); + DSS_NOTICE_LOG("deferring snapshot creation...\n"); + warn_count = 60; /* warn only once per hour */ + } snapshot_creation_status = SCS_READY; compute_next_snapshot_time(); - ret = -E_BAD_EXIT_CODE; + ret = 0; goto out; } + warn_count = 0; snapshot_creation_status = SCS_PRE_HOOK_SUCCESS; ret = 1; out: @@ -577,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; @@ -701,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: @@ -807,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; @@ -825,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) @@ -834,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; } @@ -975,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);