]> git.tuebingen.mpg.de Git - dss.git/blobdiff - dss.c
Never remove the snapshot that is currently being created.
[dss.git] / dss.c
diff --git a/dss.c b/dss.c
index af02f1ce0bfcbf20b6858a3b22f762762140e4bf..82cdc94abd157eb750f7f050bc494e86fa5ef95d 100644 (file)
--- a/dss.c
+++ b/dss.c
@@ -175,13 +175,13 @@ static void compute_next_snapshot_time(void)
        tmp.tv_sec = x;
        tmp.tv_usec = 0;
        ret = tv_diff(&unit_interval, &tmp, &diff); /* total sleep time per unit interval */
-       gettimeofday(&now, NULL);
-       if (ret < 0 || !s)
+       if (ret < 0 || !s) /* unit_interval < tmp or no snapshot */
                goto min_sleep;
        tv_divide(wanted, &diff, &tmp); /* sleep time betweeen two snapshots */
-       diff.tv_sec = s->completion_time;
+       diff.tv_sec = s->completion_time; /* completion time of the the latest snaphot */
        diff.tv_usec = 0;
        tv_add(&diff, &tmp, &next_snapshot_time);
+       gettimeofday(&now, NULL);
        if (tv_diff(&now, &next_snapshot_time, NULL) < 0)
                goto out;
 min_sleep:
@@ -209,6 +209,11 @@ out:
        return ret;
 }
 
+static int snapshot_is_being_created(struct snapshot *s)
+{
+       return s->creation_time == current_snapshot_creation_time;
+}
+
 /*
  * return: 0: no redundant snapshots, 1: rm process started, negative: error
  */
@@ -235,6 +240,8 @@ static int remove_redundant_snapshot(struct snapshot_list *sl)
                FOR_EACH_SNAPSHOT(s, i, sl) {
                        int64_t this_score;
 
+                       if (snapshot_is_being_created(s))
+                               continue;
                        //DSS_DEBUG_LOG("checking %s\n", s->name);
                        if (s->interval > interval) {
                                prev = s;
@@ -278,6 +285,8 @@ static int remove_outdated_snapshot(struct snapshot_list *sl)
        DSS_DEBUG_LOG("looking for snapshots belonging to intervals greater than %d\n",
                conf.num_intervals_arg);
        FOR_EACH_SNAPSHOT(s, i, sl) {
+               if (snapshot_is_being_created(s))
+                       continue;
                if (s->interval <= conf.num_intervals_arg)
                        continue;
                if (conf.dry_run_given) {
@@ -300,8 +309,8 @@ static int remove_oldest_snapshot(struct snapshot_list *sl)
        if (!s) /* no snapshot found */
                return 0;
        DSS_INFO_LOG("oldest snapshot: %s\n", s->name);
-       if (s->creation_time == current_snapshot_creation_time)
-               return 0; /* do not remove the snapshot currently being created */
+       if (snapshot_is_being_created(s))
+               return 0;
        return remove_snapshot(s);
 }
 
@@ -380,8 +389,8 @@ static int post_create_hook(void)
                compute_next_snapshot_time();
                return 0;
        }
-       cmd = make_message("%s %s", conf.post_create_hook_arg,
-               path_to_last_complete_snapshot);
+       cmd = make_message("%s %s/%s", conf.post_create_hook_arg,
+               conf.dest_dir_arg, path_to_last_complete_snapshot);
        DSS_NOTICE_LOG("executing %s\n", cmd);
        ret = dss_exec_cmdline_pid(&post_create_hook_pid, cmd, fds);
        free(cmd);
@@ -620,6 +629,15 @@ static int parse_config_file(int override)
                        .check_ambiguity = 0,
                        .print_errors = 1
                };
+               if (override) { /* invalidate all rsync options */
+                       int i;
+
+                       for (i = 0; i < conf.rsync_option_given; i++) {
+                               free(conf.rsync_option_arg[i]);
+                               conf.rsync_option_arg[i] = NULL;
+                       }
+                       conf.rsync_option_given = 0;
+               }
                cmdline_parser_config_file(config_file, &conf, &params);
        }
        ret = check_config();
@@ -695,6 +713,21 @@ out:
        return ret;
 }
 
+/*
+ * We can not use rsync locally if the local user is different from the remote
+ * user or if the src dir is not on the local host (or both).
+ */
+static int use_rsync_locally(char *logname)
+{
+       char *h = conf.remote_host_arg;
+
+       if (strcmp(h, "localhost") && strcmp(h, "127.0.0.1"))
+               return 0;
+       if (conf.remote_user_given && strcmp(conf.remote_user_arg, logname))
+               return 0;
+       return 1;
+}
+
 static void create_rsync_argv(char ***argv, int64_t *num)
 {
        char *logname, *newest;
@@ -718,7 +751,7 @@ static void create_rsync_argv(char ***argv, int64_t *num)
        } else
                DSS_INFO_LOG("no previous snapshot found\n");
        logname = dss_logname();
-       if (conf.remote_user_given && !strcmp(conf.remote_user_arg, logname))
+       if (use_rsync_locally(logname))
                (*argv)[i++] = dss_strdup(conf.source_dir_arg);
        else
                (*argv)[i++] = make_message("%s@%s:%s/", conf.remote_user_given?