Hi Matt, I want to delay the assignment of blocks to the dnode.
So whenever I need a block I will call metaslab_alloc which is internal part of zio pipeline. This metaslab_alloc will return me the blkptr with blk_birth as say 123. I will issue the Zio to write data to the disk with this blkptr. Now After some time I want to assign this block to some particular dnode. So I will just update the level 1 indirect block of the dnode with the blkptr we created earlier. So the assignment will have different txg say 456, So when i update the blkptr with indirect block I need to update the logical birth time of block i.e. blk_birth with 456 So that DSL and DMU will consider the block as if it was created in txg=456. But the blk_phys_birth will remain to 123 which is the actual birth time of the block. Now in this case I dont have dedupe enabled. I just wanted to confirm that if I have dedupe disabled and a block with different blk_birth and blk_phys_birth then will this work?. Or it will cause any problem.? Thanks, Gaurav. On Tue, Oct 15, 2013 at 11:36 AM, Matthew Ahrens <mahr...@delphix.com>wrote: > > > > On Mon, Oct 14, 2013 at 10:53 PM, Gaurav Mahajan <gaurav...@gmail.com>wrote: > >> Hi Matt, >> >> Thanks for the reply. >> So can it happen like block gets physically allocate in one txg (say >> txg=123) using metaslab_alloc() >> So the blkptr will have only blk_birth=123 and bkp_phys_birth=0. >> > > >> Later on this block gets assigned to a Dnode (lets say ion txg 456) >> > > What do you mean by that? If it was written as part of that dnode then it > would be "assigned" in the same txg, 123. Or do you mean the same data is > later written to a different file and you have dedup enabled? > > >> then we can modify the blkptr as blk_birth=456 and blk_phys_birth=123. >> > > blkptrs are not modified once they are on disk. > > >> >> Would this work? this would work only in case we have dedupe enabled. >> > > If you had dedup enabled, and you write data that is identical to a block > that already exists, it will have blk_phys_birth = whenever it was first > written, some time in the past; and blk_birth = now, when the new reference > is created to the existing physical block. > > --matt > > >> >> Thanks, >> Gaurav >> >> >> On Tue, Oct 15, 2013 at 10:59 AM, Matthew Ahrens <mahr...@delphix.com>wrote: >> >>> On Wed, Oct 9, 2013 at 3:35 AM, Gaurav Mahajan <gaurav...@gmail.com>wrote: >>> >>>> Hi, >>>> >>>> I am new to ZFS and trying to understand the code and workflow. >>>> >>>> In blkptr structure there are blk_phys_birth and blk_birth are nothing >>>> but the txgs. >>>> >>>> What is the difference between them? >>>> How DDT uses these two fields? >>>> >>>> typedef struct blkptr { >>>> .... >>>> uint64_t blk_phys_birth; /* txg when block was allocated */ >>>> uint64_t blk_birth; /* transaction group at birth */ >>>> ..... >>>> } blkptr_t; >>>> >>>> >>> blk_birth_phys is when the block was allocated. >>> blk_birth is when this particular reference was created. >>> >>> If the block is dedup'ed, blk_birth_phys can be before blk_birth. (The >>> block was allocated at time A, then another reference was added to that >>> block at a later time B.) >>> >>> If they are the same (e.g. as is the case for all non-dedup'ed blocks), >>> we only store blk_birth. (I believe this is for backwards compatibility >>> with software that doesn't understand dedup (pool version 21)). >>> >>> blk_birth_phys is used by the SPA, for example when resilvering devices >>> that were temporarily offline. >>> >>> blk_birth is used by the DMU and DSL, for example to determine when to >>> free a block, or what blocks should be part of a zfs send stream. >>> >>> --matt >>> >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to zfs-devel+unsubscr...@zfsonlinux.org. >>> >> >> To unsubscribe from this group and stop receiving emails from it, send >> an email to zfs-devel+unsubscr...@zfsonlinux.org. >> > > To unsubscribe from this group and stop receiving emails from it, send an > email to zfs-devel+unsubscr...@zfsonlinux.org. >
_______________________________________________ developer mailing list developer@open-zfs.org http://lists.open-zfs.org/mailman/listinfo/developer