# HG changeset patch # User maybee # Date 1132759014 28800 # Node ID 9bc5c1db9740c2c49621c7cd6a5a4981c93943b0 # Parent e6bfffd6f3beb86090aecaf5b449be8944336586 6345547 assertion failed: tempreserve < arc.c/4 from zfs_rename 6354299 Disable metadata compression, at least temporarily diff -r e6bfffd6f3be -r 9bc5c1db9740 usr/src/uts/common/fs/zfs/arc.c --- a/usr/src/uts/common/fs/zfs/arc.c Wed Nov 23 03:08:29 2005 -0800 +++ b/usr/src/uts/common/fs/zfs/arc.c Wed Nov 23 07:16:54 2005 -0800 @@ -1891,18 +1891,24 @@ return (ERESTART); } #endif + if (tempreserve > arc.c/4 && !arc.no_grow) + arc.c = MIN(arc.c_max, tempreserve * 4); + if (tempreserve > arc.c) + return (ENOMEM); + /* - * XXX This is kind of hacky. The limit should be adjusted - * dynamically to keep the time to sync a dataset fixed (around - * 1-5 seconds?). - * Maybe should have some sort of locking? If two requests come - * in concurrently, we might let them both succeed, when one of - * them should fail. Not a huge deal. + * Throttle writes when the amount of dirty data in the cache + * gets too large. We try to keep the cache less than half full + * of dirty blocks so that our sync times don't grow too large. + * Note: if two requests come in concurrently, we might let them + * both succeed, when one of them should fail. Not a huge deal. + * + * XXX The limit should be adjusted dynamically to keep the time + * to sync a dataset fixed (around 1-5 seconds?). */ - ASSERT3U(tempreserve, <, arc.c/4); /* otherwise we'll loop forever */ - - if (arc_tempreserve + tempreserve + arc.anon->size > arc.c / 4) { + if (tempreserve + arc_tempreserve + arc.anon->size > arc.c / 2 && + arc_tempreserve + arc.anon->size > arc.c / 4) { dprintf("failing, arc_tempreserve=%lluK anon=%lluK " "tempreserve=%lluK arc.c=%lluK\n", arc_tempreserve>>10, arc.anon->lsize>>10, @@ -1932,9 +1938,9 @@ arc.c = MIN(arc.c, vmem_size(heap_arena, VMEM_ALLOC | VMEM_FREE) / 8); #endif - /* use at least 1/32 of all memory, or 32MB, whichever is more */ + /* set min cache to 1/32 of all memory, or 64MB, whichever is more */ arc.c_min = MAX(arc.c / 4, 64<<20); - /* use at most 3/4 of all memory, or all but 1GB, whichever is more */ + /* set max to 3/4 of all memory, or all but 1GB, whichever is more */ if (arc.c * 8 >= 1<<30) arc.c_max = (arc.c * 8) - (1<<30); else diff -r e6bfffd6f3be -r 9bc5c1db9740 usr/src/uts/common/fs/zfs/dbuf.c --- a/usr/src/uts/common/fs/zfs/dbuf.c Wed Nov 23 03:08:29 2005 -0800 +++ b/usr/src/uts/common/fs/zfs/dbuf.c Wed Nov 23 07:16:54 2005 -0800 @@ -1847,7 +1847,8 @@ * that specializes in arrays of bps. */ checksum = ZIO_CHECKSUM_FLETCHER_4; - compress = ZIO_COMPRESS_LZJB; + /* XXX - disable compresssion for now */ + compress = ZIO_COMPRESS_OFF; } else { /* * Allow dnode settings to override objset settings, diff -r e6bfffd6f3be -r 9bc5c1db9740 usr/src/uts/common/fs/zfs/dmu_objset.c --- a/usr/src/uts/common/fs/zfs/dmu_objset.c Wed Nov 23 03:08:29 2005 -0800 +++ b/usr/src/uts/common/fs/zfs/dmu_objset.c Wed Nov 23 07:16:54 2005 -0800 @@ -166,8 +166,9 @@ ASSERT(err == 0); } else { /* It's the meta-objset. */ + /* XXX - turn off metadata compression temporarily */ osi->os_checksum = ZIO_CHECKSUM_FLETCHER_4; - osi->os_compress = ZIO_COMPRESS_LZJB; + osi->os_compress = ZIO_COMPRESS_OFF; } /* @@ -184,7 +185,8 @@ else osi->os_md_checksum = ZIO_CHECKSUM_FLETCHER_4; - osi->os_md_compress = ZIO_COMPRESS_LZJB; + /* XXX - turn off metadata compression temporarily */ + osi->os_md_compress = ZIO_COMPRESS_OFF; for (i = 0; i < TXG_SIZE; i++) { list_create(&osi->os_dirty_dnodes[i], sizeof (dnode_t),