Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 May 2011 14:05:06 +0200
From:      Borja Marcos <borjam@sarenet.es>
To:        Jeremy Chadwick <freebsd@jdc.parodius.com>
Cc:        Charles Sprickman <spork@bway.net>, stable@FreeBSD.org, Andriy Gapon <avg@FreeBSD.org>
Subject:   Re: 8.1R possible zfs snapshot livelock?
Message-ID:  <FCE5F082-A3BF-4A21-B2E3-FEF3EA715F2C@sarenet.es>
In-Reply-To: <20110517112952.GA48610@icarus.home.lan>
References:  <alpine.OSX.2.00.1105170120510.1983@hotlap.nat.fasttrackmonkey.com> <20110517073029.GA44359@icarus.home.lan> <4DD25264.8040305@FreeBSD.org> <20110517112952.GA48610@icarus.home.lan>

next in thread | previous in thread | raw e-mail | index | archive | help

On May 17, 2011, at 1:29 PM, Jeremy Chadwick wrote:

> * ZFS send | ssh zfs recv results in ZFS subsystem hanging; =
8.1-RELEASE;
>  February 2011:
>  =
http://lists.freebsd.org/pipermail/freebsd-fs/2011-February/010602.html

I found a reproducible deadlock condition actually. If you keep some I/O =
activity on a dataset on which you are receiving a ZFS incremental =
snapshot at the same time, it can deadlock.

Imagine this situation: Two servers, A and B. A dataset on server A is =
replicated at regular intervals to B, so that you keep a reasonably up =
to date copy.

Something like:

(Runnning on server A):

zfs snapshot thepool/thedataset@thistime
zfs send -Ri thepooll/thedataser@previoustime hepool/thedataset@thistime =
| ssh serverB zfs receive -d thepool

It works, but I suffered a deadlock when one of the periodic "daily" =
scripts was running. Doing some tests, I saw that ZFS  can deadlock if =
you do a zfs receive onto a dataset which has some read activity. =
Disabling atime didn't help either.

But if you make sure *not* to access the replicated dataset it works, I =
haven=B4t seen it failing otherwise.=20

If  you wish to reproduce it, try creating a dataset for /usr/obj, =
running make buildworld on it, replicating at, say, 30 or 60 second =
intervals, and keep several scripts (or rsync) reading the target =
dataset files and just copying them to another place in the usual, =
"classic" way. (example: tar cf - . | ( cd /destination && tar xf -)





Borja




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?FCE5F082-A3BF-4A21-B2E3-FEF3EA715F2C>