HAMMER Utility - Change the minimum UNDO/REDO FIFO from 100M to 500M
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 10 Feb 2011 22:32:25 +0000 (14:32 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 10 Feb 2011 22:32:25 +0000 (14:32 -0800)
* The minimum undo/redo fifo really needs to be larger.  Don't play
  around, make it 500M.  People who want to run HAMMER on small hard
  drives or images need to be cognizent of the requirement.

* This partially solves (only partially) a FIFO overflow condition.
  Effectively the complexity of buffered operations hammer allows to
  build up in the kernel could easily overflow a minimally-sized on-media
  UNDO/REDO FIFO.  Upping the requirement makes the case less likely.

  The remainder of the resolution will require some fixes in the
  HAMMER VFS code.

Reported-by: Thomas Nikolajsen <thomas.nikolajsen@mail.dk>
sbin/hammer/ondisk.c
sbin/newfs_hammer/newfs_hammer.c

index e75ed60..054674a 100644 (file)
@@ -662,13 +662,17 @@ format_undomap(hammer_volume_ondisk_t ondisk)
         * up to HAMMER_UNDO_LAYER2 large blocks.  Size to approximately
         * 0.1% of the disk.
         *
-        * The minimum UNDO fifo size is 100MB.
+        * The minimum UNDO fifo size is 500MB, or approximately 1% of
+        * the recommended 50G disk.
+        *
+        * Changing this minimum is rather dangerous as complex filesystem
+        * operations can cause the UNDO FIFO to fill up otherwise.
         */
        undo_limit = UndoBufferSize;
        if (undo_limit == 0) {
                undo_limit = (ondisk->vol_buf_end - ondisk->vol_buf_beg) / 1000;
-               if (undo_limit < 100*1024*1024)
-                       undo_limit = 100*1024*1024;
+               if (undo_limit < 500*1024*1024)
+                       undo_limit = 500*1024*1024;
        }
        undo_limit = (undo_limit + HAMMER_LARGEBLOCK_MASK64) &
                     ~HAMMER_LARGEBLOCK_MASK64;
index db67d56..4cf3c3c 100644 (file)
@@ -251,6 +251,11 @@ main(int ac, char **av)
                "on a nightly basis. The periodic.conf(5) variable\n"
                "'daily_clean_hammer_enable' can be unset to disable this.\n"
                "Also see 'man hammer' and 'man HAMMER' for more information.\n");
+       if (total < 10*GIG) {
+               printf("\nWARNING: The minimum UNDO/REDO FIFO is 500MB, you"
+                      "really should not\n"
+                      " try to format a HAMMER filesystem this small\n");
+       }
        if (total < 50*GIG) {
                printf("\nWARNING: HAMMER filesystems less than 50GB are "
                        "not recommended!\n"