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 > mdsal-...@lists.opendaylight.org > https://lists.opendaylight.org/mailman/listinfo/mdsal-dev >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ controller-dev mailing list controller-dev@lists.opendaylight.org https://lists.opendaylight.org/mailman/listinfo/controller-dev