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īt seen it failing otherwise. 

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>