HAMMER Util - Bulk transfer, SIGPIPE, more features.
authorMatthew Dillon <dillon@apollo.backplane.com>
Mon, 17 Aug 2009 20:14:53 +0000 (13:14 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Mon, 17 Aug 2009 20:14:53 +0000 (13:14 -0700)
* Add -B option for initial bulk transfer in a mirror-stream

* The parent process in a mirror-stream and mirror-copy operation
  now ignores SIGPIPE

* Use the smaller of ctime or mtime when calculating the real timestamp
  for a snapshot softlink in a prune operation.

* Sleep an additional 15 seconds before reconnecting a failed connection
  in a mirror-stream operation.

sbin/hammer/cmd_mirror.c
sbin/hammer/cmd_softprune.c
sbin/hammer/hammer.8
sbin/hammer/hammer.c
sbin/hammer/hammer.h

index 9c6b712..e3c7960 100644 (file)
@@ -170,7 +170,7 @@ again:
         * mirroring in order to allow the stream to be killed and
         * restarted without having to start over.
         */
-       if (histogram < 0) {
+       if (histogram < 0 && BulkOpt == 0) {
                if (VerboseOpt)
                        fprintf(stderr, "\n");
                histogram = generate_histogram(fd, filesystem,
@@ -825,6 +825,7 @@ hammer_cmd_mirror_copy(char **av, int ac, int streaming)
                mirror_usage(1);
 
        TwoWayPipeOpt = 1;
+       signal(SIGPIPE, SIG_IGN);
 
 again:
        if (pipe(fds) < 0) {
@@ -836,6 +837,7 @@ again:
         * Source
         */
        if ((pid1 = fork()) == 0) {
+               signal(SIGPIPE, SIG_DFL);
                dup2(fds[0], 0);
                dup2(fds[0], 1);
                close(fds[0]);
@@ -888,6 +890,7 @@ again:
         * Target
         */
        if ((pid2 = fork()) == 0) {
+               signal(SIGPIPE, SIG_DFL);
                dup2(fds[1], 0);
                dup2(fds[1], 1);
                close(fds[0]);
@@ -943,7 +946,7 @@ again:
                        fprintf(stderr, "\nLost Link\n");
                        fflush(stderr);
                }
-               sleep(DelayOpt);
+               sleep(15 + DelayOpt);
                goto again;
        }
 
index e5c6621..b088a7f 100644 (file)
@@ -348,7 +348,13 @@ hammer_softprune_addentry(struct softprune **basep,
        elm = &scan->prune.elms[scan->prune.nelms];
        elm->beg_tid = strtoull(tidptr + 2, NULL, 0);
        elm->end_tid = 0;
-       elm->mod_tid = (st) ? st->st_ctime : 0;
+       elm->mod_tid = 0;
+       if (st) {
+               if (st->st_ctime < st->st_mtime)
+                       elm->mod_tid = st->st_ctime;
+               else
+                       elm->mod_tid = st->st_mtime;
+       }
        ++scan->prune.nelms;
        return(scan);
 }
index 2680651..44f6bae 100644 (file)
@@ -40,7 +40,7 @@
 .Nd HAMMER file system utility
 .Sh SYNOPSIS
 .Nm
-.Op Fl h2qrv
+.Op Fl h2qrvB
 .Op Fl b Ar bandwidth
 .Op Fl c Ar cyclefile
 .Op Fl f Ar blkdev[:blkdev]*
@@ -124,6 +124,12 @@ Increase verboseness.
 May be specified multiple times.
 .It Fl y
 Force "yes" for any interactive question.
+.It Fl B
+Bulk Transfer.
+.Ar Mirror-stream
+will not attempt to break-up large initial bulk transfers into smaller
+pieces.  This can save time but if the link is lost in the middle of the
+initial bulk transfer you will have to start over from scratch.
 .It Fl C Ar cachesize[:readahead]
 Set the memory cache size for any raw I/O.  The default is 16m.
 A suffix of 'k' for kilobytes and 'm' for megabytes is allowed,
@@ -693,9 +699,19 @@ Zero out the snapshots directory path for this PFS.
 .It prune-min=hh[:mm[:ss]]
 Set the minimum fine-grained data retention period.
 .Nm HAMMER
-always retains fine-grained history up to the first snapshot.
-You can extend the retention period beyond the first snapshot by
-specifying it with this option.
+always retains fine-grained history up to the most recent snapshot.
+You can extend the retention period further by specifying a non-zero
+pruning minimum.  Any snapshot softlinks within the retention period
+are ignored for the purposes of pruning (the fine grained history
+is retained).
+.Pp
+Because the transaction id in the snapshot softlink cannot be used
+to calculate a timestamp,
+.Nm HAMMER
+uses the earlier of the st_ctime or st_mtime field of the softlink to
+determine which snapshots fall within the retention period.
+Users must be sure to retain one of these two fields when manipulating
+the softlink.
 .El
 .\" ==== pfs-upgrade ====
 .It Ar pfs-upgrade Ar dirpath
@@ -794,13 +810,20 @@ options to keep the mirroring target in sync with the source on a continuing
 basis.
 .Pp
 If the pipe is broken the command will automatically retry after sleeping
-for a short while.
+for a short while.  The time slept will be 15 seconds plus the time given
+in the
+.Fl i
+option.
 .Pp
 This command also detects the initial-mirroring case and spends some
 time scanning the B-Tree to find good break points, allowing the initial
 bulk mirroring operation to be broken down into about 20 separate pieces.
 This means that the user can kill and restart the operation and it will
 not have to start from scratch once it has gotten past the first chunk.
+The
+.Fl B
+option may be used to disable this feature and perform an initial bulk
+transfer instead.
 .\" ==== version ====
 .It Ar version Ar filesystem
 This command returns the
index 6d7ab5a..dec15f5 100644 (file)
@@ -55,6 +55,7 @@ int ForceYesOpt = 0;
 int ForceOpt;
 int RunningIoctl;
 int DidInterrupt;
+int BulkOpt;
 u_int64_t BandwidthOpt;
 const char *CyclePath;
 const char *LinkPath;
@@ -68,7 +69,7 @@ main(int ac, char **av)
        int ch;
        int cacheSize = 0;
 
-       while ((ch = getopt(ac, av, "b:c:dhf:i:qrs:t:v2yC:F")) != -1) {
+       while ((ch = getopt(ac, av, "b:c:dhf:i:qrs:t:v2yBC:F")) != -1) {
                switch(ch) {
                case '2':
                        TwoWayPipeOpt = 1;
@@ -134,6 +135,9 @@ main(int ac, char **av)
                        else
                                ++QuietOpt;
                        break;
+               case 'B':
+                       BulkOpt = 1;
+                       break;
                case 'C':
                        cacheSize = strtol(optarg, &ptr, 0);
                        switch(*ptr) {
index 1084e8a..d4f7204 100644 (file)
@@ -70,6 +70,7 @@ extern int ForceYesOpt;
 extern int RunningIoctl;
 extern int DidInterrupt;
 extern int ForceOpt;
+extern int BulkOpt;
 extern u_int64_t BandwidthOpt;
 extern const char *LinkPath;
 extern const char *CyclePath;