Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1383741 > unrolled thread
| Started by | Christoph Hellwig <hch@infradead.org> |
|---|---|
| First post | 2016-04-20 23:00 +0200 |
| Last post | 2016-04-26 17:10 +0200 |
| Articles | 20 on this page of 23 — 9 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Christoph Hellwig <hch@infradead.org> - 2016-04-20 23:00 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io "Verma, Vishal L" <vishal.l.verma@intel.com> - 2016-04-23 20:10 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io "hch@infradead.org" <hch@infradead.org> - 2016-04-25 10:40 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Jeff Moyer <jmoyer@redhat.com> - 2016-04-25 17:40 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io "hch@infradead.org" <hch@infradead.org> - 2016-04-26 10:40 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io "Verma, Vishal L" <vishal.l.verma@intel.com> - 2016-04-25 19:20 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dan Williams <dan.j.williams@intel.com> - 2016-04-25 19:30 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dave Chinner <david@fromorbit.com> - 2016-04-26 01:30 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io "Darrick J. Wong" <darrick.wong@oracle.com> - 2016-04-26 01:40 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dan Williams <dan.j.williams@intel.com> - 2016-04-26 01:50 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dave Chinner <david@fromorbit.com> - 2016-04-26 02:20 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dan Williams <dan.j.williams@intel.com> - 2016-04-26 03:50 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dave Chinner <david@fromorbit.com> - 2016-04-26 05:00 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dan Williams <dan.j.williams@intel.com> - 2016-04-26 06:20 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dave Chinner <david@fromorbit.com> - 2016-04-26 10:30 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dan Williams <dan.j.williams@intel.com> - 2016-04-26 17:00 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Jan Kara <jack@suse.cz> - 2016-04-26 17:40 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dan Williams <dan.j.williams@intel.com> - 2016-04-26 19:20 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io "Verma, Vishal L" <vishal.l.verma@intel.com> - 2016-04-26 02:00 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Dave Chinner <david@fromorbit.com> - 2016-04-26 02:50 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Vishal Verma <vishal@kernel.org> - 2016-04-26 17:00 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io "hch@infradead.org" <hch@infradead.org> - 2016-04-26 10:40 +0200
Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io Vishal Verma <vishal@kernel.org> - 2016-04-26 17:10 +0200
Page 1 of 2 [1] 2 Next page →
| From | Christoph Hellwig <hch@infradead.org> |
|---|---|
| Date | 2016-04-20 23:00 +0200 |
| Subject | Re: [PATCH v2 5/5] dax: handle media errors in dax_do_io |
| Message-ID | <rq7o7-5F5-25@gated-at.bofh.it> |
On Fri, Apr 15, 2016 at 12:11:36PM -0400, Jeff Moyer wrote:
> > + if (IS_DAX(inode)) {
> > + ret = dax_do_io(iocb, inode, iter, offset, blkdev_get_block,
> > NULL, DIO_SKIP_DIO_COUNT);
> > + if (ret == -EIO && (iov_iter_rw(iter) == WRITE))
> > + ret_saved = ret;
> > + else
> > + return ret;
> > + }
> > +
> > + ret = __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset,
> > blkdev_get_block, NULL, NULL,
> > DIO_SKIP_DIO_COUNT);
> > + if (ret < 0 && ret_saved)
> > + return ret_saved;
> > +
>
> Hmm, did you just break async DIO? I think you did! :)
> __blockdev_direct_IO can return -EIOCBQUEUED, and you've now turned that
> into -EIO. Really, I don't see a reason to save that first -EIO. The
> same applies to all instances in this patch.
Yes, there is no point in saving the earlier error - just return the
second error all the time.
E.g.
ret = dax_io();
if (dax_need_dio_retry(ret))
ret = direct_IO();
[toc] | [next] | [standalone]
| From | "Verma, Vishal L" <vishal.l.verma@intel.com> |
|---|---|
| Date | 2016-04-23 20:10 +0200 |
| Message-ID | <rraae-7rl-17@gated-at.bofh.it> |
| In reply to | #1383741 |
On Wed, 2016-04-20 at 13:59 -0700, Christoph Hellwig wrote:
> On Fri, Apr 15, 2016 at 12:11:36PM -0400, Jeff Moyer wrote:
> >
> > >
> > > + if (IS_DAX(inode)) {
> > > + ret = dax_do_io(iocb, inode, iter, offset,
> > > blkdev_get_block,
> > > NULL, DIO_SKIP_DIO_COUNT);
> > > + if (ret == -EIO && (iov_iter_rw(iter) == WRITE))
> > > + ret_saved = ret;
> > > + else
> > > + return ret;
> > > + }
> > > +
> > > + ret = __blockdev_direct_IO(iocb, inode, I_BDEV(inode),
> > > iter, offset,
> > > blkdev_get_block, NULL,
> > > NULL,
> > > DIO_SKIP_DIO_COUNT);
> > > + if (ret < 0 && ret_saved)
> > > + return ret_saved;
> > > +
> > Hmm, did you just break async DIO? I think you did! :)
> > __blockdev_direct_IO can return -EIOCBQUEUED, and you've now turned
> > that
> > into -EIO. Really, I don't see a reason to save that first
> > -EIO. The
> > same applies to all instances in this patch.
> Yes, there is no point in saving the earlier error - just return the
> second error all the time.
Is it ok to do that?
direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM due
to some allocation failing, and I thought we should return the original
-EIO in such cases so that the application doesn't lose the information
that the bad block is actually causing the error.
>
> E.g.
>
> ret = dax_io();
> if (dax_need_dio_retry(ret))
> ret = direct_IO();
>
[toc] | [prev] | [next] | [standalone]
| From | "hch@infradead.org" <hch@infradead.org> |
|---|---|
| Date | 2016-04-25 10:40 +0200 |
| Message-ID | <rrKdI-2Cz-31@gated-at.bofh.it> |
| In reply to | #1385698 |
On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM due > to some allocation failing, and I thought we should return the original > -EIO in such cases so that the application doesn't lose the information > that the bad block is actually causing the error. EINVAL is a concern here. Not due to the right error reported, but because it means your current scheme is fundamentally broken - we need to support I/O at any alignment for DAX I/O, and not fail due to alignbment concernes for a highly specific degraded case. I think this whole series need to go back to the drawing board as I don't think it can actually rely on using direct I/O as the EIO fallback.
[toc] | [prev] | [next] | [standalone]
| From | Jeff Moyer <jmoyer@redhat.com> |
|---|---|
| Date | 2016-04-25 17:40 +0200 |
| Message-ID | <rrQMb-8el-37@gated-at.bofh.it> |
| In reply to | #1386110 |
"hch@infradead.org" <hch@infradead.org> writes: > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: >> direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM due >> to some allocation failing, and I thought we should return the original >> -EIO in such cases so that the application doesn't lose the information >> that the bad block is actually causing the error. > > EINVAL is a concern here. Not due to the right error reported, but > because it means your current scheme is fundamentally broken - we > need to support I/O at any alignment for DAX I/O, and not fail due to > alignbment concernes for a highly specific degraded case. > > I think this whole series need to go back to the drawing board as I > don't think it can actually rely on using direct I/O as the EIO > fallback. The only callers of dax_do_io are direct_IO methods. Cheers, Jeff
[toc] | [prev] | [next] | [standalone]
| From | "hch@infradead.org" <hch@infradead.org> |
|---|---|
| Date | 2016-04-26 10:40 +0200 |
| Message-ID | <rs6Hf-4gv-3@gated-at.bofh.it> |
| In reply to | #1386600 |
On Mon, Apr 25, 2016 at 11:32:08AM -0400, Jeff Moyer wrote: > > EINVAL is a concern here. Not due to the right error reported, but > > because it means your current scheme is fundamentally broken - we > > need to support I/O at any alignment for DAX I/O, and not fail due to > > alignbment concernes for a highly specific degraded case. > > > > I think this whole series need to go back to the drawing board as I > > don't think it can actually rely on using direct I/O as the EIO > > fallback. > > The only callers of dax_do_io are direct_IO methods. They are because the DAX I/O pass is a mess, but that doesn't mean the user specific O_DIRECT on the open nessecarily.
[toc] | [prev] | [next] | [standalone]
| From | "Verma, Vishal L" <vishal.l.verma@intel.com> |
|---|---|
| Date | 2016-04-25 19:20 +0200 |
| Message-ID | <rrSkW-1aM-11@gated-at.bofh.it> |
| In reply to | #1386110 |
On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: > > > > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM > > due > > to some allocation failing, and I thought we should return the > > original > > -EIO in such cases so that the application doesn't lose the > > information > > that the bad block is actually causing the error. > EINVAL is a concern here. Not due to the right error reported, but > because it means your current scheme is fundamentally broken - we > need to support I/O at any alignment for DAX I/O, and not fail due to > alignbment concernes for a highly specific degraded case. > > I think this whole series need to go back to the drawing board as I > don't think it can actually rely on using direct I/O as the EIO > fallback. > Agreed that DAX I/O can happen with any size/alignment, but how else do we send an IO through the driver without alignment restrictions? Also, the granularity at which we store badblocks is 512B sectors, so it seems natural that to clear such a sector, you'd expect to send a write to the whole sector. The expected usage flow is: - Application hits EIO doing dax_IO or load/store io - It checks badblocks and discovers it's files have lost data - It write()s those sectors (possibly converted to file offsets using fiemap) * This triggers the fallback path, but if the application is doing this level of recovery, it will know the sector is bad, and write the entire sector - Or it replaces the entire file from backup also using write() (not mmap+stores) * This just frees the fs block, and the next time the block is reallocated by the fs, it will likely be zeroed first, and that will be done through the driver and will clear errors I think if we want to keep allowing arbitrary alignments for the dax_do_io path, we'd need: 1. To represent badblocks at a finer granularity (likely cache lines) 2. To allow the driver to do IO to a *block device* at sub-sector granularity Can we do that?
[toc] | [prev] | [next] | [standalone]
| From | Dan Williams <dan.j.williams@intel.com> |
|---|---|
| Date | 2016-04-25 19:30 +0200 |
| Message-ID | <rrSuD-1f0-15@gated-at.bofh.it> |
| In reply to | #1386684 |
On Mon, Apr 25, 2016 at 10:14 AM, Verma, Vishal L <vishal.l.verma@intel.com> wrote: > On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: >> On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: >> > >> > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM >> > due >> > to some allocation failing, and I thought we should return the >> > original >> > -EIO in such cases so that the application doesn't lose the >> > information >> > that the bad block is actually causing the error. >> EINVAL is a concern here. Not due to the right error reported, but >> because it means your current scheme is fundamentally broken - we >> need to support I/O at any alignment for DAX I/O, and not fail due to >> alignbment concernes for a highly specific degraded case. >> >> I think this whole series need to go back to the drawing board as I >> don't think it can actually rely on using direct I/O as the EIO >> fallback. >> > Agreed that DAX I/O can happen with any size/alignment, but how else do > we send an IO through the driver without alignment restrictions? Also, > the granularity at which we store badblocks is 512B sectors, so it > seems natural that to clear such a sector, you'd expect to send a write > to the whole sector. > > The expected usage flow is: > > - Application hits EIO doing dax_IO or load/store io > > - It checks badblocks and discovers it's files have lost data > > - It write()s those sectors (possibly converted to file offsets using > fiemap) > * This triggers the fallback path, but if the application is doing > this level of recovery, it will know the sector is bad, and write the > entire sector > > - Or it replaces the entire file from backup also using write() (not > mmap+stores) > * This just frees the fs block, and the next time the block is > reallocated by the fs, it will likely be zeroed first, and that will be > done through the driver and will clear errors > > > I think if we want to keep allowing arbitrary alignments for the > dax_do_io path, we'd need: > 1. To represent badblocks at a finer granularity (likely cache lines) > 2. To allow the driver to do IO to a *block device* at sub-sector > granularity 3. Arrange for O_DIRECT to bypass dax_do_io(), and leave the optimization only for the dax "buffered I/O" case. 4. Skip dax_do_io() entirely in the presence of errors I think 3 is the most closely aligned with the typical block device model. In the typical case a buffered write may fail due to a badblock read when filling the page cache, but an O_DIRECT write would bypass the page cache and potentially clear the error / cause the block to be reallocated internally to the drive.
[toc] | [prev] | [next] | [standalone]
| From | Dave Chinner <david@fromorbit.com> |
|---|---|
| Date | 2016-04-26 01:30 +0200 |
| Message-ID | <rrY70-5UY-7@gated-at.bofh.it> |
| In reply to | #1386684 |
On Mon, Apr 25, 2016 at 05:14:36PM +0000, Verma, Vishal L wrote: > On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: > > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: > > > > > > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM > > > due > > > to some allocation failing, and I thought we should return the > > > original > > > -EIO in such cases so that the application doesn't lose the > > > information > > > that the bad block is actually causing the error. > > EINVAL is a concern here. Not due to the right error reported, but > > because it means your current scheme is fundamentally broken - we > > need to support I/O at any alignment for DAX I/O, and not fail due to > > alignbment concernes for a highly specific degraded case. > > > > I think this whole series need to go back to the drawing board as I > > don't think it can actually rely on using direct I/O as the EIO > > fallback. > > > Agreed that DAX I/O can happen with any size/alignment, but how else do > we send an IO through the driver without alignment restrictions? Also, > the granularity at which we store badblocks is 512B sectors, so it > seems natural that to clear such a sector, you'd expect to send a write > to the whole sector. > > The expected usage flow is: > > - Application hits EIO doing dax_IO or load/store io > > - It checks badblocks and discovers it's files have lost data Lots of hand-waving here. How does the application map a bad "sector" to a file without scanning the entire filesystem to find the owner of the bad sector? > - It write()s those sectors (possibly converted to file offsets using > fiemap) > * This triggers the fallback path, but if the application is doing > this level of recovery, it will know the sector is bad, and write the > entire sector Where does the application find the data that was lost to be able to rewrite it? > - Or it replaces the entire file from backup also using write() (not > mmap+stores) > * This just frees the fs block, and the next time the block is > reallocated by the fs, it will likely be zeroed first, and that will be > done through the driver and will clear errors There's an implicit assumption that applications will keep redundant copies of their data at the /application layer/ and be able to automatically repair it? And then there's the implicit assumption that it will unlink and free the entire file before writing a new copy, and that then assumes the the filesystem will zero blocks if they get reused to clear errors on that LBA sector mapping before they are accessible again to userspace.. It seems to me that there are a number of assumptions being made across multiple layers here. Maybe I've missed something - can you point me to the design/architecture description so I can see how "app does data recovery itself" dance is supposed to work? Cheers, Dave. -- Dave Chinner david@fromorbit.com
[toc] | [prev] | [next] | [standalone]
| From | "Darrick J. Wong" <darrick.wong@oracle.com> |
|---|---|
| Date | 2016-04-26 01:40 +0200 |
| Message-ID | <rrYgG-5ZE-3@gated-at.bofh.it> |
| In reply to | #1386997 |
On Tue, Apr 26, 2016 at 09:25:52AM +1000, Dave Chinner wrote: > On Mon, Apr 25, 2016 at 05:14:36PM +0000, Verma, Vishal L wrote: > > On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: > > > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: > > > > > > > > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM > > > > due > > > > to some allocation failing, and I thought we should return the > > > > original > > > > -EIO in such cases so that the application doesn't lose the > > > > information > > > > that the bad block is actually causing the error. > > > EINVAL is a concern here. Not due to the right error reported, but > > > because it means your current scheme is fundamentally broken - we > > > need to support I/O at any alignment for DAX I/O, and not fail due to > > > alignbment concernes for a highly specific degraded case. > > > > > > I think this whole series need to go back to the drawing board as I > > > don't think it can actually rely on using direct I/O as the EIO > > > fallback. > > > > > Agreed that DAX I/O can happen with any size/alignment, but how else do > > we send an IO through the driver without alignment restrictions? Also, > > the granularity at which we store badblocks is 512B sectors, so it > > seems natural that to clear such a sector, you'd expect to send a write > > to the whole sector. > > > > The expected usage flow is: > > > > - Application hits EIO doing dax_IO or load/store io > > > > - It checks badblocks and discovers it's files have lost data > > Lots of hand-waving here. How does the application map a bad > "sector" to a file without scanning the entire filesystem to find > the owner of the bad sector? FWIW there was some discussion @ LSF about using (XFS) rmap to figure out which parts of a file (on XFS) have gone bad. Chris Mason said that he'd like to collaborate on having a common getfsmap ioctl between btrfs and XFS since they have a backref index that could be hooked up to it for them. Obviously the app still has to coordinate stopping file IO and calling GETFSMAP since the fs won't do that on its own. There's also the question of how to handle LBA translation if there's other stuff like dm in the way. I don't think device-mapper or md do reverse mapping, so things get murky from here. Guess I should get on pushing out a getfsmap patch for review. :) --D (/me doesn't have answers to any of your other questions.) > > - It write()s those sectors (possibly converted to file offsets using > > fiemap) > > * This triggers the fallback path, but if the application is doing > > this level of recovery, it will know the sector is bad, and write the > > entire sector > > Where does the application find the data that was lost to be able to > rewrite it? > > > - Or it replaces the entire file from backup also using write() (not > > mmap+stores) > > * This just frees the fs block, and the next time the block is > > reallocated by the fs, it will likely be zeroed first, and that will be > > done through the driver and will clear errors > > There's an implicit assumption that applications will keep redundant > copies of their data at the /application layer/ and be able to > automatically repair it? And then there's the implicit assumption > that it will unlink and free the entire file before writing a new > copy, and that then assumes the the filesystem will zero blocks if > they get reused to clear errors on that LBA sector mapping before > they are accessible again to userspace.. > > It seems to me that there are a number of assumptions being made > across multiple layers here. Maybe I've missed something - can you > point me to the design/architecture description so I can see how > "app does data recovery itself" dance is supposed to work? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs
[toc] | [prev] | [next] | [standalone]
| From | Dan Williams <dan.j.williams@intel.com> |
|---|---|
| Date | 2016-04-26 01:50 +0200 |
| Message-ID | <rrYqm-63w-3@gated-at.bofh.it> |
| In reply to | #1386997 |
On Mon, Apr 25, 2016 at 4:25 PM, Dave Chinner <david@fromorbit.com> wrote: > On Mon, Apr 25, 2016 at 05:14:36PM +0000, Verma, Vishal L wrote: >> On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: >> > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: >> > > >> > > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM >> > > due >> > > to some allocation failing, and I thought we should return the >> > > original >> > > -EIO in such cases so that the application doesn't lose the >> > > information >> > > that the bad block is actually causing the error. >> > EINVAL is a concern here. Not due to the right error reported, but >> > because it means your current scheme is fundamentally broken - we >> > need to support I/O at any alignment for DAX I/O, and not fail due to >> > alignbment concernes for a highly specific degraded case. >> > >> > I think this whole series need to go back to the drawing board as I >> > don't think it can actually rely on using direct I/O as the EIO >> > fallback. >> > >> Agreed that DAX I/O can happen with any size/alignment, but how else do >> we send an IO through the driver without alignment restrictions? Also, >> the granularity at which we store badblocks is 512B sectors, so it >> seems natural that to clear such a sector, you'd expect to send a write >> to the whole sector. >> >> The expected usage flow is: >> >> - Application hits EIO doing dax_IO or load/store io >> >> - It checks badblocks and discovers it's files have lost data > > Lots of hand-waving here. How does the application map a bad > "sector" to a file without scanning the entire filesystem to find > the owner of the bad sector? > >> - It write()s those sectors (possibly converted to file offsets using >> fiemap) >> * This triggers the fallback path, but if the application is doing >> this level of recovery, it will know the sector is bad, and write the >> entire sector > > Where does the application find the data that was lost to be able to > rewrite it? > >> - Or it replaces the entire file from backup also using write() (not >> mmap+stores) >> * This just frees the fs block, and the next time the block is >> reallocated by the fs, it will likely be zeroed first, and that will be >> done through the driver and will clear errors > > There's an implicit assumption that applications will keep redundant > copies of their data at the /application layer/ and be able to > automatically repair it? And then there's the implicit assumption > that it will unlink and free the entire file before writing a new > copy, and that then assumes the the filesystem will zero blocks if > they get reused to clear errors on that LBA sector mapping before > they are accessible again to userspace.. > > It seems to me that there are a number of assumptions being made > across multiple layers here. Maybe I've missed something - can you > point me to the design/architecture description so I can see how > "app does data recovery itself" dance is supposed to work? > Maybe I missed something, but all these assumptions are already present for typical block devices, i.e. sectors may go bad and a write may make the sector usable again. This patch series is extending that out to the DAX-mmap case, but it's the same principle of "write to clear error" that we live with in the block-I/O path. What clarification are you looking for beyond that point?
[toc] | [prev] | [next] | [standalone]
| From | Dave Chinner <david@fromorbit.com> |
|---|---|
| Date | 2016-04-26 02:20 +0200 |
| Message-ID | <rrYTn-6xR-1@gated-at.bofh.it> |
| In reply to | #1387005 |
On Mon, Apr 25, 2016 at 04:43:14PM -0700, Dan Williams wrote: > On Mon, Apr 25, 2016 at 4:25 PM, Dave Chinner <david@fromorbit.com> wrote: > > On Mon, Apr 25, 2016 at 05:14:36PM +0000, Verma, Vishal L wrote: > >> On Mon, 2016-04-25 at 01:31 -0700, hch@infradead.org wrote: > >> > On Sat, Apr 23, 2016 at 06:08:37PM +0000, Verma, Vishal L wrote: > >> > > > >> > > direct_IO might fail with -EINVAL due to misalignment, or -ENOMEM > >> > > due > >> > > to some allocation failing, and I thought we should return the > >> > > original > >> > > -EIO in such cases so that the application doesn't lose the > >> > > information > >> > > that the bad block is actually causing the error. > >> > EINVAL is a concern here. Not due to the right error reported, but > >> > because it means your current scheme is fundamentally broken - we > >> > need to support I/O at any alignment for DAX I/O, and not fail due to > >> > alignbment concernes for a highly specific degraded case. > >> > > >> > I think this whole series need to go back to the drawing board as I > >> > don't think it can actually rely on using direct I/O as the EIO > >> > fallback. > >> > > >> Agreed that DAX I/O can happen with any size/alignment, but how else do > >> we send an IO through the driver without alignment restrictions? Also, > >> the granularity at which we store badblocks is 512B sectors, so it > >> seems natural that to clear such a sector, you'd expect to send a write > >> to the whole sector. > >> > >> The expected usage flow is: > >> > >> - Application hits EIO doing dax_IO or load/store io > >> > >> - It checks badblocks and discovers it's files have lost data > > > > Lots of hand-waving here. How does the application map a bad > > "sector" to a file without scanning the entire filesystem to find > > the owner of the bad sector? > > > >> - It write()s those sectors (possibly converted to file offsets using > >> fiemap) > >> * This triggers the fallback path, but if the application is doing > >> this level of recovery, it will know the sector is bad, and write the > >> entire sector > > > > Where does the application find the data that was lost to be able to > > rewrite it? > > > >> - Or it replaces the entire file from backup also using write() (not > >> mmap+stores) > >> * This just frees the fs block, and the next time the block is > >> reallocated by the fs, it will likely be zeroed first, and that will be > >> done through the driver and will clear errors > > > > There's an implicit assumption that applications will keep redundant > > copies of their data at the /application layer/ and be able to > > automatically repair it? And then there's the implicit assumption > > that it will unlink and free the entire file before writing a new > > copy, and that then assumes the the filesystem will zero blocks if > > they get reused to clear errors on that LBA sector mapping before > > they are accessible again to userspace.. > > > > It seems to me that there are a number of assumptions being made > > across multiple layers here. Maybe I've missed something - can you > > point me to the design/architecture description so I can see how > > "app does data recovery itself" dance is supposed to work? > > > > Maybe I missed something, but all these assumptions are already > present for typical block devices, i.e. sectors may go bad and a write > may make the sector usable again. The assumption we make about sectors going bad on SSDs or SRDs is that the device is about to die and needs replacing ASAP. Then RAID takes care of the rebuild completely transparently. i.e. handling and correcting bad sectors is typically done completely transparently /below/ the filesytem like so: Application Filesystem block [LBA mapping/redundancy/correction driver e.g. md/dm] driver hardware [LBA redundancy/correction e.g h/w RAID] In the case of filesystems with their own RAID/redundancy code (e.g. btrfs), then it looks like this: Application Filesystem mapping/redundancy/correction driver block driver hardware [LBA redundancy/correction e.g h/w RAID] > This patch series is extending that > out to the DAX-mmap case, but it's the same principle of "write to > clear error" that we live with in the block-I/O path. What > clarification are you looking for beyond that point? I'm asking for an actual design document that explains how moving all the redundancy and bad sector correction stuff from the LBA layer up into application space is supposed to work when applications have no clue about LBA mappings, nor tend to keep redundant data around. i.e. you're proposing this: Application Application data redundancy/correction Filesystem Block [LBA mapping/redundancy/correction driver e.g. md/dm] driver hardware And somehow all the error information from the hardware layer needs to be propagated up to the application layer, along with all the mapping information from the filesystem and block layers for the application to make sense of the hardware reported errors. I see assumptions this this "just works" but we don't have any of the relevant APIs or infrastructure to enable the application to do the hardware error->file+offset namespace mapping (i.e. filesystem reverse mapping for for file offsets and directory paths, and reverse mapping for the the block layer remapping drivers). I haven't seen any design/documentation for infrastructure at the application layer to handle redundant data and correctly transparently so I don't have any idea what the technical requirements this different IO stack places on filesystems may be. Hence I'm asking for some kind of architecture/design documentation that I can read to understand exactly what is being proposed here... Cheers, Dave. -- Dave Chinner david@fromorbit.com
[toc] | [prev] | [next] | [standalone]
| From | Dan Williams <dan.j.williams@intel.com> |
|---|---|
| Date | 2016-04-26 03:50 +0200 |
| Message-ID | <rs0iu-7wL-3@gated-at.bofh.it> |
| In reply to | #1387024 |
On Mon, Apr 25, 2016 at 5:11 PM, Dave Chinner <david@fromorbit.com> wrote: > On Mon, Apr 25, 2016 at 04:43:14PM -0700, Dan Williams wrote: [..] >> Maybe I missed something, but all these assumptions are already >> present for typical block devices, i.e. sectors may go bad and a write >> may make the sector usable again. > > The assumption we make about sectors going bad on SSDs or SRDs is > that the device is about to die and needs replacing ASAP. Similar assumptions here. Storage media is experiencing errors and past a certain threshold it may be time to decommission the device. You can see definitions for SMART / media health commands from various vendors at these links, and yes, hopefully these are standardized / unified at some point down the road: http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf https://github.com/HewlettPackard/hpe-nvm/blob/master/Documentation/NFIT_DSM_DDR4_NVDIMM-N_v84s.pdf https://msdn.microsoft.com/en-us/library/windows/hardware/mt604717(v=vs.85).aspx > Then > RAID takes care of the rebuild completely transparently. i.e. > handling and correcting bad sectors is typically done completely > transparently /below/ the filesytem like so: Again, same for an NVDIMM. Use the pmem block-device as a RAID-member device. >> This patch series is extending that >> out to the DAX-mmap case, but it's the same principle of "write to >> clear error" that we live with in the block-I/O path. What >> clarification are you looking for beyond that point? > > I'm asking for an actual design document that explains how moving > all the redundancy and bad sector correction stuff from the LBA > layer up into application space is supposed to work when > applications have no clue about LBA mappings, nor tend to keep > redundant data around. i.e. you're proposing this: These patches are not proposing *new* / general infrastructure for moving redundancy and bad sector correction handling to userspace. If an existing app is somehow dealing with raw (without RAID) device errors on disk storage media today it should not need to change to handle errors on an NVDIMM. My expectation is that very few if any applications handle this today and just fail in the presence of media errors. > Application > Application data redundancy/correction > Filesystem > Block > [LBA mapping/redundancy/correction driver e.g. md/dm] > driver > hardware > > And somehow all the error information from the hardware layer needs > to be propagated up to the application layer, along with all the > mapping information from the filesystem and block layers for the > application to make sense of the hardware reported errors. > > I see assumptions this this "just works" but we don't have any of > the relevant APIs or infrastructure to enable the application to do > the hardware error->file+offset namespace mapping (i.e. filesystem > reverse mapping for for file offsets and directory paths, and > reverse mapping for the the block layer remapping drivers). If an application expects errors to be handled beneath the filesystem then it should forgo DAX and arrange for the NVDIMM devices to be RAIDed. Otherwise, if an application wants to use DAX then it might need to be prepared to handle media errors itself same as the un-RAIDed disk case. Yes, at an administrative level without reverse-mapping support from a filesystem there's presently no way to ask "which files on this fs are impacted by media errors", and we're aware that reverse-mapping capabilities are nascent for current DAX-aware filesystems. The forward lookup path, as impractical as it is for large numbers of files, is available if an application wanted to know if a specific file was impacted. We've discussed possibly extending fiemap() to return bad blocks in a file rather than consulting sysfs, or extending lseek() with something like SEEK_ERROR to return offsets of bad areas in a file. > I haven't seen any design/documentation for infrastructure at the > application layer to handle redundant data and correctly > transparently so I don't have any idea what the technical > requirements this different IO stack places on filesystems may be. > Hence I'm asking for some kind of architecture/design documentation > that I can read to understand exactly what is being proposed here... I think this is a discussion for a solution that would build on top of this basic "here are the errors, re-write them with good data if you can; otherwise, best of luck" foundation. Something like a DAX-aware device mapper layer that duplicates data tagged with REQ_META so at least we have a recovery path when a sector error lands in critical filesystem-metadata. However, anything we come up with to make NVDIMM errors more survivable should be directly applicable to traditional disk storage as well. Along these lines we had a BoF session at Vault where drive vendors we're wondering if the sysfs bad sectors list could help software recover from the loss of a disk-head, or other errors that only take down part of the drive. An I/O hint that flags data that should be stored redundantly might be useful there as well. By the way, your presence was sorely missed at LSF/MM!
[toc] | [prev] | [next] | [standalone]
| From | Dave Chinner <david@fromorbit.com> |
|---|---|
| Date | 2016-04-26 05:00 +0200 |
| Message-ID | <rs1od-8q1-9@gated-at.bofh.it> |
| In reply to | #1387067 |
On Mon, Apr 25, 2016 at 06:45:08PM -0700, Dan Williams wrote: > On Mon, Apr 25, 2016 at 5:11 PM, Dave Chinner <david@fromorbit.com> wrote: > > On Mon, Apr 25, 2016 at 04:43:14PM -0700, Dan Williams wrote: > [..] > >> Maybe I missed something, but all these assumptions are already > >> present for typical block devices, i.e. sectors may go bad and a write > >> may make the sector usable again. > > > > The assumption we make about sectors going bad on SSDs or SRDs is > > that the device is about to die and needs replacing ASAP. > > Similar assumptions here. Storage media is experiencing errors and > past a certain threshold it may be time to decommission the device. > > You can see definitions for SMART / media health commands from various > vendors at these links, and yes, hopefully these are standardized / > unified at some point down the road: > > http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf > https://github.com/HewlettPackard/hpe-nvm/blob/master/Documentation/NFIT_DSM_DDR4_NVDIMM-N_v84s.pdf > https://msdn.microsoft.com/en-us/library/windows/hardware/mt604717(v=vs.85).aspx > > > > Then > > RAID takes care of the rebuild completely transparently. i.e. > > handling and correcting bad sectors is typically done completely > > transparently /below/ the filesytem like so: > > Again, same for an NVDIMM. Use the pmem block-device as a RAID-member device. Which means we're not using DAX and so the existing storage model applies. I understand how this works. What I'm asking about the redundancy/error correction model /when using DAX/ and a userspace DAX load/store throws the MCE. > > And somehow all the error information from the hardware layer needs > > to be propagated up to the application layer, along with all the > > mapping information from the filesystem and block layers for the > > application to make sense of the hardware reported errors. > > > > I see assumptions this this "just works" but we don't have any of > > the relevant APIs or infrastructure to enable the application to do > > the hardware error->file+offset namespace mapping (i.e. filesystem > > reverse mapping for for file offsets and directory paths, and > > reverse mapping for the the block layer remapping drivers). > > If an application expects errors to be handled beneath the filesystem > then it should forgo DAX and arrange for the NVDIMM devices to be > RAIDed. See above: I'm asking about the DAX-enabled error handling model, not the traditional error handling model. > Otherwise, if an application wants to use DAX then it might > need to be prepared to handle media errors itself same as the > un-RAIDed disk case. Yes, at an administrative level without > reverse-mapping support from a filesystem there's presently no way to > ask "which files on this fs are impacted by media errors", and we're > aware that reverse-mapping capabilities are nascent for current > DAX-aware filesystems. Precisely my point - suggestions are being proposed which assume use of infrastructure that *does not exist yet* and has not been discussed or documented. If we're expecting such infrastructure to be implemented in the filesystems and block device drivers, then we need to determine that the error model actually works first... > The forward lookup path, as impractical as it > is for large numbers of files, is available if an application wanted > to know if a specific file was impacted. We've discussed possibly > extending fiemap() to return bad blocks in a file rather than > consulting sysfs, or extending lseek() with something like SEEK_ERROR > to return offsets of bad areas in a file. Via what infrastructure will the filesystem use for finding out whether a file has bad blocks in it? And if the file does have bad blocks, what are you expecting the filesystem to do with that information? > > I haven't seen any design/documentation for infrastructure at the > > application layer to handle redundant data and correctly > > transparently so I don't have any idea what the technical > > requirements this different IO stack places on filesystems may be. > > Hence I'm asking for some kind of architecture/design documentation > > that I can read to understand exactly what is being proposed here... > > I think this is a discussion for a solution that would build on top of > this basic "here are the errors, re-write them with good data if you > can; otherwise, best of luck" foundation. Something like a DAX-aware > device mapper layer that duplicates data tagged with REQ_META so at > least we have a recovery path when a sector error lands in critical > filesystem-metadata. Filesytsem metadata is not the topic of discussion here - it's user data that throws an error on a DAX load/store that is the issue. > However, anything we come up with to make NVDIMM > errors more survivable should be directly applicable to traditional > disk storage as well. I'm not sure it does. DAX implies that traditional block layer RAID infrastructure is not possible, nor are data CRCs, nor are any other sort of data transformations that are needed for redundancy at the device layers. Anything that relies on copying/modifying/stable data to provide redundancies needs to do such work at a place where it can stall userspace page faults. This is where pmem native filesystem designs like NOVA take over from traditional block based filesystems - they are designed around the ability to do atomic page-based operations for data protection and recovery operations. It is this mechanism that allows stable pages to be committed to permanent storage and as such, allow redundancy operations such as mirroring to be performed before operations are marked as "stable". I'm missing the bigger picture that is being aimed at here - what's the point of DAX if we have to turn it off if we want any sort of failure protection? What's the big plan for fully enabling DAX with robust error correction? Where is this all supposed to be leading to? > Along these lines we had a BoF session at Vault > where drive vendors we're wondering if the sysfs bad sectors list > could help software recover from the loss of a disk-head, or other > errors that only take down part of the drive. Right, but as I've said elsewhere, loss of a disk head implies terabyte scale data loss. That is not something we can automatically recovery from at the filesystem level. Low level raid recovery could handle that sort of loss, but at the higher layers it's a disaster similar to multiple disk RAID failure. It's a completely different scale to a single sector/page loss we are talking about here, and so I don't see there as being much (if any) overlap here. > An I/O hint that flags > data that should be stored redundantly might be useful there as well. DAX doesn't have an IO path to hint with... :/ Cheers, Dave. -- Dave Chinner david@fromorbit.com
[toc] | [prev] | [next] | [standalone]
| From | Dan Williams <dan.j.williams@intel.com> |
|---|---|
| Date | 2016-04-26 06:20 +0200 |
| Message-ID | <rs2DE-1bT-1@gated-at.bofh.it> |
| In reply to | #1387109 |
On Mon, Apr 25, 2016 at 7:56 PM, Dave Chinner <david@fromorbit.com> wrote: > On Mon, Apr 25, 2016 at 06:45:08PM -0700, Dan Williams wrote: [..] >> Otherwise, if an application wants to use DAX then it might >> need to be prepared to handle media errors itself same as the >> un-RAIDed disk case. Yes, at an administrative level without >> reverse-mapping support from a filesystem there's presently no way to >> ask "which files on this fs are impacted by media errors", and we're >> aware that reverse-mapping capabilities are nascent for current >> DAX-aware filesystems. > > Precisely my point - suggestions are being proposed which assume > use of infrastructure that *does not exist yet* and has not been > discussed or documented. If we're expecting such infrastructure to > be implemented in the filesystems and block device drivers, then we > need to determine that the error model actually works first... These patches only assume the clear-error-on write-model, and that *maybe* the sysfs bad blocks list is useful if the filesystem has a reverse-map, or if the application can compare the list against the results of fiemap(). Beyond that, this is the same perennial "we should really have better error coordination between block device and filesystems" discussions that we have at LSF. > >> The forward lookup path, as impractical as it >> is for large numbers of files, is available if an application wanted >> to know if a specific file was impacted. We've discussed possibly >> extending fiemap() to return bad blocks in a file rather than >> consulting sysfs, or extending lseek() with something like SEEK_ERROR >> to return offsets of bad areas in a file. > > Via what infrastructure will the filesystem use for finding out > whether a file has bad blocks in it? And if the file does have bad > blocks, what are you expecting the filesystem to do with that > information? We currently have no expectation that the filesystem does anything with the bad blocks list. However, if a filesystem had btrfs-like capabilities to recover data from a redundant location we'd be looking to plug into that infrastructure. >> > I haven't seen any design/documentation for infrastructure at the >> > application layer to handle redundant data and correctly >> > transparently so I don't have any idea what the technical >> > requirements this different IO stack places on filesystems may be. >> > Hence I'm asking for some kind of architecture/design documentation >> > that I can read to understand exactly what is being proposed here... >> >> I think this is a discussion for a solution that would build on top of >> this basic "here are the errors, re-write them with good data if you >> can; otherwise, best of luck" foundation. Something like a DAX-aware >> device mapper layer that duplicates data tagged with REQ_META so at >> least we have a recovery path when a sector error lands in critical >> filesystem-metadata. > > Filesytsem metadata is not the topic of discussion here - it's > user data that throws an error on a DAX load/store that is the > issue. Which is not a new problem since volatile DRAM in the non-DAX case can throw the exact same error. The current recovery model there is crash the kernel (without MCE recovery), or crash the application and hope the kernel maps out the page or the application knows how to restart after SIGBUS. Memory mirroring is meant to make this a bit less harsh, but there's no mechanism to make this available outside the kernel. >> However, anything we come up with to make NVDIMM >> errors more survivable should be directly applicable to traditional >> disk storage as well. > > I'm not sure it does. DAX implies that traditional block layer RAID > infrastructure is not possible, nor are data CRCs, nor are any other > sort of data transformations that are needed for redundancy at the > device layers. Anything that relies on copying/modifying/stable data to > provide redundancies needs to do such work at a place where it can > stall userspace page faults. > > This is where pmem native filesystem designs like NOVA take over > from traditional block based filesystems - they are designed around > the ability to do atomic page-based operations for data protection > and recovery operations. It is this mechanism that allows stable > pages to be committed to permanent storage and as such, allow > redundancy operations such as mirroring to be performed before > operations are marked as "stable". > > I'm missing the bigger picture that is being aimed at here - what's the > point of DAX if we have to turn it off if we want any sort of > failure protection? What's the big plan for fully enabling DAX with > robust error correction? Where is this all supposed to be leading > to? > NOVA and other solutions are free and encouraged to do a coherent bottoms-up rethink of error handling on top of persistent memory devices, in the meantime applications can only expect the legacy SIGBUS and -EIO mechanisms are available. So I'm still trying to connect how the "What would NOVA do?" discussion is anything but orthogonal to hooking up SIGBUS and -EIO for traditional-filesystem DAX. It's the only error model an application can expect because it's the only one that currently exists. >> Along these lines we had a BoF session at Vault >> where drive vendors we're wondering if the sysfs bad sectors list >> could help software recover from the loss of a disk-head, or other >> errors that only take down part of the drive. > > Right, but as I've said elsewhere, loss of a disk head implies > terabyte scale data loss. That is not something we can automatically > recovery from at the filesystem level. Low level raid recovery could > handle that sort of loss, but at the higher layers it's a disaster > similar to multiple disk RAID failure. It's a completely different > scale to a single sector/page loss we are talking about here, and so > I don't see there as being much (if any) overlap here. > >> An I/O hint that flags >> data that should be stored redundantly might be useful there as well. > > DAX doesn't have an IO path to hint with... :/ ...I was thinking traditional filesystem metadata operations through the block layer. NOVA could of course do something better since it always indirects userspace access through a filesystem managed page.
[toc] | [prev] | [next] | [standalone]
| From | Dave Chinner <david@fromorbit.com> |
|---|---|
| Date | 2016-04-26 10:30 +0200 |
| Message-ID | <rs6xA-4bI-1@gated-at.bofh.it> |
| In reply to | #1387128 |
On Mon, Apr 25, 2016 at 09:18:42PM -0700, Dan Williams wrote: > On Mon, Apr 25, 2016 at 7:56 PM, Dave Chinner <david@fromorbit.com> wrote: > > On Mon, Apr 25, 2016 at 06:45:08PM -0700, Dan Williams wrote: > >> > I haven't seen any design/documentation for infrastructure at the > >> > application layer to handle redundant data and correctly > >> > transparently so I don't have any idea what the technical > >> > requirements this different IO stack places on filesystems may be. > >> > Hence I'm asking for some kind of architecture/design documentation > >> > that I can read to understand exactly what is being proposed here... > >> > >> I think this is a discussion for a solution that would build on top of > >> this basic "here are the errors, re-write them with good data if you > >> can; otherwise, best of luck" foundation. Something like a DAX-aware > >> device mapper layer that duplicates data tagged with REQ_META so at > >> least we have a recovery path when a sector error lands in critical > >> filesystem-metadata. > > > > Filesytsem metadata is not the topic of discussion here - it's > > user data that throws an error on a DAX load/store that is the > > issue. > > Which is not a new problem since volatile DRAM in the non-DAX case can > throw the exact same error. They are not the same class of error, not by a long shot. The "bad page in page cache" error on traditional storage means data is not lost - the original copy still in whatever storage medium that the cached page was filled from. i.e. Re-read the file and the data is still there, which is no different to crashing and restarting that machine and losing whatever writes had not been committed to stable storage.. In the pmem case, a "bad page" is a permanent loss of data - it's unrecoverable without some form data recovery operation being performed on the storage. > The current recovery model there is crash > the kernel (without MCE recovery), Ouch. Permanent data loss and a system wide DoS. > or crash the application and hope > the kernel maps out the page or the application knows how to restart > after SIGBUS. Not much better - neither provide a mechanism for recovery. > Memory mirroring is meant to make this a bit less > harsh, but there's no mechanism to make this available outside the > kernel. Which implies that we need a DM module that interfaces with the hardware memory mirroring to perform recovery and remapping operations. i.e. in the traditional storage stack location. > >> However, anything we come up with to make NVDIMM > >> errors more survivable should be directly applicable to traditional > >> disk storage as well. > > > > I'm not sure it does. DAX implies that traditional block layer RAID > > infrastructure is not possible, nor are data CRCs, nor are any other > > sort of data transformations that are needed for redundancy at the > > device layers. Anything that relies on copying/modifying/stable data to > > provide redundancies needs to do such work at a place where it can > > stall userspace page faults. > > > > This is where pmem native filesystem designs like NOVA take over > > from traditional block based filesystems - they are designed around > > the ability to do atomic page-based operations for data protection > > and recovery operations. It is this mechanism that allows stable > > pages to be committed to permanent storage and as such, allow > > redundancy operations such as mirroring to be performed before > > operations are marked as "stable". > > > > I'm missing the bigger picture that is being aimed at here - what's the > > point of DAX if we have to turn it off if we want any sort of > > failure protection? What's the big plan for fully enabling DAX with > > robust error correction? Where is this all supposed to be leading > > to? > > > > NOVA and other solutions are free and encouraged to do a coherent > bottoms-up rethink of error handling on top of persistent memory > devices, in the meantime applications can only expect the legacy > SIGBUS and -EIO mechanisms are available. So I'm still trying to > connect how the "What would NOVA do?" discussion is anything but > orthogonal to hooking up SIGBUS and -EIO for traditional-filesystem > DAX. It's the only error model an application can expect because it's > the only one that currently exists. <sigh> Yes, I get that. I'm not interested in the resultant fatal error delivery - I'm asking about what happens between the memory error and the delivery of the fatal "we've lost your data forever" error that gets delivered to userspace. i.e. I'm after a description of how error correction/recovery is supposed to be applied to DAX *before we report SIGBUS or EIO* to the application. What is the plan/model/vision for intercepting MCEs and recovering from them? e.g. how do we going to pull the good copy from hardware/software memory mirrors? What layer is supposed to be responsible for that? Is it different for hardware mirroring compared to a more traditional software dm-RAID1 solution? What requirements does software recovery imply - do we need stable page state for DAX (i.e. to prevent userspace modification while we make copies)? Do we need to remap LBAs in the storage stack iduring recovery when bad blocks are reported? If so, where does it get done? What atomicity and resiliency requirements are there for recovery? e.g. bad block is reported, system crashes - what needs to happen on reboot to have recovery work correctly? There's heaps of stuff that is completely undefined here - error handling is fucking hard at the best of times, but I'm struggling to understand even the basics of what is being proposed here apart from "pmem error == crash the application, maybe even the system". Future filesystems are only part of the solution here - infrastructure like access to hardware mirrored copies for recovery purposes will impact greatly on the design of upper layers and their performance (e.g. no need for RAID1 in a software layer), so we really need the model/architecture to be pretty clearly defined at the outset before people waste too much time going down paths that simply won't work on the hardware/infrastructure that is being provided.... > >> An I/O hint that flags > >> data that should be stored redundantly might be useful there as well. > > > > DAX doesn't have an IO path to hint with... :/ > > ...I was thinking traditional filesystem metadata operations through > the block layer. NOVA could of course do something better since it > always indirects userspace access through a filesystem managed page. It seems to me you are focussing on code/technologies that exist today instead of trying to define an architecture that is more optimal for pmem storage systems. Yes, working code is great, but if you can't tell people how things like robust error handling and redundancy are going to work in future then it's going to take forever for everyone else to handle such errors robustly through the storage stack... Cheers, Dave. -- Dave Chinner david@fromorbit.com
[toc] | [prev] | [next] | [standalone]
| From | Dan Williams <dan.j.williams@intel.com> |
|---|---|
| Date | 2016-04-26 17:00 +0200 |
| Message-ID | <rscD1-11Z-49@gated-at.bofh.it> |
| In reply to | #1387222 |
On Tue, Apr 26, 2016 at 1:27 AM, Dave Chinner <david@fromorbit.com> wrote: > On Mon, Apr 25, 2016 at 09:18:42PM -0700, Dan Williams wrote: [..] > It seems to me you are focussing on code/technologies that exist > today instead of trying to define an architecture that is more > optimal for pmem storage systems. Yes, working code is great, but if > you can't tell people how things like robust error handling and > redundancy are going to work in future then it's going to take > forever for everyone else to handle such errors robustly through the > storage stack... Precisely because higher order redundancy is built on top this baseline. MD-RAID can't do it's error recovery if we don't have -EIO and clear-error-on-write. On the other hand, you're absolutely right that we have a gaping hole on top of the SIGBUS recovery model, and don't have a kernel layer we can interpose on top of DAX to provide some semblance of redundancy. In the meantime, a handful of applications with a team of full-time site-reliability-engineers may be able to plug in external redundancy infrastructure on top of what is defined in these patches. For everyone else, the hard problem, we need to do a lot more thinking about a trap and recover solution.
[toc] | [prev] | [next] | [standalone]
| From | Jan Kara <jack@suse.cz> |
|---|---|
| Date | 2016-04-26 17:40 +0200 |
| Message-ID | <rsdfJ-1Ck-43@gated-at.bofh.it> |
| In reply to | #1387586 |
On Tue 26-04-16 07:59:10, Dan Williams wrote: > On Tue, Apr 26, 2016 at 1:27 AM, Dave Chinner <david@fromorbit.com> wrote: > > On Mon, Apr 25, 2016 at 09:18:42PM -0700, Dan Williams wrote: > [..] > > It seems to me you are focussing on code/technologies that exist > > today instead of trying to define an architecture that is more > > optimal for pmem storage systems. Yes, working code is great, but if > > you can't tell people how things like robust error handling and > > redundancy are going to work in future then it's going to take > > forever for everyone else to handle such errors robustly through the > > storage stack... > > Precisely because higher order redundancy is built on top this baseline. > > MD-RAID can't do it's error recovery if we don't have -EIO and > clear-error-on-write. On the other hand, you're absolutely right that > we have a gaping hole on top of the SIGBUS recovery model, and don't > have a kernel layer we can interpose on top of DAX to provide some > semblance of redundancy. > > In the meantime, a handful of applications with a team of full-time > site-reliability-engineers may be able to plug in external redundancy > infrastructure on top of what is defined in these patches. For > everyone else, the hard problem, we need to do a lot more thinking > about a trap and recover solution. So we could actually implement some kind of redundancy with DAX with reasonable effort. We already do track dirty storage PFNs in the radix tree. After DAX locking patches get merged we also have a reliable way to write-protect them when we decide to do 'writeback' (translates to flushing CPU caches) for them. When we do that, we have all the infrastructure in place to provide 'stable pages' while some mirroring or other redundancy mechanism in kernel works with the data. But as Dave said, we should do some writeup of how this is all supposed to work and e.g. which layer is going to be responsible for the redundancy. Do we want to have that in DAX code? Or just provide stable page guarantees from DAX and do the redundancy from device mapper? This needs more thought... Honza -- Jan Kara <jack@suse.com> SUSE Labs, CR
[toc] | [prev] | [next] | [standalone]
| From | Dan Williams <dan.j.williams@intel.com> |
|---|---|
| Date | 2016-04-26 19:20 +0200 |
| Message-ID | <rseOv-2Z1-23@gated-at.bofh.it> |
| In reply to | #1387633 |
On Tue, Apr 26, 2016 at 8:31 AM, Jan Kara <jack@suse.cz> wrote: > On Tue 26-04-16 07:59:10, Dan Williams wrote: >> On Tue, Apr 26, 2016 at 1:27 AM, Dave Chinner <david@fromorbit.com> wrote: >> > On Mon, Apr 25, 2016 at 09:18:42PM -0700, Dan Williams wrote: >> [..] >> > It seems to me you are focussing on code/technologies that exist >> > today instead of trying to define an architecture that is more >> > optimal for pmem storage systems. Yes, working code is great, but if >> > you can't tell people how things like robust error handling and >> > redundancy are going to work in future then it's going to take >> > forever for everyone else to handle such errors robustly through the >> > storage stack... >> >> Precisely because higher order redundancy is built on top this baseline. >> >> MD-RAID can't do it's error recovery if we don't have -EIO and >> clear-error-on-write. On the other hand, you're absolutely right that >> we have a gaping hole on top of the SIGBUS recovery model, and don't >> have a kernel layer we can interpose on top of DAX to provide some >> semblance of redundancy. >> >> In the meantime, a handful of applications with a team of full-time >> site-reliability-engineers may be able to plug in external redundancy >> infrastructure on top of what is defined in these patches. For >> everyone else, the hard problem, we need to do a lot more thinking >> about a trap and recover solution. > > So we could actually implement some kind of redundancy with DAX with > reasonable effort. We already do track dirty storage PFNs in the radix > tree. After DAX locking patches get merged we also have a reliable way to > write-protect them when we decide to do 'writeback' (translates to flushing > CPU caches) for them. When we do that, we have all the infrastructure in > place to provide 'stable pages' while some mirroring or other redundancy > mechanism in kernel works with the data. > > But as Dave said, we should do some writeup of how this is all supposed to > work and e.g. which layer is going to be responsible for the redundancy. Do > we want to have that in DAX code? Or just provide stable page guarantees > from DAX and do the redundancy from device mapper? This needs more > thought... > [ adding Mike, since his ears are likely burning by this point ] If we had the ability to specify a range or list of ranges to blkdev_issue_flush() that would allow the driver level to implement redundancy at sync time. And no, before someone flies off the handle, this isn't rehashing the same argument I lost about where to track dirty pfns. Rather this relies on the radix to track dirty pfns, but asks the driver to do the flush operation. In the nominal case this is a clflush / clwb loop or wbinvd in the pmem driver, in the redundancy case the pmem driver is swapped out for a driver that uses the flush request as a trigger point to synchronize redundant data. We want this at the driver level to take advantage of standard asynchronous completions, and make it administratively equivalent to the dm/md layering people are used to using.
[toc] | [prev] | [next] | [standalone]
| From | "Verma, Vishal L" <vishal.l.verma@intel.com> |
|---|---|
| Date | 2016-04-26 02:00 +0200 |
| Message-ID | <rrYA2-67A-7@gated-at.bofh.it> |
| In reply to | #1386997 |
On Tue, 2016-04-26 at 09:25 +1000, Dave Chinner wrote: > <> > > > > - It checks badblocks and discovers it's files have lost data > Lots of hand-waving here. How does the application map a bad > "sector" to a file without scanning the entire filesystem to find > the owner of the bad sector? Yes this was hand-wavey, but we talked about this a bit at LSF.. The idea is that a per-block-device badblocks list is available at /sys/block/<pmemX>/badblocks. The application (or a suitable yet-to-be- written library function) does a fiemap to figure out the sectors its files are using, and correlates the two lists. We can also look into providing an easier-to-use interface from the kernel, in the form of an fiemap flag to report only the bad sectors, or a SEEK_BAD flag.. The application doesn't have to scan the entire filesystem, but presumably it knows what files it 'owns', and does a fiemap for those. > > > > > - It write()s those sectors (possibly converted to file offsets > > using > > fiemap) > > * This triggers the fallback path, but if the application is > > doing > > this level of recovery, it will know the sector is bad, and write > > the > > entire sector > Where does the application find the data that was lost to be able to > rewrite it? The data that was lost is gone -- this assumes the application has some ability to recover using a journal/log or other redundancy - yes, at the application layer. If it doesn't have this sort of capability, the only option is to restore files from a backup/mirror. > > > > > - Or it replaces the entire file from backup also using write() (not > > mmap+stores) > > * This just frees the fs block, and the next time the block is > > reallocated by the fs, it will likely be zeroed first, and that will > > be > > done through the driver and will clear errors > There's an implicit assumption that applications will keep redundant > copies of their data at the /application layer/ and be able to > automatically repair it? And then there's the implicit assumption > that it will unlink and free the entire file before writing a new > copy, and that then assumes the the filesystem will zero blocks if > they get reused to clear errors on that LBA sector mapping before > they are accessible again to userspace.. > > It seems to me that there are a number of assumptions being made > across multiple layers here. Maybe I've missed something - can you > point me to the design/architecture description so I can see how > "app does data recovery itself" dance is supposed to work? There isn't a document other than the flow in my head :) - but maybe I could write one up.. I wasn't thinking the application itself maintains and restores from backup copy of the file.. The application hits either a SIGBUS or EIO depending on how it accesses the data, and crashes or raises some alarm. The recovery is then done out-of-band, by a sysadmin or such (i.e. delete the file, replace with a known good copy, restart application). To summarize, the two cases we want to handle are: 1. Application has inbuilt recovery: - hits badblock - figures out it is able to recover the data - handles SIGBUS or EIO - does a (sector aligned) write() to restore the data 2. Application doesn't have any inbuilt recovery mechanism - hits badblock - gets SIGBUS (or EIO) and crashes - Sysadmin restores file from backup Case 1 is handled by either a fallback to direct_IO from dax_do_io, or always _actually_ doing direct_IO when we're opened with O_DIRECT in spite of dax (what Dan suggested). Currently if we're mounted with dax, all IO O_DIRECT or otherwise will go through dax_do_io. Case 2 is handled by patch 4 of the series: dax: use sb_issue_zerout instead of calling dax_clear_sectors > > Cheers, > > Dave.
[toc] | [prev] | [next] | [standalone]
| From | Dave Chinner <david@fromorbit.com> |
|---|---|
| Date | 2016-04-26 02:50 +0200 |
| Message-ID | <rrZmq-6LW-9@gated-at.bofh.it> |
| In reply to | #1387009 |
On Mon, Apr 25, 2016 at 11:53:13PM +0000, Verma, Vishal L wrote: > On Tue, 2016-04-26 at 09:25 +1000, Dave Chinner wrote: > > > <> > > > > > > > - It checks badblocks and discovers it's files have lost data > > Lots of hand-waving here. How does the application map a bad > > "sector" to a file without scanning the entire filesystem to find > > the owner of the bad sector? > > Yes this was hand-wavey, but we talked about this a bit at LSF.. > The idea is that a per-block-device badblocks list is available at > /sys/block/<pmemX>/badblocks. The application (or a suitable yet-to-be- > written library function) does a fiemap to figure out the sectors its > files are using, and correlates the two lists. > We can also look into providing an easier-to-use interface from the > kernel, in the form of an fiemap flag to report only the bad sectors, or > a SEEK_BAD flag.. > The application doesn't have to scan the entire filesystem, but > presumably it knows what files it 'owns', and does a fiemap for those. You're assuming that only the DAX aware application accesses it's files. users, backup programs, data replicators, fileystem re-organisers (e.g. defragmenters) etc all may access the files and they may throw errors. What then? > > > - It write()s those sectors (possibly converted to file offsets > > > using > > > fiemap) > > > * This triggers the fallback path, but if the application is > > > doing > > > this level of recovery, it will know the sector is bad, and write > > > the > > > entire sector > > Where does the application find the data that was lost to be able to > > rewrite it? > > The data that was lost is gone -- this assumes the application has some > ability to recover using a journal/log or other redundancy - yes, at the > application layer. If it doesn't have this sort of capability, the only > option is to restore files from a backup/mirror. So the architecture has a built in assumption that only userspace can handle data loss? What about filesytsems like NOVA, that use log structured design to provide DAX w/ update atomicity and can potentially also provide redundancy/repair through the same mechanisms? Won't pmem native filesystems with built in data protection features like this remove the need for adding all this to userspace applications? If so, shouldn't that be the focus of development rahter than placing the burden on userspace apps to handle storage repair situations? > > > - Or it replaces the entire file from backup also using write() (not > > > mmap+stores) > > > * This just frees the fs block, and the next time the block is > > > reallocated by the fs, it will likely be zeroed first, and that will > > > be > > > done through the driver and will clear errors > > There's an implicit assumption that applications will keep redundant > > copies of their data at the /application layer/ and be able to > > automatically repair it? And then there's the implicit assumption > > that it will unlink and free the entire file before writing a new > > copy, and that then assumes the the filesystem will zero blocks if > > they get reused to clear errors on that LBA sector mapping before > > they are accessible again to userspace.. > > > > It seems to me that there are a number of assumptions being made > > across multiple layers here. Maybe I've missed something - can you > > point me to the design/architecture description so I can see how > > "app does data recovery itself" dance is supposed to work? > > There isn't a document other than the flow in my head :) - but maybe I > could write one up.. > I wasn't thinking the application itself maintains and restores from > backup copy of the file.. The application hits either a SIGBUS or EIO > depending on how it accesses the data, and crashes or raises some alarm. > The recovery is then done out-of-band, by a sysadmin or such (i.e. > delete the file, replace with a known good copy, restart application). > > To summarize, the two cases we want to handle are: > 1. Application has inbuilt recovery: > - hits badblock > - figures out it is able to recover the data > - handles SIGBUS or EIO > - does a (sector aligned) write() to restore the data The "figures out" step here is where >95% of the work we'd have to do is. And that's in filesystem and block layer code, not userspace, and userspace can't do that work in a signal handler. And it can still fall down to the second case when the application doesn't have another copy of the data somewhere. FWIW, we don't have a DAX enabled filesystem that can do reverse block mapping, so we're a year or two away from this being a workable production solution from the filesystem perspective. And AFAICT, it's not even on the roadmap for dm/md layers. > 2. Application doesn't have any inbuilt recovery mechanism > - hits badblock > - gets SIGBUS (or EIO) and crashes > - Sysadmin restores file from backup Which is no different to an existing non-DAX application getting an EIO/sigbus from current storage technologies. Except: in the existing storage stack, redundancy and correction has already had to have failed for the application to see such an error. Hence this is normally considered a DR case as there's had to be cascading failures (e.g. multiple disk failures in a RAID) to get to this stage, not a single error in a single sector in non-redundant storage. We need some form of redundancy and correction in the PMEM stack to prevent single sector errors from taking down services until an administrator can correct the problem. I'm trying to understand where this is supposed to fit into the picture - at this point I really don't think userspace applications are going to be able to do this reliably.... Cheers, Dave. -- Dave Chinner david@fromorbit.com
[toc] | [prev] | [next] | [standalone]
Page 1 of 2 [1] 2 Next page →
Back to top | Article view | linux.kernel
csiph-web