Cathy Zhou wrote:
>> I don't understand why dladm would need to call delete_linkid if you're
>> temporarily deleting a link.  I think if you're temporarily deleting a
>> link, you'd want to keep the link ID to name mapping around so that the
>> link ID is not reused.  Even if that wasn't a concern (say if guaranteed
>>   that we would never reuse link IDs even after the mapping was
>> deleted), I still don't see why we couldn't bring the link down without
>> deleting the mapping.
>>
> Well. If this linkid was created for a temporary link only, it should be 
> deleted when that link is destroyed.
> 

Ahh, because if we didn't, we could potentially run out of link IDs.

I see.

>> If knowing the state of the link was important, I would say we should
>> track that using the configuration structures.  We could have a field
>> indicating if a link is active.  When the system reboots, the link
>> becomes active and the field would be changed to true.
>>
> But this configuration structure is only used for persist data, right? 
> and if the link is purely temporary, the configuration structure is not 
> involved at all.
>

You're right, I'm going down the wrong path here.

Let me think about the affects of the flag you suggested.

>>> Therefore, I'd suggest get_new_linkid() and delete_linkid() to have a 
>>> flag to indicate to create or delete linkids for which one (or both, 
>>> active and persistent links).
>>>
>>
>> I could do that, but I think it would be better to track that
>> information elsewhere.
>>
> Where is the elsewhere? How?
> 

No, you're right.  This won't work.

>>>> walk_confs()
>>>>
>>> What exactly information it iterates? The linkids? Then it can be 
>>> achieved by the walkers in the linkid management API.
>>>
>>
>> It walks the configuration data structure for each persistent link.  I 
>> don't think it can be achieved by the walkers in the linkid management 
>> API because at boot time we need some way of loading the persistent 
>> link ID to name mappings before we can use the link ID management API 
>> walker.
>>
>> I.e.
>>
>> in devfsadmd at boot
>>     walk_confs()
>>     for each conf
>>         get_conf_field(conf, "id", &id);
>>         get_conf_field(conf, "name", &name);
>>         add_map(id, name);  /* this function is part of devfsadmd and 
>> not any of the API's discussed in this mail */
>>
> I see.
> 
>>>> Return a configuration struct for each persistent link.  I expect 
>>>> that devfsadmd would use this on boot to determine what link ID to 
>>>> name mappings have been persisted.
>>>>
>>> In theory, as we are separating linkid management and configuration 
>>> persistence APIs, the devfsadmd doesn't need to be informed of all 
>>> the persistent link attributes at all, and the libdladm can simply do 
>>> the persistence work by itself, and not through devfsadmd. But I can 
>>> see two benefit that devfsadmd stores persistent link configuration 
>>> information:
>>>
>>> a. those configuration are looked up from both libdladm and the 
>>> kernel, so have the configuration in memory will helps the performance.
>>>
>>> b. the devfdadmd will need to be used to store and query the 
>>> persistent configuration anyway, as requested from the door-upcall 
>>> from the kernel, so it might be easy if the all persistence/query 
>>> requests to be processed in the same place.
>>>
>>
>> I agree with everything you say here, but, there's one problem.  How do
>> you initialize devfsadmd's internal structures at boot?  That's what
>> this walker is for.
>>
> Yes, you are right. But what I tried to discuss with you here is whether 
> devfdadmd needs to be involved as part of the implementation of 
> configuration persistence API, and it seems you agreed it should.
>

Yes, devfsadmd will need to call into the API so that it can load the 
persistent link ID to name mappings.

>>>> conf = get_new_conf();
>>>> set_conf_field(conf, "class", class);
>>>> set_conf_field(conf, "name", name);
>>>> set_conf_field(conf, "id", id);
>>>> commit_conf(conf);
>>>> free_conf(conf);
>>>>
>>> I think it is better make "id" to be the identifier of a persistent 
>>> link configuration entry, and unique from other conf_field, so that 
>>> when you do the commit_conf(), you know whether it is a new link or 
>>> it is to update an existing link.
>>>
>>
>> I'm not sure that is necessary because the ID is in the conf 
>> structure, and I could extract it internally.
>>
> Right, so that your internal processes is different for "key fields" 
> even users use the same API to set them. I don't see the benefit.
> 

After spending some time going over meem's comments, I decided to 
include the key fields on the create call, and then make all of them, 
except for the name field, read-only.

>>>>  If the API user only does the delete_linkid, then the link ID to 
>>>> name mapping is removed, but it still exists in persistent storage.  
>>>> For example:
>>>>
>>>> delete_linkid("net6");
>>>> id = get_new_linkid("net10", class);  /* Could return net6's link 
>>>> ID! */
>>>>
>>>> If the user persisted this new link ID, we'd have a link ID 
>>>> collision on the next reboot.
>>>>
>>>> This also implies that there is no way to safely and temporarily 
>>>> delete the link ID to name mapping for a persistent link.  Since 
>>>> this is an API, I think we could document this limitation.
>>>>
>>> I don't quite understand why.
>>>
>>
>> If a link always has the same ID, even across reboots, then we will 
>> have a collision in this case.  At the next reboot, net6 is restored 
>> (because it was persistent and was never removed form persistent 
>> storage) and net10 comes up (because it was persisted) and both have 
>> the same link ID.
>>
> I would think that When "net10" was persisted, the commit_conf(conf) 
> function should return failures.
>

Take a look at my response to meem.  I spent some time with pen and 
paper going over different scenarios, I couldn't see a way to tell the 
difference between this case and the rename case.

thanks,
Dan


Reply via email to