X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=dss.c;h=e4415f5f7c4d4a789f508899e715d9492bb387ee;hb=291aebda9ce76c72053f2f34bbd017161a0b0383;hp=0a2f55b9fb02035405c791e2343398eeacb78d44;hpb=fd7ab0475e24ec414883bf3772db160869ed2e0c;p=dss.git diff --git a/dss.c b/dss.c index 0a2f55b..e4415f5 100644 --- a/dss.c +++ b/dss.c @@ -161,7 +161,6 @@ static int64_t compute_next_snapshot_time(void) 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)) @@ -251,8 +250,7 @@ static int pre_remove_hook(struct snapshot *s, const char *why) 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; @@ -555,6 +553,7 @@ static void stop_create_process(void) { 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; } @@ -563,6 +562,7 @@ static void restart_create_process(void) { 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; } @@ -779,18 +779,22 @@ static int handle_sigchld(void) 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); @@ -1075,7 +1079,6 @@ static int select_loop(void) } FD_ZERO(&rfds); FD_SET(signal_pipe, &rfds); - DSS_DEBUG_LOG("tvp: %p, tv_sec : %lu\n", tvp, (long unsigned) tv.tv_sec); ret = dss_select(signal_pipe + 1, &rfds, NULL, tvp); if (ret < 0) goto out; @@ -1119,9 +1122,14 @@ static int select_loop(void) case HS_POST_RUNNING: continue; case HS_PRE_SUCCESS: - free_rsync_argv(rsync_argv); - create_rsync_argv(&rsync_argv, ¤t_snapshot_creation_time); - /* fall through */ + if (!name_of_reference_snapshot) { + 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 HS_NEEDS_RESTART: if (!next_snapshot_is_due()) continue;