Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pull latest content #12

Closed
wants to merge 100 commits into from
Closed

pull latest content #12

wants to merge 100 commits into from

Conversation

msandhu2014
Copy link
Contributor

No description provided.

msandhu2014 and others added 30 commits March 6, 2019 16:28
Added parent container span::Universe
set ownership in own.mdl
Added code to generate policy file with span artifacts

Change-Id: I29b02a3c8a2d1f3b9bef8a36510f54eed6330156
Signed-off-by: tarbash <waris12@yahoo.com>
Avoid multiple includes of header

Change-Id: Ia1df393b5317e8d61de72aa49e386fe9a510293a
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
- Earlier commit 7a54783
  added match on SIP before mapping EPGS in source table.
  These matches were added for any endpoint in promiscuous
  mode. This breaks DHCP since the responses come with
  a secondary ip of the DHCP interface that is not present
  in the EP file.

- This fix limits the previous fix to only NAT endpoints.
  We add a new mode "nat-mode" that when true identifies
  and endpoint as a NAT endpoint.

- For backward compatibility we also use the vm-name
  starting with prefix "snat|" to identify a NAT endpoint.
  (so that ep files do not need to be regenerated for
   existing deploymenyts)

- neutron opflex agent changes to support nat-mode
  will be done via a separate commit.

Change-Id: I7bc0ed30d2554e6c0998f221f388efbd8bd986e3
Signed-off-by: Madhu Challa <challa@gmail.com>
- Forgot to initialize the new natMode boolean.

Change-Id: I254d8f180deef5d4e8be3ecc3162d7ea1d0eb52d
Signed-off-by: Madhu Challa <challa@gmail.com>
1. add a session container for all span artifacts
2. add a reference to span/session instances from EPG

Assumption: opflex proxy will add a reference to EPG pointing to
the relevant span/sessions.
When End points are declared, any references to EPGs will be resolved
and any references from the EPG to other artifacts will be resolved.
On removal of an end point, the EPG is updated by opflex proxy to add/remove
span/session references.
Added span manager to manage span artifacts and logic.
Updated Policies.cpp to generate span artifacts for mock server
and verified that span artifacts are indeed created and resolved by the agent.

Change-Id: I42d18fb49ee3e18c6b19f123ef79ce3a5c11c474
Signed-off-by: tarbash <waris12@yahoo.com>
Change-Id: I49b8b2f579e9967cebfe53bb92e39168557ea124
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Change-Id: I599da671764a7df93d4770e2d0451a3fef75995d
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Issue appeared if you defined a relation to a class that
could be contained by multiple possible parents

Do some minor cleanup of dead code and unused params.

Change-Id: Ib3e14d92666535e4e08dfe4223e6ce30fec6e834
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
- Hence traffic between 2 different EPGs when
  they are on different compute nodes gets
  dropped at the receiving node.

- This check should not match local traffic.
  We ensure this by matching on POLICY_APPLIED

Change-Id: Id6cea9478665392aa1681abbbd4dd3b41a013a96
Signed-off-by: Madhu Challa <challa@gmail.com>
- Currently we use the EP multicast address for grat arp
  We should be using the mapped EPG multicast address.

Change-Id: I1c0c4424e26cf9c3c22ae35f739938f38df84e0b
Signed-off-by: Madhu Challa <challa@gmail.com>
Added relationship between source group and filter group.
Enhanced Policies.cpp to generate filter entry in span.

Changed debug  level in peer.cpp to 7.

Change-Id: Icc32d9e79c09316234e6c2b284697c221fabc047
Signed-off-by: tarbash <waris12@yahoo.com>
Change-Id: I2fe38edecf899d38b5f06400eaf90f2a5e0f333f
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Orchestrator needs to manage external node and path
ExtEp File is required for every external endpoint
Static Route is supported
Local Route repository is a makeshift RIB that holds all
known local routes for a given prefix including policy
prefixes.
Endpoint manager API for getting adjacency of an external EP.
Removed Bgp support and dynamic routes for now
Remote route repository should be on the opflex proxy
Sample json for mock server updated with PBR and sclass
Separate test file for PolicyManager IvLeaf cases

Change-Id: I723ac76d780c01fd172bbb5fad2dcdc5e52e26ad
Signed-off-by: Kiran Shastri <shastrinator@gmail.com>
Change-Id: I93187a9b95e1783a6216abf3befb03dac865dd3e
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Change-Id: I3d57796e289a085ac0d4aba04ffeb2221678a972
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Local route delete should delete routes without exact matching prefix owners
Local route update should handle idempotent case
Added test case for remote route add, mod and delete

Change-Id: Ied5441bbff099fd8eaade3973522659aa9a0e46a
Signed-off-by: Kiran Shastri <shastrinator@gmail.com>
Change-Id: I773da4669939e500133592568f8a680f561da026
Signed-off-by: Deniz Ersoz <dersoz@cisco.com>
Policy prefix add/update is handled as a routing domain update
Policy delete is handled as a external network delete since
we don't get an update on the routing domain

Change-Id: I03c854d1bd703df47d13f68f7c146e2cc1b54564
Signed-off-by: Kiran Shastri <shastrinator@gmail.com>
1. Arp responder so Remote EPs can talk across nodes
   without involvement of leaf.

2. Add a special interface veth-host-ac for host to
   reach pods without involvement of leaf.

Change-Id: I947337973f0a7efeccf9f59cebc7b873c2a3fd37
Signed-off-by: Madhu Challa <challa@gmail.com>
- /usr/local/etc/opflex-server is used as the policy file repo.

Change-Id: I9acb1ef8cf40c8f55cf3660d0c3b61956fcd0dbb
Signed-off-by: Madhu Challa <challa@gmail.com>

Restart mock server on policy change.

- Delete hardcoded POLICY_DIR and derive using policy file.
- Convert all tabs to spaces.

Change-Id: Ibb65967d22c78286033e777412d35e08b6d6a2e5
Signed-off-by: Madhu Challa <challa@gmail.com>
Use the new field to get proxy addresses
instead of overloading location field

Change-Id: Iff4de7ef7559435f61da59d1b368207b14f74ac5
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Change-Id: Ib47182afb1daf259fbfa01ee7bd3d1b989f78dc4
Signed-off-by: Ravi Ayyagari <ravayyag@cisco.com>
Change-Id: I35c92b835e7ede263f056a2d998ec58b8f2e2fd2
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Change-Id: Ia838214c5f28cc0622b7284a618f6c733e975a04
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Removed contained relationship between Member and Grp.
This was causing both DstMember and SrcMember elements to show
up in SrcGrp and DstGrp.

Change-Id: Ic11dadf7787b36a8aef79c7dec362b44a303ef85
Signed-off-by: Mandeep S Sandhu <waris12@yahoo.com>
Change-Id: Ic80e4c59007a904878a01f2068e9820399574f3b
Signed-off-by: Ravi Ayyagari <ravayyag@cisco.com>
This can be used to get the parent of an MO.

Changed method to return URI. The std::out_of_range exception is handled in the implementation.
Used the method on preocessor to get StoreClient reference.

removed tabs. removed namespace qualifiers.

Change-Id: I9255f99e7858f59d6d48f09bd684ec07fdb4edb7
Signed-off-by: Mandeep S Sandhu <waris12@yahoo.com>
Framework instances must be explicitly passed.
Allowing it to be optional has been the source
of confusion and bugs

Change-Id: Ic6c44092862fb2049f53f2c088b35e595cfb7575
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
There is already a Direction enum in gbp.

Change-Id: I875a55423959f42e7be66902fc9d54859fc8f09c
Signed-off-by: Mandeep S Sandhu <waris12@yahoo.com>
Change-Id: Iba251e0450ee4e4fca312ec5b4d4b84102f9ccd7
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
msandhu2014 and others added 17 commits October 3, 2019 12:11
This makes sure all communication is within the context of the uv_loop.
Cleanup of debug messages.
Refactored RpcConnection class to implement handleTransaction method.

Change-Id: I04430b5101a67d55e57562dbfb7a50bf58911f76
Signed-off-by: Mandeep S Sandhu <waris12@yahoo.com>
Change-Id: I33e13b0ad1a90c45060fe1e9942fae35a2f8b561
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Change-Id: If1ead2e170d7617601343472c8a4a4bcab61cb61
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Minor code cleanups

Change-Id: If1154202ec827021b812ecf683ff8ee93b16b9ae
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Log all dropped packets or dropped packets based on a flow
Turn drop-logging on/off dynamically.
Dropped packets are encapsulated with geneve and sent to the
configured drop-log port.
Explicit drops are handled in a separate table at the end
Log-action will be updated in a subsequent update.

Signed-off-by: Kiran Shastri <shastrinator@gmail.com>
Change-Id: I6f64ac4c30baa4918d975542405b2ec842bf8bd4
Change-Id: I244c7d9babaf1afcdab8eef18fea930934692b76
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
- mock_server implements a GRPC client that uses server-side
  streaming RPC method ListObjects, where it sends a request
  to gbpserver and in response gets a GBPOperation message
- This message contains a vector of GBPObjects
- These are converted into RapidJson document that is passed
  to opflex engine to update policy in the mo db.
- The update via deserialize() would trigger notifications to
  opflex agents.
- GbpClient class starts a thread that is responsible for
  restarting the GRPC client should the server restart.
- GbpClientImpl class starts the GRPC client thread that
  blocks waiting on a message on the channel or until the
  GRPC connection disconnects.
- The GRPC feature is enabled ONLY when passing --enable-feature
  to configure when building agent-ovs
- gbp.proto contains the protobuf defintion and the make process
  takes care of generating corresponding grpc and pb headers and
  .cc files.
- In terms of functionality I verified the basics but have not
  tested all the scenarios.
- There is more testing to be done on deserialize and the notifications
  generated to the agent.
- This commit mostly handles the GRPC framework and basic functionality
  to push changes from gbpserver to mock_server without needing a
  restart.
- It should not affect existing opflex builds (default off for GRPC)

Signed-off-by: Madhu Challa <challa@gmail.com>
Change-Id: I65bc291427262aa4ea32a3e4e357b1aab32531d3
Added logic to only update OVSDB span artifacts when
there is a change in modb.
Added hooks for configuring OVSDB IP, port and bridge for
span.

Change-Id: I808fab02a9049061fa59fdd42eb6a11116c3df17
Signed-off-by: Mandeep S Sandhu <waris12@yahoo.com>
Change-Id: I1193be21c3b0f0cc825768af47536929de090103
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Change-Id: Ie164a8eb02cfe7c8a79d2b5f2c8f848d869affc0

Signed-off-by: Gautam Venkataramanan <gautam.chennai@gmail.com>
Change-Id: I703f2b78a9743dfe7bb533d5f822b2f518e757b9
- This is part 2 of the grpc work. commit 71766d759f
  added grpc support for mock_server.
- per agent (OpflexServerConnection instance) we maintain
  uri_map, and vectors of replace, merge, and deleted reference_t's
- on agent resolve / un-resolve uri_map is updated
- policy update from grpc side triggers deserialize on each mo
  that checks if the updated mo is of interest to any agent
- if yes the replace, merge or deleted vectors are updated in
  grpc thread context which wakes up an update thread (per
  OpflexServerConnection)
- update thread builds an OpflexMessage and sends it to corresponding
  agent and clears the vectors.
- add gbp_server binary that takes a json policy file, deserializes it,
  converts it into GRPC policy and serves it to mock_server in
  configurable chunks with sleeps in between.
- verified the flows are same with incremental updates
- this completes most of the end to end integration between
  gbp server and opflex-agent as far as updates go. working
  on deletes, timeouts
- address Tom Flynns code review comments
- rename GbpServer.cpp to gbp_client_stress.cpp, this is test
  code to serve a policy-file to mock_server and is not a
  part of the shipped product.
- add logic to delete policy.

Signed-off-by: Madhu Challa <challa@gmail.com>
Change-Id: I65367b2a310427644fafd88f4499862c0fbf12e2
Change-Id: Ibeb357efd022437a337cf59a268ca0a96b4a938e
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
- a single prr_timer running in context of an io_service thread
  one per MockOpflexServer sends timeout messages to each
  OpflexConnection
- The timeout is handled in the context of the same thread
  thats also responsible to send policyUpdate messages to
  opflex_agents. Thus no extra threads are needed per connection
- The timeout handler clears any resolved URIs that have timed
  out
- An extra optional arg to mock_server --prr_interval_secs to
  configure how often to trigger the timeouts, default 1 min
- Tested by using a timeout trigger > prr_duration to verify
  the uri_map is cleared

Signed-off-by: Madhu Challa <challa@gmail.com>
Change-Id: I0f72fdc238259980be5bb8d42b51b1f3d1fdc436
If the log ever printed null the code would crash on the next line anyway

Change-Id: Id7ad797f746404d67e2fb07cf5d88748d250f7d1
Signed-off-by: Tom Flynn <tom.flynn@gmail.com>
Added API to get parent by parsing the URI.
Added comparator and has for source end points.
Tests for both LocalEp and EPG as source emembers.

Change-Id: I8f0e31fad07d4f6aa7a744c17e3ce39680641501
Signed-off-by: Mandeep S Sandhu <waris12@yahoo.com>
- In cloud env we route all pod to ext world
  traffic via veth_host_ac
- Add flows to enable such traffic
- These changes are merged from demo branch
  and bring master in sync with what was in demo.

Signed-off-by: Madhu Challa <challa@gmail.com>
Change-Id: I42f222359a0befb641f91ba977b52aac7219ca69
  - add/clear flow depending on unenforced mode on RoutingDomain

  - Note: this flow will be the highest prio entry in POLICY table

  - added gtest to check the presence of the new flow

  - deleted unwanted flow in initExpRd()

Change-Id: I70759c1e91980047b7a7f6b552991af392d64517

Change-Id: I666736ba0c3e4140a051fd81a4196526734583d2

Signed-off-by: Gautam Venkataramanan <gautam.chennai@gmail.com>
Change-Id: I9699218949ff3faecabd37ddf122d0315a5653e7
gautvenk added a commit that referenced this pull request Jun 24, 2020
355 WARNING: ThreadSanitizer: data race (pid=8183)
356   Write of size 8 at 0x7b7800000548 by thread T11 (mutexes: write M1342):
357     #0 opflex::engine::internal::OpflexPool::setTunnelMac(opflex::modb::MAC const&) include/opflex/engine/internal/OpflexPool.h:338 (libopflex.so.0+0x115151)
358     #1 opflex::engine::Processor::setTunnelMac(opflex::modb::MAC const&) /home/noiro/work/opflex/libopflex/engine/Processor.cpp:584 (libopflex.so.0+0x115151)
359     #2 opflex::ofcore::OFFramework::setTunnelMac(opflex::modb::MAC const&) /home/noiro/work/opflex/libopflex/ofcore/OFFramework.cpp:103 (libopflex.so.0+0x18dcca)
360     #3 opflexagent::Agent::setUplinkMac(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) lib/Agent.cpp:795 (libopflex_agent.so.0+0x253e33)
361     #4 opflexagent::TunnelEpManager::on_timer(boost::system::error_code const&) lib/TunnelEpManager.cpp:281 (libopflex_agent.so.0+0x22c49f)
362     #5 boost::asio::detail::wait_handler<boost::_bi::bind_t<void, boost::_mfi::mf1<void, opflexagent::TunnelEpManager, boost::system::error_code const&>, boost::_bi::list2<boost::_bi::value<opflexagent::T
363     #6 boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) /usr/include/boost/asio/detail/task_io_service_opera
364     #7 boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>&, boost::asio::detail::task_io_service_thread_info&, boost::system::error_code co
365     #8 boost::asio::detail::task_io_service::run(boost::system::error_code&) /usr/include/boost/asio/detail/impl/task_io_service.ipp:149 (libopflex.so.0+0x16b982)
366     #9 boost::asio::io_service::run() /usr/include/boost/asio/impl/io_service.ipp:59 (libopflex_agent.so.0+0x256259)
367     #10 operator() lib/Agent.cpp:606 (libopflex_agent.so.0+0x256259)
368     #11 __invoke_impl<void, opflexagent::Agent::start()::<lambda()> > /usr/include/c++/9/bits/invoke.h:60 (libopflex_agent.so.0+0x256259)
369     #12 __invoke<opflexagent::Agent::start()::<lambda()> > /usr/include/c++/9/bits/invoke.h:95 (libopflex_agent.so.0+0x256259)
370     #13 _M_invoke<0> /usr/include/c++/9/thread:244 (libopflex_agent.so.0+0x256259)
371     #14 operator() /usr/include/c++/9/thread:251 (libopflex_agent.so.0+0x256259)
372     #15 _M_run /usr/include/c++/9/thread:195 (libopflex_agent.so.0+0x256259)
373     #16 <null> <null> (libstdc++.so.6+0xd086f)
374
375   Previous read of size 8 at 0x7b7800000548 by thread T4:
376     #0 opflex::engine::internal::OpflexPool::getTunnelMac() include/opflex/engine/internal/OpflexPool.h:342 (libopflex.so.0+0x1457d5)
377     #1 opflex::engine::internal::OpflexPEHandler::connected() /home/noiro/work/opflex/libopflex/engine/OpflexPEHandler.cpp:139 (libopflex.so.0+0x1457d5)
378     #2 opflex::engine::internal::OpflexClientConnection::on_state_change(yajr::Peer*, void*, yajr::StateChange::To, int) /home/noiro/work/opflex/libopflex/engine/OpflexClientConnection.cpp:158 (libopflex.
379     #3 yajr::comms::internal::CommunicationPeer::onConnect() /home/noiro/work/opflex/libopflex/comms/CommunicationPeer.cpp:116 (libopflex.so.0+0xe2aac)
380     #4 yajr::comms::internal::on_active_connection(uv_connect_s*, int) /home/noiro/work/opflex/libopflex/comms/active_connection.cpp:185 (libopflex.so.0+0xb5d00)
381     #5 <null> <null> (libuv.so.1+0x162c3)
382     #6 <null> <null> (libtsan.so.0+0x2aba6)

Signed-off-by: Gautam Venkataramanan <gautam.chennai@gmail.com>
gautvenk added a commit that referenced this pull request Jun 25, 2020
- making refCount atomic

28944   Read of size 8 at 0x7b5400000ea0 by thread T6:
28945     #0 yajr::comms::internal::Peer::LoopData::onPrepareLoop() /home/noiro/work/opflex/libopflex/comms/loopdata.cpp:38 (libopflex.so.0+0xf4188)
28946     #1 yajr::comms::internal::Peer::LoopData::onPrepareLoop(uv_prepare_s*) /home/noiro/work/opflex/libopflex/comms/loopdata.cpp:113 (libopflex.so.0+0xf494d)
28947     #2 uv__run_prepare <null> (libuv.so.1+0x11d73)
28948     #3 <null> <null> (libtsan.so.0+0x2aba6)
28949
28950   Previous write of size 8 at 0x7b5400000ea0 by main thread:
28951     #0 yajr::comms::internal::Peer::LoopData::down() /home/noiro/work/opflex/libopflex/comms/loopdata.cpp:238 (libopflex.so.0+0xf4bef)
28952     #1 yajr::comms::internal::Peer::LoopData::destroy(bool) /home/noiro/work/opflex/libopflex/comms/loopdata.cpp:130 (libopflex.so.0+0xf5211)
28953     #2 yajr::finiLoop(uv_loop_s*) /home/noiro/work/opflex/libopflex/comms/common.cpp:33 (libopflex.so.0+0xbd27e)
28954     #3 opflexagent::OvsdbConnection::stop() ovs/OvsdbConnection.cpp:71 (agent_test+0x72ecc0)
28955     #4 opflexagent::OvsdbConnection_test::verify_connect::test_method() ovs/test/OvsdbConnection_test.cpp:102 (agent_test+0x594d65)
28956     #5 verify_connect_invoker ovs/test/OvsdbConnection_test.cpp:50 (agent_test+0x59720c)
28957     #6 boost::detail::function::void_function_invoker0<void (*)(), void>::invoke(boost::detail::function::function_buffer&) /usr/include/boost/function/function_template.hpp:118 (agent_test+0x13cd2c)
28958     #7 boost::detail::function::function_obj_invoker0<boost::detail::forward, int>::invoke(boost::detail::function::function_buffer&) <null> (libboost_unit_test_framework.so.1.65.1+0x4b2cd)
28959     #8 __libc_start_main <null> (libc.so.6+0x21b96)
28960
28961   Location is heap block of size 552 at 0x7b5400000c80 allocated by main thread:
28962     #0 operator new(unsigned long, std::nothrow_t const&) <null> (libtsan.so.0+0x771aa)
28963     #1 yajr::initLoop(uv_loop_s*) /home/noiro/work/opflex/libopflex/comms/common.cpp:22 (libopflex.so.0+0xbd060)
28964     #2 opflexagent::OvsdbConnection::start() ovs/OvsdbConnection.cpp:38 (agent_test+0x72f9a5)
28965     #3 opflexagent::OvsdbConnection_test::verify_connect::test_method() ovs/test/OvsdbConnection_test.cpp:51 (agent_test+0x59192e)
28966     #4 verify_connect_invoker ovs/test/OvsdbConnection_test.cpp:50 (agent_test+0x59720c)
28967     #5 boost::detail::function::void_function_invoker0<void (*)(), void>::invoke(boost::detail::function::function_buffer&) /usr/include/boost/function/function_template.hpp:118 (agent_test+0x13cd2c)
28968     #6 boost::detail::function::function_obj_invoker0<boost::detail::forward, int>::invoke(boost::detail::function::function_buffer&) <null> (libboost_unit_test_framework.so.1.65.1+0x4b2cd)
28969     #7 __libc_start_main <null> (libc.so.6+0x21b96)

- Protecting peers list with peerMutex

29314   Read of size 8 at 0x7b5400000ca0 by main thread (mutexes: write M217157256601723712):
29315     #0 boost::intrusive::list_impl<boost::intrusive::bhtraits<yajr::comms::internal::Peer, boost::intrusive::list_node_traits<void*>, (boost::intrusive::link_mode_type)2, boost::intrusive::dft_tag, 1u>,
29316     #1 void boost::intrusive::list_impl<boost::intrusive::bhtraits<yajr::comms::internal::Peer, boost::intrusive::list_node_traits<void*>, (boost::intrusive::link_mode_type)2, boost::intrusive::dft_tag,
29317     #2 yajr::comms::internal::Peer::LoopData::destroy(bool) /home/noiro/work/opflex/libopflex/comms/loopdata.cpp:134 (libopflex.so.0+0xf51fb)
29318     #3 yajr::finiLoop(uv_loop_s*) /home/noiro/work/opflex/libopflex/comms/common.cpp:33 (libopflex.so.0+0xbd27e)
29319     #4 opflexagent::OvsdbConnection::stop() ovs/OvsdbConnection.cpp:71 (agent_test+0x72ecc0)
29320     #5 opflexagent::OvsdbConnection_test::verify_connect::test_method() ovs/test/OvsdbConnection_test.cpp:102 (agent_test+0x594d65)
29321     #6 verify_connect_invoker ovs/test/OvsdbConnection_test.cpp:50 (agent_test+0x59720c)
29322     #7 boost::detail::function::void_function_invoker0<void (*)(), void>::invoke(boost::detail::function::function_buffer&) /usr/include/boost/function/function_template.hpp:118 (agent_test+0x13cd2c)
29323     #8 boost::detail::function::function_obj_invoker0<boost::detail::forward, int>::invoke(boost::detail::function::function_buffer&) <null> (libboost_unit_test_framework.so.1.65.1+0x4b2cd)
29324     #9 __libc_start_main <null> (libc.so.6+0x21b96)
29325
29326   Previous write of size 8 at 0x7b5400000ca0 by thread T6:
29327     #0 void boost::intrusive::list_impl<boost::intrusive::bhtraits<yajr::comms::internal::Peer, boost::intrusive::list_node_traits<void*>, (boost::intrusive::link_mode_type)2, boost::intrusive::dft_tag,
29328     #1 yajr::comms::internal::Peer::LoopData::onPrepareLoop() /home/noiro/work/opflex/libopflex/comms/loopdata.cpp:64 (libopflex.so.0+0xf42a2)
29329     #2 yajr::comms::internal::Peer::LoopData::onPrepareLoop(uv_prepare_s*) /home/noiro/work/opflex/libopflex/comms/loopdata.cpp:112 (libopflex.so.0+0xf490d)
29330     #3 uv__run_prepare <null> (libuv.so.1+0x11d73)
29331     #4 <null> <null> (libtsan.so.0+0x2aba6)
29332
29333   Location is heap block of size 552 at 0x7b5400000c80 allocated by main thread:
29334     #0 operator new(unsigned long, std::nothrow_t const&) <null> (libtsan.so.0+0x771aa)
29335     #1 yajr::initLoop(uv_loop_s*) /home/noiro/work/opflex/libopflex/comms/common.cpp:22 (libopflex.so.0+0xbd060)
29336     #2 opflexagent::OvsdbConnection::start() ovs/OvsdbConnection.cpp:38 (agent_test+0x72f9a5)
29337     #3 opflexagent::OvsdbConnection_test::verify_connect::test_method() ovs/test/OvsdbConnection_test.cpp:51 (agent_test+0x59192e)
29338     #4 verify_connect_invoker ovs/test/OvsdbConnection_test.cpp:50 (agent_test+0x59720c)
29339     #5 boost::detail::function::void_function_invoker0<void (*)(), void>::invoke(boost::detail::function::function_buffer&) /usr/include/boost/function/function_template.hpp:118 (agent_test+0x13cd2c)
29340     #6 boost::detail::function::function_obj_invoker0<boost::detail::forward, int>::invoke(boost::detail::function::function_buffer&) <null> (libboost_unit_test_framework.so.1.65.1+0x4b2cd)
29341     #7 __libc_start_main <null> (libc.so.6+0x21b96)

- Making peerMutex a recursive mutex (acquired in #11 and then in #5 again)

#4  0x00005555555ea3c6 in opflex::util::LockGuard::LockGuard(pthread_mutex_t*) () at LockGuard.cpp:24
#5  0x00005555555b194b in yajr::comms::internal::Peer::LoopData::addPeer (peer=0x7b5400000780, peerState=yajr::comms::internal::Peer::LoopData::LISTENING, uv_loop=0x7fffffffcb70)
    at ../include/opflex/yajr/internal/comms.hpp:192
#6  yajr::comms::internal::Peer::insert (this=this@entry=0x7b5400000780, peerState=peerState@entry=yajr::comms::internal::Peer::LoopData::LISTENING) at peer.cpp:82
#7  0x00005555555a7a55 in yajr::comms::internal::ListeningTcpPeer::retry (this=0x7b5400000780) at passive_listener.cpp:186
#8  0x00005555555cca1c in yajr::comms::internal::Peer::LoopData::RetryPeer::operator() (this=<optimized out>, peer=0x7b5400000780) at loopdata.cpp:212
#9  0x00005555555ccb3e in boost::intrusive::list_impl<boost::intrusive::bhtraits<yajr::comms::internal::Peer, boost::intrusive::list_node_traits<void*>, (boost::intrusive::link_mode_type)2, boost::intrusive::dft_tag, 1u>, unsigned long, false, void>::clear_and_dispose<yajr::comms::internal::Peer::LoopData::RetryPeer> (disposer=..., this=0x7b5400000030) at /usr/include/boost/move/detail/meta_utils.hpp:267
#10 yajr::comms::internal::Peer::LoopData::onPrepareLoop (this=0x7b5400000000) at loopdata.cpp:62
#11 0x00005555555cd25e in yajr::comms::internal::Peer::LoopData::onPrepareLoop (h=0x7b5400000080) at loopdata.cpp:112
#12 0x00007ffff674cd74 in uv.run_prepare () from /usr/lib/x86_64-linux-gnu/libuv.so.1
#13 0x00007ffff6746e58 in uv_run () from /usr/lib/x86_64-linux-gnu/libuv.so.1
#14 0x000055555557f726 in asynchronous_sockets::CommsFixture::loop_until_final (num_events=0, timeout=7200, should_timeout=false, transient_peers=...,
    post_conditions=0x555555578100 <asynchronous_sockets::pc_successful_connect()>, final_peers=..., this=0x7fffffffca60) at test/comms_test.cpp:380
#15 asynchronous_sockets::STABLE_test_ipv4::test_method() () at test/comms_test.cpp:518

Signed-off-by: Gautam Venkataramanan <gautam.chennai@gmail.com>
gautvenk added a commit that referenced this pull request Jul 23, 2020
…ver connection set in few cases

WARNING: ThreadSanitizer: data race (pid=24355)
  Read of size 8 at 0x7b0c00012140 by thread T13:
    #0 opflex::engine::internal::OpflexListener::sendTimeouts() /home/noiro/work/opflex/libopflex/engine/OpflexListener.cpp:213 (libopflex.so.0+0x154c70)
    #1 opflex::engine::internal::GbpOpflexServerImpl::on_timer(boost::system::error_code const&) /home/noiro/work/opflex/libopflex/engine/GbpOpflexServer.cpp:146 (libopflex.so.0+0x163808)
    #2 operator() /home/noiro/work/opflex/libopflex/engine/GbpOpflexServer.cpp:119 (libopflex.so.0+0x163dd4)
    #3 operator() /usr/include/boost/asio/detail/bind_handler.hpp:47 (libopflex.so.0+0x163dd4)
    #4 asio_handler_invoke<boost::asio::detail::binder1<opflex::engine::internal::GbpOpflexServerImpl::start()::<lambda(const boost::system::error_code&)>, boost::system::error_code> > /usr/include/boost/asio
/handler_invoke_hook.hpp:69 (libopflex.so.0+0x163dd4)
    #5 invoke<boost::asio::detail::binder1<opflex::engine::internal::GbpOpflexServerImpl::start()::<lambda(const boost::system::error_code&)>, boost::system::error_code>, opflex::engine::internal::GbpOpflexSe
rverImpl::start()::<lambda(const boost::system::error_code&)> > /usr/include/boost/asio/detail/handler_invoke_helpers.hpp:37 (libopflex.so.0+0x163dd4)
    #6 do_complete /usr/include/boost/asio/detail/wait_handler.hpp:70 (libopflex.so.0+0x163dd4)
    #7 boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) /usr/include/boost/asio/detail/task_io_service_operation
.hpp:38 (libopflex.so.0+0x16b292)

  Previous write of size 8 at 0x7b0c00012140 by thread T14 (mutexes: write M620, write M198):
    #9 opflex::engine::internal::OpflexListener::on_new_connection(yajr::Listener*, void*, int) /home/noiro/work/opflex/libopflex/engine/OpflexListener.cpp:162 (libopflex.so.0+0x15589f)
    #10 yajr::comms::internal::ListeningPeer::getConnectionHandlerData() ../include/opflex/yajr/internal/comms.hpp:1116 (libopflex.so.0+0xb98a8)
    #11 yajr::comms::internal::ListeningTcpPeer::getNewPassive() /home/noiro/work/opflex/libopflex/comms/passive_listener.cpp:333 (libopflex.so.0+0xb98a8)
    #12 yajr::comms::internal::on_passive_connection(uv_stream_s*, int) /home/noiro/work/opflex/libopflex/comms/passive_listener.cpp:296 (libopflex.so.0+0xb7074)

  Location is heap block of size 40 at 0x7b0c00012120 allocated by thread T14:
    #9 opflex::engine::internal::OpflexListener::on_new_connection(yajr::Listener*, void*, int) /home/noiro/work/opflex/libopflex/engine/OpflexListener.cpp:162 (libopflex.so.0+0x15589f)
    #10 yajr::comms::internal::ListeningPeer::getConnectionHandlerData() ../include/opflex/yajr/internal/comms.hpp:1116 (libopflex.so.0+0xb98a8)
    #11 yajr::comms::internal::ListeningTcpPeer::getNewPassive() /home/noiro/work/opflex/libopflex/comms/passive_listener.cpp:333 (libopflex.so.0+0xb98a8)
    #12 yajr::comms::internal::on_passive_connection(uv_stream_s*, int) /home/noiro/work/opflex/libopflex/comms/passive_listener.cpp:296 (libopflex.so.0+0xb7074)

SUMMARY: ThreadSanitizer: data race /home/noiro/work/opflex/libopflex/engine/OpflexListener.cpp:213 in opflex::engine::internal::OpflexListener::sendTimeouts()

Signed-off-by: Gautam Venkataramanan <gautam.chennai@gmail.com>
gautvenk added a commit that referenced this pull request Aug 7, 2020
==================
WARNING: ThreadSanitizer: data race (pid=19679)
  Read of size 1 at 0x7b1000034990 by main thread:
    #0 boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptime> >::cancel(boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptime> >
::implementation_type&, boost::system::error_code&) /usr/include/boost/asio/detail/deadline_timer_service.hpp:100 (libopflex.so.0+0x1630e3)
    #1 boost::asio::deadline_timer_service<boost::posix_time::ptime, boost::asio::time_traits<boost::posix_time::ptime> >::cancel(boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::po
six_time::ptime> >::implementation_type&, boost::system::error_code&) /usr/include/boost/asio/deadline_timer_service.hpp:96 (libopflex.so.0+0x1630e3)
    #2 boost::asio::basic_deadline_timer<boost::posix_time::ptime, boost::asio::time_traits<boost::posix_time::ptime>, boost::asio::deadline_timer_service<boost::posix_time::ptime, boost::asio::time_traits<bo
ost::posix_time::ptime> > >::cancel() /usr/include/boost/asio/basic_deadline_timer.hpp:216 (libopflex.so.0+0x1630e3)
    #3 opflex::engine::internal::GbpOpflexServerImpl::stop() /home/noiro/work/opflex/libopflex/engine/GbpOpflexServer.cpp:129 (libopflex.so.0+0x1630e3)
    #4 opflex::test::GbpOpflexServer::stop() /home/noiro/work/opflex/libopflex/engine/GbpOpflexServer.cpp:53 (libopflex.so.0+0x1631f2)
    #5 main server/opflex_server.cpp:297 (opflex_server+0x22fc3)

  Previous write of size 1 at 0x7b1000034990 by thread T12:
    #0 boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptime> >::cancel(boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptime> >
::implementation_type&, boost::system::error_code&) /usr/include/boost/asio/detail/deadline_timer_service.hpp:109 (libopflex.so.0+0x163a50)
    #1 boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptime> >::cancel(boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptime> >
::implementation_type&, boost::system::error_code&) /usr/include/boost/asio/detail/deadline_timer_service.hpp:98 (libopflex.so.0+0x163a50)
    #2 boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptime> >::expires_at(boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost::posix_time::ptim
e> >::implementation_type&, boost::posix_time::ptime const&, boost::system::error_code&) /usr/include/boost/asio/detail/deadline_timer_service.hpp:144 (libopflex.so.0+0x163a50)
    #3 boost::asio::deadline_timer_service<boost::posix_time::ptime, boost::asio::time_traits<boost::posix_time::ptime> >::expires_at(boost::asio::detail::deadline_timer_service<boost::asio::time_traits<boost
::posix_time::ptime> >::implementation_type&, boost::posix_time::ptime const&, boost::system::error_code&) /usr/include/boost/asio/deadline_timer_service.hpp:116 (libopflex.so.0+0x163a50)
    #4 boost::asio::basic_deadline_timer<boost::posix_time::ptime, boost::asio::time_traits<boost::posix_time::ptime>, boost::asio::deadline_timer_service<boost::posix_time::ptime, boost::asio::time_traits<bo
ost::posix_time::ptime> > >::expires_at(boost::posix_time::ptime const&) /usr/include/boost/asio/basic_deadline_timer.hpp:344 (libopflex.so.0+0x163a50)
    #5 opflex::engine::internal::GbpOpflexServerImpl::on_timer(boost::system::error_code const&) /home/noiro/work/opflex/libopflex/engine/GbpOpflexServer.cpp:149 (libopflex.so.0+0x163a50)
    #6 operator() /home/noiro/work/opflex/libopflex/engine/GbpOpflexServer.cpp:119 (libopflex.so.0+0x163f24)
    #7 operator() /usr/include/boost/asio/detail/bind_handler.hpp:47 (libopflex.so.0+0x163f24)
    #8 asio_handler_invoke<boost::asio::detail::binder1<opflex::engine::internal::GbpOpflexServerImpl::start()::<lambda(const boost::system::error_code&)>, boost::system::error_code> > /usr/include/boost/asio
/handler_invoke_hook.hpp:69 (libopflex.so.0+0x163f24)
    #9 invoke<boost::asio::detail::binder1<opflex::engine::internal::GbpOpflexServerImpl::start()::<lambda(const boost::system::error_code&)>, boost::system::error_code>, opflex::engine::internal::GbpOpflexSe
rverImpl::start()::<lambda(const boost::system::error_code&)> > /usr/include/boost/asio/detail/handler_invoke_helpers.hpp:37 (libopflex.so.0+0x163f24)
    #10 do_complete /usr/include/boost/asio/detail/wait_handler.hpp:70 (libopflex.so.0+0x163f24)
    #11 boost::asio::detail::task_io_service_operation::complete(boost::asio::detail::task_io_service&, boost::system::error_code const&, unsigned long) /usr/include/boost/asio/detail/task_io_service_operatio
n.hpp:38 (libopflex.so.0+0x16b3e2)
    #12 boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>&, boost::asio::detail::task_io_service_thread_info&, boost::system::error_code const
&) /usr/include/boost/asio/detail/impl/task_io_service.ipp:372 (libopflex.so.0+0x16b3e2)
    #13 boost::asio::detail::task_io_service::run(boost::system::error_code&) /usr/include/boost/asio/detail/impl/task_io_service.ipp:149 (libopflex.so.0+0x16b3e2)
    #14 boost::asio::io_service::run() /usr/include/boost/asio/impl/io_service.ipp:59 (libopflex.so.0+0x1625ff)
    #15 operator() /home/noiro/work/opflex/libopflex/engine/GbpOpflexServer.cpp:121 (libopflex.so.0+0x1625ff)
    #16 __invoke_impl<void, opflex::engine::internal::GbpOpflexServerImpl::start()::<lambda()> > /usr/include/c++/9/bits/invoke.h:60 (libopflex.so.0+0x1625ff)
    #17 __invoke<opflex::engine::internal::GbpOpflexServerImpl::start()::<lambda()> > /usr/include/c++/9/bits/invoke.h:95 (libopflex.so.0+0x1625ff)
    #18 _M_invoke<0> /usr/include/c++/9/thread:244 (libopflex.so.0+0x1625ff)
    #19 operator() /usr/include/c++/9/thread:251 (libopflex.so.0+0x1625ff)
    #20 _M_run /usr/include/c++/9/thread:195 (libopflex.so.0+0x1625ff)
    #21 <null> <null> (libstdc++.so.6+0xd086f)

Signed-off-by: Gautam Venkataramanan <gautam.chennai@gmail.com>
gautvenk added a commit that referenced this pull request Dec 9, 2020
Pattern1:
WARNING: ThreadSanitizer: data race (pid=23522)
  Write of size 8 at 0x7fff79e44c50 by thread T13 (mutexes: write M1028):
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #1 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #2 std::__detail::_Map_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent:
    #3 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    #4 opflexagent::EndpointManager::updateEndpointLocal(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::optional<std::set<opflex::modb::URI, std::less<opflex::modb::URI>, std::allocator<opfl
    #5 opflexagent::EndpointManager::updateEndpoint(opflexagent::Endpoint const&) lib/EndpointManager.cpp:311 (libopflex_agent.so.0+0x1bf259)
    #6 opflexagent::EndpointSource::updateEndpoint(opflexagent::Endpoint const&) lib/EndpointSource.cpp:23 (libopflex_agent.so.0+0x1fae1a)
    #7 opflexagent::FSEndpointSource::updated(boost::filesystem::path const&) lib/FSEndpointSource.cpp:521 (libopflex_agent.so.0+0x204af0)
    #8 opflexagent::FSWatcher::operator()() lib/FSWatcher.cpp:215 (libopflex_agent.so.0+0x19e743)

  Previous read of size 8 at 0x7fff79e44c50 by thread T8 (mutexes: write M1365):
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #1 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #2 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #3 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    #4 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3774 (libopflex_agent_renderer_openvswitch
    #5 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3821 (libopflex_agent_renderer_openvswitch
    #6 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3027 (libopflex_agent_renderer_openvswitch.so+0x142442)
    #7 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

Pattern2:
WARNING: ThreadSanitizer: data race (pid=23522)
  Write of size 8 at 0x7b1000044688 by thread T13 (mutexes: write M1028):
    #0 operator delete(void*) <null> (libtsan.so.0+0x7747e)
    #1 __gnu_cxx::new_allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> >::deallocate(std::__detail::
    #2 std::allocator_traits<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> > >::deallocate(s
    #3 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> > >::_M
    #4 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> > >::_M
    #5 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #6 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #7 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #8 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    #9 opflexagent::EndpointManager::removeEndpoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) lib/EndpointManager.cpp:353 (libopflex_agent.so.0+0x1c3972)
    #10 opflexagent::EndpointSource::removeEndpoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) lib/EndpointSource.cpp:27 (libopflex_agent.so.0+0x1fae5a)
    #11 opflexagent::FSEndpointSource::deleted(boost::filesystem::path const&) lib/FSEndpointSource.cpp:544 (libopflex_agent.so.0+0x1fb49b)

  Previous read of size 8 at 0x7b1000044688 by thread T8 (mutexes: write M1365):
    #0 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::data() const /usr/include/c++/9/bits/basic_string.h:2313 (libopflex_agent_renderer_openvswitch.so+0x169c83)
    #1 __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type std::operator==<char>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<cha
    #2 std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator()(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, st
    #3 std::__detail::_Equal_helper<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexag
    #4 std::__detail::_Hashtable_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflex
    #5 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #6 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #7 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #8 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    #9 opflexagent::IntFlowManager::updateSvcNodeStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3520 (libopflex_agent_renderer_openvswitc
    #10 opflexagent::IntFlowManager::updateSvcNodeStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3567 (libopflex_agent_renderer_openvswit
    #11 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3028 (libopflex_agent_renderer_openvswitch.so+0x142453)
    #12 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

Pattern3:
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #1 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
[2020-Dec-08 19:51:10.927044] [error] [lib/FSEndpointSource.cpp:527:updated] Could not load endpoint from: "/usr/local/var/lib/opflex-agent-ovs/endpoints/h1.ep": /usr/local/var/lib/opflex-agent-ovs/endpoints/h1.ep: cannot open file
    #2 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #3 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    #4 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3774 (libopflex_agent_renderer_openvswitch
    #5 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3821 (libopflex_agent_renderer_openvswitch
    #6 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3027 (libopflex_agent_renderer_openvswitch.so+0x142442)
    #7 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

  Previous write of size 8 at 0x7b0c0000fdf0 by thread T12:
    [failed to restore the stack]

  Mutex M1365 (0x7ba400000920) created at:
[2020-Dec-08 19:51:10.927490] [debug] [ovs/TableState.cpp:489:apply] DEL|cookie=0x0, duration=0s, table=5, n_packets=0, n_bytes=0, idle_age=0, priority=20,icmp6,reg4=0x1,reg6=0x1,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00,icmp_type=135,ic
    #0 pthread_mutex_lock <null> (libtsan.so.0+0x41d5b)
    #1 __gthread_mutex_lock /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:749 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    #2 std::mutex::lock() /usr/include/c++/9/bits/std_mutex.h:100 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    #3 std::lock_guard<std::mutex>::lock_guard(std::mutex&) /usr/include/c++/9/bits/std_mutex.h:159 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    #4 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3015 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    #5 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

Pattern4:
WARNING: ThreadSanitizer: heap-use-after-free (pid=10699)
  Read of size 8 at 0x7b6400021e88 by thread T8 (mutexes: write M1379, write M182):
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std:
    #1 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::ch
    #2 opflexagent::AgentPrometheusManager::createLabelMapFromSvcTargetAttr(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<ch
    #3 opflexagent::AgentPrometheusManager::createDynamicGaugeSvcTarget(opflexagent::AgentPrometheusManager::SVC_TARGET_METRICS, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_s
    #4 opflexagent::AgentPrometheusManager::addNUpdateSvcTargetCounter(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
    #5 opflexagent::IntFlowManager::updateSvcTgtStatsCounters(unsigned long const&, bool const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long const&, unsigned long const&, std::unor
    #6 operator() ovs/IntFlowManager.cpp:3703 (libopflex_agent_renderer_openvswitch.so+0x14127f)
    #7 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3776 (libopflex_agent_renderer_openvswitch
    #8 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3821 (libopflex_agent_renderer_openvswitch
    #9 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3027 (libopflex_agent_renderer_openvswitch.so+0x142a72)
    #10 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142e82)

  Previous write of size 8 at 0x7b6400021e88 by thread T12:
    #0 operator delete(void*) <null> (libtsan.so.0+0x7747e)
    #1 std::_Sp_counted_ptr_inplace<opflexagent::Endpoint const, std::allocator<opflexagent::Endpoint>, (__gnu_cxx::_Lock_policy)2>::_M_destroy() /usr/include/c++/9/ext/new_allocator.h:128 (libopflex_agent.so.0+0x1c2f75)
    #2 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /usr/include/c++/9/bits/shared_ptr_base.h:171 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    #3 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /usr/include/c++/9/bits/shared_ptr_base.h:148 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    #4 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() /usr/include/c++/9/bits/shared_ptr_base.h:730 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    #5 std::__shared_ptr<opflexagent::Endpoint const, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() /usr/include/c++/9/bits/shared_ptr_base.h:1169 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    #6 std::shared_ptr<opflexagent::Endpoint const>::~shared_ptr() /usr/include/c++/9/bits/shared_ptr.h:103 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    #7 opflexagent::AccessFlowManager::handleEndpointUpdate(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/AccessFlowManager.cpp:411 (libopflex_agent_renderer_openvswitch.so+0x1904e8)

Signed-off-by: Gautam Venkataramanan <gautam.chennai@gmail.com>
tomflynn pushed a commit that referenced this pull request Dec 10, 2020
Pattern1:
WARNING: ThreadSanitizer: data race (pid=23522)
  Write of size 8 at 0x7fff79e44c50 by thread T13 (mutexes: write M1028):
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #1 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #2 std::__detail::_Map_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent:
    #3 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    #4 opflexagent::EndpointManager::updateEndpointLocal(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::optional<std::set<opflex::modb::URI, std::less<opflex::modb::URI>, std::allocator<opfl
    #5 opflexagent::EndpointManager::updateEndpoint(opflexagent::Endpoint const&) lib/EndpointManager.cpp:311 (libopflex_agent.so.0+0x1bf259)
    #6 opflexagent::EndpointSource::updateEndpoint(opflexagent::Endpoint const&) lib/EndpointSource.cpp:23 (libopflex_agent.so.0+0x1fae1a)
    #7 opflexagent::FSEndpointSource::updated(boost::filesystem::path const&) lib/FSEndpointSource.cpp:521 (libopflex_agent.so.0+0x204af0)
    #8 opflexagent::FSWatcher::operator()() lib/FSWatcher.cpp:215 (libopflex_agent.so.0+0x19e743)

  Previous read of size 8 at 0x7fff79e44c50 by thread T8 (mutexes: write M1365):
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #1 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #2 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #3 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    #4 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3774 (libopflex_agent_renderer_openvswitch
    #5 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3821 (libopflex_agent_renderer_openvswitch
    #6 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3027 (libopflex_agent_renderer_openvswitch.so+0x142442)
    #7 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

Pattern2:
WARNING: ThreadSanitizer: data race (pid=23522)
  Write of size 8 at 0x7b1000044688 by thread T13 (mutexes: write M1028):
    #0 operator delete(void*) <null> (libtsan.so.0+0x7747e)
    #1 __gnu_cxx::new_allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> >::deallocate(std::__detail::
    #2 std::allocator_traits<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> > >::deallocate(s
    #3 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> > >::_M
    #4 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> > >::_M
    #5 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #6 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #7 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #8 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    #9 opflexagent::EndpointManager::removeEndpoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) lib/EndpointManager.cpp:353 (libopflex_agent.so.0+0x1c3972)
    #10 opflexagent::EndpointSource::removeEndpoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) lib/EndpointSource.cpp:27 (libopflex_agent.so.0+0x1fae5a)
    #11 opflexagent::FSEndpointSource::deleted(boost::filesystem::path const&) lib/FSEndpointSource.cpp:544 (libopflex_agent.so.0+0x1fb49b)

  Previous read of size 8 at 0x7b1000044688 by thread T8 (mutexes: write M1365):
    #0 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::data() const /usr/include/c++/9/bits/basic_string.h:2313 (libopflex_agent_renderer_openvswitch.so+0x169c83)
    #1 __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type std::operator==<char>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<cha
    #2 std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator()(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, st
    #3 std::__detail::_Equal_helper<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexag
    #4 std::__detail::_Hashtable_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflex
    #5 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #6 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #7 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #8 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    #9 opflexagent::IntFlowManager::updateSvcNodeStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3520 (libopflex_agent_renderer_openvswitc
    #10 opflexagent::IntFlowManager::updateSvcNodeStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3567 (libopflex_agent_renderer_openvswit
    #11 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3028 (libopflex_agent_renderer_openvswitch.so+0x142453)
    #12 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

Pattern3:
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #1 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
[2020-Dec-08 19:51:10.927044] [error] [lib/FSEndpointSource.cpp:527:updated] Could not load endpoint from: "/usr/local/var/lib/opflex-agent-ovs/endpoints/h1.ep": /usr/local/var/lib/opflex-agent-ovs/endpoints/h1.ep: cannot open file
    #2 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    #3 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    #4 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3774 (libopflex_agent_renderer_openvswitch
    #5 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3821 (libopflex_agent_renderer_openvswitch
    #6 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3027 (libopflex_agent_renderer_openvswitch.so+0x142442)
    #7 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

  Previous write of size 8 at 0x7b0c0000fdf0 by thread T12:
    [failed to restore the stack]

  Mutex M1365 (0x7ba400000920) created at:
[2020-Dec-08 19:51:10.927490] [debug] [ovs/TableState.cpp:489:apply] DEL|cookie=0x0, duration=0s, table=5, n_packets=0, n_bytes=0, idle_age=0, priority=20,icmp6,reg4=0x1,reg6=0x1,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00,icmp_type=135,ic
    #0 pthread_mutex_lock <null> (libtsan.so.0+0x41d5b)
    #1 __gthread_mutex_lock /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:749 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    #2 std::mutex::lock() /usr/include/c++/9/bits/std_mutex.h:100 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    #3 std::lock_guard<std::mutex>::lock_guard(std::mutex&) /usr/include/c++/9/bits/std_mutex.h:159 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    #4 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3015 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    #5 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

Pattern4:
WARNING: ThreadSanitizer: heap-use-after-free (pid=10699)
  Read of size 8 at 0x7b6400021e88 by thread T8 (mutexes: write M1379, write M182):
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std:
    #1 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::ch
    #2 opflexagent::AgentPrometheusManager::createLabelMapFromSvcTargetAttr(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<ch
    #3 opflexagent::AgentPrometheusManager::createDynamicGaugeSvcTarget(opflexagent::AgentPrometheusManager::SVC_TARGET_METRICS, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_s
    #4 opflexagent::AgentPrometheusManager::addNUpdateSvcTargetCounter(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
    #5 opflexagent::IntFlowManager::updateSvcTgtStatsCounters(unsigned long const&, bool const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long const&, unsigned long const&, std::unor
    #6 operator() ovs/IntFlowManager.cpp:3703 (libopflex_agent_renderer_openvswitch.so+0x14127f)
    #7 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3776 (libopflex_agent_renderer_openvswitch
    #8 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3821 (libopflex_agent_renderer_openvswitch
    #9 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3027 (libopflex_agent_renderer_openvswitch.so+0x142a72)
    #10 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142e82)

  Previous write of size 8 at 0x7b6400021e88 by thread T12:
    #0 operator delete(void*) <null> (libtsan.so.0+0x7747e)
    #1 std::_Sp_counted_ptr_inplace<opflexagent::Endpoint const, std::allocator<opflexagent::Endpoint>, (__gnu_cxx::_Lock_policy)2>::_M_destroy() /usr/include/c++/9/ext/new_allocator.h:128 (libopflex_agent.so.0+0x1c2f75)
    #2 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /usr/include/c++/9/bits/shared_ptr_base.h:171 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    #3 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /usr/include/c++/9/bits/shared_ptr_base.h:148 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    #4 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() /usr/include/c++/9/bits/shared_ptr_base.h:730 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    #5 std::__shared_ptr<opflexagent::Endpoint const, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() /usr/include/c++/9/bits/shared_ptr_base.h:1169 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    #6 std::shared_ptr<opflexagent::Endpoint const>::~shared_ptr() /usr/include/c++/9/bits/shared_ptr.h:103 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    #7 opflexagent::AccessFlowManager::handleEndpointUpdate(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/AccessFlowManager.cpp:411 (libopflex_agent_renderer_openvswitch.so+0x1904e8)

Signed-off-by: Gautam Venkataramanan <gautam.chennai@gmail.com>
ansao-aci pushed a commit to ansao-aci/opflex that referenced this pull request Feb 10, 2021
…onetworks#305)

Pattern1:
WARNING: ThreadSanitizer: data race (pid=23522)
  Write of size 8 at 0x7fff79e44c50 by thread T13 (mutexes: write M1028):
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#1 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#2 std::__detail::_Map_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent:
    noironetworks#3 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    noironetworks#4 opflexagent::EndpointManager::updateEndpointLocal(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::optional<std::set<opflex::modb::URI, std::less<opflex::modb::URI>, std::allocator<opfl
    noironetworks#5 opflexagent::EndpointManager::updateEndpoint(opflexagent::Endpoint const&) lib/EndpointManager.cpp:311 (libopflex_agent.so.0+0x1bf259)
    noironetworks#6 opflexagent::EndpointSource::updateEndpoint(opflexagent::Endpoint const&) lib/EndpointSource.cpp:23 (libopflex_agent.so.0+0x1fae1a)
    noironetworks#7 opflexagent::FSEndpointSource::updated(boost::filesystem::path const&) lib/FSEndpointSource.cpp:521 (libopflex_agent.so.0+0x204af0)
    noironetworks#8 opflexagent::FSWatcher::operator()() lib/FSWatcher.cpp:215 (libopflex_agent.so.0+0x19e743)

  Previous read of size 8 at 0x7fff79e44c50 by thread T8 (mutexes: write M1365):
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#1 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#2 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#3 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    noironetworks#4 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3774 (libopflex_agent_renderer_openvswitch
    noironetworks#5 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3821 (libopflex_agent_renderer_openvswitch
    noironetworks#6 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3027 (libopflex_agent_renderer_openvswitch.so+0x142442)
    noironetworks#7 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

Pattern2:
WARNING: ThreadSanitizer: data race (pid=23522)
  Write of size 8 at 0x7b1000044688 by thread T13 (mutexes: write M1028):
    #0 operator delete(void*) <null> (libtsan.so.0+0x7747e)
    noironetworks#1 __gnu_cxx::new_allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> >::deallocate(std::__detail::
    noironetworks#2 std::allocator_traits<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> > >::deallocate(s
    noironetworks#3 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> > >::_M
    noironetworks#4 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint const> >, true> > >::_M
    noironetworks#5 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#6 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#7 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#8 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    noironetworks#9 opflexagent::EndpointManager::removeEndpoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) lib/EndpointManager.cpp:353 (libopflex_agent.so.0+0x1c3972)
    noironetworks#10 opflexagent::EndpointSource::removeEndpoint(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) lib/EndpointSource.cpp:27 (libopflex_agent.so.0+0x1fae5a)
    noironetworks#11 opflexagent::FSEndpointSource::deleted(boost::filesystem::path const&) lib/FSEndpointSource.cpp:544 (libopflex_agent.so.0+0x1fb49b)

  Previous read of size 8 at 0x7b1000044688 by thread T8 (mutexes: write M1365):
    #0 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::data() const /usr/include/c++/9/bits/basic_string.h:2313 (libopflex_agent_renderer_openvswitch.so+0x169c83)
    noironetworks#1 __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type std::operator==<char>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<cha
    noironetworks#2 std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator()(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, st
    noironetworks#3 std::__detail::_Equal_helper<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexag
    noironetworks#4 std::__detail::_Hashtable_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflex
    noironetworks#5 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#6 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#7 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#8 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    noironetworks#9 opflexagent::IntFlowManager::updateSvcNodeStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3520 (libopflex_agent_renderer_openvswitc
    noironetworks#10 opflexagent::IntFlowManager::updateSvcNodeStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3567 (libopflex_agent_renderer_openvswit
    noironetworks#11 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3028 (libopflex_agent_renderer_openvswitch.so+0x142453)
    noironetworks#12 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

Pattern3:
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#1 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
[2020-Dec-08 19:51:10.927044] [error] [lib/FSEndpointSource.cpp:527:updated] Could not load endpoint from: "/usr/local/var/lib/opflex-agent-ovs/endpoints/h1.ep": /usr/local/var/lib/opflex-agent-ovs/endpoints/h1.ep: cannot open file
    noironetworks#2 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::shared_ptr<opflexagent::Endpoint
    noironetworks#3 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::shared_ptr<opflexagent::Endpoint const>, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<cha
    noironetworks#4 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3774 (libopflex_agent_renderer_openvswitch
    noironetworks#5 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3821 (libopflex_agent_renderer_openvswitch
    noironetworks#6 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3027 (libopflex_agent_renderer_openvswitch.so+0x142442)
    noironetworks#7 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

  Previous write of size 8 at 0x7b0c0000fdf0 by thread T12:
    [failed to restore the stack]

  Mutex M1365 (0x7ba400000920) created at:
[2020-Dec-08 19:51:10.927490] [debug] [ovs/TableState.cpp:489:apply] DEL|cookie=0x0, duration=0s, table=5, n_packets=0, n_bytes=0, idle_age=0, priority=20,icmp6,reg4=0x1,reg6=0x1,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00,icmp_type=135,ic
    #0 pthread_mutex_lock <null> (libtsan.so.0+0x41d5b)
    noironetworks#1 __gthread_mutex_lock /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:749 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    noironetworks#2 std::mutex::lock() /usr/include/c++/9/bits/std_mutex.h:100 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    noironetworks#3 std::lock_guard<std::mutex>::lock_guard(std::mutex&) /usr/include/c++/9/bits/std_mutex.h:159 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    noironetworks#4 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3015 (libopflex_agent_renderer_openvswitch.so+0x141ae4)
    noironetworks#5 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142852)

Pattern4:
WARNING: ThreadSanitizer: heap-use-after-free (pid=10699)
  Read of size 8 at 0x7b6400021e88 by thread T8 (mutexes: write M1379, write M182):
    #0 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std:
    noironetworks#1 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::hash<std::__cxx11::basic_string<char, std::ch
    noironetworks#2 opflexagent::AgentPrometheusManager::createLabelMapFromSvcTargetAttr(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<ch
    noironetworks#3 opflexagent::AgentPrometheusManager::createDynamicGaugeSvcTarget(opflexagent::AgentPrometheusManager::SVC_TARGET_METRICS, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_s
    noironetworks#4 opflexagent::AgentPrometheusManager::addNUpdateSvcTargetCounter(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
    noironetworks#5 opflexagent::IntFlowManager::updateSvcTgtStatsCounters(unsigned long const&, bool const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long const&, unsigned long const&, std::unor
    noironetworks#6 operator() ovs/IntFlowManager.cpp:3703 (libopflex_agent_renderer_openvswitch.so+0x14127f)
    noironetworks#7 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3776 (libopflex_agent_renderer_openvswitch
    noironetworks#8 opflexagent::IntFlowManager::updateSvcTgtStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&) ovs/IntFlowManager.cpp:3821 (libopflex_agent_renderer_openvswitch
    noironetworks#9 opflexagent::IntFlowManager::handleUpdateSvcStatsFlows(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/IntFlowManager.cpp:3027 (libopflex_agent_renderer_openvswitch.so+0x142a72)
    noironetworks#10 operator() ovs/IntFlowManager.cpp:3080 (libopflex_agent_renderer_openvswitch.so+0x142e82)

  Previous write of size 8 at 0x7b6400021e88 by thread T12:
    #0 operator delete(void*) <null> (libtsan.so.0+0x7747e)
    noironetworks#1 std::_Sp_counted_ptr_inplace<opflexagent::Endpoint const, std::allocator<opflexagent::Endpoint>, (__gnu_cxx::_Lock_policy)2>::_M_destroy() /usr/include/c++/9/ext/new_allocator.h:128 (libopflex_agent.so.0+0x1c2f75)
    noironetworks#2 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /usr/include/c++/9/bits/shared_ptr_base.h:171 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    noironetworks#3 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() /usr/include/c++/9/bits/shared_ptr_base.h:148 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    noironetworks#4 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() /usr/include/c++/9/bits/shared_ptr_base.h:730 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    noironetworks#5 std::__shared_ptr<opflexagent::Endpoint const, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() /usr/include/c++/9/bits/shared_ptr_base.h:1169 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    noironetworks#6 std::shared_ptr<opflexagent::Endpoint const>::~shared_ptr() /usr/include/c++/9/bits/shared_ptr.h:103 (libopflex_agent_renderer_openvswitch.so+0x1904e8)
    noironetworks#7 opflexagent::AccessFlowManager::handleEndpointUpdate(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ovs/AccessFlowManager.cpp:411 (libopflex_agent_renderer_openvswitch.so+0x1904e8)

Signed-off-by: Gautam Venkataramanan <gautam.chennai@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants