Date: Wed, 12 Nov 2008 23:05:13 +0200 From: Kostik Belousov <kostikbel@gmail.com> To: Tim Bishop <tim-lists@bishnet.net> Cc: Tim Bishop <tim@bishnet.net>, Jeremy Chadwick <koitsu@freebsd.org>, freebsd-stable@freebsd.org, David Peall <david@esn.org.za> Subject: Re: System deadlock when using mksnap_ffs Message-ID: <20081112210513.GM47073@deviant.kiev.zoral.com.ua> In-Reply-To: <20081112194928.GA19539@carrick.bishnet.net> References: <20081112175826.GD26195@carrick.bishnet.net> <20081112194928.GA19539@carrick.bishnet.net>
next in thread | previous in thread | raw e-mail | index | archive | help
--4ybNbZnZ8tziJ7D6 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, Nov 12, 2008 at 07:49:28PM +0000, Tim Bishop wrote: > On Wed, Nov 12, 2008 at 05:58:26PM +0000, Tim Bishop wrote: > > I run the mksnap_ffs command to take the snapshot and some time later > > the system completely freezes up: > >=20 > > paladin# cd /u2/.snap/ > > paladin# mksnap_ffs /u2 test.1 >=20 > Someone (not named because they choose not to reply to the list) gave me > the following patch: >=20 > --- sys/ufs/ffs/ffs_snapshot.c.orig Wed Mar 22 09:42:31 2006 > +++ sys/ufs/ffs/ffs_snapshot.c Mon Nov 20 14:59:13 2006 > @@ -282,6 +282,8 @@ restart: > if (error) > goto out; > bawrite(nbp); > + if (cg % 10 =3D=3D 0) > + ffs_syncvnode(vp, MNT_WAIT); > } > /* > * Copy all the cylinder group maps. Although the > @@ -303,6 +305,8 @@ restart: > goto out; > error =3D cgaccount(cg, vp, nbp, 1); > bawrite(nbp); > + if (cg % 10 =3D=3D 0) > + ffs_syncvnode(vp, MNT_WAIT); > if (error) > goto out; > } >=20 > With the description: >=20 > "What can happen is on a big file system it will fill up the buffer > cache with I/O and then run out. When the buffer cache fills up then no > more disk I/O can happen :-( When you do a sync, it flushes that out to > disk so things don't hang." >=20 > It seems to work too. But it seems more like a workaround than a fix? It looks hackish, but in fact it is not that wrong, and I even say that it provides reasonable workaround. The usual way to prevent wdrain deadlock is to issue bwillwrite() call before any vnode lock is taken. This is sufficient for most VFS syscalls that typically put dozen or less dirty buffers into delayed write queue. Snapshot creation does not call bwillwrite() at all, and then does a lot of async writes, completely saturating buffer cache with dirty buffers. bwillwrite cannot be called after the vnode is locked, and just forcing a sync for the embrionic snapshot vnode is good enough. The 10 counter is debatable, but debate shall be postponed until the patch goes into tree. I ask an anonymous submitter to commit it. Thanks ! --4ybNbZnZ8tziJ7D6 Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEARECAAYFAkkbRQkACgkQC3+MBN1Mb4iecwCg6wKWEMcVZ30HMLCc9kfE1J9h 6gcAnRyVqnhKYTph1pEUD4ao1OyNOkR6 =Uvcf -----END PGP SIGNATURE----- --4ybNbZnZ8tziJ7D6--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20081112210513.GM47073>