On Thu, Mar 15, 2018 at 9:48 PM, Mike Gerdts <[email protected]> wrote:
> On Thu, Mar 15, 2018 at 9:10 PM, Richard Elling < > [email protected]> wrote: > >> >> >> On Mar 15, 2018, at 1:30 PM, Mike Gerdts <[email protected]> wrote: >> >> On Thu, Mar 15, 2018 at 3:00 PM, Matthew Ahrens <[email protected]> >> wrote: >> >>> Yes, I agree and that all sounds great (including "zfs set >>> refreservation=auto" to get back to the originally-computed >>> refreservation). A shame that we didn't catch this when implementing "zfs >>> clone" back in the day. >>> >>> I assume that refreservation will continue to be a non-inheritable >>> property, and that "refreservation=auto" is just a shortcut for >>> "refreservation=123GB" (or whatever the right number is). So if you set it >>> to "auto", "zfs get" will show "123GB". And changing the volsize will do >>> whatever it does today. >>> >> >> Pretty much, but currently you can't set refreservation to a value >> greater than volsize. The largest explicit value that is allowed is still >> volsize. >> >> >> That is a simple bug to fix and I thought we already had a fix, but >> perhaps only in ZoL? In any case, >> the fix needs to be in openzfs. IMHO, we really don't need to check the >> requested refreservation >> against volsize at all. >> > > I had started down that route, then convinced myself that it may be there > for good reason. Can you explain how a refreservation greater than the > size calculated by zvol_volsize_to_reservation() is useful? I couldn't > come up with a way (aside from a potential bug in that copies is not always > accounted for). > > Overwriting a zvol, taking a snapshot, then overwriting it again doesn't > seem to reduce usedbyrefreservation. > > # zfs create -V 100m zones/t/100m > # dd if=/dev/zero of=/dev/zvol/rdsk/zones/t/100m bs=1024k > write: I/O error > 101+0 records in > 101+0 records out > 104857600 bytes transferred in 0.280976 secs (373191031 bytes/sec) > > # zfs get -p space,refreservation,volsize zones/t/100m > NAME PROPERTY VALUE SOURCE > zones/t/100m name zones/t/100m - > zones/t/100m available 270941458432 - > zones/t/100m used 110362624 - > zones/t/100m usedbysnapshots 0 - > zones/t/100m usedbydataset 105127936 - > zones/t/100m usedbyrefreservation 5234688 - > zones/t/100m usedbychildren 0 - > zones/t/100m refreservation 110362624 local > zones/t/100m volsize 104857600 local > > # zfs snapshot zones/t/100m@1 > # dd if=/dev/zero of=/dev/zvol/rdsk/zones/t/100m bs=1024k > write: I/O error > 101+0 records in > 101+0 records out > 104857600 bytes transferred in 0.421021 secs (249055635 bytes/sec) > > # zfs get -p space,refreservation,volsize zones/t/100m > NAME PROPERTY VALUE SOURCE > zones/t/100m name zones/t/100m - > zones/t/100m available 270835998720 - > zones/t/100m used 215490560 - > zones/t/100m usedbysnapshots 105127936 - > zones/t/100m usedbydataset 105127936 - > zones/t/100m usedbyrefreservation 5234688 - > zones/t/100m usedbychildren 0 - > zones/t/100m refreservation 110362624 local > zones/t/100m volsize 104857600 local > > > Frankly, I have some concerns about these numbers from before the snapshot > (same output as first set above, just trimmed) > > # zfs get -p space,refreservation,volsize zones/t/100m > NAME PROPERTY VALUE SOURCE > zones/t/100m used 110362624 - > zones/t/100m usedbydataset 105127936 - > zones/t/100m usedbyrefreservation 5234688 - > zones/t/100m refreservation 110362624 local > zones/t/100m volsize 104857600 local > > In that output, used and refreservation are equal, but usebyreferservation > is 5112 KiB. I would have expected that all of the 5376 KiB of metadata > (used - volsize) would have been counted against the refreservation, > bringing usedbyrefreservation to 0. > > That output looks right to me. The "used - volsize" is not all metadata, it also includes the unconsumed refreservation (which is the usedbyrefreservation property). The "metadata overhead" calculation used to set the refreservation is a conservative estimate, so normally it you wouldn't go over the refreservation. The metadata is usedbydataset - volsize == 270,336 bytes. usedbydataset is less than refreservation, so used == refreservation. usedbyrefreservation == refreservation - usedbydataset. used == usedbydataset + usedbyrefreservation --matt ------------------------------------------ openzfs: openzfs-developer Permalink: https://openzfs.topicbox.com/groups/developer/discussions/Te3d593ba00521b6d-Mc5e61826b1b53d17cd273530 Delivery options: https://openzfs.topicbox.com/groups
