Matthew Ahrens wrote:
> Mark Shellenbaum wrote:
>> Girish Shilamkar wrote:
>>> Hi,
>>>     With reference to my previous mail ([zfs-code] Nvpair for storing EAs
>>> in dnode) which had expressed our intent to use libnvpair for EAs in
>>> dnode. I am now sending a high level design document for the same.
>>>
>>> Any suggestions/comments are most welcome.
>>>
>>> Thanks & Regards,
>>> Girish
>> General comment:
>>
>> I'm not sure we should be using nvlists to store these attributes. 
>> While it will be quick to implement, I'm concerned about the constant 
>> packing/unpacking and searching linked lists in the nvlist code.
> 
> Agreed.  Here is one proposal for how this could be done efficiently and 
> scalably (both in space and runtime):
> 
> First, note that the problem is quite constrained:
> 
> There are a fixed number of attribute names (for any given software version) 
> since these are interpreted system attributes. Therefore the attribute names 
> can be a small number, rather than a string -- ie, we have an enum that 
> defines the attributes.  We (ie, OpenSolaris) can control the allocation of 
> new enum values in this namespace.
> 
> Many attributes will always have a fixed size (eg, scanstamp, finder info)
> 
> Removing attributes or changing their sizes will be extremely rare, so we can 
> make this code path slow.  For example, it would not be prohibitive to repack 
> & rewrite all attrs.
> 
> Here is an idea for an on-disk format which takes advantage of these 
> constraints to achieve good performance:
> 
> (sa == System Attribute)
> 
> enum sa_type {
>       ST_ATIME,
>          ST_ACL,
>          ST_FINDERINFO,
>          ST_SCANSTAMP,
>          ST_LUSTRE_LAYOUT,
>          ...
>       ST_NUMTYPES
> };
> 
> const struct sa_info {
>       uint8_t sai_intlen;
> } sainfo = {
>       8, 2, 8, 8, 1, ...
> };    
> 
> on disk:
> header:
> struct sa_phys {
>          uint16_t sa_numattrs;
>          struct {
>                  uint16_t sa_type;     /* enum sssa_type */
>                  uint16_t sa_length;   /* in sainfo[sa_type] chunks */
>          } sssa_attr[];
> };
> 

I like this approach much better. I was thinking about some sort of 
indexed table with attributes having a number to identify them rather 
than a name.    This will also allow us to kick out a number of the ZPLs 
attributes into sa space, and then we can choose which additional 
attributes need to be exposed with the Solaris sysattr framework.

   -Mark



Reply via email to