On 14/04/17 23:34, Srikanth Vavilapalli wrote: > Hi > > > > I am noticing intermittently a race condition behavior where DCN > listener is getting notified about a change in the yang data even before > the data is fully written to and available in the data store. > > > > Let me explain the scenario: > > > > 1. This scenario involves three components: neutron-vpn, > netvirt-Interface-dcn-listener, netvirt-elan-manager > > 2. When a Neutron port is updated: > > a. _Step1_: The neutron-vpn component *updates genius Interface > yang model* using WriteTransaction.put() > > b. _Step2_: The netvirt-Interface-dcn-listener, which listens to > DCN of genius Interface yang models, *gets notified of the change in the > Interface model*. On receiving this notification, > netvirt-interface-dcn-listener invokes a method in netvirt-elan-manager.
It is this a bit hard to reason about this without having actual code
pointers. What are the classes involved?
I cannot find ElanInterfaceConfigVppListener anywhere in the code base.
Also, is a single-node scenario?
>
> c. _Step3_: On invocation of the handler method, the
> netvirt-elan-manager *will read the Interface model data from data
> store* using ReadOnlyTransaction.read() to proceed with its logic
Since the trigger is coming from a change notification, wouldn't it be
better to just pass the subtree to elan manager?
Regards,
Robert
>
> 3. The observation is, intermittently, in step3, when
> netvirt-elan-manager reads from the config data store, it is receiving
> the data prior to the Step1 (i.e. old data) instead of updated data.
>
> 4. I collected some logs at step2 and step3 to suspect this race
> condition behavior:
>
> a. Step2:
>
> i.
> 2017-04-12 23:37:31,697 | TRACE | eChangeHandler-0 |
> ElanInterfaceConfigVppListener | 407 -
> org.opendaylight.netvirt.elanmanager-impl - 0.4.0.SNAPSHOT | *Operation
> Interface update event* - *Old*:
> Interface{getName=fa4b736a-a35a-4dc9-8e36-2f6f6d057a2d, getType=class
> org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan,
> isEnabled=true, augmentations={interface
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan=IfL2vlan{getL2vlanMode=Trunk},
> interface
> org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.InterfaceAcl=InterfaceAcl{getAllowedAddressPairs=[AllowedAddressPairs{getIpAddress=IpPrefixOrAddress
> [_ipAddress=IpAddress [_ipv6Address=Ipv6Address
> [_value=fe80:0:0:0:f816:3eff:fed9:9ab4]]], getMacAddress=MacAddress
> [_value=fa:16:3e:d9:9a:b4], augmentations={}},
> AllowedAddressPairs{getIpAddress=IpPrefixOrAddress [_ipAddress=IpAddress
> [_ipv4Address=Ipv4Address [_value=1.0.0.9]]], getMacAddress=MacAddress
> [_value=fa:16:3e:d9:9a:b4], augmentations={}}], getSecurityGroups=[Uuid
> [_value=7a33bbaa-a251-4c77-bc5b-de7c2e621e72]],
> isPortSecurityEnabled=true}, interface
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs=ParentRefs{getDeviceOwner=class
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.InterfaceDeviceTypeCompute,
> getNodeIdentifier=[NodeIdentifier{getNodeId=overcloud-controller-0.opnfvlf.org,
> getTopologyId=topology-netconf, augmentations={}}], getVifType=class
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.*InterfaceVifTypeUnbound*,
> getVnicType=class
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.InterfaceVnicTypeNormal}}},
> *New*: Interface{getName=fa4b736a-a35a-4dc9-8e36-2f6f6d057a2d,
> getType=class
> org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan,
> isEnabled=true, augmentations={interface
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan=IfL2vlan{getL2vlanMode=Trunk},
> interface
> org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.aclservice.rev160608.InterfaceAcl=InterfaceAcl{getAllowedAddressPairs=[AllowedAddressPairs{getIpAddress=IpPrefixOrAddress
> [_ipAddress=IpAddress [_ipv6Address=Ipv6Address
> [_value=fe80:0:0:0:f816:3eff:fed9:9ab4]]], getMacAddress=MacAddress
> [_value=fa:16:3e:d9:9a:b4], augmentations={}},
> AllowedAddressPairs{getIpAddress=IpPrefixOrAddress [_ipAddress=IpAddress
> [_ipv4Address=Ipv4Address [_value=1.0.0.9]]], getMacAddress=MacAddress
> [_value=fa:16:3e:d9:9a:b4], augmentations={}}], getSecurityGroups=[Uuid
> [_value=7a33bbaa-a251-4c77-bc5b-de7c2e621e72]],
> isPortSecurityEnabled=true}, interface
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs=ParentRefs{getDeviceOwner=class
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.InterfaceDeviceTypeCompute,
> getNodeIdentifier=[NodeIdentifier{getNodeId=overcloud-controller-0.opnfvlf.org,
> getTopologyId=topology-netconf, augmentations={}}],
> getVifDetails=[VifDetails{getVifDetailsKey=port_prefix,
> getVifDetailsValue=socket_, augmentations={}},
> VifDetails{getVifDetailsKey=vhostuser_mode, getVifDetailsValue=server,
> augmentations={}}, VifDetails{getVifDetailsKey=support_vhost_user,
> getVifDetailsValue=True, augmentations={}},
> VifDetails{getVifDetailsKey=has_datapath_type_netdev,
> getVifDetailsValue=False, augmentations={}},
> VifDetails{getVifDetailsKey=vhostuser_socket_dir,
> getVifDetailsValue=/tmp/, augmentations={}},
> VifDetails{getVifDetailsKey=vhostuser_socket,
> getVifDetailsValue=/tmp/socket_fa4b736a-a35a-, augmentations={}}],
> getVifType=class
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.*InterfaceVifTypeVhostuser*,
> getVnicType=class
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.InterfaceVnicTypeNormal}}}
>
> b. Step3:
>
> i.
> 2017-04-12 23:37:31,697 | TRACE | eChangeHandler-0 |
> ElanInterfaceVppRenderer | 407 -
> org.opendaylight.netvirt.elanmanager-impl - 0.4.0.SNAPSHOT |
> isVPPInterface: vifType class
> org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.*InterfaceVifTypeUnbound*
> is not vhostuser
>
> 5. In step3, I am getting the value of
> intf.getAugmentation(ParentRefs.class). getVifType() and comparing
> against InterfaceVifTypeVhostuser.class. If you notice the log, the
> getVifType() returns the old value (*InterfaceVifTypeUnbound*) instead
> of the value of updated content (*InterfaceVifTypeVhostuser*).
>
>
>
>
>
> Could anyone plz explain me if this is right way of using the MD-SAL DCN
> notifications or a way to get around this intermittent error? Thanks for
> your help.
>
>
>
> Thanks
>
> Srikanth
>
>
>
>
>
>
>
> _______________________________________________
> mdsal-dev mailing list
> [email protected]
> https://lists.opendaylight.org/mailman/listinfo/mdsal-dev
>
signature.asc
Description: OpenPGP digital signature
_______________________________________________ controller-dev mailing list [email protected] https://lists.opendaylight.org/mailman/listinfo/controller-dev
