On Thu, Mar 08, 2012 at 07:56:03PM -0600, Ben Myers wrote:
> On Fri, Mar 09, 2012 at 11:17:10AM +1100, Dave Chinner wrote:
> > On Thu, Mar 08, 2012 at 10:23:48AM -0600, Ben Myers wrote:
> > > On Thu, Mar 08, 2012 at 01:10:54PM +1100, Dave Chinner wrote:
> > > > On Wed, Mar 07, 2012 at 12:04:26PM -0600, Eric Sandeen wrote:
> > Alex and I discussed this problem briefly awhile ago. What is the best
> > > way to lose when you hit ENOSPC (project quotas) or EDQUOT in
> > > xfs_iomap_write_delay? You want to be fair; one user hitting his quota
> > > shouldn't be able to steal some other user's block reservations unless
> > > you really are near ENOSPC for the entire filesystem.
> > >
> > > I suggested something like... track inodes with preallocated block
> > > reservations in LRU order and by dquot, so that the poor fella who is at
> > > EDQUOT will first clean up the preallocations that resulted in quota
> > > being enforced, try again, and then work on preallocations of other
> > > users only if it can help in his situation. IIRC Alex shut me down when
> > > he heard LRU. ;)
> > And I agree with Alex. Nothing additional needs to be tracked on top
> > of inodes with speculative prealloc. Just the search filter would
> > need to be different (i.e. only select inodes with a specific dquot
> > attached).
> Yeah, maybe not. A single list of inodes with speculative prealloc does
> seem a good place to start.
Except it involves growing the inode by a struct listhead. Keeping
per-inode memory usage down is extremely important, and growing it
by 16 bytes for a rare corner case is not a particularly good
tradeoff. Especially as using a radix tree tag for tracking doesn't
involve any increase in memory usage and tag based scans are
lock-free and quite efficient.
> Later maybe you would not want to
> scan/filter through all of them and we could add additional lists for
> dquots. My suggestion of using LRU was because I think that the oldest
> unused speculative preallocs should be the first to go. One chronic
> over-quota user shouldn't be able to punish everyone else.
Sure. But we only need to check if the inode with prealloc
belongs to the user/group/project that hit EDQUOT before taking
action. We don't need an LRU for that.
Indeed, I don't believe that removing the entire preallocation on
each inode is the right thing to do, either. Chopping it in half is
probably the right thing to do so that we free up lots of space in
the case of excessive (large preallocation) but don't cause
significant extra fragmentation for the work that currently requires
If we still get EDQUOT after trimming speculative preallocations, we
can try a second time. If reducing speculative preallocations by 75%
doesn't avoid the EDQUOT (or ENOSPC), then I think we can consider it
a real error....