Skip to content

Commit

Permalink
Memory leak in client when using python wrapper to send request to se…
Browse files Browse the repository at this point in the history
…rvice

  ros2/rclpy#822

Signed-off-by: Tomoya Fujita <[email protected]>
  • Loading branch information
fujitatomoya committed Sep 21, 2021
1 parent a91d264 commit d0963d5
Show file tree
Hide file tree
Showing 12 changed files with 159 additions and 2 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,7 @@ test sample to reproduce and investigate issues, easy to distribute.
## prover_rclpy

[rclpy](https://github.com/ros2/rclpy) related issue and reproducible tests.

### prover_interfaces

only applied to prover packages.
36 changes: 36 additions & 0 deletions prover_interfaces/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
cmake_minimum_required(VERSION 3.8)
project(prover_interfaces)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)

set(srv_files
"srv/Huge.srv"
)
rosidl_generate_interfaces(${PROJECT_NAME}
${srv_files}
ADD_LINTER_TESTS
)

if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# uncomment the line when a copyright and license is not present in all source files
#set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# uncomment the line when this package is not in a git repo
#set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()

ament_export_dependencies(rosidl_default_runtime)

ament_package()
25 changes: 25 additions & 0 deletions prover_interfaces/package.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>prover_interfaces</name>
<version>0.0.0</version>
<description>only applied to prover packages.</description>
<maintainer email="[email protected]">Tomoya Fujita</maintainer>
<license>Apache License 2.0</license>

<author email="[email protected]">Tomoya Fujita</author>

<buildtool_depend>ament_cmake</buildtool_depend>
<buildtool_depend>rosidl_default_generators</buildtool_depend>

<exec_depend>rosidl_default_runtime</exec_depend>

<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>

<member_of_group>rosidl_interface_packages</member_of_group>

<export>
<build_type>ament_cmake</build_type>
</export>
</package>
3 changes: 3 additions & 0 deletions prover_interfaces/srv/Huge.srv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
byte[1048576] input_tensor
---
byte[1048576] output_tensor
1 change: 1 addition & 0 deletions prover_rclpy/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<exec_depend>example_interfaces</exec_depend>
<exec_depend>rclpy</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>prover_interfaces</exec_depend>

<test_depend>ament_copyright</test_depend>
<test_depend>ament_flake8</test_depend>
Expand Down
4 changes: 2 additions & 2 deletions prover_rclpy/setup.cfg
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[develop]
script-dir=$base/lib/prover_rclpy
script_dir=$base/lib/prover_rclpy
[install]
install-scripts=$base/lib/prover_rclpy
install_scripts=$base/lib/prover_rclpy
2 changes: 2 additions & 0 deletions prover_rclpy/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
#'rclpy_585 = src.rclpy_585:main',
#'rclpy_760 = src.rclpy_760:main',
'rclpy_792 = src.rclpy_792:main',
'rclpy_client_822 = src.rclpy_client_822:main',
'rclpy_server_822 = src.rclpy_server_822:main',
],
},
)
Binary file added prover_rclpy/src/__pycache__/__init__.cpython-38.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
50 changes: 50 additions & 0 deletions prover_rclpy/src/rclpy_client_822.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import sys

from prover_interfaces.srv import Huge
import rclpy
from rclpy.node import Node

import time


class MinimalClientAsync(Node):

def __init__(self):
super().__init__('minimal_client_async')
self.cli = self.create_client(Huge, 'huge')
while not self.cli.wait_for_service(timeout_sec=5.0):
self.get_logger().info('service not available, waiting again...')
self.req = Huge.Request()

def send_request(self):
self.future = self.cli.call_async(self.req)


def main(args=None):
rclpy.init(args=args)

minimal_client = MinimalClientAsync()
for _ in range(1000):
minimal_client.get_logger().info('Sending async request...')
minimal_client.send_request()

while rclpy.ok():
rclpy.spin_once(minimal_client)
time.sleep(0.1)
if minimal_client.future.done():
try:
response = minimal_client.future.result()
except Exception as e:
minimal_client.get_logger().info(
'Service call failed %r' % (e,))
else:
minimal_client.get_logger().info('Result received!!!')
break


minimal_client.destroy_node()
rclpy.shutdown()


if __name__ == '__main__':
main()
36 changes: 36 additions & 0 deletions prover_rclpy/src/rclpy_server_822.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import sys

from prover_interfaces.srv import Huge
import rclpy
from rclpy.node import Node

import time


class MinimalServerAsync(Node):

def __init__(self):
super().__init__('minimal_server')
self.cli = self.create_service(Huge, 'huge', self.callback)

def callback(self, request, response):
self.get_logger().info('Incoming request...')
return response


def main(args=None):
rclpy.init(args=args)

minimal_server = MinimalServerAsync()

try:
rclpy.spin(minimal_server)
except KeyboardInterrupt:
pass

minimal_server.destroy_node()
rclpy.shutdown()


if __name__ == '__main__':
main()

0 comments on commit d0963d5

Please sign in to comment.