HAMMER Utilities: Feature add
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 10 May 2008 17:54:59 +0000 (17:54 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 10 May 2008 17:54:59 +0000 (17:54 +0000)
* Add another shortcut to the prune command, telling HAMMER to prune everything
  past a certain point.  For example, this will recover anything deleted over
  a year ago: 'hammer prune /mnt from 365d everything'

sbin/hammer/cmd_prune.c
sbin/hammer/hammer.8
sbin/hammer/hammer.c

index 6cfb220..8e82ca5 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sbin/hammer/Attic/cmd_prune.c,v 1.6 2008/05/05 20:34:52 dillon Exp $
+ * $DragonFly: src/sbin/hammer/Attic/cmd_prune.c,v 1.7 2008/05/10 17:54:59 dillon Exp $
  */
 
 #include "hammer.h"
@@ -42,6 +42,12 @@ static void hammer_prune_load_file(hammer_tid_t now_tid,
 static int hammer_prune_parse_line(hammer_tid_t now_tid,
                        struct hammer_ioc_prune *prune,
                        const char *filesystem, char **av, int ac);
+static int hammer_prune_parse_line_short(hammer_tid_t now_tid,
+                       struct hammer_ioc_prune *prune,
+                       const char *filesystem, char **av);
+static int hammer_prune_parse_line_long(hammer_tid_t now_tid,
+                       struct hammer_ioc_prune *prune,
+                       const char *filesystem, char **av);
 static void hammer_prune_create_links(const char *filesystem,
                        struct hammer_ioc_prune *prune);
 static void hammer_prune_make_softlink(const char *filesystem,
@@ -164,10 +170,81 @@ plural(int notplural)
  * Parse the following parameters:
  *
  * <filesystem> from <modulo_time> to <modulo_time> every <modulo_time>
+ * <filesystem> from <modulo_time> everything
  */
 static int
 hammer_prune_parse_line(hammer_tid_t now_tid, struct hammer_ioc_prune *prune,
                        const char *filesystem, char **av, int ac)
+{
+       int r;
+
+       switch(ac) {
+       case 4:
+               r = hammer_prune_parse_line_short(now_tid, prune,
+                                                 filesystem, av);
+               break;
+       case 7:
+               r = hammer_prune_parse_line_long(now_tid, prune,
+                                                filesystem, av);
+               break;
+       default:
+               r = -1;
+               break;
+       }
+       return(r);
+}
+
+static int
+hammer_prune_parse_line_short(hammer_tid_t now_tid,
+                            struct hammer_ioc_prune *prune,
+                            const char *filesystem, char **av)
+{
+       struct hammer_ioc_prune_elm *elm;
+       u_int64_t from_time;
+       char *from_stamp_str;
+
+       if (strcmp(av[0], filesystem) != 0)
+               return(0);
+       if (strcmp(av[1], "from") != 0)
+               return(-1);
+       if (strcmp(av[3], "everything") != 0)
+               return(-1);
+       if (parse_modulo_time(av[2], &from_time) < 0)
+               return(-1);
+       if (from_time == 0) {
+               fprintf(stderr, "Bad from or to time specification.\n");
+               return(-1);
+       }
+       if (prune->nelms == HAMMER_MAX_PRUNE_ELMS) {
+               fprintf(stderr, "Too many prune specifications in file! "
+                       "Max is %d\n", HAMMER_MAX_PRUNE_ELMS);
+               return(-1);
+       }
+
+       /*
+        * Example:  from 1y everything
+        */
+       elm = &prune->elms[prune->nelms++];
+       elm->beg_tid = 1;
+       elm->end_tid = now_tid - now_tid % from_time;
+       if (now_tid - elm->end_tid < from_time)
+               elm->end_tid -= from_time;
+       assert(elm->beg_tid < elm->end_tid);
+       elm->mod_tid = elm->end_tid - elm->beg_tid;
+
+       /*
+        * Convert back to local time for pretty printing
+        */
+       from_stamp_str = tid_to_stamp_str(elm->end_tid);
+       printf("Prune everything older then %s", from_stamp_str);
+       free(from_stamp_str);
+       return(0);
+}
+
+static int
+hammer_prune_parse_line_long(hammer_tid_t now_tid,
+                            struct hammer_ioc_prune *prune,
+                            const char *filesystem, char **av)
 {
        struct hammer_ioc_prune_elm *elm;
        u_int64_t from_time;
@@ -176,8 +253,6 @@ hammer_prune_parse_line(hammer_tid_t now_tid, struct hammer_ioc_prune *prune,
        char *from_stamp_str;
        char *to_stamp_str;
 
-       if (ac != 7)
-               return(-1);
        if (strcmp(av[0], filesystem) != 0)
                return(0);
        if (strcmp(av[1], "from") != 0)
@@ -381,6 +456,7 @@ prune_usage(int code)
        fprintf(stderr, "Bad prune directive, specify one of:\n"
                        "prune filesystem [using filename]\n"
                        "prune filesystem from <modulo_time> to <modulo_time> every <modulo_time>\n"
+                       "prune filesystem from <modulo_time> everything\n"
                        "prune filesystem everything\n");
        exit(code);
 }
index e08deda..1be8589 100644 (file)
@@ -30,7 +30,7 @@
 .\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\" 
-.\" $DragonFly: src/sbin/hammer/hammer.8,v 1.12 2008/05/04 19:18:17 dillon Exp $
+.\" $DragonFly: src/sbin/hammer/hammer.8,v 1.13 2008/05/10 17:54:59 dillon Exp $
 .Dd December 31, 2007
 .Dt HAMMER 8
 .Os
@@ -123,6 +123,7 @@ output as 0.
 Generate the top 32 bits of a HAMMER 64 bit directory hash for the specified
 file name.
 .It Ar prune Ar filesystem Ar from Ar #{smhdMy} Ar to Ar #{smhdMy} Ar every Ar #{smhdMy}
+.It Ar prune Ar filesystem Ar from Ar #{smhdMy} Ar everything
 .It Ar prune Ar filesystem Ar everything
 .It Ar prune Ar filesystem Op Ar using Ar filename
 Prune the filesystem, removing deleted records to free up physical disk
@@ -154,6 +155,10 @@ data on a 30 minute boundary, then a 1 day boundary in a later pruning (on
 older data), then a pruning beyond that would have to be a multiple of
 1 day.  And so forth.
 .Pp
+The "prune <filesystem> from ... everything" command will remove all
+historical records older then the specified date.  It is a way of saying
+that you do not want to retain any deleted information past a certain point.
+.Pp
 The "prune <filesystem> everything" command will remove all historical records
 from the filesystem.  The long keyword is designed to prevent accidental use.
 This option is not recommended.
index 49db592..c528bfa 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sbin/hammer/hammer.c,v 1.14 2008/05/04 19:18:17 dillon Exp $
+ * $DragonFly: src/sbin/hammer/hammer.c,v 1.15 2008/05/10 17:54:59 dillon Exp $
  */
 
 #include "hammer.h"
@@ -319,6 +319,7 @@ usage(int exit_code)
                "hammer [-s linkpath] prune <filesystem> [using <configfile>]\n"
                "hammer [-s linkpath] prune <filesystem> from <modulo_time> to "
                                "<modulo_time> every <modulo_time>\n"
+               "hammer prune <filesystem> from <modulo_time> everything\n"
                "hammer prune <filesystem> everything\n"
                "hammer reblock <filesystem> [compact%%] (default 90%%)\n"
                "hammer history[@offset[,len]] <file-1>...<file-N>\n"