[NETVIRT-614] Unnecessary usage of java lock in BgpConfigurationManager which leads to thread blocking indefinitely Created: 10/Apr/17  Updated: 06/Apr/18  Resolved: 06/Apr/18

Status: Resolved
Project: netvirt
Component/s: General
Affects Version/s: Carbon
Fix Version/s: None

Type: Bug Priority: Medium
Reporter: Periyasamy Palanisamy Assignee: Vyshakh Krishnan
Resolution: Cannot Reproduce Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Operating System: All
Platform: All


External issue ID: 8195

 Description   

Right now BgpConfigurationManager uses its intrinsic lock in lot of its methods unnecessarily which can potentially lead to thread blocking (or) even thread deadlock since it has other inner DCN listener classes which add/update/update methods are also synchronized.

For more details look at https://bugs.opendaylight.org/show_bug.cgi?id=8142
For logs: https://drive.google.com/open?id=0B_Rr7XjF0yoHc2EwT1psVGQwRVE



 Comments   
Comment by Manu B [ 13/Apr/17 ]

In another issue, we are seeing that many threads are blocked due to the lock at the below location

"AsyncDataTreeChangeListenerBase-DataTreeChangeHandler-0" #561 daemon prio=5 os_prio=0 tid=0x00007ff240012800 nid=0x2b9a runnable [0x00007ff15adb7000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)

  • locked <0x00000006ccacc490> (a java.io.BufferedInputStream)
    at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:127)
    at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)
    at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:362)
    at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:284)
    at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:191)
    at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:69)
    at org.opendaylight.netvirt.bgpmanager.thrift.gen.BgpConfigurator$Client.recv_addVrf(BgpConfigurator.java:296)
    at org.opendaylight.netvirt.bgpmanager.thrift.gen.BgpConfigurator$Client.addVrf(BgpConfigurator.java:280)
    at org.opendaylight.netvirt.bgpmanager.thrift.client.BgpRouter.dispatch(BgpRouter.java:199)
    at org.opendaylight.netvirt.bgpmanager.thrift.client.BgpRouter.addVrf(BgpRouter.java:317)
  • locked <0x00000006cca0c458> (a org.opendaylight.netvirt.bgpmanager.thrift.client.BgpRouter)
    at org.opendaylight.netvirt.bgpmanager.BgpConfigurationManager$VrfsReactor.add(BgpConfigurationManager.java:1177)
  • locked <0x00000006ca6e6318> (a org.opendaylight.netvirt.bgpmanager.BgpConfigurationManager)
  • locked <0x00000006cbe4b560> (a org.opendaylight.netvirt.bgpmanager.BgpConfigurationManager$VrfsReactor)
    at org.opendaylight.netvirt.bgpmanager.BgpConfigurationManager$VrfsReactor.add(BgpConfigurationManager.java:1152)
    at org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase$DataTreeChangeHandler.run(AsyncDataTreeChangeListenerBase.java:155)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Generated at Wed Feb 07 20:22:01 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.