HAMMER 60G/Many: Mirroring, bug fixes
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 7 Jul 2008 22:42:35 +0000 (22:42 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 7 Jul 2008 22:42:35 +0000 (22:42 +0000)
* Fix a bug in the mirror_tid propagation that could cause a delete_range
  iteration to get way way off.  B-Tree insertions were not calling
  hammer_cursor_inserted_element().

* Fix an assertion in the delete_range iteration, delete-visibility could
  cause the assert to trigger when it shouldn't.

* Add a new assertion testing that the iteration is still within the
  inode object to catch any remaining mirror_tid propagation bugs.

* Minor code documentation adjustments.

Reported-by: Gergo Szakal <bastyaelvtars@gmail.com>
sys/vfs/hammer/hammer.h
sys/vfs/hammer/hammer_btree.c
sys/vfs/hammer/hammer_cursor.c
sys/vfs/hammer/hammer_object.c
sys/vfs/hammer/hammer_vnops.c

index ea2f721..667a0cc 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/vfs/hammer/hammer.h,v 1.105 2008/07/07 03:49:50 dillon Exp $
+ * $DragonFly: src/sys/vfs/hammer/hammer.h,v 1.106 2008/07/07 22:42:35 dillon Exp $
  */
 /*
  * This header file contains structures used internally by the HAMMERFS
@@ -723,7 +723,7 @@ struct hammer_sync_info {
  */
 #define HAMMER_CHECKSPACE_SLOP_REBLOCK 25
 #define HAMMER_CHECKSPACE_SLOP_WRITE   20
-#define HAMMER_CHECKSPACE_SLOP_CREATE  15
+#define HAMMER_CHECKSPACE_SLOP_CREATE  20
 #define HAMMER_CHECKSPACE_SLOP_REMOVE  10
 
 #if defined(_KERNEL)
index cd6ff2b..3982437 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/vfs/hammer/hammer_btree.c,v 1.65 2008/07/07 03:49:50 dillon Exp $
+ * $DragonFly: src/sys/vfs/hammer/hammer_btree.c,v 1.66 2008/07/07 22:42:35 dillon Exp $
  */
 
 /*
@@ -704,6 +704,7 @@ hammer_btree_insert(hammer_cursor_t cursor, hammer_btree_leaf_elm_t elm,
        }
        node->elms[i].leaf = *elm;
        ++node->count;
+       hammer_cursor_inserted_element(cursor->node, i);
 
        /*
         * Update the leaf node's aggregate mirror_tid for mirroring
index 32e328e..06faeaa 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/vfs/hammer/hammer_cursor.c,v 1.38 2008/07/07 00:24:31 dillon Exp $
+ * $DragonFly: src/sys/vfs/hammer/hammer_cursor.c,v 1.39 2008/07/07 22:42:35 dillon Exp $
  */
 
 /*
@@ -701,7 +701,7 @@ again:
 }
 
 /*
- * Inserted element at (node, index)
+ * Deleted element at (node, index)
  *
  * Shift indexes >= index
  */
@@ -721,7 +721,7 @@ hammer_cursor_deleted_element(hammer_node_t node, int index)
 }
 
 /*
- * Deleted element at (node, index)
+ * Inserted element at (node, index)
  *
  * Shift indexes >= index
  */
index 25a421a..c454e75 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/vfs/hammer/hammer_object.c,v 1.82 2008/07/04 07:25:36 dillon Exp $
+ * $DragonFly: src/sys/vfs/hammer/hammer_object.c,v 1.83 2008/07/07 22:42:35 dillon Exp $
  */
 
 #include "hammer.h"
@@ -1672,11 +1672,15 @@ retry:
                leaf = cursor->leaf;
 
                KKASSERT(leaf->base.delete_tid == 0);
+               KKASSERT(leaf->base.obj_id == ip->obj_id);
 
                /*
                 * There may be overlap cases for regular file data.  Also
                 * remember the key for a regular file record is (base + len),
                 * NOT (base).
+                *
+                * Note that do to duplicates (mem & media) allowed by
+                * DELETE_VISIBILITY, off can wind up less then ran_beg.
                 */
                if (leaf->base.rec_type == HAMMER_RECTYPE_DATA) {
                        off = leaf->base.key - leaf->data_len;
@@ -1684,7 +1688,7 @@ retry:
                         * Check the left edge case.  We currently do not
                         * split existing records.
                         */
-                       if (off < ran_beg) {
+                       if (off < ran_beg && leaf->base.key > ran_beg) {
                                panic("hammer left edge case %016llx %d\n",
                                        leaf->base.key, leaf->data_len);
                        }
index ca1d625..5674fcf 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/vfs/hammer/hammer_vnops.c,v 1.82 2008/07/07 03:49:51 dillon Exp $
+ * $DragonFly: src/sys/vfs/hammer/hammer_vnops.c,v 1.83 2008/07/07 22:42:35 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -362,15 +362,6 @@ hammer_vop_write(struct vop_write_args *ap)
                 * large UIOs can lockout other processes due to bwillwrite()
                 * mechanics.
                 *
-                * Do not allow HAMMER to blow out system memory by
-                * accumulating too many records.   Records are so well
-                * decoupled from the buffer cache that it is possible
-                * for userland to push data out to the media via
-                * direct-write, but build up the records queued to the
-                * backend faster then the backend can flush them out.
-                * HAMMER has hit its write limit but the frontend has
-                * no pushback to slow it down.
-                *
                 * The hammer inode is not locked during these operations.
                 * The vnode is locked which can interfere with the pageout
                 * daemon for non-UIO_NOCOPY writes but should not interfere
@@ -378,10 +369,18 @@ hammer_vop_write(struct vop_write_args *ap)
                 * allow the pageout daemon to build up too many dirty buffer
                 * cache buffers.
                 */
+               /*if (((int)uio->uio_offset & (blksize - 1)) == 0)*/
                bwillwrite(blksize);
 
                /*
-                * Pending record flush check.
+                * Do not allow HAMMER to blow out system memory by
+                * accumulating too many records.   Records are so well
+                * decoupled from the buffer cache that it is possible
+                * for userland to push data out to the media via
+                * direct-write, but build up the records queued to the
+                * backend faster then the backend can flush them out.
+                * HAMMER has hit its write limit but the frontend has
+                * no pushback to slow it down.
                 */
                if (hmp->rsv_recs > hammer_limit_recs / 2) {
                        /*