Hey all, I've posted the PR here: https://github.com/openzfs/openzfs/pull/188 . I'm also pinging the ZoL community via the PR where they integrated their own version of this patch; theirs is disabled by default, so they may want to discuss things in the PR or here. Just a heads up.
On Thu, Sep 1, 2016 at 2:44 PM, Bryan Cantrill <[email protected]> wrote: > > Hey Paul, > > Definitely share your concern about dead code, and I think Matt has a > potentially interesting solution to allow for working around past bugs > (though I do wonder how it will fare with features that have several bugs > over time; should it be versioned?), but it also seems like we have > consensus that whatever its ultimate fate, this feature should be disabled > for now with an on-by-default tunable. Given that you already have a patch > that can apply cleanly to illumos, I would say move forward with it -- and > thank you! > > - Bryan > > > On Wed, Aug 31, 2016 at 8:03 PM, Paul Dagnelie <[email protected]> wrote: > >> It sounds like people agree that we should definitely take strong action >> on this, and that an off-by-default flag isn't enough. That's totally >> fine; correctness should definitely be job 1, especially for something that >> people rely on as much as their backup utilities. My only real issue with >> the on-by-default an approach is that it would be easy for this to lead to >> the feature effectively becoming dead code, which would be better off >> removed than present but largely unused and untested. However, it sounds >> like Matt's solution solves that nicely, by disabling the feature until we >> know it's good, and then transparently activating it afterwards. If people >> like Matt's approach, I think an on-by-default kernel tunable to ignore >> hole birth that we push out ASAP would be a good start. I know ZoL has >> already implemented one (and it's going into 0.6.5.8), and I have a version >> of it for DelphixOS that should apply cleanly to illumos. I could start >> work on testing and pushing that immediately. We could then take the time >> to work out all the hole birth issue, implement the backwards-compatible >> featureflags, and push those upstream without being rushed by having the >> hole_birth issues live in the wild hanging over us. >> >> On Wed, Aug 31, 2016 at 7:40 PM, Matthew Ahrens <[email protected]> >> wrote: >> >>> I agree that correctness is job #1, including in this "corner case" of >>> accidentally leaving a hole unpunched when sending/receiving. >>> >>> We should add a kernel tunable to ignore the hole birth. This is >>> low-effort and low-risk, and allows those "in the know" to immediately >>> resolve their problem. I would be open to having this be set to disable >>> hole birth behavior by default until we can implement the more complete >>> solution described below. >>> >>> I know we have improved the performance of handling holes in >>> send/receive since the hole birth feature was first introduced, and I >>> appreciate the data points that turning it off doesn't seem to hurt. But >>> I'd like to see/do a more thorough analysis before throwing it out >>> altogether (though it would be a relief if we could do so, given how much >>> headache this feature has caused). In particular, incremental sends of a >>> large zvol with lots of large, discontiguous holes will result in lots of >>> FREE records without the hole_birth feature. In the worst case, each >>> modified block could result in 8KB of data and 156KB of FREE records (312 >>> bytes/record * 512, if every other block is a hole in a 128KB indirect >>> block (which has 1024 block pointers)). So hopefully most cases are not >>> close to the worst one :-) >>> >>> As a more complete, permanent solution, I would like to propose this as >>> the first use case of a new type of feature flag: the "transparent, fully >>> backward compatible feature flag". The problem this solves is the need to >>> know last time old software wrote to pool, because old software does not >>> maintain certain data structures (e.g. does not correctly maintain hole >>> BP’s birth times - this could also be used for other things like additional >>> space accounting). >>> >>> In this case, there was a bug that caused hole BP’s birth times to not >>> be maintained correctly. Holes with birth times that were written with the >>> buggy software can not be trusted, but we can trust holes that were written >>> with newer software. By adding a fully-backwards-compatible feature flag >>> to the new (fixed) software, we can say “since TXG X, we have only used new >>> software that correctly maintains the holes birth times, and therefore we >>> can trust hole birth times that are > X (and when sending from a TXG > X, >>> birth times of 0 can be trusted)". >>> >>> Note: no user action is required (e.g. “enabling” the feature), and the >>> feature is not listed in the UI, and is not documented. In other words, >>> this is purely an implementation detail. >>> >>> Here's a brief design of how this could be implemented: >>> >>> New on-disk structures: >>> - TXG range (mintxg, maxtxg) in which only new software has written to >>> pool >>> - stored per backwards-compatible feature >>> - stored in object in MOS >>> >>> new behaviors: >>> - when open pool: >>> - if object does not mention this feature, or if this feature’s >>> maxtxg != last written txg, store new range (mintxg = maxtxg = current_txg) >>> - when sync each txg: >>> - assert maxtxg == current_txg - 1 >>> - store maxtxg = current_txg >>> - query: when was feature enabled: return “mintxg”. We know that new >>> software has been continuously in use since this txg. >>> >>> --matt >>> >>> On Wed, Aug 31, 2016 at 4:51 PM, Bryan Cantrill <[email protected] >>> > wrote: >>> >>>> >>>> So, I have a different perspective. Given that the failure mode here >>>> is severe (namely, silent data corruption) I think our collective >>>> disposition needs to be to ignore hole birth on zfs send by default. To >>>> claim that this is heavy handed (that is, that the hole birth optimization >>>> is so essential to the performance of so many that disabling it would be >>>> debilitating) is also to effectively claim that this condition is common >>>> and that silent data corruption is therefore rampant -- which should in >>>> turn strengthen our resolve to eliminate it, regardless the cost. For >>>> whatever it's worth, for our use case we believe the optimization afforded >>>> by tracking hole birth is broadly immaterial -- and that disabling this >>>> optimization has similarly little effect on our systems. >>>> >>>> Either way, the system should be correct first -- especially given the >>>> acute failure mode -- and hole birth should be ignored by zfs send until we >>>> know that this work is entirely correct. >>>> >>>> - Bryan >>>> >>>> On Wed, Aug 31, 2016 at 8:58 AM, Paul Dagnelie <[email protected]> wrote: >>>> >>>>> I think that the best approach, from my perspective, is to have an >>>>> off-by-default flag that lets you ignore the effects of hole birth. While >>>>> we're doing that, we should keep trying to fix all of these issues; we've >>>>> made good progress, and I suspect there aren't many issues left. I think >>>>> this approach does at least an ok job of addressing the needs of everyone >>>>> affected: >>>>> 1) Developers can keep developing, and this approach has a fairly low >>>>> implementation cost >>>>> 2) Users new to ZFS will get to use the feature by default, and will >>>>> be unaffected by any previous hole_birth bugs, because they have no data >>>>> from before the fixes >>>>> 3) Users who already have ZFS but didn't have corrupt data will get to >>>>> use the feature by default, and also will be unaffected by earlier bugs >>>>> because their data is not corrupt. >>>>> 4) Users who already have ZFS and do have corrupt data are probably >>>>> aware of the issue; they will hopefully be paying enough attention to >>>>> modify the flag when they upgrade to the new version. They won't be able >>>>> to >>>>> use hole_birth until all their old data falls out of whatever retention >>>>> policies they have set up, or they recreate it. >>>>> >>>>> A flag (undocumented?) to zfs send that forced the use of hole_birth >>>>> might not be a bad idea, because it would let group 4 take advantage of >>>>> the >>>>> feature on new data they create. The only people this approach doesn't >>>>> help are users who have corrupted data, but aren't aware of it; if we >>>>> think >>>>> that's a large population, we might want to take a different approach, >>>>> like >>>>> the "hole_birth_fixed" featureflag. >>>>> >>>>> On Wed, Aug 31, 2016 at 4:02 AM, Rich <[email protected]> wrote: >>>>> >>>>>> Hi all, >>>>>> I wanted to prod this discussion back to life again, given the >>>>>> existence of two more hole_birth flaws in the intervening period, namely >>>>>> Illumos #7176 and ZoL #4996. >>>>>> >>>>>> So, if we'd opted for a feature flag to mark "fixed" before this >>>>>> point, we'd be in a position of needing another one (or a mechanism to >>>>>> push >>>>>> the enabled_txg forward) to indicate that "actually, after THIS POINT, we >>>>>> don't think there's any more known bugs." >>>>>> >>>>>> I dislike the idea of whack-a-mole on revisions that are "safe", or >>>>>> manual intervention to detect that, but I'm not sure there's a nicer >>>>>> solution than either that or defaulting to discarding hole_birth metadata >>>>>> without an explicit flag to zfs send like -e or -L. >>>>>> >>>>>> If anyone has any nicer suggestions, or thoughts on how to better >>>>>> handle this recurring problem, I'd love to have a better answer to this. >>>>>> >>>>>> Thanks, >>>>>> - Rich >>>>>> >>>>>> On Fri, Jul 8, 2016 at 1:31 PM, Boris <[email protected]> >>>>>> wrote: >>>>>> >>>>>>> So, as we found out a short time ago, this is actually fixed in ZoL >>>>>>> as well, but after the 0.6.5.7 >>>>>>> ------------------------------ >>>>>>> *From:* Rich <[email protected]> >>>>>>> *Sent:* Friday, July 8, 2016 12:37:52 PM >>>>>>> *To:* [email protected] >>>>>>> *Cc:* developer; Developer Lists Illumos >>>>>>> >>>>>>> *Subject:* Re: [developer] Improvements to 6513 handling >>>>>>> >>>>>>> Hi Boris, >>>>>>> I now have working code that implements this feature, and defaults >>>>>>> to ignoring hole_birth data for sends if this feature is not enabled; >>>>>>> I'm >>>>>>> going to post patches for it after I've tested it on both ZoL and >>>>>>> illumos. >>>>>>> >>>>>>> The latter portion of the above is easily changed, but "always >>>>>>> correct and marginally less efficient for old data" seemed a better >>>>>>> default >>>>>>> than "usually correct". >>>>>>> >>>>>>> For a filesystem that prides itself on not allowing silent >>>>>>> corruption, requiring manual detection and intervention for correctness >>>>>>> seems unreasonable to me. >>>>>>> >>>>>>> - Rich >>>>>>> >>>>>>> On Fri, Jul 8, 2016 at 12:15 PM, Boris <[email protected]> >>>>>>> wrote: >>>>>>> >>>>>>>> Hi, Rich, >>>>>>>> >>>>>>>> >>>>>>>> I agree that unconditional switch using the tunable is heavy if >>>>>>>> done 'as a matter of standard practice' as opposed to 'for a short >>>>>>>> time, to >>>>>>>> fixup the known corrupted backups'. >>>>>>>> >>>>>>>> >>>>>>>> To clarify the earlier suggestions, people with data affected by >>>>>>>> the bug can do two things: >>>>>>>> >>>>>>>> >>>>>>>> 1) install the code with 6513 fix and the patch with the tunable, >>>>>>>> then temporarily turn off the hole birth optimization, resend the >>>>>>>> 'difference' (a selected subset of incrementals) affected by the >>>>>>>> problem, >>>>>>>> then turn the optimization back on >>>>>>>> >>>>>>>> 2) install the code with 6513 fix without the patch, do a full >>>>>>>> send of the affected snapshots >>>>>>>> >>>>>>>> >>>>>>>> For 2) the non-incremental send would need to happen only once per >>>>>>>> the affected snapshot lineage. Once the missed holes are re-instated >>>>>>>> with >>>>>>>> the full send, the new fixed code will perform proper incremental >>>>>>>> sends. >>>>>>>> >>>>>>>> >>>>>>>> 1) is potentially more optimal in terms of resources (network >>>>>>>> bw, etc.) >>>>>>>> >>>>>>>> 2) is potentially simpler from the operational standpoint, does not >>>>>>>> require building/installing patched code, twiddling the tunables, etc. >>>>>>>> >>>>>>>> >>>>>>>> Boris. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> ------------------------------ >>>>>>>> *From:* Rich <[email protected]> >>>>>>>> *Sent:* Friday, July 8, 2016 11:26:27 AM >>>>>>>> *To:* developer >>>>>>>> *Cc:* Developer Lists Illumos >>>>>>>> *Subject:* Re: [developer] Improvements to 6513 handling >>>>>>>> >>>>>>>> Hi Boris, >>>>>>>> A full send of the affected snapshots should be safe, AIUI - but >>>>>>>> that means people would need to do non-incremental snapshot sends to be >>>>>>>> certain of not hitting this bug, which becomes increasingly infeasible >>>>>>>> as >>>>>>>> your datasets grow. >>>>>>>> >>>>>>>> If we're looking for the simplest solution without risk of data >>>>>>>> corruption, unconditionally ignoring the hole_birth data for doing a >>>>>>>> zfs >>>>>>>> send fits the bill, but seems a bit heavy-handed. >>>>>>>> >>>>>>>> This seemed like the best way to permit people to safely send older >>>>>>>> datasets while also permitting use of the hole_birth data going >>>>>>>> forward. >>>>>>>> >>>>>>>> - Rich >>>>>>>> >>>>>>>> On Fri, Jul 8, 2016 at 11:03 AM, Boris <[email protected]> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Hi, Rich, >>>>>>>>> >>>>>>>>> >>>>>>>>> perhaps there is a simpler solution here. >>>>>>>>> >>>>>>>>> >>>>>>>>> I think for the datasets affected by this feature, a full (not >>>>>>>>> incremental) send of the source snapshot that has some holes that >>>>>>>>> have not >>>>>>>>> been transmitted by the faulty incremental send code, should fix the >>>>>>>>> issue, >>>>>>>>> as far as the on-disk layout is concerned. >>>>>>>>> >>>>>>>>> >>>>>>>>> Boris. >>>>>>>>> >>>>>>>>> ------------------------------ >>>>>>>>> *From:* Rich <[email protected]> >>>>>>>>> *Sent:* Thursday, July 7, 2016 8:30:54 PM >>>>>>>>> *To:* developer; Developer Lists Illumos >>>>>>>>> *Subject:* [developer] Improvements to 6513 handling >>>>>>>>> >>>>>>>>> Hi all, >>>>>>>>> >>>>>>>>> So, ZFS on Linux just noticed it was getting bitten by what >>>>>>>>> ultimately turned out to be Illumos #6513, partially filled holes >>>>>>>>> losing >>>>>>>>> birth time. >>>>>>>>> >>>>>>>>> Implementing that fix removes this problem for new data, but on >>>>>>>>> all platforms, this doesn't help data already written on existing >>>>>>>>> pools, >>>>>>>>> getting munged silently in incremental sends forever. >>>>>>>>> >>>>>>>>> pcd pointed out that a relatively trivial workaround would be >>>>>>>>> possible by simply ignoring the hole_birth metadata with something >>>>>>>>> like a >>>>>>>>> global tunable, but that seems too heavy-handed to me - either you're >>>>>>>>> disabling the feature everywhere because you don't know when you can >>>>>>>>> start >>>>>>>>> trusting the birth times, or you're risking silent mangling of >>>>>>>>> affected >>>>>>>>> files forever. >>>>>>>>> >>>>>>>>> I'd like to suggest using a read-compatible feature, call it >>>>>>>>> something like hole_birth_fix, in conjunction with the enabled_txg >>>>>>>>> feature, >>>>>>>>> to permit a reasonable default of ignoring hole_birth information >>>>>>>>> before >>>>>>>>> the hole_birth_fix feature was enabled, but still permitting use of it >>>>>>>>> afterward. >>>>>>>>> >>>>>>>>> This has the unfortunate behavior of breaking write support if you >>>>>>>>> enable hole_birth_fix and then try to go back to a prior codebase, >>>>>>>>> but I >>>>>>>>> can't think of a reasonable way to avoid this. >>>>>>>>> >>>>>>>>> I filed illumos #7175 to track this proposal - I'll happily write >>>>>>>>> the code to implement this shortly. >>>>>>>>> >>>>>>>>> (Apologies if I've over-CCed or missed someone I should be asking >>>>>>>>> for comment, I've not done this workflow before.) >>>>>>>>> >>>>>>>>> - Rich >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> Paul Dagnelie >>>>> >>>> >>>> >>> >> >> >> -- >> Paul Dagnelie >> > > *illumos-developer* | Archives > <https://www.listbox.com/member/archive/182179/=now> > <https://www.listbox.com/member/archive/rss/182179/25088305-e49d3582> | > Modify > <https://www.listbox.com/member/?&> > Your Subscription <http://www.listbox.com> > -- Paul Dagnelie ------------------------------------------- openzfs-developer Archives: https://www.listbox.com/member/archive/274414/=now RSS Feed: https://www.listbox.com/member/archive/rss/274414/28015062-cce53afa Modify Your Subscription: https://www.listbox.com/member/?member_id=28015062&id_secret=28015062-f966d51c Powered by Listbox: http://www.listbox.com
