Jiri Danek created PROTON-1571:
----------------------------------
Summary: The ssl C++ example appears leaky, proton::listener does
not have a destructor
Key: PROTON-1571
URL: https://issues.apache.org/jira/browse/PROTON-1571
Project: Qpid Proton
Issue Type: Bug
Components: cpp-binding, examples
Affects Versions: proton-c-0.18.0
Environment: commit e631bf6b11960d9687d42dfdde1ff4c65804981c
(upstream/master)
Author: Andrew Stitcher <[email protected]>
Date: Thu Aug 31 17:31:17 2017 -0400
PROTON-1567: Implement failover urls
- Example "reliable" client sending and receiving messages
- Also add jitter to retry backoff (with C++11
Reporter: Jiri Danek
Assignee: Cliff Jansen
After applying the following patch (to rin in a loop multiple times and to log
RSS and VSS (the last two columns))
{code}
diff --git a/examples/cpp/ssl.cpp b/examples/cpp/ssl.cpp
index 99ceb4aa..f5864f42 100644
--- a/examples/cpp/ssl.cpp
+++ b/examples/cpp/ssl.cpp
@@ -37,6 +37,9 @@
#include "fake_cpp11.hpp"
+#include <stdlib.h>
+#include <unistd.h>
+
using proton::connection_options;
using proton::ssl_client_options;
using proton::ssl_server_options;
@@ -178,8 +181,21 @@ int main(int argc, char **argv) {
if (verify != verify_noname && verify != verify_full && verify !=
verify_fail)
throw std::runtime_error("bad verify argument: " + verify);
- hello_world_direct hwd(address);
- proton::default_container(hwd).run();
+ for (int i = 0; i < 10000; i++) {
+ try {
+ hello_world_direct hwd(address);
+ proton::default_container(hwd).run();
+ } catch (const std::exception& e) {
+ if (verify_failed) {
+ if (verify == verify_fail) {
+ std::cout << "Expected failure of connection with wrong
peer name: " << e.what() << std::endl;
+ }
+ }
+ }
+ int ret = system("ps -eo pmem,comm,pid,maj_flt,min_flt,rss,vsz | grep
ssl");
+ (void)ret;
+// sleep(1);
+ }
return 0;
} catch (const std::exception& e) {
if (verify_failed) {
{code}
and normal compilation,
{{CFLAGS=-g cmake .. -DBUILD_GO=OFF -DENABLE_VALGRIND=OFF
-DCMAKE_BUILD_TYPE=Release -GNijna}}
run the example and observe that with {{-v fail}}, the RSS grows, while without
it, it seems to keep steady. This to me suggests that either the binding does
not properly handle failures, or that the example itself does not.
{noformat}
$ examples/cpp/ssl -a amqps://localhost:46085/examples -c
/home/jdanek/Work/repos/qpid-proton/examples/cpp/ssl_certs -v fail
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 378 6892 35928
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 475 7124 36344
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 572 7500 36756
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 669 7736 37160
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 773 7828 37444
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 874 8192 37860
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 972 8292 38272
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 1074 8684 38664
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 1175 8776 38936
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 1274 9164 39336
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 1375 9268 39752
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 1476 9632 40164
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 1575 9864 40568
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 1677 9956 40852
Expected failure of connection with wrong peer name:
amqp:connection:framing-error: SSL Failure: error:14090086:SSL
routines:ssl3_get_server_certificate:certificate verify failed
0.0 ssl 29657 0 1778 10320 41268
{noformat}
{noformat}
[nix-shell:~/Work/repos/qpid-proton/build]$ examples/cpp/ssl -a
amqps://localhost:46085/examples -c
/home/jdanek/Work/repos/qpid-proton/examples/cpp/ssl_certs
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 377 6824 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 471 6864 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 554 6948 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 637 6988 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 720 6988 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 803 6988 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 886 6988 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 969 6988 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 1063 6992 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 1157 7000 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 1244 7000 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 1327 7000 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 1410 7000 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 1493 7000 35928
Inbound server connection connected via SSL. Protocol: TLSv1/SSLv3
Outgoing client connection connected via SSL. Server certificate identity
CN=test_server
Hello World!
0.0 ssl 29707 0 1576 7000 35928
{noformat}
With one loop through the for and running under valgrind, it shows leak in
pn_listener. I think that either the example should free the listener, or the
C++ binding should have a destructor in proton::listener object to take care of
it. The first solution would be more flexible, the second is more C++ style,
RAII, I mean.
{noformat}
valgrind --leak-check=full examples/cpp/ssl -a amqps://localhost:46085/examples
-c /home/jdanek/Work/repos/qpid-proton/examples/cpp/ssl_certs -v fail
[...]
==29439== HEAP SUMMARY:
==29439== in use at exit: 472,452 bytes in 4,340 blocks
==29439== total heap usage: 17,516 allocs, 13,176 frees, 2,003,666 bytes
allocated
==29439==
==29439== 373,692 (208 direct, 373,484 indirect) bytes in 1 blocks are
definitely lost in loss record 1,583 of 1,583
==29439== at 0x4C2DBD5: calloc (in
/nix/store/gv9x2j31hvn0wf37h4jmb9xz6vgc3vvv-valgrind-3.12.0/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==29439== by 0x509128F: pn_listener (epoll.c:1339)
==29439== by 0x4E6017B:
proton::container::impl::listen_common_lh(std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&) (in
/home/jdanek/Work/repos/qpid-proton/build/proton-c/bindings/cpp/libqpid-proton-cpp.so.11.0.0)
==29439== by 0x4E60348:
proton::container::impl::listen(std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&) (in
/home/jdanek/Work/repos/qpid-proton/build/proton-c/bindings/cpp/libqpid-proton-cpp.so.11.0.0)
==29439== by 0x408256:
hello_world_direct::on_container_start(proton::container&) (in
/home/jdanek/Work/repos/qpid-proton/build/examples/cpp/ssl)
==29439== by 0x5DA4EA8: __pthread_once_slow (in
/nix/store/l48biijfr1j6d5kdg911051x2phfjrz7-glibc-2.25/lib/libpthread-2.25.so)
==29439== by 0x4E62CD9: void std::call_once<void
(proton::container::impl::*)(), proton::container::impl*>(std::once_flag&, void
(proton::container::impl::*&&)(), proton::container::impl*&&) (in
/home/jdanek/Work/repos/qpid-proton/build/proton-c/bindings/cpp/libqpid-proton-cpp.so.11.0.0)
==29439== by 0x4E6223F: proton::container::impl::run(int) (in
/home/jdanek/Work/repos/qpid-proton/build/proton-c/bindings/cpp/libqpid-proton-cpp.so.11.0.0)
==29439== by 0x4062BB: main (in
/home/jdanek/Work/repos/qpid-proton/build/examples/cpp/ssl)
==29439==
==29439== LEAK SUMMARY:
==29439== definitely lost: 208 bytes in 1 blocks
==29439== indirectly lost: 373,484 bytes in 1,056 blocks
==29439== possibly lost: 0 bytes in 0 blocks
==29439== still reachable: 98,760 bytes in 3,283 blocks
==29439== suppressed: 0 bytes in 0 blocks
==29439== Reachable blocks (those to which a pointer was found) are not shown.
[..]
{noformat}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]