in meta/Meta.cpp [7023:7183]
void Meta::populate(
_In_ const swss::TableDump& dump)
{
SWSS_LOG_ENTER();
SWSS_LOG_TIMER("table dump populate");
// table dump contains only 1 switch the one that user wanted to connect
// using init=false
for (const auto &key: dump)
{
sai_object_meta_key_t mk;
sai_deserialize_object_meta_key(key.first, mk);
std::unordered_map<std::string, std::string> hash;
for (const auto &field: key.second)
{
hash[field.first] = field.second;
}
SaiAttributeList alist(mk.objecttype, hash, false);
auto attr_count = alist.get_attr_count();
auto attr_list = alist.get_attr_list();
// make references and objects from object id
if (!m_saiObjectCollection.objectExists(mk))
m_saiObjectCollection.createObject(mk);
auto info = sai_metadata_get_object_type_info(mk.objecttype);
if (info->isnonobjectid)
{
/*
* Increase object reference count for all object ids in non object id
* members.
*/
for (size_t j = 0; j < info->structmemberscount; ++j)
{
const sai_struct_member_info_t *m = info->structmembers[j];
if (m->membervaluetype != SAI_ATTR_VALUE_TYPE_OBJECT_ID)
{
continue;
}
if (!m_oids.objectReferenceExists(m->getoid(&mk)))
m_oids.objectReferenceInsert(m->getoid(&mk));
m_oids.objectReferenceIncrement(m->getoid(&mk));
}
}
else
{
if (!m_oids.objectReferenceExists(mk.objectkey.key.object_id))
m_oids.objectReferenceInsert(mk.objectkey.key.object_id);
}
bool haskeys = false;
for (uint32_t idx = 0; idx < attr_count; ++idx)
{
const sai_attribute_t* attr = &attr_list[idx];
auto mdp = sai_metadata_get_attr_metadata(mk.objecttype, attr->id);
const sai_attribute_value_t& value = attr->value;
const sai_attr_metadata_t& md = *mdp;
if (SAI_HAS_FLAG_KEY(md.flags))
{
haskeys = true;
META_LOG_DEBUG(md, "attr is key");
}
// increase reference on object id types
uint32_t count = 0;
const sai_object_id_t *list;
switch (md.attrvaluetype)
{
case SAI_ATTR_VALUE_TYPE_OBJECT_ID:
count = 1;
list = &value.oid;
break;
case SAI_ATTR_VALUE_TYPE_OBJECT_LIST:
count = value.objlist.count;
list = value.objlist.list;
break;
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_ID:
if (value.aclfield.enable)
{
count = 1;
list = &value.aclfield.data.oid;
}
break;
case SAI_ATTR_VALUE_TYPE_ACL_FIELD_DATA_OBJECT_LIST:
if (value.aclfield.enable)
{
count = value.aclfield.data.objlist.count;
list = value.aclfield.data.objlist.list;
}
break;
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_ID:
if (value.aclaction.enable)
{
count = 1;
list = &value.aclaction.parameter.oid;
}
break;
case SAI_ATTR_VALUE_TYPE_ACL_ACTION_DATA_OBJECT_LIST:
if (value.aclaction.enable)
{
count = value.aclaction.parameter.objlist.count;
list = value.aclaction.parameter.objlist.list;
}
break;
default:
if (md.isoidattribute)
{
META_LOG_THROW(md, "missing process of oid attribute, FIXME");
}
break;
}
for (uint32_t index = 0; index < count; index++)
{
if (!m_oids.objectReferenceExists(list[index]))
m_oids.objectReferenceInsert(list[index]);
m_oids.objectReferenceIncrement(list[index]);
}
m_saiObjectCollection.setObjectAttr(mk, md, attr);
}
if (haskeys)
{
auto mKey = sai_serialize_object_meta_key(mk);
auto switchId = switchIdQuery(mk.objectkey.key.object_id);
auto attrKey = AttrKeyMap::constructKey(switchId, mk, attr_count, attr_list);
m_attrKeys.insert(mKey, attrKey);
}
}
}