Repository: bluzelle/swarmDB Branch: devel Commit: 3315336eec8b Files: 221 Total size: 2.2 MB Directory structure: gitextract_w88obzzf/ ├── .gitignore ├── .travis.yml ├── CMakeLists.txt ├── CONTRIBUTOR.md ├── LICENSE ├── README.md ├── SUMMARY.md ├── audit/ │ ├── CMakeLists.txt │ ├── audit.cpp │ ├── audit.hpp │ ├── audit_base.hpp │ └── test/ │ ├── CMakeLists.txt │ └── audit_test.cpp ├── chaos/ │ ├── CMakeLists.txt │ ├── chaos.cpp │ ├── chaos.hpp │ ├── chaos_base.hpp │ └── test/ │ ├── CMakeLists.txt │ └── chaos_test.cpp ├── cmake/ │ ├── add_gmock_test.cmake │ ├── boost.cmake │ ├── git_commit.cmake │ ├── googletest.cmake │ ├── jsoncpp.cmake │ ├── openssl.cmake │ ├── rocksdb.cmake │ ├── static_analysis.cmake │ ├── static_analysis.sh │ ├── swarm_git_commit.hpp.in │ ├── swarm_version.cmake │ └── swarm_version.hpp.in ├── crud/ │ ├── CMakeLists.txt │ ├── crud.cpp │ ├── crud.hpp │ ├── crud_base.hpp │ ├── subscription_manager.cpp │ ├── subscription_manager.hpp │ ├── subscription_manager_base.hpp │ └── test/ │ ├── CMakeLists.txt │ ├── crud_test.cpp │ └── subscription_manager_test.cpp ├── crypto/ │ ├── CMakeLists.txt │ ├── crypto.cpp │ ├── crypto.hpp │ ├── crypto_base.hpp │ └── test/ │ ├── CMakeLists.txt │ └── crypto_test.cpp ├── depend/ │ ├── CMakeLists.txt │ ├── README.md │ ├── boost/ │ │ ├── CMakeLists.txt │ │ └── package/ │ │ ├── .gitattributes │ │ └── CMakeLists.txt │ ├── googletest/ │ │ ├── CMakeLists.txt │ │ └── package/ │ │ ├── .gitattributes │ │ └── CMakeLists.txt │ ├── jsoncpp/ │ │ ├── CMakeLists.txt │ │ └── package/ │ │ ├── .gitattributes │ │ └── CMakeLists.txt │ ├── openssl/ │ │ ├── CMakeLists.txt │ │ └── package/ │ │ ├── .gitattributes │ │ └── CMakeLists.txt │ └── rocksdb/ │ ├── CMakeLists.txt │ └── package/ │ ├── .gitattributes │ └── CMakeLists.txt ├── include/ │ ├── bluzelle.hpp │ ├── boost_asio_beast.hpp │ └── system_clock.hpp ├── mocks/ │ ├── CMakeLists.txt │ ├── mock_boost_asio_beast.hpp │ ├── mock_chaos_base.hpp │ ├── mock_crud_base.hpp │ ├── mock_crypto_base.hpp │ ├── mock_monitor.hpp │ ├── mock_node_base.hpp │ ├── mock_options_base.hpp │ ├── mock_pbft_base.hpp │ ├── mock_pbft_failure_detector.hpp │ ├── mock_pbft_service_base.hpp │ ├── mock_peers_beacon_base.hpp │ ├── mock_session_base.hpp │ ├── mock_status_provider_base.hpp │ ├── mock_storage_base.hpp │ ├── mock_subscription_manager_base.hpp │ ├── mock_system_clock.hpp │ ├── mock_utils_interface.hpp │ ├── smart_mock_io.cpp │ ├── smart_mock_io.hpp │ ├── smart_mock_node.cpp │ ├── smart_mock_node.hpp │ ├── smart_mock_peers_beacon.cpp │ └── smart_mock_peers_beacon.hpp ├── monitor/ │ ├── CMakeLists.txt │ ├── monitor.cpp │ ├── monitor.hpp │ ├── monitor_base.hpp │ └── test/ │ ├── CMakeLists.txt │ └── monitor_test.cpp ├── node/ │ ├── CMakeLists.txt │ ├── node.cpp │ ├── node.hpp │ ├── node_base.hpp │ ├── session.cpp │ ├── session.hpp │ ├── session_base.hpp │ └── test/ │ ├── CMakeLists.txt │ ├── node_test.cpp │ └── session_test.cpp ├── options/ │ ├── CMakeLists.txt │ ├── options.cpp │ ├── options.hpp │ ├── options_base.hpp │ ├── simple_options.cpp │ ├── simple_options.hpp │ └── test/ │ ├── CMakeLists.txt │ └── options_test.cpp ├── pbft/ │ ├── CMakeLists.txt │ ├── database_pbft_service.cpp │ ├── database_pbft_service.hpp │ ├── dummy_pbft_service.cpp │ ├── dummy_pbft_service.hpp │ ├── operations/ │ │ ├── CMakeLists.txt │ │ ├── pbft_memory_operation.cpp │ │ ├── pbft_memory_operation.hpp │ │ ├── pbft_operation.cpp │ │ ├── pbft_operation.hpp │ │ ├── pbft_operation_manager.cpp │ │ ├── pbft_operation_manager.hpp │ │ ├── pbft_persistent_operation.cpp │ │ ├── pbft_persistent_operation.hpp │ │ └── test/ │ │ ├── CMakeLists.txt │ │ ├── pbft_operation_manager_test.cpp │ │ ├── pbft_operation_test_common.cpp │ │ └── pbft_persistent_operation_test.cpp │ ├── pbft.cpp │ ├── pbft.hpp │ ├── pbft_base.hpp │ ├── pbft_checkpoint_manager.cpp │ ├── pbft_checkpoint_manager.hpp │ ├── pbft_persistent_state.cpp │ ├── pbft_persistent_state.hpp │ ├── pbft_service_base.hpp │ └── test/ │ ├── CMakeLists.txt │ ├── database_pbft_service_test.cpp │ ├── pbft_audit_test.cpp │ ├── pbft_catchup_test.cpp │ ├── pbft_checkpoint_tests.cpp │ ├── pbft_newview_test.cpp │ ├── pbft_peer_change_test.cpp │ ├── pbft_persistent_state_test.cpp │ ├── pbft_proto_test.cpp │ ├── pbft_proto_test.hpp │ ├── pbft_test.cpp │ ├── pbft_test_common.cpp │ ├── pbft_test_common.hpp │ ├── pbft_timestamp_test.cpp │ └── pbft_viewchange_test.cpp ├── peers_beacon/ │ ├── CMakeLists.txt │ ├── peer_address.hpp │ ├── peers_beacon.cpp │ ├── peers_beacon.hpp │ ├── peers_beacon_base.hpp │ └── test/ │ ├── CMakeLists.txt │ └── peers_beacon_tests.cpp ├── pkg/ │ ├── CMakeLists.txt │ └── debian/ │ ├── CMakeLists.txt │ ├── postinst │ └── postrm ├── policy/ │ ├── CMakeLists.txt │ ├── eviction_base.hpp │ ├── random.cpp │ ├── random.hpp │ ├── test/ │ │ ├── CMakeLists.txt │ │ └── eviction_test.cpp │ ├── volatile_ttl.cpp │ └── volatile_ttl.hpp ├── proto/ │ ├── CMakeLists.txt │ ├── audit.proto │ ├── bluzelle.proto │ ├── database.proto │ ├── pbft.proto │ └── status.proto ├── qa/ │ └── integration-tests.sh ├── scripts/ │ ├── crud │ ├── generate-key │ └── sign_uuid.sh ├── scripts-1.md ├── status/ │ ├── CMakeLists.txt │ ├── status.cpp │ ├── status.hpp │ ├── status_provider_base.hpp │ └── test/ │ ├── CMakeLists.txt │ └── status_test.cpp ├── storage/ │ ├── CMakeLists.txt │ ├── mem_storage.cpp │ ├── mem_storage.hpp │ ├── rocksdb_storage.cpp │ ├── rocksdb_storage.hpp │ ├── storage_base.hpp │ └── test/ │ ├── CMakeLists.txt │ └── storage_test.cpp ├── swarm/ │ ├── CMakeLists.txt │ └── main.cpp ├── utils/ │ ├── CMakeLists.txt │ ├── blacklist.cpp │ ├── blacklist.hpp │ ├── bytes_to_debug_string.cpp │ ├── bytes_to_debug_string.hpp │ ├── crypto.cpp │ ├── crypto.hpp │ ├── esr_peer_info.cpp │ ├── http_req.cpp │ ├── make_endpoint.cpp │ ├── make_endpoint.hpp │ ├── test/ │ │ ├── CMakeLists.txt │ │ ├── make_endpoint_test.cpp │ │ └── utils_test.cpp │ ├── utils_interface.hpp │ └── utils_interface_base.hpp └── valgrind/ ├── bluzelle.supp ├── create_suppressions.sh └── parse_valgrind_suppressions.sh ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .idea/ .state/ build/ logs/ cmake-build-debug/ cmake-build-release/ scripts/bluzelle_pb2.py scripts/database_pb2.py scripts/audit_pb2.py scripts/pbft_pb2.py scripts/status_pb2.py *.pyc *.pem ================================================ FILE: .travis.yml ================================================ sudo: false language: cpp env: global: - PROJECT_VERSION_MAJOR="0" - PROJECT_VERSION_MINOR="7" - PROJECT_VERSION_PATCH="${TRAVIS_BUILD_NUMBER}" - PROJECT_VERSION="${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" - PACKAGE_ARCHITECTURE="amd64" - PACKAGE_NAME="bluzelle-swarmdb" - PACKAGE_NAME_DEB="${PACKAGE_NAME}_${PROJECT_VERSION}_${PACKAGE_ARCHITECTURE}.deb" - PACKAGE_NAME_OSX="${PACKAGE_NAME}_${PROJECT_VERSION}_darwin_${PACKAGE_ARCHITECTURE}.tar.gz" - secure: "vF3zRyPiUm+VOVAq1y6TDGqr5s2XYk7In6Zh8LbX0VNv6ROQ7HEwusbO6tuR4I0Og0m59RplQd3oAr3nxLMN/85YQw1vvVbc+TC1wIenM15bfEgCKjTsiFbIEf7fPgUyqVg/YLGSEsskcXiFrfb5IyFmAj+v37u0N56u4B3/ga82e5RIXvu641z1Ex2sS0L/MhN4TOluI/5ASeg/D6QHKVx59HiX/PjOkWbCKY10p5CzbXgNyik37NrI1ZKnLTtYFCznuPeXpt4Vx0YdCLOaJw4uG2ay2CjayOmOvXlNWb9iHXL5EveovptDhSSqAJjzy+MqwnrjJHsciOBHX2efpeCpSBx6tGw9e8bi6Xg3MJvdPjEcfKoAWBG2MdJUAdGk48eduvdPqnx/Ig7//ez9aYLgbXaac3k09N5SeyPZuRE2mnQoXNcO2ApL3NfOAJ/3WRtFo/scgu8rBfEZrIqy2BAgnOK86TYZwIR1CabQgPDClY9XddcZ+PBQ4a+j/CqDTcjdYR5I7ABV4nPgCU2rheKEhKMv8yw4kFl5U6wFUOtkEdxFJk3+d8oxHPrQf0CDFKovkSEcMzEgcJE1DsVLNzNPlE9y12+Rsopt/fcCNqSvyl22XaI7O9UnE/j+Y2ATlydB+6olEvOEd02K9WYuVUotyeBu4bB8sY0V4VDREUI=" - secure: "Z4h7T0uHpz3WLtX93NckznB/FujL7LncaZdxJQ5DrWOtIpUJA7REix8oMDyTaXqhsksX5x24CdxuArmFkgE5G1xJK7sIgI7R6RlDG0shRyfMBWaB0Olbsxq9FiZb11Cmguq2ANoPdwFj53BwSjLs+8QW7wWx2NE4TF0JWWNBVVi1hcX5cPc2xW8oEy7657mxCTq6/G8upOonMRHmiB3M+u9Xn0Sv7+SCmtkFw6uUSGfRRkwwRl0haf0qwlOg6o6Aihen0zFEM/Rf3imx5JhyxtlW6KQBG8WZOmv2gQ9AXD9sAZG4H52Klr81QIhKrzlQNEoLvPtkhqTFXCGlBRH7bBXbCYRFYhvm8j1ja2tM46wZHwdIx5gtUqLk5+PcNdFEO335003GeOPewzayk44WWkPQyHPkNLTLAnLJawKkSDsLsWIokl0BGz5m2O08GBoohTd0LaOQrEi3npI92s6OasxPh9wcCwYYwGT5WqLmnKc6XRpI5I+RFN6yjPYCYUwgCd5LVkOG5hpvg8tTYG63gxshPJWSWv5yObMPppmObnpQNjPOdw63m9cpnevo2DbGLZsHedDyqMGhjZnn3CG8ZlRQvdPLo56l2gFRxhw8J2xnk1C2ffil8C9IjiTLBK+Y5ALd17BuI40ZA+ClRHy8Z6MFXgMfFlr/YBrUtY3tvGg=" - secure: "Hp7Ww6XhkZvzOsktsaL8lyiMbXLP3u/Entj7UXomywDr7gMIAyoIiD122bZ1Wa+sbNfnNd8lKS1AZxMtwxbhAK9hcB6ZvypAE3i4pfoQWxd4jq3pXltJ2oLbXEWzH1aGcTtibf2vI6WBpI8mPGWrykBeQfCzd0qs6t5pNzeA43ta77WCADWJivxe69l4rqxUGmXZVbGzApUgn5UP7FTscuByitQm6KPft63sre6aSC1P9FKWD4VOFlDqol3v+Bsmn05bNc9a/UuLq/C6vSa6BxsJpalMIRtlXE+MRXVpYxnBNS1UlH+8LA6txG3fwisyvwXG5KjO4tDuVLIYzuK1+TBCCnFBbTJ+2aCZ9iR7sA34A+AUbF2JyTfGtR4RnOd2cMgGuWgn1ASoe2c5GE45aK/s+ijDsKpzzHl8gR3QJS7yd0U/KCgnW3bsq4mRq95sjA/5MZuS2gmIpMS0JoprLmjXikZLI3LDQc8VHqK5U2ne/W7xZyszc57IlJI6HiL2v2yw25m8/yna7PXyAYFPsZ8LRzoZJvq/uBVh8sAnhpgMfQ5FxOuJGvhH56UjvcXqIYfz1a4ELIl8b2rLq6M1qUWYHwlTq8xHHhWShQBpfEiZQBncD0+K7LO7KhJb78sqJcbMFcgsWooKqlsElGQwK92BUkECRu8eC4n8uaaJ/GM=" - secure: "D3BGFKFKHDG0ajTpvEAP7poQmOvSUq2l7jG9q7hK+xHDRKBhM7YfSUJicz5H358VBKURoURLbykq3WXw/gpzTSVqpusXJ4UjGiAZLRXHlTsyXW0IVGvXXPx53SiJkHbfVC/3MK22rzV9LYR3wxEt7k9xKLfRGBr+tAiTzi/ikox/4ibIx6cb0PQGrVTbeoSJfJfF6VQvzeaoST7K9CREJGb9PuLpiXPRt0CIeY5Y1r7+HCJSzO2XWX+8i+DpMB7ZItQjrt09vaoDoUS5WPxL92+S8nrWNH++LhEzvq1PTtZs0bQkLHG+zfrM/5j2Q34HP6QZceVSixMzEz2l9wE0lZI5d21udnh1CApbaZvHHvLuR7cvZGv6VCNZefZhKTsDAs+GRMYLhZgauqxnOxug0ZO8ErLHJ0K87l/U0krBUCtMTO5FPodEPahXVOe9UXlBnl8FFhihQ4VB23TXWbFy0qa1M1iCV3jT27hpDHCmPuD5KwGWzDITrnaC0+YzQpmOuZKLB/wlQdJD7XmRkV3OCye1ejwFpwCD1SMJLZBTd4rReAgxxgT4f0xq/IuoGORvAXYDbZeYNrISYrxN8u6LAAc56IDQ7F8nZO/l85gPZaSrkzL4zeuDhWsMr/SBysBL2XlwhL9iSYHWEhgr67hJVOzVUqpMCH6nr2Y8hc4cK1w=" matrix: include: - os: linux dist: xenial addons: apt: sources: - ubuntu-toolchain-r-test - sourceline: 'deb [trusted=yes] http://ppa.launchpad.net/maarten-fonville/protobuf/ubuntu xenial main' packages: - g++-7 - pkg-config - protobuf-compiler - libprotobuf-dev - libsnappy-dev - libbz2-dev env: - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7" - CMAKE_URL="https://cmake.org/files/v3.12/cmake-3.12.1-Linux-x86_64.tar.gz" - CMAKE_COMMAND="$HOME/.local/bin/cmake -DPMD_EXE=$HOME/pmd-bin-6.6.0/bin/run.sh ${CMAKE_OPTIONS}" cache: directories: - $HOME/.local before_install: - eval "${MATRIX_EVAL}" - mkdir -p $HOME/.local - | pip install --user cpp-coveralls if [ ! -e $HOME/.local/bin/cmake ]; then echo "CMake not found in the cache, get and extract it..." travis_retry curl -L ${CMAKE_URL} \ | tar -xz -C $HOME/.local --strip-components=1 else echo "Using cached CMake" fi - | if [ ! -e $HOME/pmd-bin-6.6.0/bin/run.sh ]; then echo "PMD not found in the cache, get and extract it..." cd $HOME travis_retry curl -OL "https://github.com/pmd/pmd/releases/download/pmd_releases%2F6.6.0/pmd-bin-6.6.0.zip" unzip pmd-bin-6.6.0.zip rm pmd-bin-6.6.0.zip else echo "Using cached PMD" fi compiler: - gcc before_script: - cd ${TRAVIS_BUILD_DIR} - mkdir build - cd build - > if { [ "$TRAVIS_BRANCH" = "master" ] || [[ $TRAVIS_BRANCH == *"release"* ]]; } && [ $TRAVIS_OS_NAME = "linux" ] ; then ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=RelWithDebInfo -DPROJECT_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} -DPROJECT_VERSION_MINOR=${PROJECT_VERSION_MINOR} -DPROJECT_VERSION_PATCH=${PROJECT_VERSION_PATCH} .. else ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -DENABLE_GCOV=ON -DPROJECT_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} -DPROJECT_VERSION_MINOR=${PROJECT_VERSION_MINOR} -DPROJECT_VERSION_PATCH=${PROJECT_VERSION_PATCH} .. fi script: - ${CXX} --version - echo CXXFLAGS=${CXXFLAGS} - git lfs install - git lfs pull - make -j2 - make static_analysis - ctest - make package after_success: - coveralls -r ${TRAVIS_BUILD_DIR} -e 'build/boost' -e 'build/openssl' -e 'build/rocksdb' -e 'build/jsoncpp' -e 'build/googletest' -e 'build/proto' -e 'build/CMakeFiles' -e 'build/swarm_version.hpp' -e 'audit/test' -e 'bootstrap/test' -e 'chaos/test' -e 'crud/test' -e 'crypto/test' -e 'ethereum/test' -e 'http/test' -e 'mocks' -e 'node/test' -e 'options/test' -e 'pbft/test' -e 'status/test' -e 'storage/test' -e 'swarm' -e 'include' -e 'utils/test' --gcov-options '\-lp' - echo ${TRAVIS_BRANCH} - if [ "$TRAVIS_BRANCH" = "master" ] ; then PACKAGE_COMPONENT="stable" ; else PACKAGE_COMPONENT="unstable" ; fi - | if [ "$TRAVIS_BRANCH" = "master" ] || [ "$TRAVIS_BRANCH" = "devel" ] || [[ $TRAVIS_BRANCH == *"release"* ]]; then travis_retry curl -u${REPO_USER}:${REPO_PASSWORD} -XPUT "https://bluzelle.jfrog.io/bluzelle/debian-local/pool/${PACKAGE_NAME_DEB};deb.distribution=all;deb.component=${PACKAGE_COMPONENT};deb.architecture=${PACKAGE_ARCHITECTURE}" -T ${TRAVIS_BUILD_DIR}/build/${PACKAGE_NAME_DEB} fi if [ "$TRAVIS_BRANCH" = "master" ] ; then git lfs fetch --all git tag ${PROJECT_VERSION} git remote add origin-swarm https://${GITHUB_TOKEN}@github.com/bluzelle/swarmdb.git > /dev/null 2>&1 git push --quiet --set-upstream origin-swarm ${TRAVIS_BRANCH} --tags fi ================================================ FILE: CMakeLists.txt ================================================ cmake_minimum_required(VERSION 3.10) project(bluzelle CXX) # ensure type is set if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug) endif() include(cmake/swarm_version.cmake) message("Build version ${PROJECT_VERSION}") # Setup version header configure_file(${PROJECT_SOURCE_DIR}/cmake/swarm_version.hpp.in ${CMAKE_BINARY_DIR}/swarm_version.hpp.tmp) execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/swarm_version.hpp.tmp ${CMAKE_BINARY_DIR}/swarm_version.hpp) execute_process(COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/swarm_version.hpp.tmp) include_directories(${CMAKE_BINARY_DIR}) # hides path bug! # use ccache if available... find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) endif(CCACHE_FOUND) # output dir set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output) # compiler options... set(CMAKE_CXX_STANDARD 17) add_compile_options("-fdiagnostics-color=auto") add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY) # todo: remove -Wno-implicit-fallthrough once CI moves past gcc 7.4.0... set(warnings "-Wall -Wextra -Werror -Wpedantic -Wno-implicit-fallthrough") if (APPLE) set(warnings "${warnings} -Wno-invalid-offsetof") else() # for beast and gcc release builds... if("${CMAKE_BUILD_TYPE}" STREQUAL "Release") set(warnings "${warnings} -Wno-maybe-uninitialized") endif() # todo: these may no longer be required... if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 9.2) message(STATUS "GCC ${CMAKE_CXX_COMPILER_VERSION} warning workaround: -Wno-deprecated-copy -Wno-sign-compare (Still needed?)") set(warnings "${warnings} -Wno-deprecated-copy -Wno-sign-compare") endif() endif() set(CMAKE_CXX_FLAGS ${warnings}) # old or new way? if(NOT BUILD_DEPEND) add_subdirectory(depend) else() include(cmake/boost.cmake) include(cmake/rocksdb.cmake) include(cmake/jsoncpp.cmake) include(cmake/googletest.cmake) include(cmake/openssl.cmake) endif() # find packages include(cmake/add_gmock_test.cmake) set(Protobuf_USE_STATIC_LIBS ON) include(FindProtobuf) find_package(Protobuf REQUIRED) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(SYSTEM ${PROTOBUF_INCLUDE_DIR}) enable_testing() # coverage? if (ENABLE_GCOV) if (NOT APPLE) set(COVERAGE_COMPILER_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage" CACHE INTERNAL "") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}") message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}") endif() endif() add_subdirectory(proto) set(BLUZELLE_STD_INCLUDES ${Boost_INCLUDE_DIRS} ${GTEST_INCLUDE_DIR} ${JSONCPP_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR} ${PROTO_INCLUDE_DIRS} ${ROCKSDB_INCLUDE_DIRS}) add_subdirectory(peers_beacon) add_subdirectory(crud) add_subdirectory(node) add_subdirectory(options) add_subdirectory(pkg) add_subdirectory(status) add_subdirectory(storage) add_subdirectory(swarm) add_subdirectory(utils) add_subdirectory(audit) add_subdirectory(pbft) add_subdirectory(chaos) add_subdirectory(crypto) add_subdirectory(monitor) add_subdirectory(mocks) add_subdirectory(policy) include(cmake/static_analysis.cmake) # git commit used to build add_custom_command( OUTPUT swarm_git_commit COMMENT "Generating swarm_git_commit.hpp" COMMAND ${CMAKE_COMMAND} -D PROJECT_SOURCE_DIR=${CMAKE_SOURCE_DIR} -D PROJECT_BINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_SOURCE_DIR}/cmake/git_commit.cmake WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) add_custom_target(swarm-git-commit ALL DEPENDS swarm_git_commit) # enable valgrind for CI... if(ENABLE_MEMCHECK) # todo: add to CI: ctest --test-action memcheck if(NOT APPLE) set(MEMORYCHECK_SUPPRESSIONS_FILE ${PROJECT_SOURCE_DIR}/valgrind/bluzelle.supp) set(VALGRIND_COMMAND_OPTIONS "--error-exitcode=1 --leak-check=full --show-reachable=yes --error-limit=no --gen-suppressions=all") include(CTest) endif() endif() ================================================ FILE: CONTRIBUTOR.md ================================================ # Contributing to Bluzelle Welcome to wanting to contribute to Bluzelle! Thank you for taking your time to contribute. The following is a set of guidelines for contributing to the Bluzelle ecosystem (this includes swarmDB, the drivers, and more). These are of course mostly just guidelines, not rules. Feel free to use your best judgement, and you can always contribute proposals to change this guide via a pull request! #### Table Of Contents [Code of Conduct](#code-of-conduct) [The Quick Start Guide](#the-quick-start-guide) [Getting Started](#getting-started) [How Can I Contribute?](#how-can-icontribute) [Coding Style Guide](#coding-style-guide) ## Code of Conduct This project and its participants are governed by the [Bluzelle Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project, you are expected to uphold the code. Report unacceptable behaviour to [opensource@bluzelle.com](mailto:opensource@bluzelle.com). The general idea here is that you should be **respectful**, **positive** and **considerate**. When asking questions, please be **patient** for a response, **specific** in what you are asking, and always think **collaboratively**. You are reminded that you should not **spam**, post links to sites that violate our Terms of Use, or post third party advertisements. ## The Quick Start Guide Join our community resources: * [mailing list](https://groups.google.com/forum/#!forum/bluzelle) - this is the Google group where Bluzelle developers discuss development plans. Users are also encourage to ask questions here. You can either subscribe to the list, or read it as a forum. * [Gitter](https://gitter.im/bluzelle) - if chat is something you prefer, and you're looking for answers quicker, get to the Bluzelle Gitter community. We have several rooms and you could post to the Lobby or anywhere you feel is appropriate. Remember though that you *may* not get answers immediately, as the Bluzelle project is distributed worldwide, and it might take some time for you to get an answer. Please be patient. ## Getting Started Bluzelle is growing to be a large open source project. There are many repositories on [GitHub](http://github.com/bluzelle) and it is a good idea to familiarise yourself with them. * [bluzelle/swarmDB](https://github.com/bluzelle/swarmDB) - this is the core Bluzelle decentralised database. Do pay attention to the branches within swarmDB as there are plenty! ### Client Libraries * [pyBluzelle](https://github.com/bluzelle/pyBluzelle) - this is the Python client library for Bluzelle swarmDB. * [swarmclient-js](https://github.com/bluzelle/swarmclient-js) - this is the JavaScript client library for Bluzelle swarmDB. * [bluzelle-php](https://github.com/bluzelle/bluzelle-php) - this is the PHP client library for Bluzelle swarmDB. * [swarmclient-rb](https://github.com/bluzelle/swarmclient-rb) - this is the Ruby client library for Bluzelle swarmDB. ## How Can I Contribute? ### How to report bugs The Swarmdb project is tracking issues within github issues. If you find a bug within the software or documentation please open a new [issue](https://github.com/bluzelle/swarmDB/issues). Your bug will be placed on our backlog and addressed based on priotiry. ### How do I suggest enhancements? Enhancements can be requested in two ways. 1. Like bugs you can open a new [issue](https://github.com/bluzelle/swarmDB/issues) 2. More proactively you can make the code or documentation change and submit it as a pull request ### Making your first code contribution ### Branching Model Basic standards will be in place across all Bluzelle repositories that are based off the [Git Flow model](https://datasift.github.io/gitflow/IntroducingGitFlow.html). Below you will find a description of each branch and it’s intended purpose. #### Devel **Branch**: Devel **Purpose**: The Devel branch the official integration branch. **Perquisite for commits**: Merges to this branch are by pull request only and must pass the Travis Build and have at least one code review. Any committer can merge a pull request once the above requisites are satisfied. Only squash merges are allowed in this branch. **Tags**: None **Build artifacts**: Build automation may push to an “unstable” repository for testing #### Master **Branch**: Master **Purpose**: Master will ***ONLY*** have commits related to official releases (major, minor and patch). **Prerequisite for commit**: Merges to this branch are by pull request only and must pass the Travis Build and have at least one code review. ONLY official branch owners can merge a pull request. Only merges are allowed on this branch. **Tags**: `${major}-${minor}-${TRAVIS-BUILD}` **Build artifacts**: Build automation must push to an official repo either public or the Bluzelle artifactory repositories #### Feature Branch **Branch**: `/task/${username}/${taskname}` **Purpose**: This is a feature branch and is meant to last for the duration of feature development. There is no implication of stability in a feature branch and developers have absolute freedom on what happens within these branches. After merging to the devel branch the feature branch is deleted. **Prerequisite for commit**: None **Tags**: None **Build artifacts**: None #### Commit Messages Commit messages must follow the basic structure in the example provided below. An “issuekey” may be either a GitHub Issue or Jira Issue. Commit messages will contain a single line description of the change, followed by a more in depth description of the commit. Example: ~~~~ ${issuekey} This is a one line commit message This is a longer commit paragraph for more detail. It may also contain bullet points: feature change 1 feature change 2 side effect 1 ~~~~ ### Pull requests and signing the Bluzelle Contributor License Agreement (CLA) Once you have submitted a pull request, you will also have to sign the Bluzelle Contributor License Agreement (CLA). This is done automatically, as long as you have a GitHub account, and submit the pull request. Without signing the CLA, your contribution cannot be accepted and there will be no review for the pull request to get it merged. We use an automated platform to track digital signatures tied to your GitHub username. ## Coding Style Guide Use this document as a guideline, if you don't find what you need here please contact a Bluzelle employee with your comments or suggestions. Another great resource is the Google C++ Style guide (https://google.github.io/styleguide/cppguide.html) ### Project Layout * CMake is used to generate a build environment. (ie. makefiles, xcode project etc.) * Source and test file naming is based on the class being defined/tested: ex. node module node ├── CMakeLists.txt ├── node_base.hpp ├── node.cpp ├── node.hpp ├── session_base.hpp ├── session.cpp ├── session.hpp └── test ├── CMakeLists.txt ├── node_test.cpp └── session_test.cpp ### Code style * Write your code as though you are writing it for publication. * Your code should compile with no warnings using the C++ 17 flag. * Allman coding style using 4 space characters for indentation. (https://en.wikipedia.org/wiki/Indentation_style#Allman_style) * Try to limit line length to 120 characters. Continuation of code should be the next line with one indentation level. * Header files should use newer "#pragma once" instead of traditional #ifdef guard macros. * Source and test file naming is based on the class being defined/tested: class this_is_an_example: { ... this_is_an_example.hpp this_is_an_example.cpp this_is_an_example_test.cpp * When modifying existing code continue the style that it was created to maintain consistency. * Function/method definitions should have return type on a separate line: bool class::method() { ... return true; } * Use #include for POD types such as uint32_t, uint64_t etc. * Do not use "auto" for POD types * Use auto for types that can not be defined or are rather verbose such as a lambda or an iterator. * Use snake case for class & variable naming: class this_is_snake_case { ... variables: uint32_t widget_count; * Class layout should be public, protected & private: class foo { public: // initialization list layout example... foo(uint32_t foo_counter, uint32_t max_widgets) : foo_counter(foo_counter) , max_widgets(max_widgets) { } private: uint32_t foo_counter = 0; // prefer class initialization of variable if not passed through constructor const uin32_t max_widgets; }; * Constructor layout should align with the first parameter: foo::foo(unsigned int age, float weight_in_tonnes, string name, string city, string country) : this->age(age) , this->weight_in_tonnes(weight_in_tonnes) , this->name(name) , this->city(city) , this->country(country) { ... } * Do not use Hungarian notation. * Class and variable names should be descriptive; avoid abbreviation unless using a standard nomenclature such as TCP, UDP, HTTP & CURL. * Code within namespace should be indented * Even single lines of code for conditionals and loops should be enclosed by braces. switch(my_value) { case MY_CONST_GLOBAL: { ... } break; default: { ... } break; } * When using multiple levels of namespaces use c++17's syntax: namespace bzn::utils { class .... * Use "using namespace" sparingly and only where you should follow the DRY principle. * Use Test Driven Development * Use CI's code coverage reporting to help identify untested code and exception cases * Create a mockable interface class to help test code that would require complex setup or dependencies such as a server class foo_base { public: virtual ~foo_base() = default; void function_one() const = 0; ... * Do not use dynamic cast unless there is a very compelling reason * Const casts are not to be used under any circumstances * Reinterpret casts are only to be used in situations where “void” pointers are being upcast * Const should be used in every place it can be used. For example, imagine the following function get_window in some class prototype: const Window* get_window(const Foo* const some_variable_name) const * Derived classes from an interface should be marked as final unless the intent is to use it as a base class. * Use references everywhere applicable for function parameters. * Globals will be declared const within an unnamed namespace namespace { const uint32_t MY_CONST_GLOBAL = 1337; } * As a fundamental principle, there should be no entropy whatsoever in the code.Some common examples of entropy include the use of static initialization where the order of instantiation is often non-deterministic. * Variable names must CLEARLY describe the type and usage * Use std::shared_ptr & std::unique_ptr instead of raw pointers. * Use const where possible (functions & variables) * Do not use typedef, but use "using xyz_t" language feature where new types have a suffix of _t: using foo_count_t = uint32_t; * Use new enum classes and specify size type: enum class state : uint8_t { ... * Access member variables and functions always using the "this->" pointer. Do not mark member variables with a prefix/postfix pattern. this->function_one(); this->a_member_variable = 0; * Use Doxygen style comments for all public methods. Base class should have them and derived classes do not require it. * Comment any code that is not obvious, in terms of what it does. * Reference symbol should be added to the type and not the variable. void function(const some_type& my_type); ### Best practices * Follow SOLID & DRY principles Keep functions small and focused. (https://en.wikipedia.org/wiki/SOLID) * Before writing new code to support a feature, follow these steps: 1. Check the C++ std library algorithms etc. 2. If not in std library then look at boost. 3. If boost can't help then consult with the Bluzelle team, third party libraries 4. If you can't find a third party library then consider implementing your own. * #includes should use and not "header_file.hpp" #include #include #include #include * Preferred include ordering: 1. global project headers 2. current lib/code headers 3. other project lib headers 4. third_party lib headers 5. standard headers * Use functional style as apposed to raw loops such has std::find_if, std::remove_if etc. * Use exceptions only when the code can not function with out "something". Typically this would be during construction of a class. * Long functions are difficult to change and difficult to understand. Each function should attempt to do exactly one thing. You should be able to sum it up in one sentence (and the method name should be a summary of that sentence). If you find a function is getting too long, split it into sensible parts. * Functions taking large numbers of parameters (ie: more than six) are a generally a bad idea and are indicative of either a function trying to do too much or poor class organization. Split the function up into sensible parts. * Conditionals and loops should not be nested more than three deep. Any such code needs to be refactored. Either pull the inner parts of the code into separate methods or pull the complex conditions into functions. A line of code should never exceed approximately seventy characters. ================================================ FILE: LICENSE ================================================ GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU Affero General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Remote Network Interaction; Use with the GNU General Public License. Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . ================================================ FILE: README.md ================================================ # SwarmDB [![Build Status](https://travis-ci.org/bluzelle/swarmDB.svg?branch=devel)](https://travis-ci.org/bluzelle/swarmDB) [![Coverage Status](https://coveralls.io/repos/github/bluzelle/swarmDB/badge.svg?branch=devel)](https://coveralls.io/github/bluzelle/swarmDB?branch=devel) [![License](https://img.shields.io/:license-AGPLv3-blue.svg?style=flat-square)](https://github.com/bluzelle/swarmDB/blob/devel/LICENSE) [![Twitter](https://img.shields.io/badge/twitter-@bluzelle-blue.svg?style=flat-square)](https://twitter.com/BluzelleHQ) [![Gitter chat](https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square)](https://gitter.im/bluzelle) ## ABOUT SWARMDB Bluzelle brings together the sharing economy and token economy. Bluzelle enables people to rent out their computer storage space to earn a token while dApp developers pay with a token to have their data stored and managed in the most efficient way. ## Getting started with Docker If you want to deploy your swarm immediately you can use our docker-compose quickstart instructions: ### Install Docker [Docker Installation Guide](https://docs.docker.com/install/) 1. Setup a local docker-compose swarm with the instructions found [here](https://github.com/bluzelle/docker-swarm-deploy) 2. Run `docker-compose up` in the same directory of your docker-compose.yml. This command will initialize the swarm within your local docker-machine. Full docker-compose documentation can be found [here](https://docs.docker.com/compose/) 3. Nodes are available on localhost port 51010-51012 4. [Connect a test websocket client](https://github.com/bluzelle/swarmDB#testing-locally) 5. Create a node server application using our node.js [library](https://github.com/bluzelle/bluzelle-js) 6. `CTRL-C` to terminate the docker-compose swarm ## Getting started building from source ### Installation - Ubuntu **CMake (Ver. 3.10 or greater) etc.** On Ubuntu 18.04 and newer, you can simply install via `apt`. ```text $ sudo apt-get install cmake ``` If your system packages don't have a new enough version, you can install a different CMake into `~/mycmake/` to avoid overwriting your system's `cmake`. ```text $ sudo apt-get install curl libcurl4-openssl-dev $ mkdir -p ~/mycmake $ curl -L http://cmake.org/files/v3.11/cmake-3.11.0-Linux-x86_64.tar.gz | tar -xz -C ~/mycmake --strip-components=1 ``` You would then use `~/mycmake/bin/cmake ..` instead of `cmake ..` in further instructions. **Protobuf \(Ver. 3 or greater\) etc.** ```text $ sudo apt-add-repository ppa:maarten-fonville/protobuf $ sudo apt-get update $ sudo apt-get install pkg-config protobuf-compiler libprotobuf-dev libsnappy-dev libbz2-dev ``` **ccache \(Optional\)** If available, cmake will attempt to use ccache \([https://ccache.samba.org](https://ccache.samba.org)\) to _drastically_ speed up compilation. ```text $ sudo apt-get install ccache ``` **Git LFS \(Optional\)** Git LFS is currently being used to speed up builds if available. ```text $ sudo apt-get install git-lfs $ git lfs install ``` ### Building the Daemon from Command Line Interface \(CLI\) **Note**: Git LFS is used by default. If you do not have it set up, you must build the dependencies by setting `BUILD_DEPEND=YES` in your `cmake` call, e.g. `cmake .. -DBUILD_DEPEND=YES`, and omit the `git lfs` commands. Here are the steps to build the Daemon and unit test application from the command line: ```text $ mkdir build $ cd build $ cmake .. $ git lfs install $ git lfs pull $ sudo make install ``` ### Deploying the Daemons #### The Bluzelle Configuration File The Bluzelle daemon is configured by setting the properties of a JSON configuration file provided by the user. This file is usually called *bluzelle.json* and resides in the current working directory. To specify a different configuration file the daemon can be executed with the -c command line argument: $ swarm -c peer0.json The configuration file is a JSON format file, as seen in the following example: { "listener_address" : "127.0.0.1", "listener_port" : 50000, "bootstrap_file" : "/home/isabel/swarmdb/local/nodes/peers.json", "debug_logging" : true, "log_to_stdout" : true, "use_pbft": true, "bootstrap_file": "./peers.json", "stack" : "testnet-dev" } The complete documentation of the options available for this file is given by $ swarm --help but the properties likely useful for a minimal swarm are summarized here: - "bootstrap_file" - path to peers file (see below) - "debug_logging" - show more log info - "listener_address" - the ip address that SwarmDB will listen on (this should be "127.0.0.1" unless you are doing something fancy) - "listener_port" - the port that SwarmDB will listen on (each node running on the same host should use a different port) - "log_to_stdout" (optional) - log to stdout as well as log file - "uuid" - the universally unique identifier that this instance of SwarmDB will use to uniquely identify itself. This should be specified if and only if node cryptography is disabled (the default) - otherwise, nodes use their private keys as their identifier. - "stack" - software stack used by swarm #### The Bluzelle Bootstrap File The bootstrap file, identified in the config file by the "bootstrap_file" parameter, see above, provides a list of nodes in the the swarm that the local instance of the SwarmDB daemon can communicate with. If the membership of the swarm has changed, these nodes will be used to introduce the node to the current swarm and catch it up to the current state, and the bootstrap file acts as a "starting peers list". If you are running a static testnet (i.e., nodes do not join or leave the swarm) then every node should have the same bootstrap_file, and it should include an entry for every node. Thus, each node will appear in its own bootstrap file. If a node is not already in the swarm when it starts (i.e., it should dynamically join the swarm) then it should not be in its own bootstrap file. The booststrap file format is a JSON array, containing JSON objects describing nodes as seen in the following example: [ { "host": "127.0.0.1", "name": "peer0", "port": 49152, "uuid": "d6707510-8ac6-43c1-b9a5-160cf54c99f5" }, { "host": "127.0.0.1", "name": "peer1", "port": 49153, "uuid": "5c63dfdc-e251-4b9c-8c36-404972c9b4ec" }, ... { "host": "127.0.0.1", "name": "peer1", "port": 49153, "uuid": "ce4bfdc-63c7-5b9d-1c37-567978e9b893a" } ] where the Peer object parameters are (ALL PARAMETERS MUST MATCH THE PEER CONFIGURATION): - "host" - the IP address associated with the external node - "name" - the human readable name that the external node uses - "port" - the socket address that the external node will listen for protobuf and web socket requests. (listen_port in the config file) - "uuid" - the universally unique identifier that the external node uses to uniquely identify itself. This is required to be unique per node and consistent between the peerlist and the config. Note that if node cryptography is enabled (see swarmdb --help), node uuids are their public keys. #### Steps to setup and run Daemon: 1. Create each of the JSON files as described above in swarmDB/build/output/, where the swarm executable resides. \(bluzelle.json, bluzelle2.json, bluzelle3.json, bluzelle4.json, peers.json\). 2. Create an account with Etherscan: [https://etherscan.io/register](https://etherscan.io/register) 3. Create an Etherscan API KEY by clicking Developers -> API-KEYs. 4. Add your Etherscan API KEY Token to the configuration files. 5. Modify the `ethereum` address to be an Ethereum mainnet address that contains tokens or use the sample address provided above. 6. Ensure that each swarmdb instance is configured to listen on a different port and has a different uuid, and that the peers file contains correct uuids and addresses for all nodes 7. Deploy your swarm of Daemons. From the swarmDB/build/output/ directory, run: ```text $ ./swarm -c bluzelle.json $ ./swarm -c bluzelle2.json $ ./swarm -c bluzelle3.json ``` ## Integration Tests With Bluzelle's Javascript Client ### Installation - macOSX #### Homebrew ```text $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" ``` #### Node ```text $ brew install node ``` #### Yarn ```text $ brew install yarn ``` ### Installation - Ubuntu #### NPM ```text $ sudo apt-get install npm ``` #### Update NPM ```text $ sudo npm install npm@latest -g ``` #### Yarn ```text $ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list $ sudo apt-get update && sudo apt-get install yarn ``` ### Running Integration Tests Script to clone _bluzelle-js_ repository and copy template configuration files or run tests with your configuration files. ```text $ qa/integration-tests setup // Sets up template configuration files ``` ```text $ qa/integration-tests // Runs tests with configuration files you've created ``` ## Testing Locally ```text $ cd scripts Follow instructions in readme.md ``` #### Connectivity Test ```text $ ./crud -s -n localhost:49154 status Client: crud-script-0 Sending: swarm_id: "" sender: "crud-script-0" status_request: "" ------------------------------------------------------------ Response: swarm_version: "0.3.1443" swarm_git_commit: "0.3.1096-41-g91cef89" uptime: "1 days, 17 hours, 29 minutes" module_status_json: ... pbft_enabled: true Response: { "module" : [ { "name" : "pbft", "status" : { "is_primary" : false, "latest_checkpoint" : { "hash" : "", "sequence_number" : 3800 }, "latest_stable_checkpoint" : { "hash" : "", "sequence_number" : 3800 }, "next_issued_sequence_number" : 1, "outstanding_operations_count" : 98, "peer_index" : [ { "host" : "127.0.0.1", "name" : "node_0", "port" : 50000, "uuid" : "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/HIPqL97zXbPN8CW609Dddu4vSKx/xnS1sle0FTgyzaDil1UmmQkrlTsQQqpU7N/kVMbAY+/la3Rawfw6VjVpA==" }, { "host" : "127.0.0.1", "name" : "node_1", "port" : 50001, "uuid" : "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELUJ3AivScRn6sfBgBsBi3I18mpOC5NZ552ma0QTFSHVdPGj98OBMhxMkyKRI6UhAeuUTDf/mCFM5EqsSRelSQw==" }, { "host" : "127.0.0.1", "name" : "node_2", "port" : 50002, "uuid" : "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEg+lS+GZNEOqhftj041jCjLabPrOxkkpTHSWgf6RNjyGKenwlsdYF9Xg1UH1FZCpNVkHhCLi2PZGk6EYMQDXqUg==" } ], "primary" : { "host" : "127.0.0.1", "host_port" : 50001, "name" : "node_1", "uuid" : "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELUJ3AivScRn6sfBgBsBi3I18mpOC5NZ552ma0QTFSHVdPGj98OBMhxMkyKRI6UhAeuUTDf/mCFM5EqsSRelSQw==" }, "unstable_checkpoints_count" : 0, "view" : 1 } } ] } ------------------------------------------------------------ ``` #### Create database ```text ./crud -s -n localhost:50000 create-db -u myuuid Client: crud-script-0 ------------------------------------------------------------ Response: header { db_uuid: "myuuid" nonce: 2998754133578549919 } ------------------------------------------------------------ ``` #### Create ```text $ ./crud -s -n localhost:50000 create -u myuuid -k mykey -v myvalue Client: crud-script-0 ------------------------------------------------------------ Response: header { db_uuid: "myuuid" nonce: 9167923913779064632 } ------------------------------------------------------------ ``` #### Read ```text $ ./crud -s -n localhost:50000 read -u myuuid -k mykey Client: crud-script-0 ------------------------------------------------------------ Response: header { db_uuid: "myuuid" nonce: 1298794800698891064 } read { key: "mykey" value: "myvalue" } ------------------------------------------------------------ ``` #### Update ```text $ ./crud -s -n localhost:50000 update -u myuuid -k mykey -v mynewvalue Client: crud-script-0 ------------------------------------------------------------ Response: header { db_uuid: "myuuid" nonce: 9006453024945657757 } ------------------------------------------------------------ ``` #### Delete ```text $ ./crud -s -n localhost:50000 delete -u myuuid -k mykey Client: crud-script-0 ------------------------------------------------------------ Response: header { db_uuid: "myuuid" nonce: 7190311901863172254 } ------------------------------------------------------------ ``` #### Subscribe ```text $ ./crud -s -n localhost:50000 subscribe -u myuuid -k mykey Client: crud-script-0 ------------------------------------------------------------ Response: header { db_uuid: "myuuid" nonce: 8777225851310409007 } ------------------------------------------------------------ Waiting.... Response: header { db_uuid: "myuuid" nonce: 8777225851310409007 } subscription_update { key: "mykey" value: "myvalue" } ------------------------------------------------------------ Waiting.... ``` #### Delete database ```text ./crud -s -n localhost:50000 delete-db -u myuuid Client: crud-script-0 ------------------------------------------------------------ Response: header { db_uuid: "myuuid" nonce: 1540670102065057350 } ------------------------------------------------------------ ``` #### Adding or Removing A Peer Dynamically adding and removing peers is not supported in this release. This functionality will be available in a subsequent version of swarmDB. #### Help & Options ```text $ ./crud --help usage: crud [-h] [-p] [-i ID] -n NODE {status,create-db,delete-db,has-db,writers,add-writer,remove-writer,create,read,update,delete,has,keys,size,subscribe} ... crud positional arguments: {status,create-db,delete-db,has-db,writers,add-writer,remove-writer,create,read,update,delete,has,keys,size,subscribe} status Status create-db Create database delete-db Delete database has-db Has database writers Database writers add-writer Add database writers remove-writer Remove database writers create Create k/v read Read k/v update Update k/v delete Delete k/v has Determine whether a key exists within a DB by UUID keys Get all keys for a DB by UUID size Determine the size of the DB by UUID subscribe Subscribe and monitor changes for a key optional arguments: -h, --help show this help message and exit -i ID, --id ID Crud script sender id (default 0) -s , Swarm id --swarm_id required arguments: -n NODE, --node NODE node's address (ex. 127.0.0.1:51010) ================================================ FILE: SUMMARY.md ================================================ # Table of contents * [SwarmDB](README.md) * [Python CRUD Test App](scripts-1.md) ================================================ FILE: audit/CMakeLists.txt ================================================ add_library(audit audit_base.hpp audit.hpp audit.cpp ../mocks/mock_pbft_base.hpp) target_link_libraries(audit utils proto) add_dependencies(audit boost jsoncpp) target_include_directories(audit PRIVATE ${BLUZELLE_STD_INCLUDES}) add_subdirectory(test) ================================================ FILE: audit/audit.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include using namespace bzn; audit::audit(std::shared_ptr io_context , std::shared_ptr node , size_t mem_size , std::shared_ptr monitor ) : node(std::move(node)) , io_context(std::move(io_context)) , primary_alive_timer(this->io_context->make_unique_steady_timer()) , mem_size(mem_size) , monitor(std::move(monitor)) { } void audit::start() { std::call_once(this->start_once, [this]() { this->node->register_for_message(bzn_envelope::kAudit, std::bind(&audit::handle, shared_from_this(), std::placeholders::_1, std::placeholders::_2)); LOG(debug) << "starting primary alive timer"; this->reset_primary_alive_timer(); }); } void audit::reset_primary_alive_timer() { this->primary_dead_count = 0; this->primary_alive_timer->cancel(); this->primary_alive_timer->expires_from_now(this->primary_timeout); this->primary_alive_timer->async_wait(std::bind(&audit::handle_primary_alive_timeout, shared_from_this(), std::placeholders::_1)); } void audit::handle_primary_alive_timeout(const boost::system::error_code& ec) { if (ec && ec != boost::system::errc::operation_canceled) { LOG(trace) << "primary alive timeout canceled " << ec.message(); return; } if (ec == boost::system::errc::operation_canceled) { LOG(trace) << "primary still alive"; return; } this->monitor->send_counter(bzn::statistic::pbft_no_primary); this->primary_alive_timer->expires_from_now(this->primary_timeout); this->primary_alive_timer->async_wait(std::bind(&audit::handle_primary_alive_timeout, shared_from_this(), std::placeholders::_1)); } void audit::handle(const bzn_envelope& env, std::shared_ptr /*session*/) { audit_message message; if (!message.ParseFromString(env.audit())) { LOG(error) << "failed to parse audit message from " << env.sender(); } LOG(trace) << "got audit message" << message.DebugString(); if (message.has_pbft_commit()) { this->handle_pbft_commit(message.pbft_commit()); } else if (message.has_primary_status()) { this->handle_primary_status(message.primary_status()); } else if (message.has_failure_detected()) { this->handle_failure_detected(message.failure_detected()); } else { LOG(error) << "got an unknown audit message? " << message.DebugString(); } } void audit::handle_primary_status(const primary_status& primary_status) { std::lock_guard lock(this->audit_lock); if (this->recorded_primaries.count(primary_status.view()) == 0) { LOG(info) << "observed primary of view " << primary_status.view() << " to be '" << primary_status.primary() << "'"; this->monitor->send_counter(bzn::statistic::pbft_primary_alive); this->recorded_primaries[primary_status.view()] = primary_status.primary(); this->trim(); } else if (this->recorded_primaries[primary_status.view()] != primary_status.primary()) { std::string err = str(boost::format( "Conflicting primary detected! '%1%' is the recorded primary of view %2%, but '%3%' claims to be the primary of the same view.") % this->recorded_primaries[primary_status.view()] % primary_status.view() % primary_status.primary()); this->monitor->send_counter(bzn::statistic::pbft_primary_conflict); } this->reset_primary_alive_timer(); } void audit::handle_pbft_commit(const pbft_commit_notification& commit) { std::lock_guard lock(this->audit_lock); this->monitor->send_counter(bzn::statistic::pbft_commit); if (this->recorded_pbft_commits.count(commit.sequence_number()) == 0) { LOG(debug) << "observed that message '" << bytes_to_debug_string(commit.operation()) << "' is committed at sequence " << commit.sequence_number(); this->recorded_pbft_commits[commit.sequence_number()] = commit.operation(); this->trim(); } else if (this->recorded_pbft_commits[commit.sequence_number()] != commit.operation()) { std::string err = str(boost::format( "Conflicting commit detected! '%1%' is the recorded entry at sequence %2%, but '%3%' has been committed with the same sequence.") % this->recorded_pbft_commits[commit.sequence_number()] % commit.sequence_number() % commit.operation()); this->monitor->send_counter(bzn::statistic::pbft_commit_conflict); } } void audit::handle_failure_detected(const failure_detected& /*failure*/) { std::lock_guard lock(this->audit_lock); this->monitor->send_counter(bzn::statistic::pbft_failure_detected); } size_t audit::current_memory_size() { return this->recorded_pbft_commits.size() + this->recorded_primaries.size(); } void audit::trim() { // Here we're removing the lowest term/log index entries, which is sort of like the oldest entries. I'd rather // remove entries at random, but that's not straightforward to do with STL containers without making some onerous // performance compromise. while(this->recorded_primaries.size() > this->mem_size) { this->recorded_primaries.erase(this->recorded_primaries.begin()); } while(this->recorded_pbft_commits.size() > this->mem_size) { this->recorded_pbft_commits.erase(this->recorded_pbft_commits.begin()); } } ================================================ FILE: audit/audit.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include #include namespace bzn { class audit : public audit_base, public std::enable_shared_from_this { public: audit(std::shared_ptr , std::shared_ptr node , size_t mem_size , std::shared_ptr monitor ); void handle(const bzn_envelope& message, std::shared_ptr session) override; void handle_pbft_commit(const pbft_commit_notification&) override; void handle_primary_status(const primary_status&) override; void handle_failure_detected(const failure_detected&) override; size_t current_memory_size(); void start() override; private: void handle_primary_alive_timeout(const boost::system::error_code& ec); void reset_primary_alive_timer(); void report_error(const std::string& metric_name, const std::string& error_description); void send_to_monitor(const std::string& stat); void handle_leader_data(const leader_status&); void handle_leader_made_progress(const leader_status&); void trim(); std::list recorded_errors; const std::shared_ptr node; const std::shared_ptr io_context; uint primary_dead_count = 0; std::map recorded_primaries; std::map recorded_pbft_commits; std::once_flag start_once; std::mutex audit_lock; std::unique_ptr primary_alive_timer; // TODO: Make this configurable std::chrono::milliseconds primary_timeout{std::chrono::milliseconds(30000)}; size_t forgotten_error_count = 0; size_t mem_size; std::shared_ptr monitor; }; } ================================================ FILE: audit/audit_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include #include namespace bzn { class audit_base { public: virtual ~audit_base() = default; virtual void start() = 0; virtual void handle(const bzn_envelope& msg, std::shared_ptr session) = 0; virtual void handle_pbft_commit(const pbft_commit_notification&) = 0; virtual void handle_primary_status(const primary_status&) = 0; virtual void handle_failure_detected(const failure_detected&) = 0; }; } ================================================ FILE: audit/test/CMakeLists.txt ================================================ set(test_srcs audit_test.cpp) set(test_libs audit proto ${Protobuf_LIBRARIES}) add_gmock_test(audit) ================================================ FILE: audit/test/audit_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the views of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include using namespace ::testing; class audit_test : public Test { public: std::shared_ptr mock_io_context = std::make_shared>(); std::shared_ptr mock_node = std::make_shared>(); std::unique_ptr primary_alive_timer = std::make_unique>(); bzn::asio::wait_handler primary_alive_timer_callback; std::shared_ptr mock_monitor = std::make_shared>(); std::shared_ptr audit; size_t mem_size = 1000; audit_test() { EXPECT_CALL(*(this->mock_io_context), make_unique_steady_timer()) .WillOnce(Invoke( [&](){return std::move(this->primary_alive_timer);} )); EXPECT_CALL(*(this->primary_alive_timer), async_wait(_)) .WillRepeatedly(Invoke( [&](auto handler){this->primary_alive_timer_callback = handler;} )); } void build_audit() { // We cannot construct this during our constructor because doing so invalidates our timer pointers, // which prevents tests from setting expectations on them this->audit = std::make_shared(this->mock_io_context, this->mock_node, this->mem_size, this->mock_monitor); this->audit->start(); } }; TEST_F(audit_test, audit_throws_error_when_primaries_conflict) { this->build_audit(); primary_status a, b, c; a.set_primary("fred"); a.set_view(1); b.set_primary("smith"); b.set_view(2); c.set_primary("francheskitoria"); c.set_view(1); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_alive, 1)).Times(AnyNumber()); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_conflict, 1)); this->audit->handle_primary_status(a); this->audit->handle_primary_status(b); this->audit->handle_primary_status(c); this->audit->handle_primary_status(b); } TEST_F(audit_test, audit_throws_error_when_pbft_commits_conflict) { this->build_audit(); pbft_commit_notification a, b, c; a.set_operation("do something"); a.set_sequence_number(1); b.set_operation("do a different thing"); b.set_sequence_number(2); c.set_operation("do something else"); c.set_sequence_number(1); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit, 1)).Times(AnyNumber()); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit_conflict, 1)); this->audit->handle_pbft_commit(a); this->audit->handle_pbft_commit(b); this->audit->handle_pbft_commit(c); this->audit->handle_pbft_commit(b); } TEST_F(audit_test, audit_throws_error_when_no_primary_alive) { EXPECT_CALL(*(this->primary_alive_timer), expires_from_now(_)).Times(AtLeast(1)); this->build_audit(); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_no_primary, 1)); this->primary_alive_timer_callback(boost::system::error_code()); } TEST_F(audit_test, audit_resets_primary_alive_on_message) { bool reset; EXPECT_CALL(*(this->primary_alive_timer), cancel()).WillRepeatedly(Invoke( [&](){reset = true;} )); this->build_audit(); primary_status ls1; ls1.set_primary("fred"); reset = false; EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_alive, 1)).Times(AnyNumber()); this->audit->handle_primary_status(ls1); EXPECT_TRUE(reset); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_no_primary, 1)); this->primary_alive_timer_callback(boost::system::error_code()); } TEST_F(audit_test, audit_forgets_old_data) { this->mem_size = 10; this->build_audit(); primary_status ls1; ls1.set_primary("joe"); primary_status ls2; ls2.set_primary("alfred"); pbft_commit_notification com; com.set_operation("Do some stuff!!"); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit, 1)).Times(AnyNumber()); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_alive, 1)).Times(AnyNumber()); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_conflict, 1)).Times(Exactly(100)); for(auto i : boost::irange(0, 100)) { // Trigger an error, a primary elected, and a commit notification every iteration ls1.set_view(i); ls2.set_view(i); com.set_sequence_number(i); this->audit->handle_primary_status(ls1); this->audit->handle_primary_status(ls2); this->audit->handle_pbft_commit(com); } // It's allowed to have mem size each of commits, primaries, and EXPECT_LE(this->audit->current_memory_size(), 2*this->mem_size); } TEST_F(audit_test, audit_still_detects_new_errors_after_forgetting_old_data) { this->mem_size = 10; this->build_audit(); primary_status ls1; ls1.set_primary("joe"); pbft_commit_notification com; com.set_operation("do exciting things and stuff"); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit, 1)).Times(AnyNumber()); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_alive, 1)).Times(AnyNumber()); for (auto i : boost::irange(0, 100)) { ls1.set_view(i); com.set_sequence_number(i); this->audit->handle_primary_status(ls1); this->audit->handle_pbft_commit(com); } EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit_conflict, 1)); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_conflict, 1)); ls1.set_primary("not joe"); com.set_operation("don't do anything"); this->audit->handle_primary_status(ls1); this->audit->handle_pbft_commit(com); } TEST_F(audit_test, audit_sends_monitor_message_when_primary_conflict) { this->build_audit(); primary_status ls1; ls1.set_primary("joe"); primary_status ls2 = ls1; ls2.set_primary("francine"); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_alive, 1)).Times(AnyNumber()); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_primary_conflict, 1)); this->audit->handle_primary_status(ls1); this->audit->handle_primary_status(ls2); } TEST_F(audit_test, audit_sends_monitor_message_when_commit_conflict) { this->build_audit(); pbft_commit_notification com1; com1.set_sequence_number(2); com1.set_operation("the first thing"); pbft_commit_notification com2 = com1; com2.set_operation("the second thing"); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit, 1)).Times(AnyNumber()); EXPECT_CALL(*(this->mock_monitor), send_counter(bzn::statistic::pbft_commit_conflict, 1)); this->audit->handle_pbft_commit(com1); this->audit->handle_pbft_commit(com2); } ================================================ FILE: chaos/CMakeLists.txt ================================================ add_library(chaos chaos.hpp chaos.cpp chaos_base.hpp ) target_link_libraries(chaos options) target_include_directories(chaos PRIVATE ${BLUZELLE_STD_INCLUDES}) add_dependencies(chaos boost openssl) add_subdirectory(test) ================================================ FILE: chaos/chaos.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include using namespace bzn; using namespace bzn::option_names; chaos::chaos(std::shared_ptr io_context, std::shared_ptr options) : io_context(std::move(io_context)) , options(std::move(options)) , crash_timer(this->io_context->make_unique_steady_timer()) { // We don't need cryptographically secure randomness here, but it does need to be of reasonable quality and differ across processes std::random_device rd; this->random.seed(rd()); } void chaos::start() { if (this->enabled()) { std::call_once( this->start_once, [this]() { this->start_crash_timer(); } ); } } void chaos::start_crash_timer() { std::weibull_distribution distribution( this->options->get_simple_options().get(CHAOS_NODE_FAILURE_SHAPE), this->options->get_simple_options().get(CHAOS_NODE_FAILURE_SCALE)); double hours_until_crash = distribution(this->random); LOG(info) << boost::format("Chaos module will trigger this node crashing in %1$.2f hours") % hours_until_crash; auto time_until_crash = std::chrono::duration(hours_until_crash); this->crash_timer->expires_from_now(std::chrono::duration_cast(time_until_crash)); // Doing this with this timer means that crashes will only occur at times where boost schedules // a new callback to take place, rather than truly at random. this->crash_timer->async_wait(std::bind(&chaos::handle_crash_timer, shared_from_this(), std::placeholders::_1)); } void chaos::handle_crash_timer(const boost::system::error_code& /*ec*/) { LOG(fatal) << "Chaos module triggering node crash"; // Intentionally crashing abruptly std::abort(); } bool chaos::enabled() { return this->options->get_simple_options().get(CHAOS_ENABLED); } bool chaos::is_message_delayed() { const bool result = this->enabled() && this->options->get_simple_options().get(CHAOS_MESSAGE_DELAY_CHANCE) > this->random_float(this->random); if (result) { LOG(debug) << "Chaos module delaying message"; } return result; } bool chaos::is_message_dropped() { bool result = this->enabled() && this->options->get_simple_options().get(CHAOS_MESSAGE_DROP_CHANCE) > this->random_float(this->random); if (result) { LOG(debug) << "Chaos module dropping message"; } return result; } void chaos::reschedule_message(chaos_delay_callback callback) const { std::shared_ptr timer = this->io_context->make_unique_steady_timer(); auto delay = std::chrono::milliseconds(this->options->get_simple_options().get(CHAOS_MESSAGE_DELAY_TIME)); timer->expires_from_now(delay); timer->async_wait( [timer, callback](auto /*error*/) { LOG(debug) << "Chaos module retrying delayed message"; callback(); }); } ================================================ FILE: chaos/chaos.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include namespace bzn { class chaos : public chaos_base, public std::enable_shared_from_this { public: chaos(std::shared_ptr io_context, std::shared_ptr options); void start() override; bool is_message_dropped() override; bool is_message_delayed() override; void reschedule_message(chaos_delay_callback callback) const override; private: void start_crash_timer(); void handle_crash_timer(const boost::system::error_code&); bool enabled(); std::once_flag start_once; const std::shared_ptr io_context; const std::shared_ptr options; std::unique_ptr crash_timer; std::mt19937 random; std::uniform_real_distribution<> random_float{0.0, 1.0}; }; } ================================================ FILE: chaos/chaos_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn { class chaos_base { public: /* * start the node death timer (if enabled) */ virtual void start() = 0; /* * Randomly determine if a message should be dropped, according to settings */ virtual bool is_message_dropped() = 0; /* * Randomly determine if a message should be delayed, according to settings */ virtual bool is_message_delayed() = 0; using chaos_delay_callback = std::function; /* * Schedule a delayed callback according to settings * @param callback callback for sending message when delay expires */ virtual void reschedule_message(chaos_delay_callback callback) const = 0; virtual ~chaos_base() = default; }; } ================================================ FILE: chaos/test/CMakeLists.txt ================================================ set(test_srcs chaos_test.cpp) set(test_libs chaos options) add_gmock_test(chaos) ================================================ FILE: chaos/test/chaos_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include using namespace ::testing; class chaos_test : public Test { public: std::shared_ptr options; std::shared_ptr mock_io_context = std::make_shared>(); std::unique_ptr node_crash_timer = std::make_unique>(); std::unique_ptr second_timer = std::make_unique>(); bzn::asio::wait_handler node_crash_handler; bzn::asio::wait_handler second_timer_handler; std::shared_ptr chaos; size_t timer_waited = 0; // This pattern copied from audit test chaos_test() { EXPECT_CALL(*(this->mock_io_context), make_unique_steady_timer()) .Times(AnyNumber()) .WillOnce(Invoke( [&](){return std::move(this->node_crash_timer);} )).WillOnce(Invoke( [&](){return std::move(this->second_timer);} )); EXPECT_CALL(*(this->node_crash_timer), async_wait(_)) .Times(AnyNumber()) .WillRepeatedly(Invoke( [&](auto handler) { this->node_crash_handler = handler; this->timer_waited++; } )); EXPECT_CALL(*(this->second_timer), async_wait(_)) .Times(AnyNumber()) .WillRepeatedly(Invoke( [&](auto handler) { this->second_timer_handler = handler; } )); this->options = std::make_shared(); this->options->get_mutable_simple_options().set(bzn::option_names::CHAOS_ENABLED, "true"); this->options->get_mutable_simple_options().set(bzn::option_names::CHAOS_MESSAGE_DELAY_CHANCE, "0.5"); this->options->get_mutable_simple_options().set(bzn::option_names::CHAOS_MESSAGE_DROP_CHANCE, "0.5"); } void build_chaos() { this->chaos = std::make_shared(this->mock_io_context, this->options); this->chaos->start(); } }; using chaos_test_DeathTest = chaos_test; // https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#death-test-naming TEST_F(chaos_test_DeathTest, test_crash_scheduled_and_executed) { this->build_chaos(); EXPECT_EQ(this->timer_waited, 1u); ASSERT_DEATH(this->node_crash_handler(boost::system::error_code()), ""); } TEST_F(chaos_test, test_messages_never_dropped_or_delayed_when_disabled) { this->build_chaos(); this->options->get_mutable_simple_options().set(bzn::option_names::CHAOS_ENABLED, "false"); for (int i=0; i<10000; i++) { ASSERT_FALSE(this->chaos->is_message_dropped()); ASSERT_FALSE(this->chaos->is_message_delayed()); } } TEST_F(chaos_test, test_messages_sometimes_dropped_or_delayed_sometimes_not) { this->build_chaos(); uint dropped_count = 0; uint delayed_count = 0; uint not_dropped_count = 0; uint not_delayed_count = 0; for (int i=0; i<10000; i++) { if (this->chaos->is_message_dropped()) { dropped_count ++; } else { not_dropped_count ++; } if (this->chaos->is_message_delayed()) { delayed_count++; } else { not_delayed_count++; } if (dropped_count>0 && not_dropped_count>0 && delayed_count>0 && not_delayed_count>0) { return; } } FAIL(); } TEST_F(chaos_test, reschedule_retries_message) { this->build_chaos(); bool called = false; this->chaos->reschedule_message([&](){called = true;}); this->second_timer_handler(boost::system::error_code()); ASSERT_TRUE(called); } ================================================ FILE: cmake/add_gmock_test.cmake ================================================ # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . include(GoogleTest) function(add_gmock_test target) set(target ${target}_tests) add_executable(${target} ${test_srcs}) add_dependencies(${target} boost googletest jsoncpp ${test_deps}) target_link_libraries(${target} ${test_libs} ${OPENSSL_LIBRARIES} ${GMOCK_BOTH_LIBRARIES} ${Boost_LIBRARIES} ${JSONCPP_LIBRARIES} ${test_link} pthread) target_include_directories(${target} PRIVATE ${BLUZELLE_STD_INCLUDES}) gtest_discover_tests(${target}) unset(test_srcs) unset(test_libs) unset(test_deps) unset(test_link) endfunction() ================================================ FILE: cmake/boost.cmake ================================================ # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . include(ExternalProject) include(ProcessorCount) set(REQUIRED_BOOST "1.70.0") set(BOOST_URL_HASH "882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9") message(STATUS "Boost: ${REQUIRED_BOOST}") set(BOOST_TARBALL "boost_${REQUIRED_BOOST}") string(REPLACE "." "_" BOOST_TARBALL ${BOOST_TARBALL}) string(APPEND BOOST_TARBALL ".tar.gz") set(BOOST_LIBS "chrono,program_options,random,regex,system,thread,log,serialization") # Prevent travis gcc crashes... if (DEFINED ENV{TRAVIS}) set(BUILD_FLAGS -j8) else() ProcessorCount(N) if(NOT N EQUAL 0) set(BUILD_FLAGS -j${N}) endif() endif() ExternalProject_Add(boost PREFIX "${CMAKE_CURRENT_BINARY_DIR}/boost" URL "https://dl.bintray.com/boostorg/release/${REQUIRED_BOOST}/source/${BOOST_TARBALL}" URL_HASH SHA256=${BOOST_URL_HASH} TIMEOUT 120 INSTALL_COMMAND "" CONFIGURE_COMMAND "${CMAKE_CURRENT_BINARY_DIR}/boost/src/boost/bootstrap.sh" "--with-libraries=${BOOST_LIBS}" BUILD_COMMAND "${CMAKE_CURRENT_BINARY_DIR}/boost/src/boost/b2" link=static visibility=global "${BUILD_FLAGS} " BUILD_IN_SOURCE true DOWNLOAD_NO_PROGRESS true ) set_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM ${CMAKE_CURRENT_BINARY_DIR}/boost) ExternalProject_Get_Property(boost source_dir) set(Boost_INCLUDE_DIRS ${source_dir}) set(Boost_LIBRARIES ${source_dir}/stage/lib/libboost_log.a ${source_dir}/stage/lib/libboost_program_options.a ${source_dir}/stage/lib/libboost_system.a ${source_dir}/stage/lib/libboost_thread.a pthread ${source_dir}/stage/lib/libboost_serialization.a ${source_dir}/stage/lib/libboost_date_time.a ${source_dir}/stage/lib/libboost_log_setup.a ${source_dir}/stage/lib/libboost_filesystem.a ${source_dir}/stage/lib/libboost_regex.a ${source_dir}/stage/lib/libboost_chrono.a ${source_dir}/stage/lib/libboost_atomic.a ) ================================================ FILE: cmake/git_commit.cmake ================================================ # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . set(SWARM_GIT_COMMIT "unknown") find_program(GIT_EXECUTABLE NAMES git) if (GIT_EXECUTABLE) execute_process(COMMAND git describe --always --tags --dirty OUTPUT_VARIABLE SWARM_GIT_COMMIT OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) endif() configure_file(${CMAKE_CURRENT_LIST_DIR}/swarm_git_commit.hpp.in ${PROJECT_BINARY_DIR}/swarm_git_commit.hpp.tmp) execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_BINARY_DIR}/swarm_git_commit.hpp.tmp ${PROJECT_BINARY_DIR}/swarm_git_commit.hpp) execute_process(COMMAND ${CMAKE_COMMAND} -E remove ${PROJECT_BINARY_DIR}/swarm_git_commit.hpp.tmp) ================================================ FILE: cmake/googletest.cmake ================================================ # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . include(ExternalProject) ExternalProject_Add(googletest PREFIX "${CMAKE_CURRENT_BINARY_DIR}/googletest" URL https://github.com/google/googletest/archive/release-1.8.0.tar.gz URL_HASH SHA256=58a6f4277ca2bc8565222b3bbd58a177609e9c488e8a72649359ba51450db7d8 TIMEOUT 30 INSTALL_COMMAND "" DOWNLOAD_NO_PROGRESS true ) set_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM "${CMAKE_CURRENT_BINARY_DIR}/googletest") ExternalProject_Get_Property(googletest source_dir) include_directories(${source_dir}/googlemock/include ${source_dir}/googletest/include) ExternalProject_Get_Property(googletest binary_dir) link_directories(${binary_dir}/googlemock) set(GMOCK_BOTH_LIBRARIES gmock_main gmock) ================================================ FILE: cmake/jsoncpp.cmake ================================================ # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . include(ExternalProject) ExternalProject_Add(jsoncpp PREFIX "${CMAKE_CURRENT_BINARY_DIR}/jsoncpp" URL https://github.com/open-source-parsers/jsoncpp/archive/1.8.4.tar.gz URL_HASH SHA256=c49deac9e0933bcb7044f08516861a2d560988540b23de2ac1ad443b219afdb6 TIMEOUT 30 INSTALL_COMMAND "" CMAKE_ARGS -DJSONCPP_WITH_PKGCONFIG_SUPPORT=OFF -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF -DJSONCPP_WITH_TESTS=OFF -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} DOWNLOAD_NO_PROGRESS true ) set_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM "${CMAKE_CURRENT_BINARY_DIR}/jsoncpp") ExternalProject_Get_Property(jsoncpp source_dir) set(JSONCPP_INCLUDE_DIRS ${source_dir}/include) include_directories(${JSONCPP_INCLUDE_DIRS}) ExternalProject_Get_Property(jsoncpp binary_dir) link_directories(${binary_dir}/src/lib_json/) set(JSONCPP_LIBRARIES ${binary_dir}/src/lib_json/libjsoncpp.a) ================================================ FILE: cmake/openssl.cmake ================================================ # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . include(ExternalProject) include(ProcessorCount) # Prevent travis gcc crashes... if (DEFINED ENV{TRAVIS}) set(BUILD_FLAGS -j8) else() ProcessorCount(N) if(NOT N EQUAL 0) set(BUILD_FLAGS -j${N}) endif() endif() # platform detection if (APPLE) set(OPENSSL_BUILD_PLATFORM darwin64-x86_64-cc) else() set(OPENSSL_BUILD_PLATFORM linux-x86_64) endif() ExternalProject_Add(openssl PREFIX "${CMAKE_CURRENT_BINARY_DIR}/openssl" URL https://www.openssl.org/source/openssl-1.1.1.tar.gz URL_HASH SHA256=2836875a0f89c03d0fdf483941512613a50cfb421d6fd94b9f41d7279d586a3d TIMEOUT 30 INSTALL_COMMAND "" DOWNLOAD_NO_PROGRESS true CONFIGURE_COMMAND "${CMAKE_CURRENT_BINARY_DIR}/openssl/src/openssl/Configure" ${OPENSSL_BUILD_PLATFORM} BUILD_COMMAND make ${BUILD_FLAGS} ) set_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM "${CMAKE_CURRENT_BINARY_DIR}/openssl") ExternalProject_Get_Property(openssl source_dir) ExternalProject_Get_Property(openssl binary_dir) set(OPENSSL_INCLUDE_DIR ${source_dir}/include ${binary_dir}/include) set(OPENSSL_LIBRARIES ${binary_dir}/libcrypto.a ${binary_dir}/libssl.a dl pthread) ================================================ FILE: cmake/rocksdb.cmake ================================================ # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . include(ExternalProject) include(ProcessorCount) include(FindZLIB) # find snappy... find_path(SNAPPY_INCLUDE_DIR NAMES snappy.h HINTS ${SNAPPY_ROOT_DIR}/include) find_library(SNAPPY_LIBRARIES NAMES snappy HINTS ${SNAPPY_ROOT_DIR}/lib) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Snappy DEFAULT_MSG SNAPPY_LIBRARIES SNAPPY_INCLUDE_DIR) mark_as_advanced( SNAPPY_ROOT_DIR SNAPPY_LIBRARIES SNAPPY_INCLUDE_DIR) # find bzip2... find_path(BZIP2_INCLUDE_DIR NAMES bzlib.h HINTS ${BZIP2_ROOT_DIR}/include) find_library(BZIP2_LIBRARIES NAMES bz2 HINTS ${BZIP2_ROOT_DIR}/lib) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Bzip2 DEFAULT_MSG BZIP2_LIBRARIES BZIP2_INCLUDE_DIR) mark_as_advanced( BZIP2_ROOT_DIR BZIP2_LIBRARIES BZIP2_INCLUDE_DIR) # Prevent travis gcc crashes... if (DEFINED ENV{TRAVIS}) set(BUILD_FLAGS -j8) else() ProcessorCount(N) if(NOT N EQUAL 0) set(BUILD_FLAGS -j${N}) endif() endif() ExternalProject_Add(rocksdb PREFIX "${CMAKE_CURRENT_BINARY_DIR}/rocksdb" URL https://github.com/facebook/rocksdb/archive/v5.14.3.tar.gz URL_HASH SHA256=c7019a645fc23df0adfe97ef08e793a36149bff2f57ef3b6174cbb0c8c9867b1 TIMEOUT 30 INSTALL_COMMAND "" CONFIGURE_COMMAND "" BUILD_COMMAND PORTABLE=1 make -e DISABLE_JEMALLOC=1 static_lib ${BUILD_FLAGS} BUILD_IN_SOURCE true DOWNLOAD_NO_PROGRESS true ) set_property(DIRECTORY PROPERTY CLEAN_NO_CUSTOM "${CMAKE_CURRENT_BINARY_DIR}/rocksdb") ExternalProject_Get_Property(rocksdb source_dir) set(ROCKSDB_INCLUDE_DIRS ${source_dir}/include) ExternalProject_Get_Property(rocksdb binary_dir) link_directories(${binary_dir}/) set(ROCKSDB_LIBRARIES ${binary_dir}/librocksdb.a ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} ${BZIP2_LIBRARIES}) if (APPLE) find_library(LZ4_LIBRARY NAMES liblz4.a) message(STATUS ${LZ4_LIBRARY}) list(APPEND ROCKSDB_LIBRARIES ${LZ4_LIBRARY}) # rocksdb may of found these libraries... find_library(ZSTD_LIBRARY NAMES libzstd.a) if (ZSTD_LIBRARY) message(STATUS ${ZSTD_LIBRARY}) list(APPEND ROCKSDB_LIBRARIES ${ZSTD_LIBRARY}) endif() find_library(TBB_LIBRARY NAMES libtbb.a) if (TBB_LIBRARY) message(STATUS ${TBB_LIBRARY}) list(APPEND ROCKSDB_LIBRARIES ${TBB_LIBRARY}) endif() endif() ================================================ FILE: cmake/static_analysis.cmake ================================================ # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . add_custom_target(static_analysis) # copy paste detection... if (NOT DEFINED "PMD_EXE") find_program(PMD_EXE NAMES pmd run.sh) endif() message(STATUS "pmd: ${PMD_EXE}") if (PMD_EXE) add_custom_target(cpd COMMAND ${CMAKE_SOURCE_DIR}/cmake/static_analysis.sh cpd ${PMD_EXE} ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}) add_dependencies(static_analysis cpd) endif() # complexity analysis... find_program(PMCCABE_EXE NAMES pmccabe) message(STATUS "pmccabe: ${PMCCABE_EXE}") if (PMCCABE_EXE) add_custom_target(pmccabe COMMAND ${CMAKE_SOURCE_DIR}/cmake/static_analysis.sh pmccabe ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}) add_dependencies(static_analysis pmccabe) endif() ================================================ FILE: cmake/static_analysis.sh ================================================ #!/usr/bin/env bash # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # set -x TEMP_FILE=$(mktemp) case "$1" in cpd) find "$3" -not \( -path "$4" -prune \) -name "*.cpp" -not -name "*_test.cpp" -o -name "*.hpp" > $TEMP_FILE $2 cpd --minimum-tokens 115 --language cpp --filelist $TEMP_FILE ;; pmccabe) echo "Modified McCabe Cyclomatic Complexity" echo "| Traditional McCabe Cyclomatic Complexity" echo "| | # Statements in function" echo "| | | First line of function" echo "| | | | # lines in function" echo "| | | | | filename(definition line number):function" echo "| | | | | |" pmccabe $(find "$2" -not \( -path "$3" -prune \) -name "*.cpp" -not -name "*_test.cpp" -o -name "*.hpp") 2> $TEMP_FILE | sort -nr echo "-----------------------------------------------------------------------------" echo Parse errors: echo cat $TEMP_FILE ;; esac rm $TEMP_FILE ================================================ FILE: cmake/swarm_git_commit.hpp.in ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #define SWARM_GIT_COMMIT "@SWARM_GIT_COMMIT@" ================================================ FILE: cmake/swarm_version.cmake ================================================ # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # version for swarm set(PROJECT_VERSION_MAJOR 0 CACHE STRING "Set the project major version") set(PROJECT_VERSION_MINOR 0 CACHE STRING "Set the project minor version") set(PROJECT_VERSION_PATCH "0-desk" CACHE STRING "Set the project patch version") set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" CACHE STRING "") ================================================ FILE: cmake/swarm_version.hpp.in ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #define SWARM_VERSION "@PROJECT_VERSION@" ================================================ FILE: crud/CMakeLists.txt ================================================ add_library(crud STATIC crud_base.hpp subscription_manager.cpp subscription_manager.hpp subscription_manager_base.hpp crud.cpp crud.hpp ) target_link_libraries(crud proto policy) add_dependencies(crud boost jsoncpp openssl) target_include_directories(crud PRIVATE ${BLUZELLE_STD_INCLUDES}) add_subdirectory(test) ================================================ FILE: crud/crud.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include using namespace bzn; using namespace std::placeholders; namespace { const std::string PERMISSION_UUID{"PERMS"}; const std::string OWNER_KEY{"OWNER"}; const std::string WRITERS_KEY{"WRITERS"}; const std::string MAX_SIZE_KEY{"MAX_SIZE"}; const std::string EVICTION_POLICY_KEY{"EVICTION_POLICY"}; const std::string TTL_UUID{"TTL"}; const std::chrono::seconds TTL_TICK{5}; // not too aggressive inline bzn::key_t generate_expire_key(const bzn::uuid_t& uuid, const bzn::key_t& key) { Json::Value value; value["uuid"] = uuid; value["key"] = key; return value.toStyledString(); } inline std::pair extract_uuid_key(const bzn::key_t& key) { Json::CharReaderBuilder rbuilder; std::unique_ptr const reader(rbuilder.newCharReader()); std::string parse_errors; Json::Value json; if (!reader->parse(key.c_str(), key.c_str() + key.size(), &json, &parse_errors)) { throw std::runtime_error("Failed to parse database json ttl data: " + parse_errors); } return std::make_pair(json["uuid"].asString(), json["key"].asString()); } } crud::crud(std::shared_ptr io_context, std::shared_ptr storage, std::shared_ptr subscription_manager, std::shared_ptr node, bzn::key_t owner_public_key) : storage(std::move(storage)) , subscription_manager(std::move(subscription_manager)) , node(std::move(node)) , expire_timer(io_context->make_unique_steady_timer()) , message_handlers{ {database_msg::kCreate, std::bind(&crud::handle_create, this, _1, _2, _3)}, {database_msg::kRead, std::bind(&crud::handle_read, this, _1, _2, _3)}, {database_msg::kUpdate, std::bind(&crud::handle_update, this, _1, _2, _3)}, {database_msg::kDelete, std::bind(&crud::handle_delete, this, _1, _2, _3)}, {database_msg::kHas, std::bind(&crud::handle_has, this, _1, _2, _3)}, {database_msg::kKeys, std::bind(&crud::handle_keys, this, _1, _2, _3)}, {database_msg::kSize, std::bind(&crud::handle_size, this, _1, _2, _3)}, {database_msg::kSubscribe, std::bind(&crud::handle_subscribe, this, _1, _2, _3)}, {database_msg::kUnsubscribe, std::bind(&crud::handle_unsubscribe, this, _1, _2, _3)}, {database_msg::kCreateDb, std::bind(&crud::handle_create_db, this, _1, _2, _3)}, {database_msg::kUpdateDb, std::bind(&crud::handle_update_db, this, _1, _2, _3)}, {database_msg::kDeleteDb, std::bind(&crud::handle_delete_db, this, _1, _2, _3)}, {database_msg::kHasDb, std::bind(&crud::handle_has_db, this, _1, _2, _3)}, {database_msg::kWriters, std::bind(&crud::handle_writers, this, _1, _2, _3)}, {database_msg::kAddWriters, std::bind(&crud::handle_add_writers, this, _1, _2, _3)}, {database_msg::kRemoveWriters, std::bind(&crud::handle_remove_writers, this, _1, _2, _3)}, {database_msg::kQuickRead, std::bind(&crud::handle_read, this, _1, _2, _3)}, {database_msg::kTtl, std::bind(&crud::handle_ttl, this, _1, _2, _3)}, {database_msg::kPersist, std::bind(&crud::handle_persist, this, _1, _2, _3)}, {database_msg::kExpire, std::bind(&crud::handle_expire, this, _1, _2, _3)}} , owner_public_key(std::move(owner_public_key)) { } void crud::start(std::shared_ptr pbft, const size_t max_swarm_storage) { std::call_once(this->start_once, [this, pbft, max_swarm_storage]() { this->pbft = std::move(pbft); this->max_swarm_storage = max_swarm_storage; this->subscription_manager->start(); this->expire_timer->expires_from_now(TTL_TICK); this->expire_timer->async_wait(std::bind(&crud::check_key_expiration, shared_from_this(), std::placeholders::_1)); }); } void crud::handle_request(const bzn::caller_id_t& caller_id, const database_msg& request, const std::shared_ptr session) { if (auto it = this->message_handlers.find(request.msg_case()); it != this->message_handlers.end()) { LOG(debug) << "processing message: " << uint32_t(request.msg_case()); it->second(caller_id, request, session); return; } LOG(error) << "unknown request: " << uint32_t(request.msg_case()); } void crud::send_response(const database_msg& request, const bzn::storage_result result, database_response&& response, std::shared_ptr& session) { *response.mutable_header() = request.header(); if (result != bzn::storage_result::ok) { if (bzn::storage_result_msg.count(result)) { // special response error case... if (request.msg_case() == database_msg::kQuickRead) { response.mutable_quick_read()->set_error(bzn::storage_result_msg.at(result)); } else { response.mutable_error()->set_message(bzn::storage_result_msg.at(result)); } } else { LOG(error) << "unknown error code: " << uint32_t(result); } } bzn_envelope env; env.set_database_response(response.SerializeAsString()); if (session) { // special response case that does not require signing... if (request.msg_case() == database_msg::kQuickRead) { session->send_message(std::make_shared(env.SerializeAsString())); } else { LOG(trace) << "Sending response via session"; session->send_signed_message(std::make_shared(env)); } } else { LOG(warning) << "session not set - response for the " << uint32_t(request.msg_case()) << " operation not sent via session"; } if (this->node && !response.header().point_of_contact().empty()) { LOG(trace) << "Sending response via PoC: " << response.header().point_of_contact(); try { this->node->send_signed_message(response.header().point_of_contact(), std::make_shared(env)); } catch(const std::runtime_error& err) { LOG(error) << err.what(); } } else { LOG(warning) << "Unable to send response for the " << uint32_t(request.msg_case()) << " operation to point of contact - node not set in crud module"; } } void crud::handle_create(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::db_not_found}; std::lock_guard lock(this->crud_lock); // lock for write access auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (db_exists) { if (!this->is_caller_a_writer(caller_id, perms)) { result = bzn::storage_result::access_denied; } else { // bail on key value pairs that are too large right away! if (this->max_database_size(perms) && request.create().key().length() + request.create().value().length() > this->max_database_size(perms)) { this->send_response(request, bzn::storage_result::value_too_large, database_response(), session); return; } if (this->expired(request.header().db_uuid(), request.create().key())) { this->send_response(request, bzn::storage_result::delete_pending, database_response(), session); return; } if (this->operation_exceeds_available_space(request, perms)) { if (!this->do_eviction(request, this->max_database_size(perms))) { this->send_response(request, bzn::storage_result::db_full, database_response(), session); return; } } result = this->storage->create(request.header().db_uuid(), request.create().key(), request.create().value()); if (result == bzn::storage_result::ok) { this->update_expiration_entry(generate_expire_key(request.header().db_uuid(), request.create().key()), request.create().expire()); this->subscription_manager->inspect_commit(request); } } } this->send_response(request, result, database_response(), session); } void crud::handle_read(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr session) { std::shared_lock lock(this->crud_lock); // lock for read access if (!this->storage->has(PERMISSION_UUID, request.header().db_uuid())) { this->send_response(request, bzn::storage_result::db_not_found, database_response(), session); return; } const bzn::key_t key = (request.msg_case() == database_msg::kRead) ? request.read().key() : request.quick_read().key(); // expired? if (this->expired(request.header().db_uuid(), key)) { this->send_response(request, bzn::storage_result::delete_pending, database_response(), session); return; } const auto result = this->storage->read(request.header().db_uuid(), key); database_response response; if (result) { if (request.msg_case() == database_msg::kRead) { response.mutable_read()->set_key(key); response.mutable_read()->set_value(*result); } else { response.mutable_quick_read()->set_key(key); response.mutable_quick_read()->set_value(*result); } } this->send_response(request, (result) ? bzn::storage_result::ok : bzn::storage_result::not_found, std::move(response), session); } void crud::handle_update(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::db_not_found}; std::lock_guard lock(this->crud_lock); // lock for write access const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (db_exists) { if (!this->is_caller_a_writer(caller_id, perms)) { result = bzn::storage_result::access_denied; } else { // bail on key value pairs that are too large right away! if (this->max_database_size(perms) && request.create().key().length() + request.create().value().length() > this->max_database_size(perms)) { this->send_response(request, bzn::storage_result::value_too_large, database_response(), session); return; } // expired? if (this->expired(request.header().db_uuid(), request.update().key())) { this->send_response(request, bzn::storage_result::delete_pending, database_response(), session); return; } if (this->operation_exceeds_available_space(request, perms)) { // let's try evicting some key/value pairs if (!this->do_eviction(request, this->max_database_size(perms))) { this->send_response(request, bzn::storage_result::db_full, database_response(), session); return; } } result = this->storage->update(request.header().db_uuid(), request.update().key(), request.update().value()); if (result == bzn::storage_result::ok) { this->update_expiration_entry(generate_expire_key(request.header().db_uuid(), request.update().key()), request.update().expire()); this->subscription_manager->inspect_commit(request); } } } this->send_response(request, result, database_response(), session); } void crud::handle_delete(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::db_not_found}; std::lock_guard lock(this->crud_lock); // lock for write access const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (db_exists) { if (!this->is_caller_a_writer(caller_id, perms)) { result = bzn::storage_result::access_denied; } else { result = this->storage->remove(request.header().db_uuid(), request.delete_().key()); if (result == bzn::storage_result::ok) { this->subscription_manager->inspect_commit(request); this->remove_expiration_entry(generate_expire_key(request.header().db_uuid(), request.delete_().key())); } } } this->send_response(request, result, database_response(), session); } void crud::handle_ttl(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr session) { std::shared_lock lock(this->crud_lock); // lock for read access bool has = this->storage->has(request.header().db_uuid(), request.ttl().key()); // exists and expired? if (has && this->expired(request.header().db_uuid(), request.ttl().key())) { this->send_response(request, bzn::storage_result::delete_pending, database_response(), session); return; } database_response response; if (has) { const auto ttl = this->get_ttl(request.header().db_uuid(), request.ttl().key()); if (ttl) { response.mutable_ttl()->set_key(request.ttl().key()); response.mutable_ttl()->set_ttl(*ttl); } else { has = false; // we don't have a ttl value for this key } } this->send_response(request, (has) ? bzn::storage_result::ok : bzn::storage_result::ttl_not_found, std::move(response), session); } void crud::handle_persist(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::db_not_found}; std::lock_guard lock(this->crud_lock); // lock for write access const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (db_exists) { if (!this->is_caller_a_writer(caller_id, perms)) { result = bzn::storage_result::access_denied; } else { const auto generated_key = generate_expire_key(request.header().db_uuid(), request.persist().key()); const bool has = this->storage->has(TTL_UUID, generated_key); // expired? if (has && this->expired(request.header().db_uuid(), request.persist().key())) { this->send_response(request, bzn::storage_result::delete_pending, database_response(), session); return; } if (has) { this->remove_expiration_entry(generated_key); result = bzn::storage_result::ok; } else { result = bzn::storage_result::ttl_not_found; } } } this->send_response(request, result, database_response(), session); } void crud::handle_expire(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::db_not_found}; std::lock_guard lock(this->crud_lock); // lock for write access const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (db_exists) { if (!this->is_caller_a_writer(caller_id, perms)) { result = bzn::storage_result::access_denied; } else { const auto generated_key = generate_expire_key(request.header().db_uuid(), request.expire().key()); const bool has = this->storage->has(TTL_UUID, generated_key); // expired? if (has && this->expired(request.header().db_uuid(), request.expire().key())) { this->send_response(request, bzn::storage_result::delete_pending, database_response(), session); return; } // do not allow zero expires... if (request.expire().expire() == 0) { result = bzn::storage_result::invalid_argument; } else { result = bzn::storage_result::not_found; // assume if ttl entry exists so does the db entry... if (has) { this->remove_expiration_entry(generated_key); result = bzn::storage_result::ok; this->update_expiration_entry(generated_key, request.expire().expire()); } else { if (this->storage->has(request.header().db_uuid(), request.expire().key())) { result = bzn::storage_result::ok; this->update_expiration_entry(generated_key, request.expire().expire()); } else { result = bzn::storage_result::not_found; } } } } } this->send_response(request, result, database_response(), session); } void crud::handle_has(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::ok}; std::shared_lock lock(this->crud_lock); // lock for read access database_response response; response.mutable_has()->set_key(request.has().key()); if (this->expired(request.header().db_uuid(), request.has().key())) { response.mutable_has()->set_has(false); } else { if (this->storage->has(PERMISSION_UUID, request.header().db_uuid())) { response.mutable_has()->set_has(this->storage->has(request.header().db_uuid(), request.has().key())); } else { result = bzn::storage_result::db_not_found; } } this->send_response(request, result, std::move(response), session); } void crud::handle_keys(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::ok}; std::shared_lock lock(this->crud_lock); // lock for read access database_response response; if (this->storage->has(PERMISSION_UUID, request.header().db_uuid())) { const auto keys = this->storage->get_keys(request.header().db_uuid()); response.mutable_keys(); for (const auto& key : keys) { if (!this->expired(request.header().db_uuid(), key)) { response.mutable_keys()->add_keys(key); } } } else { result = bzn::storage_result::db_not_found; } this->send_response(request, result, std::move(response), session); } void crud::handle_size(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr session) { std::shared_lock lock(this->crud_lock); // lock for read access const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (!db_exists) { this->send_response(request, bzn::storage_result::db_not_found, database_response(), session); return; } const auto [keys, size] = this->storage->get_size(request.header().db_uuid()); database_response response; response.mutable_size()->set_keys(keys); response.mutable_size()->set_bytes(size); if (const auto max_size = this->max_database_size(perms); max_size) { response.mutable_size()->set_remaining_bytes((size < max_size) ? (max_size - size) : (0)); response.mutable_size()->set_max_size(max_size); } this->send_response(request, bzn::storage_result::ok, std::move(response), session); } void crud::handle_subscribe(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr session) { if (session) { database_response response; this->subscription_manager->subscribe(request.header().db_uuid(), request.subscribe().key(), request.header().nonce(), response, session); this->send_response(request, bzn::storage_result::ok, std::move(response), session); return; } LOG(warning) << "session no longer available. SUBSCRIBE not executed."; } void crud::handle_unsubscribe(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr session) { if (session) { database_response response; this->subscription_manager->unsubscribe(request.header().db_uuid(), request.unsubscribe().key(), request.unsubscribe().nonce(), response, session); this->send_response(request, bzn::storage_result::ok, std::move(response), session); return; } // subscription manager will cleanup stale sessions... LOG(warning) << "session no longer available. UNSUBSCRIBE not executed."; } void crud::handle_create_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::ok}; std::lock_guard lock(this->crud_lock); // lock for write access if (!this->owner_public_key.empty() && (this->owner_public_key != caller_id)) { result = bzn::storage_result::access_denied; } else if (this->storage->has(PERMISSION_UUID, request.header().db_uuid())) { result = bzn::storage_result::db_exists; } else { const Json::Value perms = this->create_permission_data(caller_id, request.create_db()); // Check max_database_size and if requested database is set to unlimited! if ((request.create_db().max_size() == 0) && this->max_swarm_storage) { LOG(debug) << "attempting to create a database with no limits (max_swarm_storage = " << this->max_swarm_storage << ")"; result = bzn::storage_result::invalid_size; } else { if (!this->operation_exceeds_available_space(request, perms)) { result = this->storage->create(PERMISSION_UUID, request.header().db_uuid(), perms.toStyledString()); } else { result = bzn::storage_result::db_full; } } } this->send_response(request, result, database_response(), session); } void crud::handle_update_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::db_not_found}; std::lock_guard lock(this->crud_lock); // lock for write access auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (db_exists) { if (!this->is_caller_owner(caller_id, perms)) { result = bzn::storage_result::access_denied; } else { // Check max_database_size and if requested database is set to unlimited! if ((request.update_db().max_size() == 0) && this->max_swarm_storage) { LOG(debug) << "attempting to update a database with no limits (max_swarm_storage = " << this->max_swarm_storage << ")"; result = bzn::storage_result::invalid_size; } else { // only check if max size has grown... if (request.update_db().max_size() > perms[MAX_SIZE_KEY].asUInt64()) { auto new_perms = perms; new_perms[MAX_SIZE_KEY] = request.update_db().max_size(); if (this->operation_exceeds_available_space(request, new_perms)) { this->send_response(request, bzn::storage_result::db_full, database_response(), session); return; } } result = this->storage->update(PERMISSION_UUID, request.header().db_uuid(), this->update_permission_data(perms, request.update_db())); } } } this->send_response(request, result, database_response(), session); } void crud::handle_delete_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::db_not_found}; std::lock_guard lock(this->crud_lock); // lock for write access const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (!this->owner_public_key.empty() && (this->owner_public_key != caller_id)) { result = bzn::storage_result::access_denied; } else if (db_exists) { if (!this->is_caller_owner(caller_id, perms)) { result = bzn::storage_result::access_denied; } else { result = this->storage->remove(PERMISSION_UUID, request.header().db_uuid()); this->storage->remove(request.header().db_uuid()); this->flush_expiration_entries(request.header().db_uuid()); } } this->send_response(request, result, database_response(), session); } void crud::handle_has_db(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr session) { std::shared_lock lock(this->crud_lock); // lock for read access database_response response; response.mutable_has_db()->set_uuid(request.header().db_uuid()); response.mutable_has_db()->set_has(this->storage->has(PERMISSION_UUID, request.header().db_uuid())); this->send_response(request, bzn::storage_result::ok, std::move(response), session); } void crud::handle_writers(const bzn::caller_id_t& /*caller_id*/, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::not_found}; std::shared_lock lock(this->crud_lock); // lock for read access const auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (db_exists) { database_response resp; resp.mutable_writers()->set_owner(perms[OWNER_KEY].asString()); for(const auto& writer : perms[WRITERS_KEY]) { resp.mutable_writers()->add_writers(writer.asString()); } this->send_response(request, bzn::storage_result::ok, std::move(resp), session); return; } else { this->send_response(request, result, database_response(), session); } } void crud::handle_add_writers(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::db_not_found}; std::lock_guard lock(this->crud_lock); // lock for write access auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (db_exists) { if (!this->is_caller_owner(caller_id, perms)) { result = bzn::storage_result::access_denied; } else { this->add_writers(request, perms); LOG(debug) << "updating db perms: " << perms.toStyledString().substr(0, MAX_MESSAGE_SIZE) << "..."; if (result = this->storage->update(PERMISSION_UUID, request.header().db_uuid(), perms.toStyledString()); result != bzn::storage_result::ok) { throw std::runtime_error("Failed to update database permissions: " + bzn::storage_result_msg.at(result)); } } } this->send_response(request, result, database_response(), session); } void crud::handle_remove_writers(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) { bzn::storage_result result{bzn::storage_result::db_not_found}; std::lock_guard lock(this->crud_lock); // lock for write access auto [db_exists, perms] = this->get_database_permissions(request.header().db_uuid()); if (db_exists) { if (!this->is_caller_owner(caller_id, perms)) { result = bzn::storage_result::access_denied; } else { this->remove_writers(request, perms); LOG(debug) << "updating db perms: " << perms.toStyledString().substr(0, MAX_MESSAGE_SIZE) << "..."; if (result = this->storage->update(PERMISSION_UUID, request.header().db_uuid(), perms.toStyledString()); result != bzn::storage_result::ok) { throw std::runtime_error("Failed to update database permissions: " + bzn::storage_result_msg.at(result)); } } } this->send_response(request, result, database_response(), session); } std::pair crud::get_database_permissions(const bzn::uuid_t& uuid) const { // does the db exist? if (this->storage->has(PERMISSION_UUID, uuid)) { auto perms_data = this->storage->read(PERMISSION_UUID, uuid); if (!perms_data) { throw std::runtime_error("Failed to read database permission data!"); } Json::CharReaderBuilder rbuilder; std::unique_ptr const reader(rbuilder.newCharReader()); std::string parse_errors; Json::Value json; if (!reader->parse((*perms_data).c_str(), (*perms_data).c_str() + (*perms_data).size(), &json, &parse_errors)) { throw std::runtime_error("Failed to parse database json permission data: " + parse_errors); } return {true, json}; } return {false, Json::Value()}; } Json::Value crud::create_permission_data(const bzn::caller_id_t& caller_id, const database_create_db& request) const { Json::Value json; json[OWNER_KEY] = boost::trim_copy(caller_id); json[WRITERS_KEY] = Json::Value(Json::arrayValue); json[MAX_SIZE_KEY] = request.max_size(); json[EVICTION_POLICY_KEY] = uint16_t(request.eviction_policy()); LOG(debug) << "created db perms: " << json.toStyledString(); return json; } bzn::value_t crud::update_permission_data(Json::Value& perms, const database_create_db& request) const { perms[MAX_SIZE_KEY] = request.max_size(); perms[EVICTION_POLICY_KEY] = uint16_t(request.eviction_policy()); LOG(debug) << "update db perms: " << perms.toStyledString(); return perms.toStyledString(); } bool crud::is_caller_owner(const bzn::caller_id_t& caller_id, const Json::Value& perms) const { return perms[OWNER_KEY] == boost::trim_copy(caller_id); } bool crud::is_caller_a_writer(const bzn::caller_id_t& caller_id, const Json::Value& perms) const { for (const auto& writer_id : perms[WRITERS_KEY]) { if (writer_id == boost::trim_copy(caller_id)) { return true; } } // A node may be issuing an operation such as delete for key expiration... // TODO: this may need to compare against all recent peers, not just current ones for (const auto& peer_uuid : *this->pbft->peers()->current()) { if (peer_uuid.uuid == boost::trim_copy(caller_id)) { return true; } } return this->is_caller_owner(caller_id, perms); } std::shared_ptr crud::get_eviction_policy(const Json::Value& perms) { // TODO: As we add more policies we may want to turn this into the strategy pattern and use // a registry based approach here if (perms[EVICTION_POLICY_KEY] == database_create_db::RANDOM) { return std::make_shared(this->storage); } else if (perms[EVICTION_POLICY_KEY] == database_create_db::VOLATILE_TTL) { return std::make_shared(this->storage); } return nullptr; } uint64_t crud::max_database_size(const Json::Value& perms) const { return boost::lexical_cast(perms[MAX_SIZE_KEY]); } void crud::add_writers(const database_msg& request, Json::Value& perms) { const std::string owner = perms[OWNER_KEY].asString(); std::set current_writers; for (const auto& writer : perms[WRITERS_KEY]) { current_writers.emplace(writer.asString()); } for (const auto& writer : request.add_writers().writers()) { // owner never should be in the writers list... if (writer != owner) { current_writers.insert(writer); } } perms[WRITERS_KEY].clear(); for (auto&& writer : current_writers) { perms[WRITERS_KEY].append(std::move(writer)); } } void crud::remove_writers(const database_msg& request, Json::Value& perms) { std::set current_writers; for (auto& writer : perms[WRITERS_KEY]) { current_writers.emplace(writer.asString()); } for (const auto& writer : request.remove_writers().writers()) { current_writers.erase(writer); } perms[WRITERS_KEY].clear(); for (auto&& writer : current_writers) { perms[WRITERS_KEY].append(std::move(writer)); } } bool crud::save_state() { std::lock_guard lock(this->crud_lock); // lock for write access return this->storage->create_snapshot(); } std::shared_ptr crud::get_saved_state() { std::shared_lock lock(this->crud_lock); // lock for read access return this->storage->get_snapshot(); } bool crud::load_state(const std::string& state) { std::lock_guard lock(this->crud_lock); // lock for write access return this->storage->load_snapshot(state); } void crud::update_expiration_entry(const bzn::key_t& generated_key, uint64_t expire) { if (expire) { // now + expire seconds... const auto expires = boost::lexical_cast( std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count() + expire); auto result = this->storage->create(TTL_UUID, generated_key, expires); if (result == bzn::storage_result::ok) { LOG(debug) << "created ttl entry [" << expires << "] for: " << generated_key; return; } result = this->storage->update(TTL_UUID, generated_key, expires); if (result != bzn::storage_result::ok) { throw std::runtime_error("Failed to update ttl entry for: " + generated_key); } return; } LOG(debug) << "removing old entry for: " << generated_key; this->remove_expiration_entry(generated_key); } void crud::remove_expiration_entry(const bzn::key_t& generated_key) { this->storage->remove(TTL_UUID, generated_key); } bool crud::expired(const bzn::uuid_t& uuid, const bzn::key_t& key) { auto result = this->storage->read(TTL_UUID, generate_expire_key(uuid, key)); if (result) { const uint64_t now = uint64_t(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); const uint64_t expire = boost::lexical_cast(*result); return (expire <= now); } return false; } std::optional crud::get_ttl(const bzn::uuid_t& uuid, const bzn::key_t& key) const { const auto result = this->storage->read(TTL_UUID, generate_expire_key(uuid, key)); if (result) { const uint64_t now = uint64_t(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); const uint64_t expire = boost::lexical_cast(*result); if (expire > now) { return {boost::lexical_cast(*result) - std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()}; } return {0}; } return {}; } void crud::check_key_expiration(const boost::system::error_code& ec) { if (!ec) { std::lock_guard lock(this->crud_lock); // lock for write access const uint64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); for (const auto& generated_key : this->storage->get_keys(TTL_UUID)) { auto result = this->storage->read(TTL_UUID, generated_key); if (result) { const auto [uuid, key] = extract_uuid_key(generated_key); // has entry expired? if (now >= boost::lexical_cast(*result)) { LOG(debug) << "removing expired ttl entry and key for: " << uuid << ":" << key; // Issue delete using pbft... database_msg request; request.mutable_header()->set_db_uuid(uuid); request.mutable_delete_()->set_key(key); bzn_envelope msg; msg.set_sender(this->pbft->get_uuid()); msg.set_database_msg(request.SerializeAsString()); this->pbft->handle_database_message(msg, nullptr); } else { // if key no longer exists, then remove the entry... if (!this->storage->has(uuid, key)) { LOG(debug) << "removing stale ttl entry for: " << uuid << ":" << key; this->storage->remove(TTL_UUID, generated_key); } } } else { std::runtime_error("Failed to read TTL value for: " + generated_key); } } this->expire_timer->expires_from_now(TTL_TICK); this->expire_timer->async_wait(std::bind(&crud::check_key_expiration, shared_from_this(), std::placeholders::_1)); } } void crud::flush_expiration_entries(const bzn::uuid_t& uuid) { for (const auto& generated_key : this->storage->get_keys(TTL_UUID)) { const auto [db_uuid, key] = extract_uuid_key(generated_key); if (db_uuid == uuid) { this->storage->remove(TTL_UUID, generated_key); LOG(debug) << "removing ttl entry for: " << db_uuid << ":" << key; } } } bool crud::operation_exceeds_available_space(const database_msg& request, const Json::Value& perms) { const auto request_type = request.msg_case(); const auto max_size = this->max_database_size(perms); if (request_type == database_msg::kCreateDb || request_type == database_msg::kUpdateDb) { if (!this->max_swarm_storage) { LOG(debug) << "max storage zero, ignoring: " << request.msg_case(); return false; } if (request_type == database_msg::kCreateDb) { return (this->get_swarm_storage_usage() + max_size > this->max_swarm_storage); } if (request_type == database_msg::kUpdateDb) { Json::Value prev_perms; std::tie(std::ignore, prev_perms) = this->get_database_permissions(request.header().db_uuid()); return (this->get_swarm_storage_usage() - this->max_database_size(prev_perms) + max_size > this->max_swarm_storage); } } // any max size set? if (max_size) { uint64_t size; std::tie(std::ignore, size) = this->storage->get_size(request.header().db_uuid()); // test create if (request_type == database_msg::kCreate) { return (size + request.create().key().size() + request.create().value().size() > max_size); } // test update if (request_type == database_msg::kUpdate) { const auto prev_kv_size = this->storage->get_key_size(request.header().db_uuid(), request.update().key()); if (prev_kv_size) { return (size - *prev_kv_size + request.update().key().size() + request.update().value().size() > max_size); } } } return false; } size_t crud::get_swarm_storage_usage() { const auto databases = this->storage->get_keys(PERMISSION_UUID); size_t current_database_max_sizes{}; for(const auto& database : databases) { auto const result = this->storage->read(PERMISSION_UUID, database); if (result) { Json::CharReaderBuilder rbuilder; std::unique_ptr const reader(rbuilder.newCharReader()); std::string parse_errors; Json::Value json; if (!reader->parse(result.value().c_str(), result.value().c_str() + result.value().size(), &json, &parse_errors)) { throw std::runtime_error("Failed to parse database json uuid data: " + parse_errors); } const auto max_size = this->max_database_size(json); LOG(debug) << "database: " << database << " " << result.value(); current_database_max_sizes += max_size; } } return current_database_max_sizes; } bool crud::do_eviction(const database_msg& request, size_t max_size) { const auto PERMS{this->get_database_permissions(request.header().db_uuid()).second}; if (auto eviction_policy = this->get_eviction_policy(PERMS)) { auto keys_to_evict {eviction_policy->keys_to_evict(request, max_size)}; if (keys_to_evict.empty()) { return false; } std::for_each( keys_to_evict.begin(), keys_to_evict.end(), [&](const auto& key) { this->storage->remove(request.header().db_uuid(), key); }); return true; } return false; } std::string crud::get_name() { return "crud"; } bzn::json_message crud::get_status() { bzn::json_message status; std::shared_lock lock(this->crud_lock); // lock for read access status["max_swarm_storage"] = uint64_t(this->max_swarm_storage); status["swarm_storage_usage"] = uint64_t(this->get_swarm_storage_usage()); return status; } ================================================ FILE: crud/crud.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace bzn { class crud final : public bzn::crud_base, public bzn::status_provider_base, public std::enable_shared_from_this { public: crud(std::shared_ptr io_context, std::shared_ptr storage , std::shared_ptr subscription_manager , std::shared_ptr node, bzn::key_t owner_public_key = ""); void handle_request(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) override; void start(std::shared_ptr pbft, size_t max_storage = 0) override; bool save_state() override; std::shared_ptr get_saved_state() override; bool load_state(const std::string& state) override; bzn::json_message get_status() override; std::string get_name() override; private: void handle_create_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_update_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_delete_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_has_db(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_create(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_read(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_update(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_delete(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_ttl(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_persist(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_expire(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_has(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_keys(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_size(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_subscribe(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_unsubscribe(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_writers(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_add_writers(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void handle_remove_writers(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session); void send_response(const database_msg& request, bzn::storage_result result, database_response&& response, std::shared_ptr& session); // permission... std::pair get_database_permissions(const bzn::uuid_t& uuid) const; Json::Value create_permission_data(const bzn::caller_id_t& caller_id, const database_create_db& request) const; bzn::value_t update_permission_data(Json::Value& perms, const database_create_db& request) const; size_t get_swarm_storage_usage(); bool is_caller_owner(const bzn::caller_id_t& caller_id, const Json::Value& perms) const; bool is_caller_a_writer(const bzn::caller_id_t& caller_id, const Json::Value& perms) const; void add_writers(const database_msg& request, Json::Value& perms); void remove_writers(const database_msg& request, Json::Value& perms); uint64_t max_database_size(const Json::Value& perms) const; bool operation_exceeds_available_space(const database_msg& request, const Json::Value& perms); // expiration... void check_key_expiration(const boost::system::error_code& ec); bool expired(const bzn::uuid_t& uuid, const bzn::key_t& key); void update_expiration_entry(const bzn::uuid_t& generated_key, uint64_t expire); void remove_expiration_entry(const bzn::key_t& generated_key); void flush_expiration_entries(const bzn::uuid_t& uuid); std::optional get_ttl(const bzn::uuid_t& uuid, const bzn::key_t& key) const; // cache replacement policy std::shared_ptr get_eviction_policy(const Json::Value& perms); bool do_eviction(const database_msg& request, size_t max_size); std::shared_ptr storage; std::shared_ptr subscription_manager; std::shared_ptr node; std::shared_ptr pbft; // required for expiration std::unique_ptr expire_timer; using message_handler_t = std::function session)>; std::unordered_map message_handlers; std::once_flag start_once; std::shared_mutex crud_lock; // for multi-reader and single writer access const bzn::key_t owner_public_key; size_t max_swarm_storage{}; // maximum size of swarm database (unlimited when zero) }; } // namespace bzn ================================================ FILE: crud/crud_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include namespace bzn { class pbft_base; class crud_base { public: virtual ~crud_base() = default; virtual void handle_request(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session) = 0; virtual void start(std::shared_ptr pbft, size_t max_storage) = 0; virtual bool save_state() = 0; virtual std::shared_ptr get_saved_state() = 0; virtual bool load_state(const std::string& state) = 0; }; } // namespace bzn ================================================ FILE: crud/subscription_manager.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include using namespace bzn; namespace { const std::chrono::seconds DEFAULT_DEAD_SESSION_CHECK{15}; } subscription_manager::subscription_manager(std::shared_ptr io_context) : purge_timer(io_context->make_unique_steady_timer()) { } void subscription_manager::start() { std::call_once(this->start_once, [this]() { this->purge_timer->expires_from_now(DEFAULT_DEAD_SESSION_CHECK); this->purge_timer->async_wait(std::bind(&subscription_manager::purge_closed_sessions, shared_from_this(), std::placeholders::_1)); }); } void subscription_manager::subscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr session) { LOG(debug) << "session [" << session->get_session_id() << "] subscription request: " << uuid << ":" << transaction_id << ":" << key; std::lock_guard lock(this->subscribers_lock); if (auto database_it = this->subscribers.find(uuid); database_it != this->subscribers.end()) { if (auto key_it = database_it->second.find(key); key_it == database_it->second.end()) { // add new key and subscriber... database_it->second[key][session->get_session_id()][transaction_id] = std::move(session); this->key_seq_number[uuid][key] = 0; return; } else { // find existing session... auto session_it = database_it->second[key].find(session->get_session_id()); if (session_it == database_it->second[key].end() || session_it->second.find(transaction_id) == session_it->second.end()) { // add new key and subscriber... database_it->second[key][session->get_session_id()][transaction_id] = std::move(session); return; } } // session already subscribed to this key... response.mutable_error()->set_message(MSG_DUPLICATE_SUB); LOG(debug) << "session [" << session->get_session_id() << "] has already subscribed to: " << uuid << ":" << transaction_id << ":" << key; return; } // create a new entry... this->subscribers[uuid][key][session->get_session_id()][transaction_id] = std::move(session); } void subscription_manager::unsubscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr session) { LOG(debug) << "session [" << session->get_session_id() << "] unsubscribe request: " << uuid << ":" << key << ":" << transaction_id; std::lock_guard lock(this->subscribers_lock); auto database_it = this->subscribers.find(uuid); if (database_it == this->subscribers.end()) { response.mutable_error()->set_message(MSG_INVALID_UUID); LOG(debug) << "session [" << session->get_session_id() << "] unknown database & key: " << uuid << ":" << key << ":" << transaction_id; return; } auto key_it = database_it->second.find(key); if (key_it == database_it->second.end()) { response.mutable_error()->set_message(MSG_INVALID_KEY); LOG(debug) << "session [" << session->get_session_id() << "] unknown key: " << uuid << ":" << key << ":" << transaction_id; return; } // check to see if session is already in the list... if (auto session_it = database_it->second[key].find(session->get_session_id()); session_it == key_it->second.end()) { response.mutable_error()->set_message(MSG_INVALID_SUB); LOG(debug) << "session [" << session->get_session_id() << "] not subscribed to: " << uuid << ":" << key << ":" << transaction_id; return; } else { // remove subscription... if (auto sub_it = session_it->second.find(transaction_id); sub_it != session_it->second.end()) { session_it->second.erase(sub_it); return; } response.mutable_error()->set_message(MSG_INVALID_SUB); LOG(debug) << "session [" << session->get_session_id() << "] not subscribed to: " << uuid << ":" << key << ":" << transaction_id; } } void subscription_manager::notify_sessions(const bzn::uuid_t& uuid, const bool update, const bzn::key_t& key, const std::string& value) { std::lock_guard lock(this->subscribers_lock); if (auto database_it = this->subscribers.find(uuid); database_it != this->subscribers.end()) { if (auto key_it = database_it->second.find(key); key_it != database_it->second.end()) { std::once_flag once; for (const auto& sessions : key_it->second) { std::call_once(once, [&]{++this->key_seq_number[uuid][key];}); for (const auto& subscription : sessions.second) { if (auto session_shared_ptr = subscription.second.lock()) { database_response resp; resp.mutable_header()->set_db_uuid(uuid); resp.mutable_header()->set_nonce(subscription.first); resp.mutable_subscription_update()->set_key(key); resp.mutable_subscription_update()->set_seq(this->key_seq_number[uuid][key]); if (!value.empty()) { resp.mutable_subscription_update()->set_value(value); } if (update) { resp.mutable_subscription_update()->set_operation(database_subscription_update::UPDATE); } else { resp.mutable_subscription_update()->set_operation(database_subscription_update::DELETE); } LOG(debug) << "notifying session [" << session_shared_ptr->get_session_id() << "] : " << uuid << ":" << key << ":" << subscription.first << ":" << this->key_seq_number[uuid][key] << ":" << value.substr(0, MAX_MESSAGE_SIZE); session_shared_ptr->send_message(std::make_shared(resp.SerializeAsString())); } } } } } } void subscription_manager::inspect_commit(const database_msg& msg) { switch (msg.msg_case()) { case database_msg::kCreate: this->notify_sessions(msg.header().db_uuid(), true, msg.create().key(), msg.create().value()); break; case database_msg::kUpdate: this->notify_sessions(msg.header().db_uuid(), true, msg.update().key(), msg.update().value()); break; case database_msg::kDelete: this->notify_sessions(msg.header().db_uuid(), false, msg.delete_().key(), ""); break; default: // nothing to do... break; } } void subscription_manager::purge_closed_sessions(const boost::system::error_code& ec) { if (!ec) { std::lock_guard lock(this->subscribers_lock); auto database_it = this->subscribers.begin(); while (database_it != this->subscribers.end()) { size_t purged{}; auto key_it = database_it->second.begin(); while (key_it != database_it->second.end()) { auto session_it = key_it->second.begin(); while (session_it != key_it->second.end()) { auto subscribers_it = session_it->second.begin(); while (subscribers_it != session_it->second.end()) { if (auto session_shared_ptr = subscribers_it->second.lock()) { ++subscribers_it; continue; } LOG(debug) << "purged closed session [" << session_it->first << "] for: " << database_it->first; ++purged; subscribers_it = session_it->second.erase(subscribers_it); } if (session_it->second.empty()) { session_it = key_it->second.erase(session_it); continue; } ++session_it; } if (key_it->second.empty()) { key_it = database_it->second.erase(key_it); continue; } ++key_it; } if (purged) { LOG(info) << "purged " << purged << " closed sessions for database: " << database_it->first; } if (database_it->second.empty()) { database_it = this->subscribers.erase(database_it); continue; } ++database_it; } // reschedule... this->purge_timer->expires_from_now(DEFAULT_DEAD_SESSION_CHECK); this->purge_timer->async_wait(std::bind(&subscription_manager::purge_closed_sessions, shared_from_this(), std::placeholders::_1)); } } ================================================ FILE: crud/subscription_manager.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include namespace bzn { class subscription_manager final : public bzn::subscription_manager_base, public std::enable_shared_from_this { public: subscription_manager(std::shared_ptr io_context); void start() override; void subscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr session) override; void unsubscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr session) override; void inspect_commit(const database_msg& msg) override; private: void purge_closed_sessions(const boost::system::error_code& ec); void notify_sessions(const bzn::uuid_t& uuid, bool update, const bzn::key_t& key, const std::string& value); std::unordered_map>>>> subscribers; std::unordered_map> key_seq_number; std::mutex subscribers_lock; std::unique_ptr purge_timer; std::once_flag start_once; }; } // namespace bzn ================================================ FILE: crud/subscription_manager_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include namespace bzn { const std::string MSG_INVALID_UUID = "INVALID_UUID"; const std::string MSG_INVALID_KEY = "INVALID_KEY"; const std::string MSG_INVALID_SUB = "INVALID_SUB"; const std::string MSG_DUPLICATE_SUB = "DUPLICATE_SUB"; class subscription_manager_base { public: virtual ~subscription_manager_base() = default; virtual void start() = 0; virtual void subscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr session) = 0; virtual void unsubscribe(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr session) = 0; virtual void inspect_commit(const database_msg& msg) = 0; }; } // namespace bzn ================================================ FILE: crud/test/CMakeLists.txt ================================================ set(test_srcs crud_test.cpp subscription_manager_test.cpp) set(test_libs crud pbft pbft_operations node storage peers_beacon proto smart_mocks ${Protobuf_LIBRARIES}) add_gmock_test(crud) ================================================ FILE: crud/test/crud_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::testing; namespace { const std::string TTL_UUID{"TTL"}; bool parse_env_to_db_resp(database_response& target, const std::string& source) { bzn_envelope intermediate; return intermediate.ParseFromString(source) && target.ParseFromString(intermediate.database_response()); } void expect_signed_response(const std::shared_ptr& session, std::optional db_uuid = std::nullopt, std::optional nonce = std::nullopt, std::optional response_case = std::nullopt, std::optional error_msg = std::nullopt, std::function additional_checks = [](auto){}) { EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke( [=](std::shared_ptr env) { EXPECT_EQ(env->payload_case(), bzn_envelope::kDatabaseResponse); database_response resp; resp.ParseFromString(env->database_response()); if (db_uuid) { EXPECT_EQ(resp.header().db_uuid(), *db_uuid); } if (nonce) { EXPECT_EQ(resp.header().nonce(), *nonce); } if (response_case) { EXPECT_EQ(resp.response_case(), *response_case); } if (error_msg) { EXPECT_EQ(resp.error().message(), *error_msg); } additional_checks(resp); })); } void expect_response(const std::shared_ptr& session, std::optional db_uuid = std::nullopt, std::optional nonce = std::nullopt, std::optional response_case = std::nullopt, std::optional error_msg = std::nullopt, std::function additional_checks = [](auto){}) { EXPECT_CALL(*session, send_message(_)).WillOnce(Invoke( [=](std::shared_ptr msg) { bzn_envelope env; env.ParseFromString(*msg); EXPECT_EQ(env.payload_case(), bzn_envelope::kDatabaseResponse); database_response resp; resp.ParseFromString(env.database_response()); if (db_uuid) { EXPECT_EQ(resp.header().db_uuid(), *db_uuid); } if (nonce) { EXPECT_EQ(resp.header().nonce(), *nonce); } if (response_case) { EXPECT_EQ(resp.response_case(), *response_case); } if (error_msg) { EXPECT_EQ(resp.error().message(), *error_msg); } additional_checks(resp); })); } std::shared_ptr initialize_crud( std::shared_ptr& session , std::shared_ptr& mock_node , bzn::uuid_t caller_id) { mock_node = std::make_shared(); auto mock_subscription_manager = std::make_shared>(); auto mock_io_context = std::make_shared>(); session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, mock_node, caller_id); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); return crud; } std::string generate_random_hash() { boost::uuids::random_generator gen; return boost::lexical_cast(boost::uuids::to_string(gen())); } database_msg build_header_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, const std::string& request_hash) { database_msg msg; msg.mutable_header()->set_point_of_contact(caller_uuid); msg.mutable_header()->set_db_uuid(db_uuid); msg.mutable_header()->set_nonce(nonce); msg.mutable_header()->set_request_hash(request_hash); return msg; } database_msg build_create_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, const std::string& request_hash, const bzn::key_t &key, const bzn::value_t &value, uint64_t expire = 0) { database_msg msg {build_header_msg(caller_uuid, db_uuid, nonce, request_hash)}; msg.mutable_create()->set_key(key); msg.mutable_create()->set_value(value); if (expire) { msg.mutable_create()->set_expire(expire); } return msg; } database_msg build_update_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, const std::string& request_hash, const bzn::key_t &key, const bzn::value_t &value, uint64_t expire = 0) { database_msg msg {build_header_msg(caller_uuid, db_uuid, nonce, request_hash)}; msg.mutable_header()->set_nonce(nonce); msg.mutable_update()->set_key(key); msg.mutable_update()->set_value(value); if (expire) { msg.mutable_update()->set_expire(expire); } return msg; } database_msg build_create_db_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, size_t max_size, database_create_db_eviction_policy_type eviction_policy) { database_msg msg {build_header_msg(caller_uuid, db_uuid, nonce, generate_random_hash())}; msg.mutable_create_db()->set_max_size(max_size); msg.mutable_create_db()->set_eviction_policy(eviction_policy); return msg; } database_msg build_update_db_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, size_t max_size, database_create_db_eviction_policy_type eviction_policy) { database_msg msg {build_header_msg(caller_uuid, db_uuid, nonce, generate_random_hash())}; msg.mutable_update_db()->set_max_size(max_size); msg.mutable_update_db()->set_eviction_policy(eviction_policy); return msg; } database_msg build_quick_read_msg(const bzn::uuid_t &caller_uuid, const bzn::uuid_t &db_uuid, uint64_t nonce, const bzn::key_t &key) { database_msg msg {build_header_msg(caller_uuid, db_uuid, nonce, generate_random_hash())}; msg.mutable_quick_read()->set_key(key); return msg; } void create_test_database( const std::shared_ptr& crud , const std::shared_ptr& session , const std::shared_ptr& mock_node , const bzn::uuid_t& caller_uuid , const bzn::uuid_t& db_uuid , uint64_t max_size = 0 , database_create_db_eviction_policy_type eviction_policy = database_create_db_eviction_policy_type_NONE) { database_msg msg{build_create_db_msg(caller_uuid, db_uuid, 0, max_size, eviction_policy)}; // We are not testing create database, so we can suppress the send_signed_message calls. EXPECT_CALL(*session, send_signed_message(_)); EXPECT_CALL(*mock_node, send_signed_message(A(),_)); crud->handle_request(caller_uuid, msg, session); } void remove_test_database( const std::shared_ptr& crud , const std::shared_ptr& session , const std::shared_ptr& mock_node , const bzn::uuid_t& caller_uuid , const bzn::uuid_t& db_uuid) { database_msg msg{build_header_msg(caller_uuid, db_uuid, 0, generate_random_hash())}; msg.mutable_delete_db(); // We are not testing remove database, so hide these messsages. EXPECT_CALL(*mock_node, send_signed_message(A(),_)); EXPECT_CALL(*session, send_signed_message(_)); crud->handle_request(caller_uuid, msg, session); } void create_key_value( const std::shared_ptr& crud , const std::shared_ptr& session , const std::shared_ptr& mock_node , const bzn::uuid_t& caller , const std::string& request_hash , const bzn::uuid_t& db , const std::string& key , const std::string& value , uint64_t expire = 0) { database_msg msg{build_create_msg(caller, db, 123, request_hash, key, value, expire)}; // We are not testing create, so we can suppress the send_signed_message calls. EXPECT_CALL(*session, send_signed_message(_)); EXPECT_CALL(*mock_node, send_signed_message(A(),_)); crud->handle_request(caller, msg, session); } void update_key_value( const std::shared_ptr& crud , const std::shared_ptr& session , const std::shared_ptr& mock_node , const bzn::uuid_t& caller , const std::string& request_hash , const bzn::uuid_t& db , const std::string& key , const std::string& value , uint64_t expire = 0) { database_msg msg{build_update_msg(caller, db, 123, request_hash, key, value, expire)}; // We are not testing update, so we can suppress the send_signed_message calls. EXPECT_CALL(*session, send_signed_message(_)); EXPECT_CALL(*mock_node, send_signed_message(A(),_)); crud->handle_request(caller, msg, session); } std::pair get_database_size( const std::shared_ptr& crud , const std::shared_ptr& session , const std::shared_ptr& mock_node , const bzn::uuid_t& caller, const bzn::uuid_t& db) { std::promise> db_size_promise; database_msg msg{build_header_msg(caller, db, 123, generate_random_hash())}; msg.mutable_size(); EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke( [&](const std::shared_ptr& env) { database_response resp; resp.ParseFromString(env->database_response()); db_size_promise.set_value(std::pair{resp.size().keys(), resp.size().bytes()}); })); // We are not testing get database size, so we can suppress the mock_node send_signed_message call. EXPECT_CALL(*mock_node, send_signed_message(A(),_)); std::future> future = db_size_promise.get_future(); crud->handle_request(caller, msg, session); return future.get(); } std::set get_database_keys( const std::shared_ptr& crud , const std::shared_ptr& session , const std::shared_ptr& mock_node , const bzn::uuid_t& caller_id , const bzn::uuid_t& db_uuid) { std::promise> keys_promise; database_msg msg{build_header_msg(caller_id, db_uuid, 123, generate_random_hash())}; msg.mutable_keys(); expect_signed_response(session, db_uuid, uint64_t(123), database_response::kKeys, std::nullopt, [&](const auto& resp) { std::set tmp_set(resp.keys().keys().begin(), resp.keys().keys().end()); keys_promise.set_value(tmp_set); }); // We are not testing get database keys, so we can suppress the mock_node send_signed_message call. EXPECT_CALL(*mock_node, send_signed_message(A(),_)); std::future> future = keys_promise.get_future(); crud->handle_request(db_uuid, msg, session); return future.get(); } std::string do_quickread(const std::shared_ptr& crud , const std::shared_ptr& session , const std::shared_ptr& mock_node , const bzn::uuid_t& caller_id , const bzn::uuid_t& db_uuid , const bzn::key_t& key) { const uint64_t NONCE{123}; std::promise value_promise; database_msg msg{build_quick_read_msg(caller_id, db_uuid, NONCE, key)}; expect_response(session, db_uuid, NONCE, database_response::kQuickRead, std::nullopt, [&](const auto& msg) { value_promise.set_value( msg.quick_read().value()); }); // We are not testing quickread, so we can suppress the mock_node send_signed_message call. EXPECT_CALL(*mock_node, send_signed_message(A(),_)); std::future future = value_promise.get_future(); crud->handle_request(db_uuid, msg, session); return future.get(); } std::string make_key(size_t index) { return str(boost::format("key%04d") % index); } std::string make_value(size_t size) { return std::string(size,'X'); } size_t fill_database( const std::shared_ptr& crud , const std::shared_ptr& session , const std::shared_ptr& mock_node , const bzn::uuid_t& caller_id , const std::string request_hash , const bzn::uuid_t& db_uuid , size_t value_size , size_t max_size, bool expires = false) { // We have a cache with random eviction and max size MAX_SIZE bytes, fill up the database to just under the // limit const size_t ITEMS{max_size / (make_key(0).length() + value_size)}; const bzn::value_t VALUE{make_value(value_size)}; for (size_t index{0} ; index < ITEMS; ++index) { create_key_value( crud, session, mock_node, caller_id , request_hash.empty() ? generate_random_hash() : request_hash , db_uuid, make_key(index), VALUE , expires ? index * 1024 + 1024 : 0 ); } return ITEMS; } } TEST(crud, test_that_create_sends_proper_response) { auto mock_subscription_manager = std::make_shared>(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... auto session = std::make_shared(); expect_signed_response(session, "uuid", 123, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::db_not_found)); crud->handle_request("caller_id", msg, session); // now create the db... msg.mutable_create_db(); expect_signed_response(session, "uuid", 123, database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // now test creates... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); msg.mutable_create()->set_expire(2); EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); expect_signed_response(session, "uuid", 123, database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // fail to create same key... expect_signed_response(session, "uuid", 123, database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::exists)); crud->handle_request("caller_id", msg, session); // fail because key is too big... msg.mutable_create()->set_key(std::string(bzn::MAX_KEY_SIZE + 1, '*')); expect_signed_response(session, "uuid", 123, database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::key_too_large)); crud->handle_request("caller_id", msg, session); // fail because value is too big... msg.mutable_create()->set_value(std::string(bzn::MAX_VALUE_SIZE + 1, '*')); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::value_too_large)); crud->handle_request("caller_id", msg, session); // get ttl for new key msg.mutable_ttl()->set_key("key"); expect_signed_response(session, "uuid", uint64_t(123), database_response::kTtl, std::nullopt, [](const database_response& resp) { EXPECT_EQ(resp.ttl().key(), "key"); EXPECT_GE(resp.ttl().ttl(), uint64_t(1)); }); crud->handle_request("caller_id", msg, session); // expire key... sleep(2); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::delete_pending)); crud->handle_request("caller_id", msg, session); // calling create should return delete pending... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); msg.mutable_create()->set_expire(2); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::delete_pending)); crud->handle_request("caller_id", msg, session); } TEST(crud, test_that_point_of_contact_create_sends_proper_response) { auto mock_node = std::make_shared(); auto mock_subscription_manager = std::make_shared>(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, mock_node); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... EXPECT_CALL(*mock_node, send_signed_message("point_of_contact",_)).WillOnce(Invoke( [&](const bzn::uuid_t& , auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found)); })); crud->handle_request("caller_id", msg, nullptr); // now create the db... msg.mutable_create_db(); // virtual void send_signed_message(const bzn::uuid_t& , std::shared_ptr msg, bool close_session) = 0; EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", _)).WillOnce(Invoke( [&](const auto& , auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET); })); crud->handle_request("caller_id", msg, nullptr); // now test creates... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", _)).WillOnce(Invoke( [&](const auto& , auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET); })); crud->handle_request("caller_id", msg, nullptr); // ttl should fail since default is zero... msg.mutable_ttl()->set_key("key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", _)).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::ttl_not_found)); })); crud->handle_request("caller_id", msg, nullptr); // fail to create same key... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", _)).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kError); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::exists)); })); crud->handle_request("caller_id", msg, nullptr); // fail because key is too big... msg.mutable_create()->set_key(std::string(bzn::MAX_KEY_SIZE+1,'*')); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", _)).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kError); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::key_too_large)); })); crud->handle_request("caller_id", msg, nullptr); // fail because value is too big... msg.mutable_create()->set_value(std::string(bzn::MAX_VALUE_SIZE+1,'*')); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", _)).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kError); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::value_too_large)); })); crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_read_sends_proper_response) { auto mock_subscription_manager = std::make_shared>(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); crud->handle_request("caller_id", msg, nullptr); // test reads... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); msg.mutable_create()->set_expire(2); // add key... auto session = std::make_shared(); EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); expect_signed_response(session); crud->handle_request("caller_id", msg, session); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // read key... msg.mutable_read()->set_key("key"); expect_signed_response(session, "uuid", uint64_t(123), database_response::kRead, std::nullopt, [](const auto& resp) { ASSERT_EQ(resp.read().key(), "key"); ASSERT_EQ(resp.read().value(), "value"); }); crud->handle_request("caller_id", msg, session); // quick read key... msg.mutable_quick_read()->set_key("key"); expect_response(session, "uuid", uint64_t(123), database_response::kQuickRead, std::nullopt, [](const auto& resp) { ASSERT_EQ(resp.quick_read().key(), "key"); ASSERT_EQ(resp.quick_read().value(), "value"); }); crud->handle_request("caller_id", msg, session); // invalid db... msg.mutable_header()->set_db_uuid("invalid"); msg.mutable_read()->set_key("key"); expect_signed_response(session, "invalid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::db_not_found)); crud->handle_request("caller_id", msg, session); msg.mutable_quick_read()->set_key("key"); expect_response(session, "invalid", uint64_t(123), database_response::kQuickRead, std::nullopt, [](const auto& resp) { ASSERT_EQ(resp.quick_read().error(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found)); }); crud->handle_request("caller_id", msg, session); // read invalid key... msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_read()->set_key("invalid-key"); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::not_found)); crud->handle_request("caller_id", msg, session); // quick read invalid key... msg.mutable_quick_read()->set_key("invalid-key"); expect_response(session, "uuid", uint64_t(123), database_response::kQuickRead, std::nullopt, [](const auto& resp) { ASSERT_EQ(resp.quick_read().error(), bzn::storage_result_msg.at(bzn::storage_result::not_found)); }); crud->handle_request("caller_id", msg, session); // null session nothing should happen... crud->handle_request("caller_id", msg, nullptr); // expired key should return delete_pending msg.mutable_read()->set_key("key"); sleep(2); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::delete_pending)); crud->handle_request("caller_id", msg, session); } TEST(crud, test_that_point_of_contact_read_sends_proper_response) { auto mock_subscription_manager = std::make_shared>(); auto mock_node = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, mock_node); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // test reads... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // read key... msg.mutable_read()->set_key("key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kRead); ASSERT_EQ(resp.read().key(), "key"); ASSERT_EQ(resp.read().value(), "value"); })); crud->handle_request("caller_id", msg, nullptr); // quick read key... msg.mutable_quick_read()->set_key("key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", _)).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kQuickRead); ASSERT_EQ(resp.quick_read().key(), "key"); ASSERT_EQ(resp.quick_read().value(), "value"); })); crud->handle_request("caller_id", msg, nullptr); // read invalid key... msg.mutable_read()->set_key("invalid-key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kError); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::not_found)); })); crud->handle_request("caller_id", msg, nullptr); // quick read invalid key... msg.mutable_quick_read()->set_key("invalid-key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kQuickRead); ASSERT_EQ(resp.quick_read().error(), bzn::storage_result_msg.at(bzn::storage_result::not_found)); })); crud->handle_request("caller_id", msg, nullptr); // null point_of_contact, nothing should happen... msg.mutable_header()->clear_point_of_contact(); crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_update_sends_proper_response) { auto mock_subscription_manager = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); EXPECT_CALL(*mock_subscription_manager, start()); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); crud->handle_request("caller_id", msg, nullptr); // test updates... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... auto session = std::make_shared(); EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); expect_signed_response(session); crud->handle_request("caller_id", msg, session); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // update key... EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); msg.mutable_update()->set_key("key"); msg.mutable_update()->set_value("updated"); msg.mutable_update()->set_expire(2); expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // clear msg... msg.mutable_update()->release_key(); msg.mutable_update()->release_value(); // read updated key... msg.mutable_read()->set_key("key"); expect_signed_response(session, "uuid", uint64_t(123), database_response::kRead, std::nullopt, [](const auto& resp) { ASSERT_EQ(resp.read().key(), "key"); ASSERT_EQ(resp.read().value(), "updated"); }); crud->handle_request("caller_id", msg, session); // expired key should return delete_pending msg.mutable_update()->set_key("key"); msg.mutable_update()->set_value("updated"); sleep(2); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::delete_pending)); crud->handle_request("caller_id", msg, session); } TEST(crud, test_that_point_of_contact_update_sends_proper_response) { auto mock_subscription_manager = std::make_shared(); auto mock_node = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, mock_node); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); EXPECT_CALL(*mock_subscription_manager, start()); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // test updates... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // update key... EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); msg.mutable_update()->set_key("key"); msg.mutable_update()->set_value("updated"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET); })); crud->handle_request("caller_id", msg, nullptr); // clear msg... msg.mutable_update()->release_key(); msg.mutable_update()->release_value(); // read updated key... msg.mutable_read()->set_key("key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kRead); ASSERT_EQ(resp.read().key(), "key"); ASSERT_EQ(resp.read().value(), "updated"); })); crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_delete_sends_proper_response) { auto mock_subscription_manager = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); EXPECT_CALL(*mock_subscription_manager, start()); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); crud->handle_request("caller_id", msg, nullptr); // test deletes... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... auto session = std::make_shared(); EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); expect_signed_response(session); crud->handle_request("caller_id", msg, session); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // delete key... msg.mutable_delete_()->set_key("key"); expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); crud->handle_request("caller_id", msg, session); // delete invalid key... expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::not_found)); crud->handle_request("caller_id", msg, session); } TEST(crud, test_that_point_of_contact_delete_sends_proper_response) { auto mock_node = std::make_shared(); auto mock_subscription_manager = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, mock_node); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); EXPECT_CALL(*mock_subscription_manager, start()); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // test deletes... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // delete key... msg.mutable_delete_()->set_key("key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET); })); EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); crud->handle_request("caller_id", msg, nullptr); // delete invalid key... EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kError); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::not_found)); })); crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_has_sends_proper_response) { auto mock_node = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); crud->handle_request("caller_id", msg, nullptr); // test has... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... auto session = std::make_shared(); expect_signed_response(session); crud->handle_request("caller_id", msg, session); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // valid key... msg.mutable_has()->set_key("key"); expect_signed_response(session, "uuid", uint64_t(123), database_response::kHas, std::nullopt, [](const auto& resp) { ASSERT_EQ(resp.has().key(), "key"); ASSERT_TRUE(resp.has().has()); }); crud->handle_request("caller_id", msg, session); // invalid key... msg.mutable_has()->set_key("invalid-key"); expect_signed_response(session, "uuid", 123, database_response::kHas, std::nullopt, [](const auto& resp) { ASSERT_EQ(resp.has().key(), "invalid-key"); ASSERT_FALSE(resp.has().has()); }); crud->handle_request("caller_id", msg, session); // invalid database msg.mutable_header()->set_db_uuid("invalid-uuid"); msg.mutable_has()->set_key("key"); expect_signed_response(session, "invalid-uuid", 123, database_response::kError, std::nullopt, [](const auto& resp) { ASSERT_EQ(resp.header().db_uuid(), "invalid-uuid"); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found)); }); crud->handle_request("caller_id", msg, session); // null session nothing should happen... crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_point_of_contact_has_sends_proper_response) { auto mock_node = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), mock_node); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // test has... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // valid key... msg.mutable_has()->set_key("key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kHas); ASSERT_EQ(resp.has().key(), "key"); ASSERT_TRUE(resp.has().has()); })); crud->handle_request("caller_id", msg, nullptr); // invalid key... msg.mutable_has()->set_key("invalid-key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kHas); ASSERT_EQ(resp.has().key(), "invalid-key"); ASSERT_FALSE(resp.has().has()); })); crud->handle_request("caller_id", msg, nullptr); // null session nothing should happen... msg.mutable_header()->clear_point_of_contact(); crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_keys_sends_proper_response) { auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); crud->handle_request("caller_id", msg, nullptr); // test keys... msg.mutable_create()->set_key("key1"); msg.mutable_create()->set_value("value"); // add key... auto session = std::make_shared(); EXPECT_CALL(*session, send_signed_message(_)).Times(2); crud->handle_request("caller_id", msg, session); // add another... msg.mutable_create()->set_key("key2"); crud->handle_request("caller_id", msg, session); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // get keys... msg.mutable_keys(); expect_signed_response(session, "uuid", uint64_t(123), database_response::kKeys, std::nullopt, [](auto resp) { ASSERT_EQ(resp.keys().keys().size(), int(2)); // keys are not returned in order created... auto keys = resp.keys().keys(); std::sort(keys.begin(), keys.end()); ASSERT_EQ(keys[0], "key1"); ASSERT_EQ(keys[1], "key2"); }); crud->handle_request("caller_id", msg, session); // invalid uuid returns empty message... msg.mutable_header()->set_db_uuid("invalid-uuid"); expect_signed_response(session, "invalid-uuid", uint64_t(123), database_response::kError, std::nullopt, [](const auto& resp) { ASSERT_EQ(resp.header().db_uuid(), "invalid-uuid"); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found)); }); crud->handle_request("caller_id", msg, session); // null session nothing should happen... crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_point_of_contact_keys_sends_proper_response) { auto mock_node = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), mock_node); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // test keys... msg.mutable_create()->set_key("key1"); msg.mutable_create()->set_value("value"); // add key... EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // add another... msg.mutable_create()->set_key("key2"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // get keys... msg.mutable_keys(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kKeys); ASSERT_EQ(resp.keys().keys().size(), int(2)); // keys are not returned in order created... auto keys = resp.keys().keys(); std::sort(keys.begin(), keys.end()); ASSERT_EQ(keys[0], "key1"); ASSERT_EQ(keys[1], "key2"); })); crud->handle_request("caller_id", msg, nullptr); // invalid uuid returns empty message... msg.mutable_header()->set_db_uuid("invalid-uuid"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "invalid-uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kError); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found)); })); crud->handle_request("caller_id", msg, nullptr); // null session nothing should happen... msg.mutable_header()->clear_point_of_contact(); crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_size_sends_proper_response) { auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); msg.mutable_create_db()->set_max_size(1234); crud->handle_request("caller_id", msg, nullptr); // test size... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... auto session = std::make_shared(); expect_signed_response(session); crud->handle_request("caller_id", msg, session); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // get size... msg.mutable_size(); expect_signed_response(session, "uuid", uint64_t(123), database_response::kSize, std::nullopt, [](auto resp) { ASSERT_EQ(resp.size().bytes(), uint64_t(8)); ASSERT_EQ(resp.size().keys(), uint32_t(1)); ASSERT_EQ(resp.size().max_size(), uint64_t(1234)); }); crud->handle_request("caller_id", msg, session); // invalid uuid returns zero... msg.mutable_header()->set_db_uuid("invalid-uuid"); expect_signed_response(session, "invalid-uuid", uint64_t(123), database_response::kError); crud->handle_request("caller_id", msg, session); // null session nothing should happen... crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_point_of_contact_size_sends_proper_response) { auto mock_node = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), mock_node); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // test size... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // clear msg... msg.mutable_create()->release_key(); msg.mutable_create()->release_value(); // get size... msg.mutable_size(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kSize); ASSERT_EQ(resp.size().bytes(), uint64_t(8)); ASSERT_EQ(resp.size().keys(), uint32_t(1)); })); crud->handle_request("caller_id", msg, nullptr); // invalid uuid returns zero... msg.mutable_header()->set_db_uuid("invalid-uuid"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [&](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "invalid-uuid"); ASSERT_EQ(resp.header().nonce(), uint64_t(123)); ASSERT_EQ(resp.response_case(), database_response::kError); })); crud->handle_request("caller_id", msg, nullptr); // null session nothing should happen... msg.mutable_header()->clear_point_of_contact(); crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_subscribe_request_calls_subscription_manager) { auto mock_subscription_manager = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr); EXPECT_CALL(*mock_subscription_manager, start()); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); // subscribe... database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_subscribe()->set_key("key"); // nothing should happen... crud->handle_request("caller_id", msg, nullptr); // try again with a valid session... auto mock_session = std::make_shared(); EXPECT_CALL(*mock_subscription_manager, subscribe(msg.header().db_uuid(), msg.subscribe().key(), msg.header().nonce(), _, _)); expect_signed_response(mock_session); crud->handle_request("caller_id", msg, mock_session); } TEST(crud, test_that_unsubscribe_request_calls_subscription_manager) { auto mock_subscription_manager = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr); EXPECT_CALL(*mock_subscription_manager, start()); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); // unsubscribe... database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_unsubscribe()->set_key("key"); msg.mutable_unsubscribe()->set_nonce(321); // nothing should happen... crud->handle_request("caller_id", msg, nullptr); auto mock_session = std::make_shared(); EXPECT_CALL(*mock_subscription_manager, unsubscribe(msg.header().db_uuid(), msg.unsubscribe().key(), msg.unsubscribe().nonce(), _, _)); expect_signed_response(mock_session); crud->handle_request("caller_id", msg, mock_session); } TEST(crud, test_that_create_db_request_sends_proper_response) { auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); // create database... database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); auto mock_session = std::make_shared(); expect_signed_response(mock_session, "uuid", std::nullopt, database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, mock_session); expect_signed_response(mock_session, "uuid", std::nullopt, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::db_exists)); // try to create it again... crud->handle_request("caller_id", msg, mock_session); } TEST(crud, test_that_point_of_contact_create_db_request_sends_proper_response) { auto mock_node = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), mock_node); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); // create database... database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET); })); crud->handle_request("caller_id", msg, nullptr); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_exists)); })); // try to create it again... crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_has_db_request_sends_proper_response) { auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; // create db... msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); // nothing should happen... crud->handle_request("caller_id", msg, nullptr); auto mock_session = std::make_shared(); // request has db.. msg.mutable_has_db(); expect_signed_response(mock_session, "uuid", std::nullopt, database_response::kHasDb, std::nullopt, [](auto resp) { ASSERT_TRUE(resp.has_db().has()); }); crud->handle_request("caller_id", msg, mock_session); // request invalid db... msg.mutable_header()->set_db_uuid("invalid-uuid"); expect_signed_response(mock_session, std::nullopt, std::nullopt, database_response::kHasDb, std::nullopt, [](auto resp) { ASSERT_FALSE(resp.has_db().has()); ASSERT_EQ(resp.has_db().uuid(), "invalid-uuid"); }); crud->handle_request("caller_id", msg, mock_session); } TEST(crud, test_that_point_of_contact_has_db_request_sends_proper_response) { auto mock_node = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), mock_node); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; // create db... msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // request has db.. msg.mutable_has_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.response_case(), database_response::kHasDb); ASSERT_EQ(resp.has_db().uuid(), "uuid"); ASSERT_TRUE(resp.has_db().has()); })); crud->handle_request("caller_id", msg, nullptr); // request invalid db... msg.mutable_header()->set_db_uuid("invalid-uuid"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.response_case(), database_response::kHasDb); ASSERT_EQ(resp.has_db().uuid(), "invalid-uuid"); ASSERT_FALSE(resp.has_db().has()); })); crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_delete_db_sends_proper_response) { auto storage = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); // delete database... database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_delete_db(); auto mock_session = std::make_shared(); expect_signed_response(mock_session, "uuid", std::nullopt, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::db_not_found)); crud->handle_request("caller_id", msg, mock_session); // create a database... msg.mutable_create_db(); expect_signed_response(mock_session); crud->handle_request("caller_id", msg, mock_session); // add a key with a ttl msg.mutable_create()->set_key("key1"); msg.mutable_create()->set_value("value"); msg.mutable_create()->set_expire(123); crud->handle_request("caller_id", msg, nullptr); // delete database... msg.mutable_delete_db(); expect_signed_response(mock_session, "uuid", std::nullopt, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::access_denied)); // non-owner caller... crud->handle_request("bad_caller_id", msg, mock_session); expect_signed_response(mock_session, "uuid", std::nullopt, database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, mock_session); // test storage for ttl entry Json::Value ttl_key; ttl_key["uuid"] = "uuid"; ttl_key["key"] = "key1"; ASSERT_FALSE(storage->has(TTL_UUID, ttl_key.toStyledString())); } TEST(crud, test_that_point_of_contact_delete_db_sends_proper_response) { auto mock_node = std::make_shared(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), mock_node); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); // delete database... database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_delete_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::db_not_found)); })); crud->handle_request("caller_id", msg, nullptr); // create a database... msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud->handle_request("caller_id", msg, nullptr); // delete database... msg.mutable_delete_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::access_denied)); })); // non-owner caller... crud->handle_request("bad_caller_id", msg, nullptr); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET); })); crud->handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_state_can_be_saved_and_retrieved) { bzn::crud crud(std::make_shared>(), std::make_shared(), std::make_shared>(), nullptr); ASSERT_TRUE(crud.save_state()); auto state = crud.get_saved_state(); ASSERT_TRUE(state); ASSERT_TRUE(crud.load_state(*state)); } TEST(crud, test_that_writers_sends_proper_response) { bzn::crud crud(std::make_shared>(), std::make_shared(), std::make_shared>(), nullptr); // create database... database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); auto mock_session = std::make_shared(); expect_signed_response(mock_session); crud.handle_request("caller_id", msg, mock_session); // request writers... msg.mutable_writers(); // only the owner should be set at this stage... expect_signed_response(mock_session, "uuid", std::nullopt, database_response::kWriters, std::nullopt, [](auto resp) { ASSERT_EQ(resp.writers().owner(), "caller_id"); ASSERT_EQ(resp.writers().writers().size(), 0); }); crud.handle_request("caller_id", msg, mock_session); } TEST(crud, test_that_point_of_contact_writers_sends_proper_response) { auto mock_node = std::make_shared(); bzn::crud crud(std::make_shared>(), std::make_shared(), std::make_shared>(), mock_node); // create database... database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud.handle_request("caller_id", msg, nullptr); // request writers... msg.mutable_writers(); // only the owner should be set at this stage... EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.response_case(), database_response::kWriters); ASSERT_EQ(resp.writers().owner(), "caller_id"); ASSERT_EQ(resp.writers().writers().size(), 0); })); crud.handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_add_writers_sends_proper_response) { bzn::crud crud(std::make_shared>(), std::make_shared(), std::make_shared>(), nullptr); // create database... database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); auto mock_session = std::make_shared(); expect_signed_response(mock_session); crud.handle_request("caller_id", msg, mock_session); // request writers... // should not be added to writers as this is the owner msg.mutable_add_writers()->add_writers("caller_id"); msg.mutable_add_writers()->add_writers("client_1_key"); msg.mutable_add_writers()->add_writers("client_2_key"); expect_signed_response(mock_session, "uuid", std::nullopt, database_response::RESPONSE_NOT_SET); crud.handle_request("caller_id", msg, mock_session); // access test expect_signed_response(mock_session, "uuid", std::nullopt, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::access_denied)); crud.handle_request("other_caller_id", msg, mock_session); // request writers... msg.mutable_writers(); // only the owner should be set at this stage... expect_signed_response(mock_session, "uuid", std::nullopt, database_response::kWriters, std::nullopt, [](auto resp) { ASSERT_EQ(resp.writers().owner(), "caller_id"); ASSERT_EQ(resp.writers().writers().size(), 2); ASSERT_EQ(resp.writers().writers()[0], "client_1_key"); ASSERT_EQ(resp.writers().writers()[1], "client_2_key"); }); crud.handle_request("caller_id", msg, mock_session); } TEST(crud, test_that_point_of_contact_add_writers_sends_proper_response) { auto mock_node = std::make_shared(); bzn::crud crud(std::make_shared>(), std::make_shared(), std::make_shared>(), mock_node); // create database... database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud.handle_request("caller_id", msg, nullptr); // request writers... // should not be added to writers as this is the owner msg.mutable_add_writers()->add_writers("caller_id"); msg.mutable_add_writers()->add_writers("client_1_key"); msg.mutable_add_writers()->add_writers("client_2_key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET); })); crud.handle_request("caller_id", msg, nullptr); // access test EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::access_denied)); })); crud.handle_request("other_caller_id", msg, nullptr); // request writers... msg.mutable_writers(); // only the owner should be set at this stage... EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.response_case(), database_response::kWriters); ASSERT_EQ(resp.writers().owner(), "caller_id"); ASSERT_EQ(resp.writers().writers().size(), 2); ASSERT_EQ(resp.writers().writers()[0], "client_1_key"); ASSERT_EQ(resp.writers().writers()[1], "client_2_key"); })); crud.handle_request("caller_id", msg, nullptr); } TEST(crud, test_that_remove_writers_sends_proper_response) { bzn::crud crud(std::make_shared>(), std::make_shared(), std::make_shared>(), nullptr); // create database... database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); auto mock_session = std::make_shared(); expect_signed_response(mock_session); crud.handle_request("caller_id", msg, mock_session); // request writers... msg.mutable_add_writers()->add_writers("client_1_key"); msg.mutable_add_writers()->add_writers("client_2_key"); expect_signed_response(mock_session); crud.handle_request("caller_id", msg, mock_session); // remove writers... msg.mutable_remove_writers()->add_writers("client_2_key"); expect_signed_response(mock_session, "uuid", std::nullopt, database_response::RESPONSE_NOT_SET); crud.handle_request("caller_id", msg, mock_session); // access test expect_signed_response(mock_session, "uuid", std::nullopt, std::nullopt, bzn::storage_result_msg.at(bzn::storage_result::access_denied)); crud.handle_request("other_caller_id", msg, mock_session); } TEST(crud, test_that_point_of_contact_remove_writers_sends_proper_response) { auto mock_node = std::make_shared(); bzn::crud crud(std::make_shared>(), std::make_shared(), std::make_shared>(), mock_node); // create database... database_msg msg; msg.mutable_header()->set_point_of_contact("point_of_contact"); msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud.handle_request("caller_id", msg, nullptr); // request writers... msg.mutable_add_writers()->add_writers("client_1_key"); msg.mutable_add_writers()->add_writers("client_2_key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())); crud.handle_request("caller_id", msg, nullptr); // remove writers... msg.mutable_remove_writers()->add_writers("client_2_key"); EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.response_case(), database_response::RESPONSE_NOT_SET); })); crud.handle_request("caller_id", msg, nullptr); // access test EXPECT_CALL(*mock_node, send_signed_message("point_of_contact", An>())).WillOnce(Invoke( [](const auto&, auto msg) { database_response resp; ASSERT_TRUE(parse_env_to_db_resp(resp, msg->SerializeAsString())); ASSERT_EQ(resp.header().db_uuid(), "uuid"); ASSERT_EQ(resp.error().message(), bzn::storage_result_msg.at(bzn::storage_result::access_denied)); })); crud.handle_request("other_caller_id", msg, nullptr); } TEST(crud, test_that_key_with_expire_set_is_deleted_by_timer_callback) { auto mock_subscription_manager = std::make_shared(); auto mock_io_context = std::make_shared>(); auto mock_steady_timer = std::make_unique(); EXPECT_CALL(*mock_steady_timer, expires_from_now(_)).Times(2); bzn::asio::wait_handler wh; EXPECT_CALL(*mock_steady_timer, async_wait(_)).WillRepeatedly(Invoke( [&](auto handler) { wh = handler; })); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::move(mock_steady_timer); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr); EXPECT_CALL(*mock_subscription_manager, start()); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); bzn::uuid_t node_uuid{"node-uuid"}; EXPECT_CALL(*mock_pbft, get_uuid()).WillOnce(ReturnRef(node_uuid)); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); auto session = std::make_shared(); msg.mutable_create_db(); expect_signed_response(session, "uuid", 123, database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // create key with expiration... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); msg.mutable_create()->set_expire(1); EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); expect_signed_response(session, "uuid", 123, database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); sleep(2); // force expiration // call background timer... EXPECT_CALL(*mock_pbft, handle_database_message(_,_)); wh(boost::system::error_code()); // key should be gone... msg.mutable_read()->set_key("key"); expect_signed_response(session, "uuid", 123, database_response::kError); crud->handle_request("caller_id", msg, session); // failure does nothing... wh(make_error_code(boost::system::errc::timed_out)); } TEST(crud, test_that_key_with_expiration_can_be_made_persistent) { auto mock_io_context = std::make_shared>(); auto mock_steady_timer = std::make_unique(); EXPECT_CALL(*mock_steady_timer, expires_from_now(_)); EXPECT_CALL(*mock_steady_timer, async_wait(_)); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::move(mock_steady_timer); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); auto session = std::make_shared(); msg.mutable_create_db(); expect_signed_response(session, "uuid", 123, database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // create key with expiration... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); msg.mutable_create()->set_expire(123); expect_signed_response(session, "uuid", 123, database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // make key persist msg.mutable_persist()->set_key("key"); expect_signed_response(session, "uuid", 123, database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // should be gone msg.mutable_ttl()->set_key("key"); expect_signed_response(session, "uuid", 123, database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::ttl_not_found)); crud->handle_request("caller_id", msg, session); // make key persist that no longer exists msg.mutable_persist()->set_key("key"); expect_signed_response(session, "uuid", 123, database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::ttl_not_found)); crud->handle_request("caller_id", msg, session); } TEST(crud, test_that_create_db_uses_bluzelle_key_to_validate) { auto mock_subscription_manager = std::make_shared>(); auto mock_io_context = std::make_shared>(); auto session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr, "caller_id"); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_create_db(); EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke( [=](std::shared_ptr env) { database_response resp; resp.ParseFromString(env->database_response()); EXPECT_EQ(database_response::ResponseCase::RESPONSE_NOT_SET,resp.response_case()); EXPECT_EQ("", resp.error().message()); })); crud->handle_request("caller_id", msg, session); } TEST(crud, test_that_create_db_with_incorrect_bluzelle_key_fails_to_validate) { auto mock_subscription_manager = std::make_shared>(); auto mock_io_context = std::make_shared>(); auto session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr, "caller_id"); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_create_db(); EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke( [=](std::shared_ptr env) { database_response resp; resp.ParseFromString(env->database_response()); EXPECT_EQ(database_response::ResponseCase::kError,resp.response_case()); EXPECT_EQ(bzn::storage_result_msg.at(bzn::storage_result::access_denied), resp.error().message()); })); crud->handle_request("not_the_caller_id", msg, session); } TEST(crud, test_that_delete_db_uses_bluzelle_key_to_validate) { auto mock_subscription_manager = std::make_shared>(); auto mock_io_context = std::make_shared>(); auto session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr, "caller_id"); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); { database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke( [=](std::shared_ptr env) { database_response resp; resp.ParseFromString(env->database_response()); EXPECT_EQ(database_response::ResponseCase::RESPONSE_NOT_SET,resp.response_case()); EXPECT_EQ("", resp.error().message()); })); crud->handle_request("caller_id", msg, session); } { database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_delete_db(); EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke( [=](std::shared_ptr env) { database_response resp; resp.ParseFromString(env->database_response()); EXPECT_EQ(database_response::ResponseCase::RESPONSE_NOT_SET,resp.response_case()); EXPECT_EQ("", resp.error().message()); })); crud->handle_request("caller_id", msg, session); } } TEST(crud, test_that_delete_db_with_incorrect_bluzelle_key_fails_to_validate) { auto mock_subscription_manager = std::make_shared>(); auto mock_io_context = std::make_shared>(); auto session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr, "caller_id"); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); { database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke( [=](std::shared_ptr env) { database_response resp; resp.ParseFromString(env->database_response()); EXPECT_EQ(database_response::ResponseCase::RESPONSE_NOT_SET, resp.response_case()); EXPECT_EQ("", resp.error().message()); })); crud->handle_request("caller_id", msg, session); } { database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_delete_db(); EXPECT_CALL(*session, send_signed_message(_)).WillOnce(Invoke( [=](std::shared_ptr env) { database_response resp; resp.ParseFromString(env->database_response()); EXPECT_EQ(database_response::ResponseCase::kError, resp.response_case()); EXPECT_EQ(bzn::storage_result_msg.at(bzn::storage_result::access_denied), resp.error().message()); })); crud->handle_request("NOT_caller_id", msg, session); } } TEST(crud, test_assumption_that_boost_random_mt19937_produces_the_same_values_for_a_given_seed) { // This test is only to validate the assumption that mt19937 behaves the same on multiple operating systems. The // actual values were created on macOS Mojave with boost 1.68.0. If this test ever fails the developers need to be // told immediately const uint64_t KEY_COUNT{422}; const uint64_t seed{2615920895}; boost::random::uniform_int_distribution<> dist(0, KEY_COUNT - 1); std::vector accepted_random_integers{308, 88, 77, 377, 58, 109, 101, 369, 14, 269}; std::vector actual_random_integers(10,0); boost::random::mt19937 mt(seed); // mt19937 chosen because it is fast std::for_each(actual_random_integers.begin(), actual_random_integers.end(), [&](auto& val){ val = dist(mt); }); ASSERT_EQ(actual_random_integers, accepted_random_integers); } TEST(crud, test_that_create_and_updates_which_exceed_db_limit_send_proper_responses) { auto mock_subscription_manager = std::make_shared>(); auto mock_io_context = std::make_shared>(); auto session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto mock_pbft = std::make_shared(); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); // create db msg.mutable_create_db(); msg.mutable_create_db()->set_max_size(10); expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // create a key that exceeds db limit.. msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("00000000"); // 1 too many (key+value size) expect_signed_response(session, "uuid", uint64_t(123), database_response::kError , bzn::storage_result_msg.at(bzn::storage_result::value_too_large)); crud->handle_request("caller_id", msg, session); // create key... msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("0000000"); // exactly db limit expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // update but not exceed db limit... msg.mutable_update()->set_key("key"); msg.mutable_update()->set_value("1111111"); // exactly db limit expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // update but exceed db limit... msg.mutable_update()->set_key("key"); msg.mutable_update()->set_value("11111110"); // exactly db limit expect_signed_response(session, "uuid", uint64_t(123), database_response::kError); crud->handle_request("caller_id", msg, session); } // TODO: RHN - Move the random eviction policy tests to the policy module TEST(crud, test_random_eviction_policy_randomly_removes_a_key_value_pair_for_create) { const size_t TEST_VALUE_SIZE{20}; const uint64_t MAX_SIZE{512}; const bzn::uuid_t DB_UUID{"sut_uuid"}; const bzn::uuid_t CALLER_UUID{"caller_id"}; const uint64_t NONCE{123}; const std::string REQUEST_HASH{generate_random_hash()}; std::shared_ptr session; std::shared_ptr mock_node; auto crud{initialize_crud(session, mock_node, CALLER_UUID)}; remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID); create_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM); // We have a cache with random eviction and max size MAX_SIZE bytes, fill up the database to just under the limit // Fill up our database to almost the MAX_SIZE, such that doubling the size of one value via an update will cause // a potential overflow size_t key_count{fill_database(crud, session, mock_node, CALLER_UUID, REQUEST_HASH, DB_UUID, TEST_VALUE_SIZE, MAX_SIZE)}; const std::set pre_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)}; // Add one more key, to push the storage over the top, this is a cache, so there will be no error, simply an // eviction of an existing key database_msg msg{build_create_msg(CALLER_UUID, DB_UUID, NONCE, generate_random_hash(), make_key(key_count + 1), make_value(TEST_VALUE_SIZE))}; // In this case we expect a db_full error as the key/value pair is larger than the storage limit. expect_signed_response(session, DB_UUID, NONCE, database_response::RESPONSE_NOT_SET); EXPECT_CALL(*mock_node, send_signed_message(A(),_)); crud->handle_request(CALLER_UUID, msg, session); // After 1 replacement the number of keys must be the same, and, in this case, the size of the database must be the // same. { const auto [keys, size]{get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID)}; ASSERT_EQ( uint32_t(key_count), keys); ASSERT_EQ( keys * (make_key(0).length() + TEST_VALUE_SIZE), size); } // Compare the post eviction set of keys to the pre eviction set of keys, there should be a difference of one key std::set post_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)}; std::set difference; std::set_difference(pre_eviction_keys.begin(), pre_eviction_keys.end(), post_eviction_keys.begin(), post_eviction_keys.end(), std::inserter(difference, difference.begin())); ASSERT_EQ(size_t(1), difference.size()); // Clean up by removing the test database remove_test_database(crud, session, mock_node, DB_UUID, CALLER_UUID); } TEST(crud, test_random_eviction_policy_with_large_value_requiring_many_evictions_for_create) { const bzn::value_t TEST_VALUE{"This is a very long string to use as a test value..."}; const u_int64_t MAX_SIZE{8096}; const bzn::uuid_t DB_UUID{"sut_uuid"}; const bzn::uuid_t CALLER_UUID{"caller_id"}; const size_t VALUE_SIZE{42}; const bzn::value_t LARGE_TEST_VALUE{make_value(3 * VALUE_SIZE)}; const std::string REQUEST_HASH{generate_random_hash()}; std::shared_ptr session; std::shared_ptr mock_node; auto crud{initialize_crud(session, mock_node, CALLER_UUID)}; remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID); create_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM); // We have a cache with random eviction and max size MAX_SIZE bytes, fill up the database to just under the limit size_t key_count = fill_database(crud, session, mock_node, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE); const std::set pre_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)}; // The cache is now less than one TEST_VALUE from its max storage limit. Add a very large value to ensure that // enough key/value pairs are removed to make room for the new key/value pair create_key_value(crud, session, mock_node, CALLER_UUID, generate_random_hash(), DB_UUID, make_key(key_count), LARGE_TEST_VALUE); // Compare the actual set of keys, there must be a difference of more than one key std::set post_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)}; { size_t size; std::tie(std::ignore, size) = get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID); ASSERT_LE(size, MAX_SIZE); } std::set difference; std::set_difference(pre_eviction_keys.begin(), pre_eviction_keys.end(), post_eviction_keys.begin(), post_eviction_keys.end(), std::inserter(difference, difference.begin())); ASSERT_TRUE(difference.size() > 1); } TEST(crud, test_random_eviction_policy_edge_case_of_create_with_value_larger_than_max_storage) { // TODO: RHN - I think this test is not useful as it tests functionality that has nothing to do with eviction const uint64_t MAX_SIZE{8096}; const bzn::value_t TOO_LARGE_TEST_VALUE{make_value(MAX_SIZE)}; const bzn::uuid_t DB_UUID{"sut_uuid"}; const bzn::uuid_t CALLER_UUID{"caller_id"}; const uint64_t NONCE{123}; const std::string REQUEST_HASH{generate_random_hash()}; std::shared_ptr session; std::shared_ptr mock_node; auto crud{initialize_crud(session, mock_node, CALLER_UUID)}; remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID); create_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM); database_msg msg{build_create_msg(CALLER_UUID, DB_UUID, NONCE, REQUEST_HASH, make_key(0), make_value(MAX_SIZE))}; // In this case we expect a value_too_large error as the key/value pair is larger than the storage limit. expect_signed_response(session, DB_UUID, NONCE, database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::value_too_large)); EXPECT_CALL(*mock_node, send_signed_message(A(),_)); crud->handle_request(CALLER_UUID, msg, session); remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID); } TEST(crud, test_random_eviction_policy_randomly_removes_a_single_key_value_pair_for_update_that_exceeds_max_storage_by_small_amount) { const uint64_t MAX_SIZE{8096}; const bzn::uuid_t DB_UUID{"sut_uuid"}; const bzn::uuid_t CALLER_UUID{"caller_id"}; const size_t VALUE_SIZE{45}; const std::string REQUEST_HASH{generate_random_hash()}; std::shared_ptr session; std::shared_ptr mock_node; auto crud{initialize_crud(session, mock_node, CALLER_UUID)}; remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID); create_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM); // Fill up our database to almost the MAX_SIZE, such that doubling the size of one value via an update will cause // a potential overflow fill_database(crud, session, mock_node, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE); const std::set pre_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)}; // the database is now less than one VALUE_SIZE + key size from over flowing. Trigger a single replacement size_t size{0}; std::tie(std::ignore, size) = get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID); const size_t STORAGE_FREE{MAX_SIZE - size}; update_key_value(crud, session, mock_node, CALLER_UUID, generate_random_hash(), DB_UUID, make_key(0), make_value(VALUE_SIZE + STORAGE_FREE + 1)); { // The size of the database must be less than MAX_SIZE after the update size_t db_size; std::tie(std::ignore, db_size) = get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID); ASSERT_LE(size, MAX_SIZE); } // Compare the post eviction set of keys to the pre eviction set of keys, there should be a difference of one key std::set post_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)}; std::set difference; std::set_difference(pre_eviction_keys.begin(), pre_eviction_keys.end(), post_eviction_keys.begin(), post_eviction_keys.end(), std::inserter(difference, difference.begin())); ASSERT_EQ(size_t(1), difference.size()); // Clean up by removing the test database remove_test_database(crud, session, mock_node, DB_UUID, CALLER_UUID); } TEST(crud, test_random_eviction_policy_randomly_removes_many_key_value_pairs_for_update_that_exceeds_max_storage_by_large_amount) { const uint64_t MAX_SIZE{8096}; const bzn::uuid_t DB_UUID{"sut_uuid"}; const bzn::uuid_t CALLER_UUID{"caller_id"}; const size_t VALUE_SIZE{45}; const size_t LARGE_VALUE_SIZE{5 * VALUE_SIZE}; const std::string REQUEST_HASH{generate_random_hash()}; std::shared_ptr session; std::shared_ptr mock_node; auto crud{initialize_crud(session, mock_node, CALLER_UUID)}; remove_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID); create_test_database(crud, session, mock_node, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM); // Fill up our database to almost the MAX_SIZE, such that doubling the size of one value via an update will cause // a potential overflow fill_database(crud, session, mock_node, CALLER_UUID, generate_random_hash(), DB_UUID, VALUE_SIZE, MAX_SIZE); const std::set pre_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)}; // the database is now less than one VALUE_SIZE + key size from over flowing. Trigger a single replacement size_t size{0}; std::tie(std::ignore, size) = get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID); const size_t STORAGE_FREE{MAX_SIZE - size}; update_key_value(crud, session, mock_node, CALLER_UUID, generate_random_hash(), DB_UUID, make_key(0), make_value(LARGE_VALUE_SIZE + STORAGE_FREE)); { // The size of the database must be less than MAX_SIZE after the update size_t db_size{0}; std::tie(std::ignore, db_size) = get_database_size(crud, session, mock_node, CALLER_UUID, DB_UUID); ASSERT_LE(size, MAX_SIZE); } // Compare the post eviction set of keys to the pre eviction set of keys, there should be a difference of one key std::set post_eviction_keys{get_database_keys(crud, session, mock_node, CALLER_UUID, DB_UUID)}; std::set difference; std::set_difference(pre_eviction_keys.begin(), pre_eviction_keys.end(), post_eviction_keys.begin(), post_eviction_keys.end(), std::inserter(difference, difference.begin())); ASSERT_GT(difference.size(), size_t(1)); // Clean up by removing the test database remove_test_database(crud, session, mock_node, DB_UUID, CALLER_UUID); } // These two eviction test should probably stay here as they are testing the eviction policies *and* crud TEST(crud, test_that_two_cruds_evict_the_same_key_value_pairs_using_the_random_eviction_policy) { const size_t MAX_SIZE{8096}; const bzn::uuid_t DB_UUID{"sut_uuid"}; const bzn::uuid_t CALLER_UUID{"caller_id"}; const size_t VALUE_SIZE{27}; const std::string REQUEST_HASH{generate_random_hash()}; std::shared_ptr session_0; std::shared_ptr mock_node_0; auto crud_0{initialize_crud(session_0, mock_node_0, CALLER_UUID)}; std::shared_ptr session_1; std::shared_ptr mock_node_1; auto crud_1{initialize_crud(session_1, mock_node_1, CALLER_UUID)}; remove_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID); create_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM); remove_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID); create_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_RANDOM); // create a lot of keys to fill the database const auto KEY_COUNT = fill_database(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE); ASSERT_EQ(KEY_COUNT, fill_database(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE)); const std::set pre_eviction_keys_0{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)}; const std::set pre_eviction_keys_1{get_database_keys(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID)}; EXPECT_EQ(pre_eviction_keys_0,pre_eviction_keys_1); // create a number of keys larger than the max size of the database for(size_t index{KEY_COUNT}; index < KEY_COUNT + 100; ++index) { size_t db_size{0}; std::tie(std::ignore, db_size) = get_database_size(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID); const auto KEY = make_key(index); const auto INNER_REQUEST_HASH{generate_random_hash()}; create_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, INNER_REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE - db_size)); create_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, INNER_REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE - db_size)); } const auto select_key_from_set = [](const auto& keys, uint64_t index) { std::set::const_iterator c_it(keys.begin()); std::advance(c_it, index); return *c_it; }; // update a lot of keys with values that will exceed the database max storage boost::random::mt19937 mt; // valgrind suppression needs this as there's different behaviour every run... mt.seed(123); for(size_t i{0}; i < 20; ++i) { const std::set active_keys{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)}; const boost::random::uniform_int_distribution<> dist(0, active_keys.size() - 1); const bzn::key_t KEY{select_key_from_set(active_keys, dist(mt))}; size_t db_size{0}; std::tie(std::ignore, db_size) = get_database_size(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID); const auto VALUE{do_quickread(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID, KEY)}; const auto NEW_VALUE_SIZE{MAX_SIZE - db_size + VALUE.length() + 1}; update_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(NEW_VALUE_SIZE)); update_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(NEW_VALUE_SIZE)); } // update a key with a value larger than the value of MAX_SIZE { const std::set active_keys{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)}; const boost::random::uniform_int_distribution<> dist(0, active_keys.size() - 1); const bzn::key_t KEY{select_key_from_set(active_keys, dist(mt))}; update_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE)); update_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE)); } // Are the databases in each crud the same? const std::set post_eviction_keys_0{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)}; const std::set post_eviction_keys_1{get_database_keys(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID)}; std::set difference; std::set_difference(pre_eviction_keys_0.begin(), pre_eviction_keys_0.end(), post_eviction_keys_0.begin(), post_eviction_keys_0.end(), std::inserter(difference, difference.begin())); ASSERT_GT(difference.size(), size_t(0)); ASSERT_EQ(post_eviction_keys_0, post_eviction_keys_1); remove_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID); remove_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID); } TEST(crud, test_that_two_cruds_evict_the_same_key_value_pairs_using_the_volatile_ttl_eviction_policy) { const size_t MAX_SIZE{8096}; const bzn::uuid_t DB_UUID{"sut_uuid"}; const bzn::uuid_t CALLER_UUID{"caller_id"}; const size_t VALUE_SIZE{27}; const std::string REQUEST_HASH{generate_random_hash()}; std::shared_ptr session_0; std::shared_ptr mock_node_0; auto crud_0{initialize_crud(session_0, mock_node_0, CALLER_UUID)}; std::shared_ptr session_1; std::shared_ptr mock_node_1; auto crud_1{initialize_crud(session_1, mock_node_1, CALLER_UUID)}; remove_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID); create_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_VOLATILE_TTL); remove_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID); create_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID, MAX_SIZE, database_create_db_eviction_policy_type_VOLATILE_TTL); // create a lot of keys to fill the database const auto KEY_COUNT = fill_database(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE, true); ASSERT_EQ(KEY_COUNT, fill_database(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, VALUE_SIZE, MAX_SIZE, true)); const std::set pre_eviction_keys_0{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)}; const std::set pre_eviction_keys_1{get_database_keys(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID)}; EXPECT_EQ(pre_eviction_keys_0,pre_eviction_keys_1); // create a number of keys larger than the max size of the database for(size_t index{KEY_COUNT}; index < KEY_COUNT + 100; ++index) { size_t db_size{0}; std::tie(std::ignore, db_size) = get_database_size(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID); const auto KEY = make_key(index); const auto INNER_REQUEST_HASH{generate_random_hash()}; const auto expire = 8 + index + 128; // Provide some expire values that are sortable const bzn::value_t VALUE{make_value(MAX_SIZE - db_size)}; create_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, INNER_REQUEST_HASH, DB_UUID, KEY, VALUE, expire); create_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, INNER_REQUEST_HASH, DB_UUID, KEY, VALUE, expire); } const auto select_key_from_set = [](const auto& keys, uint64_t index) { std::set::const_iterator c_it(keys.begin()); std::advance(c_it, index); return *c_it; }; // update a lot of keys with values that will exceed the database max storage boost::random::mt19937 mt; // valgrind suppression needs this as there's different behaviour every run... mt.seed(123); for(size_t i{0}; i < 20; ++i) { const std::set active_keys{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)}; const boost::random::uniform_int_distribution<> dist(0, active_keys.size() - 1); const bzn::key_t KEY{select_key_from_set(active_keys, dist(mt))}; size_t db_size{0}; std::tie(std::ignore, db_size) = get_database_size(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID); const auto VALUE{do_quickread(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID, KEY)}; const auto NEW_VALUE_SIZE{MAX_SIZE - db_size + VALUE.length() + 1}; update_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(NEW_VALUE_SIZE)); update_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(NEW_VALUE_SIZE)); } // update a key with a value larger than the value of MAX_SIZE { const std::set active_keys{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)}; const boost::random::uniform_int_distribution<> dist(0, active_keys.size() - 1); const bzn::key_t KEY{select_key_from_set(active_keys, dist(mt))}; update_key_value(crud_0, session_0, mock_node_0, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE)); update_key_value(crud_1, session_1, mock_node_1, CALLER_UUID, REQUEST_HASH, DB_UUID, KEY, make_value(MAX_SIZE)); } // Are the databases in each crud the same? const std::set post_eviction_keys_0{get_database_keys(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID)}; const std::set post_eviction_keys_1{get_database_keys(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID)}; std::set difference; std::set_difference(pre_eviction_keys_0.begin(), pre_eviction_keys_0.end(), post_eviction_keys_0.begin(), post_eviction_keys_0.end(), std::inserter(difference, difference.begin())); ASSERT_GT(difference.size(), size_t(0)); ASSERT_EQ(post_eviction_keys_0, post_eviction_keys_1); remove_test_database(crud_0, session_0, mock_node_0, CALLER_UUID, DB_UUID); remove_test_database(crud_1, session_1, mock_node_1, CALLER_UUID, DB_UUID); } TEST(crud, test_that_expire_send_proper_response) { auto mock_subscription_manager = std::make_shared>(); auto mock_io_context = std::make_shared>(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), mock_subscription_manager, nullptr); auto mock_pbft = std::make_shared(); EXPECT_CALL(*mock_pbft, peers()).WillRepeatedly(Return(bzn::static_empty_peers_beacon())); crud->start(mock_pbft); database_msg msg; msg.mutable_header()->set_db_uuid("uuid"); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create_db(); crud->handle_request("caller_id", msg, nullptr); msg.mutable_create()->set_key("key"); msg.mutable_create()->set_value("value"); // add key... auto session = std::make_shared(); EXPECT_CALL(*mock_subscription_manager, inspect_commit(_)); expect_signed_response(session); crud->handle_request("caller_id", msg, session); // set expire on key not in db... msg.mutable_expire()->set_key("key1"); msg.mutable_expire()->set_expire(1); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::not_found)); crud->handle_request("caller_id", msg, session); // set expire... msg.mutable_expire()->set_key("key"); msg.mutable_expire()->set_expire(1); expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // update key.. msg.mutable_expire()->set_expire(0); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::invalid_argument)); crud->handle_request("caller_id", msg, session); // update key.. msg.mutable_expire()->set_expire(2); expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", msg, session); // get ttl.. msg.mutable_ttl()->set_key("key"); expect_signed_response(session, "uuid", uint64_t(123), database_response::kTtl, std::nullopt, [](const auto& resp) { EXPECT_EQ(resp.ttl().key(), "key"); EXPECT_GE(resp.ttl().ttl(), uint64_t(2)); }); crud->handle_request("caller_id", msg, session); // test for expired... sleep(3); // update key.. msg.mutable_expire()->set_key("key"); msg.mutable_expire()->set_expire(2); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::delete_pending)); crud->handle_request("caller_id", msg, session); } TEST(crud, test_that_create_exceeding_max_swarm_storage_sends_proper_response) { auto mock_io_context = std::make_shared>(); auto session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); // start crud with a max swarm storage size of 2K... crud->start(std::make_shared>(), 2048); // create a valid sized db... { auto request = build_create_db_msg("caller_id", "uuid", uint64_t(123), 2048, database_create_db::NONE); expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", request, session); } // try to create another but this time we will fail since the swarm is full... { auto request = build_create_db_msg("caller_id", "uuid2", uint64_t(123), 1024, database_create_db::NONE); expect_signed_response(session, "uuid2", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::db_full)); crud->handle_request("caller_id", request, session); } // delete a database to make room... { database_msg request; request.mutable_header()->set_db_uuid("uuid"); request.mutable_header()->set_nonce(uint64_t(123)); request.mutable_delete_db(); expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", request, session); } // try to create again... { auto request = build_create_db_msg("caller_id", "uuid2", uint64_t(123), 1024, database_create_db::NONE); expect_signed_response(session, "uuid2", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", request, session); } // test that update size to 2048 to fill swarm... { database_msg request; request.mutable_header()->set_db_uuid("uuid2"); request.mutable_header()->set_nonce(uint64_t(123)); request.mutable_update_db()->set_max_size(2048); request.mutable_update_db()->set_eviction_policy(database_create_db::VOLATILE_TTL); expect_signed_response(session, "uuid2", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", request, session); } // try to create another and we fail because swarm is full... { auto request = build_create_db_msg("caller_id", "uuid", uint64_t(123), 1024, database_create_db::NONE); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::db_full)); crud->handle_request("caller_id", request, session); } } TEST(crud, test_that_update_exceeding_max_swarm_stroage_sends_proper_resonse) { auto mock_io_context = std::make_shared>(); auto session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); // start crud with a max swarm storage size of 2K... crud->start(std::make_shared>(), 2048); // create a valid sized db... { auto request = build_create_db_msg("caller_id", "uuid", uint64_t(123), 1024, database_create_db::NONE); expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", request, session); } // another... { auto request = build_create_db_msg("caller_id", "uuid2", uint64_t(123), 1024, database_create_db::NONE); expect_signed_response(session, "uuid2", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", request, session); } // update with a new size that exceeds swarm db limit... { auto request = build_update_db_msg("caller_id", "uuid", uint64_t(123), 1025, database_create_db::NONE); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::db_full)); crud->handle_request("caller_id", request, session); } } TEST(crud, test_that_create_db_cannot_create_a_database_that_is_unlimited_when_max_swarm_storage_is_set) { auto mock_io_context = std::make_shared>(); auto session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); // start crud with limited storage... crud->start(std::make_shared>(), 1024); // try to create an unlimited db... { auto request = build_create_db_msg("caller_id", "uuid", uint64_t(123), 0, database_create_db::NONE); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::invalid_size)); crud->handle_request("caller_id", request, session); } } TEST(crud, test_that_update_db_cannot_convert_a_database_to_unlimited_when_max_swarm_storage_is_set) { auto mock_io_context = std::make_shared>(); auto session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); // start crud with limited storage... crud->start(std::make_shared>(), 1024); // create a valid db with a limit... { auto request = build_create_db_msg("caller_id", "uuid", uint64_t(123), 1024, database_create_db::NONE); expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", request, session); } // attempt to convert to an unlimited db... { auto request = build_update_db_msg("caller_id", "uuid", uint64_t(123), 0, database_create_db::NONE); expect_signed_response(session, "uuid", uint64_t(123), database_response::kError, bzn::storage_result_msg.at(bzn::storage_result::invalid_size)); crud->handle_request("caller_id", request, session); } } TEST(crud, test_that_status_reports_current_usage) { auto mock_io_context = std::make_shared>(); auto session = std::make_shared(); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::make_unique>(); })); auto crud = std::make_shared(mock_io_context, std::make_shared(), std::make_shared>(), nullptr); // start crud with limited storage... crud->start(std::make_shared>(), 2048); // create a valid db with a limit... { auto request = build_create_db_msg("caller_id", "uuid", uint64_t(123), 1024, database_create_db::NONE); expect_signed_response(session, "uuid", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", request, session); } // and another... { auto request = build_create_db_msg("caller_id", "uuid2", uint64_t(123), 512, database_create_db::NONE); expect_signed_response(session, "uuid2", uint64_t(123), database_response::RESPONSE_NOT_SET); crud->handle_request("caller_id", request, session); } auto status = crud->get_status(); EXPECT_EQ(status["max_swarm_storage"].asUInt64(), uint64_t(2048)); EXPECT_EQ(status["swarm_storage_usage"].asUInt64(), uint64_t(1536)); EXPECT_EQ(crud->get_name(), "crud"); } ================================================ FILE: crud/test/subscription_manager_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include using namespace ::testing; namespace { const bzn::key_t TEST_KEY{"key"}; const bzn::key_t TEST_UNKOWN_KEY{"unknown"}; const bzn::uuid_t TEST_UUID{"uuid"}; const bzn::uuid_t TEST_UNKOWN_UUID{"67ee0ca8-bd79-4eef-88db-9343aaf6ca7e"}; } TEST(subscription_manager, test_that_session_can_subscribe_and_unsubscribe_for_updates) { auto mock_session1 = std::make_shared(); auto mock_session2 = std::make_shared(); auto mock_session3 = std::make_shared(); EXPECT_CALL(*mock_session1, get_session_id()).WillRepeatedly(Return(bzn::session_id(1))); EXPECT_CALL(*mock_session2, get_session_id()).WillRepeatedly(Return(bzn::session_id(2))); EXPECT_CALL(*mock_session3, get_session_id()).WillRepeatedly(Return(bzn::session_id(3))); bzn::subscription_manager sm(std::make_shared>()); // two subscribers... { database_response response; sm.subscribe(TEST_UUID, TEST_KEY, 0, response, mock_session1); ASSERT_EQ(response.response_case(), database_response::RESPONSE_NOT_SET); } { database_response response; sm.subscribe(TEST_UUID, TEST_KEY, 1, response, mock_session1); ASSERT_EQ(response.response_case(), database_response::RESPONSE_NOT_SET); } // duplicate subscription request... (session 1) { database_response response; sm.subscribe(TEST_UUID, TEST_KEY, 1, response, mock_session1); ASSERT_EQ(response.response_case(), database_response::kError); ASSERT_EQ(response.error().message(), bzn::MSG_DUPLICATE_SUB); } // new session should be able to register using same transaction id { database_response response; sm.subscribe(TEST_UUID, TEST_KEY, 1, response, mock_session2); ASSERT_EQ(response.response_case(), database_response::RESPONSE_NOT_SET); } // duplicate subscription request... (session 2) { database_response response; sm.subscribe(TEST_UUID, TEST_KEY, 1, response, mock_session2); ASSERT_EQ(response.response_case(), database_response::kError); ASSERT_EQ(response.error().message(), bzn::MSG_DUPLICATE_SUB); } // invalid key { database_response response; sm.unsubscribe(TEST_UUID, TEST_UNKOWN_KEY, 0, response, mock_session1); ASSERT_EQ(response.response_case(), database_response::kError); ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_KEY); } // invalid session { database_response response; sm.unsubscribe(TEST_UUID, TEST_KEY, 0, response, mock_session3); ASSERT_EQ(response.response_case(), database_response::kError); ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_SUB); } // succeed and we should be return a success response... { database_response response; sm.unsubscribe(TEST_UUID, TEST_KEY, 0, response, mock_session1); ASSERT_EQ(response.response_case(), database_response::RESPONSE_NOT_SET); } // invalid transaction_id { database_response response; sm.unsubscribe(TEST_UUID, TEST_KEY, 0, response, mock_session1); ASSERT_EQ(response.response_case(), database_response::kError); ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_SUB); } // should get an unknown subscription error.. { database_response response; sm.unsubscribe(TEST_UUID, TEST_KEY, 4, response, mock_session2); ASSERT_EQ(response.response_case(), database_response::kError); ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_SUB); } // test for invalid uuid... { database_response response; sm.unsubscribe(TEST_UNKOWN_UUID, TEST_KEY, 5, response, mock_session2); ASSERT_EQ(response.response_case(), database_response::kError); ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_UUID); } } TEST(subscription_manager, test_that_session_cannot_unsubscribe_other_sessions) { auto mock_session1 = std::make_shared(); auto mock_session2 = std::make_shared(); EXPECT_CALL(*mock_session1, get_session_id()).WillRepeatedly(Return(bzn::session_id(1))); EXPECT_CALL(*mock_session2, get_session_id()).WillRepeatedly(Return(bzn::session_id(2))); bzn::subscription_manager sm(std::make_shared>()); // two subscribers... { database_response response; sm.subscribe(TEST_UUID, "1", 0, response, mock_session1); sm.subscribe(TEST_UUID, "2", 1, response, mock_session2); } // test for invalid uuid... database_response response; // session two will try to unsub session 1... sm.unsubscribe(TEST_UUID, "1", 0, response, mock_session2); ASSERT_EQ(response.error().message(), bzn::MSG_INVALID_SUB); } TEST(subscription_manager, test_that_subscriber_is_notified_for_create_and_updates) { auto mock_session1 = std::make_shared(); auto mock_session2 = std::make_shared(); EXPECT_CALL(*mock_session1, get_session_id()).WillRepeatedly(Return(bzn::session_id(1))); EXPECT_CALL(*mock_session2, get_session_id()).WillRepeatedly(Return(bzn::session_id(2))); bzn::subscription_manager sm(std::make_shared>()); database_response response; sm.subscribe(TEST_UUID, "0", 0, response, mock_session1); sm.subscribe(TEST_UUID, "0", 1234, response, mock_session2); sm.subscribe(TEST_UUID, "1", 4321, response, mock_session1); sm.subscribe(TEST_UUID, "1", 0, response, mock_session2); // send through a 'create' message... { database_msg msg; msg.mutable_header()->set_db_uuid(TEST_UUID); msg.mutable_header()->set_nonce(123); msg.mutable_create()->set_key("0"); msg.mutable_create()->set_value("0"); EXPECT_CALL(*mock_session1, send_message(An>())).WillOnce(Invoke( [](std::shared_ptr msg) { database_response resp; resp.ParseFromString(*msg); ASSERT_EQ(resp.header().db_uuid(), TEST_UUID); ASSERT_EQ(resp.header().nonce(), uint64_t(0)); ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate); ASSERT_EQ(resp.subscription_update().key(), "0"); ASSERT_EQ(resp.subscription_update().value(), "0"); ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1)); ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE); })); EXPECT_CALL(*mock_session2, send_message(An>())).WillOnce(Invoke( [](std::shared_ptr msg) { database_response resp; resp.ParseFromString(*msg); ASSERT_EQ(resp.header().db_uuid(), TEST_UUID); ASSERT_EQ(resp.header().nonce(), uint64_t(1234)); ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate); ASSERT_EQ(resp.subscription_update().key(), "0"); ASSERT_EQ(resp.subscription_update().value(), "0"); ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1)); ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE); })); sm.inspect_commit(msg); } // send through an 'update' message... { database_msg msg; msg.mutable_header()->set_db_uuid(TEST_UUID); msg.mutable_header()->set_nonce(123); msg.mutable_update()->set_key("1"); msg.mutable_update()->set_value("1"); EXPECT_CALL(*mock_session1, send_message(An>())).WillOnce(Invoke( [](std::shared_ptr msg) { database_response resp; resp.ParseFromString(*msg); ASSERT_EQ(resp.header().db_uuid(), TEST_UUID); ASSERT_EQ(resp.header().nonce(), uint64_t(4321)); ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate); ASSERT_EQ(resp.subscription_update().key(), "1"); ASSERT_EQ(resp.subscription_update().value(), "1"); ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1)); ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE); })); EXPECT_CALL(*mock_session2, send_message(An>())).WillOnce(Invoke( [](std::shared_ptr msg) { database_response resp; resp.ParseFromString(*msg); ASSERT_EQ(resp.header().db_uuid(), TEST_UUID); ASSERT_EQ(resp.header().nonce(), uint64_t(0)); ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate); ASSERT_EQ(resp.subscription_update().key(), "1"); ASSERT_EQ(resp.subscription_update().value(), "1"); ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1)); ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE); })); sm.inspect_commit(msg); } // send a delete... nothing should happen... { database_msg msg; msg.mutable_header()->set_db_uuid(TEST_UUID); msg.mutable_header()->set_nonce(123); msg.mutable_delete_()->set_key("1"); EXPECT_CALL(*mock_session1, send_message(An>())).WillOnce(Invoke( [](std::shared_ptr msg) { database_response resp; resp.ParseFromString(*msg); ASSERT_EQ(resp.header().db_uuid(), TEST_UUID); ASSERT_EQ(resp.header().nonce(), uint64_t(4321)); ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate); ASSERT_EQ(resp.subscription_update().key(), "1"); ASSERT_EQ(resp.subscription_update().value(), ""); ASSERT_EQ(resp.subscription_update().seq(), uint64_t(2)); ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::DELETE); })); EXPECT_CALL(*mock_session2, send_message(An>())).WillOnce(Invoke( [](std::shared_ptr msg) { database_response resp; resp.ParseFromString(*msg); ASSERT_EQ(resp.header().db_uuid(), TEST_UUID); ASSERT_EQ(resp.header().nonce(), uint64_t(0)); ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate); ASSERT_EQ(resp.subscription_update().key(), "1"); ASSERT_EQ(resp.subscription_update().value(), ""); ASSERT_EQ(resp.subscription_update().seq(), uint64_t(2)); ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::DELETE); })); sm.inspect_commit(msg); } } TEST(subscription_manager, test_that_dead_session_is_removed_from_subscriber_list) { auto mock_io_context = std::make_shared(); auto mock_steady_timer = std::make_unique(); EXPECT_CALL(*mock_steady_timer, expires_from_now(_)).Times(2); bzn::asio::wait_handler wh; EXPECT_CALL(*mock_steady_timer, async_wait(_)).WillRepeatedly(Invoke( [&](auto handler) { wh = handler; })); EXPECT_CALL(*mock_io_context, make_unique_steady_timer()).WillOnce(Invoke( [&]() { return std::move(mock_steady_timer); })); auto sm = std::make_shared(mock_io_context); sm->start(); auto mock_session1 = std::make_shared(); auto mock_session2 = std::make_shared(); EXPECT_CALL(*mock_session1, get_session_id()).WillRepeatedly(Return(bzn::session_id(1))); EXPECT_CALL(*mock_session2, get_session_id()).WillRepeatedly(Return(bzn::session_id(2))); // update message... database_msg msg; msg.mutable_header()->set_db_uuid(TEST_UUID); msg.mutable_header()->set_nonce(0); msg.mutable_update()->set_key("0"); msg.mutable_update()->set_value("0"); // two subs for the same key... database_response response; sm->subscribe(TEST_UUID, "0", 0, response, mock_session1); sm->subscribe(TEST_UUID, "0", 1, response, mock_session2); EXPECT_CALL(*mock_session1, send_message(An>())).WillOnce(Invoke( [](std::shared_ptr msg) { database_response resp; resp.ParseFromString(*msg); ASSERT_EQ(resp.header().db_uuid(), TEST_UUID); ASSERT_EQ(resp.header().nonce(), uint64_t(0)); ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate); ASSERT_EQ(resp.subscription_update().key(), "0"); ASSERT_EQ(resp.subscription_update().value(), "0"); ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1)); ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE); })); EXPECT_CALL(*mock_session2, send_message(An>())).WillOnce(Invoke( [](std::shared_ptr msg) { database_response resp; resp.ParseFromString(*msg); ASSERT_EQ(resp.header().db_uuid(), TEST_UUID); ASSERT_EQ(resp.header().nonce(), uint64_t(1)); ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate); ASSERT_EQ(resp.subscription_update().key(), "0"); ASSERT_EQ(resp.subscription_update().value(), "0"); ASSERT_EQ(resp.subscription_update().seq(), uint64_t(1)); ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE); })); sm->inspect_commit(msg); // kill session... mock_session2.reset(); // exceute purge... wh(boost::system::error_code()); // there should only be one... EXPECT_CALL(*mock_session1, send_message(An>())).WillOnce(Invoke( [](std::shared_ptr msg) { database_response resp; resp.ParseFromString(*msg); ASSERT_EQ(resp.header().db_uuid(), TEST_UUID); ASSERT_EQ(resp.header().nonce(), uint64_t(0)); ASSERT_EQ(resp.response_case(), database_response::kSubscriptionUpdate); ASSERT_EQ(resp.subscription_update().key(), "0"); ASSERT_EQ(resp.subscription_update().value(), "0"); ASSERT_EQ(resp.subscription_update().seq(), uint64_t(2)); ASSERT_EQ(resp.subscription_update().operation(), database_subscription_update::UPDATE); })); sm->inspect_commit(msg); } ================================================ FILE: crypto/CMakeLists.txt ================================================ add_library(crypto crypto_base.hpp crypto.hpp crypto.cpp ) target_link_libraries(crypto proto utils) add_dependencies(crypto boost openssl) target_include_directories(crypto PRIVATE ${BLUZELLE_STD_INCLUDES}) add_subdirectory(test) ================================================ FILE: crypto/crypto.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include using namespace bzn; namespace { const std::string PEM_PREFIX = "-----BEGIN PUBLIC KEY-----\n"; const std::string PEM_SUFFIX = "\n-----END PUBLIC KEY-----\n"; } crypto::crypto(std::shared_ptr options, std::shared_ptr monitor) : options(std::move(options)) , monitor(std::move(monitor)) { LOG(info) << "Using " << SSLeay_version(SSLEAY_VERSION); if (this->options->get_simple_options().get(bzn::option_names::CRYPTO_ENABLED_OUTGOING)) { this->load_private_key(); } } const std::string& crypto::extract_payload(const bzn_envelope& msg) { switch (msg.payload_case()) { case bzn_envelope::kDatabaseMsg : { return msg.database_msg(); } case bzn_envelope::kPbftInternalRequest : { return msg.pbft_internal_request(); } case bzn_envelope::kDatabaseResponse : { return msg.database_response(); } case bzn_envelope::kJson : { return msg.json(); } case bzn_envelope::kAudit : { return msg.audit(); } case bzn_envelope::kPbft : { return msg.pbft(); } case bzn_envelope::kPbftMembership : { return msg.pbft_membership(); } case bzn_envelope::kStatusRequest: { return msg.status_request(); } case bzn_envelope::kStatusResponse: { return msg.status_response(); } case bzn_envelope::kCheckpointMsg: { return msg.checkpoint_msg(); } case bzn_envelope::kSwarmError: { return msg.swarm_error(); } default : { throw std::runtime_error( "Crypto does not know how to handle a message with type " + std::to_string(msg.payload_case())); } } } const std::string crypto::deterministic_serialize(const bzn_envelope& msg) { // I don't like hand-rolling this, but doing it here lets us do it in one place, while avoiding implementing // it for every message type std::vector tokens = {msg.sender(), std::to_string(msg.payload_case()), this->extract_payload(msg), std::to_string(msg.timestamp())}; // this construction defeats an attack where the adversary blurs the lines between the fields. if we simply // concatenate the fields, then consider the two messages // {sender: "foo", payload: "bar"} // {sender: "foobar", payload: ""} // they may have the same serialization - and therefore the same signature. std::string result = ""; for (const auto& token : tokens) { result += (std::to_string(token.length()) + "|" + token); } return result; } bool crypto::verify(const bzn_envelope& msg) { if (!this->options->get_simple_options().get(bzn::option_names::CRYPTO_ENABLED_INCOMING)) { return true; } BIO_ptr_t bio(BIO_new(BIO_s_mem()), &BIO_free); EC_KEY_ptr_t pubkey(nullptr, &EC_KEY_free); EVP_PKEY_ptr_t key(EVP_PKEY_new(), &EVP_PKEY_free); EVP_MD_CTX_ptr_t context(EVP_MD_CTX_create(), &EVP_MD_CTX_free); if (!bio || !key || !context) { LOG(error) << "failed to allocate memory for signature verification"; return false; } const auto msg_text = this->deterministic_serialize(msg); // In openssl 1.0.1 (but not newer versions), EVP_DigestVerifyFinal strangely expects the signature as // a non-const pointer. std::string signature = msg.signature(); char* sig_ptr = signature.data(); bool result = // Reconstruct the PEM file in memory (this is awkward, but it avoids dealing with EC specifics) (0 < BIO_write(bio.get(), PEM_PREFIX.c_str(), PEM_PREFIX.length())) && (0 < BIO_write(bio.get(), msg.sender().c_str(), msg.sender().length())) && (0 < BIO_write(bio.get(), PEM_SUFFIX.c_str(), PEM_SUFFIX.length())) // Parse the PEM string to get the public key the message is allegedly from && (pubkey = EC_KEY_ptr_t(PEM_read_bio_EC_PUBKEY(bio.get(), NULL, NULL, NULL), &EC_KEY_free)) && (1 == EC_KEY_check_key(pubkey.get())) && (1 == EVP_PKEY_set1_EC_KEY(key.get(), pubkey.get())) // Perform the signature validation && (1 == EVP_DigestVerifyInit(context.get(), NULL, EVP_sha256(), NULL, key.get())) && (1 == EVP_DigestVerifyUpdate(context.get(), msg_text.c_str(), msg_text.length())) && (1 == EVP_DigestVerifyFinal(context.get(), reinterpret_cast(sig_ptr), msg.signature().length())); /* Any errors here can be attributed to a bad (potentially malicious) incoming message, and we we should not * pollute our own logs with them (but we still have to clear the error state) */ ERR_clear_error(); this->monitor->send_counter(bzn::statistic::signature_verified); this->monitor->send_counter(bzn::statistic::signature_verified_bytes, msg_text.length()); if (!result) { this->monitor->send_counter(bzn::statistic::signature_rejected); } return result; } bool crypto::sign(bzn_envelope& msg) { if (msg.sender().empty()) { msg.set_sender(this->options->get_uuid()); } if (msg.sender() != options->get_uuid()) { LOG(error) << "Cannot sign message purportedly sent by " << msg.sender(); return false; } if (!this->options->get_simple_options().get(bzn::option_names::CRYPTO_ENABLED_OUTGOING)) { return true; } const auto msg_text = this->deterministic_serialize(msg); EVP_MD_CTX_ptr_t context(EVP_MD_CTX_create(), &EVP_MD_CTX_free); size_t signature_length = 0; bool result = (bool) (context) && (1 == EVP_DigestSignInit(context.get(), NULL, EVP_sha256(), NULL, this->private_key_EVP.get())) && (1 == EVP_DigestSignUpdate(context.get(), msg_text.c_str(), msg_text.length())) && (1 == EVP_DigestSignFinal(context.get(), NULL, &signature_length)); auto deleter = [](unsigned char* ptr){OPENSSL_free(ptr);}; std::unique_ptr signature((unsigned char*) OPENSSL_malloc(sizeof(unsigned char) * signature_length), deleter); result &= (bool) (signature) && (1 == EVP_DigestSignFinal(context.get(), signature.get(), &signature_length)); if (result) { msg.set_signature(signature.get(), signature_length); } else { LOG(error) << "Failed to sign message with openssl error (do we have a valid private key?)"; // Message will be sent without signature; depending on settings they may still accept it } this->log_openssl_errors(); if (result && this->options->get_simple_options().get(bzn::option_names::CRYPTO_SELF_VERIFY)) { if (!this->verify(msg)) { LOG(error) << "Failed to verify own signature?"; // These messages could be awkwardly long, but it is a severe bug if they are ever printed // and their full contents are useful for debugging LOG(error) << "offending message (deterministic_serialized, hex encoded): " << bzn::bytes_to_debug_string(msg_text, true); LOG(error) << "our bad signature (hex encoded): " << bzn::bytes_to_debug_string(msg.signature(), true); } } this->monitor->send_counter(bzn::statistic::signature_computed); this->monitor->send_counter(bzn::statistic::signature_computed_bytes, msg_text.length()); return result; } bool crypto::load_private_key() { auto filename = this->options->get_simple_options().get(bzn::option_names::NODE_PRIVATEKEY_FILE); std::unique_ptr fp(fopen(filename.c_str(), "r"), &fclose); bool result = (bool) (fp) && (this->private_key_EC = EC_KEY_ptr_t(PEM_read_ECPrivateKey(fp.get(), NULL, NULL, NULL), &EC_KEY_free)) && (1 == EC_KEY_check_key(this->private_key_EC.get())) && (this->private_key_EVP = EVP_PKEY_ptr_t(EVP_PKEY_new(), &EVP_PKEY_free)) && (1 == EVP_PKEY_set1_EC_KEY(this->private_key_EVP.get(), this->private_key_EC.get())); if (!result) { LOG(error) << "Crypto failed to load private key; will not be able to sign messages"; } this->log_openssl_errors(); return result; } std::string crypto::hash(const std::string& msg) { EVP_MD_CTX_ptr_t context(EVP_MD_CTX_create(), &EVP_MD_CTX_free); size_t md_size = EVP_MD_size(EVP_sha256()); auto deleter = [](unsigned char* ptr){OPENSSL_free(ptr);}; std::unique_ptr hash_buffer((unsigned char*) OPENSSL_malloc(sizeof(unsigned char) * md_size), deleter); bool success = (bool) (context) && (1 == EVP_DigestInit_ex(context.get(), EVP_sha256(), NULL)) && (1 == EVP_DigestUpdate(context.get(), msg.c_str(), msg.size())) && (1 == EVP_DigestFinal_ex(context.get(), hash_buffer.get(), NULL)); if (!success) { this->log_openssl_errors(); throw std::runtime_error(std::string("\nfailed to compute message hash ") + msg); } this->monitor->send_counter(bzn::statistic::hash_computed); this->monitor->send_counter(bzn::statistic::hash_computed_bytes, msg.length()); return std::string(reinterpret_cast(hash_buffer.get()), md_size); } std::string crypto::hash(const bzn_envelope& msg) { return this->hash(this->deterministic_serialize(msg)); } void crypto::log_openssl_errors() { unsigned long last_error; char buffer[120]; //openssl says this is the appropriate length while((last_error = ERR_get_error())) { ERR_error_string(last_error, buffer); LOG(error) << buffer; } } ================================================ FILE: crypto/crypto.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // #pragma once #include #include #include #include #include #include namespace bzn { class crypto : public bzn::crypto_base { public: crypto(std::shared_ptr options, std::shared_ptr monitor); bool sign(bzn_envelope& msg) override; bool verify(const bzn_envelope& msg) override; std::string hash(const std::string& msg) override; std::string hash(const bzn_envelope& msg) override; private: using EC_KEY_ptr_t = std::unique_ptr; using EVP_PKEY_ptr_t = std::unique_ptr; using BIO_ptr_t = std::unique_ptr; using EVP_MD_CTX_ptr_t = std::unique_ptr; bool load_private_key(); void log_openssl_errors(); const std::string& extract_payload(const bzn_envelope& msg); const std::string deterministic_serialize(const bzn_envelope& msg); std::shared_ptr options; std::shared_ptr monitor; EVP_PKEY_ptr_t private_key_EVP = EVP_PKEY_ptr_t(nullptr, &EVP_PKEY_free); EC_KEY_ptr_t private_key_EC = EC_KEY_ptr_t(nullptr, &EC_KEY_free); }; } ================================================ FILE: crypto/crypto_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn { class crypto_base { public: /* * sign a message using our key * @msg message to sign * @return if signature was successful */ virtual bool sign(bzn_envelope& msg) = 0; /* * verify that the signature on a message is correct and matches its sender * @msg message to verify * @return signature is present, valid and matches sender */ virtual bool verify(const bzn_envelope& msg) = 0; /* * Compute the hash of some string * @msg data * @return hash value */ virtual std::string hash(const std::string& msg) = 0; /* * @msg data * @return hash value */ virtual std::string hash(const bzn_envelope& msg) = 0; virtual ~crypto_base() = default; }; } ================================================ FILE: crypto/test/CMakeLists.txt ================================================ set(test_srcs crypto_test.cpp) set(test_libs crypto proto options ${Protobuf_LIBRARIES}) add_gmock_test(crypto) ================================================ FILE: crypto/test/crypto_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include using namespace ::testing; class crypto_test : public Test { public: std::shared_ptr options = std::make_shared(); std::shared_ptr monitor = std::make_shared>(); std::shared_ptr crypto; const std::string private_key_file = "test_private_key.pem"; const std::string public_key_file = "test_public_key.pem"; const std::string test_private_key_pem = "-----BEGIN EC PRIVATE KEY-----\n" "MHQCAQEEIFskFIUF/rSbcA62nW+a90ptWSaMnwlpNa6w5ab2BjT3oAcGBSuBBAAK\n" "oUQDQgAEIUn235kRQyjEwZiexq7tOSu/9QiabDqg8Mcwr7lq+Hi7/xx7A37wZBHV\n" "tCRpaXbJNqRhIErf6FnOZI3m71sQoA==\n" "-----END EC PRIVATE KEY-----\n"; const std::string test_public_key_pem = "-----BEGIN PUBLIC KEY-----\n" "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEIUn235kRQyjEwZiexq7tOSu/9QiabDqg\n" "8Mcwr7lq+Hi7/xx7A37wZBHVtCRpaXbJNqRhIErf6FnOZI3m71sQoA==\n" "-----END PUBLIC KEY-----\n"; bzn_envelope msg; crypto_test() { this->msg.set_pbft("pretend this is a serialized protobuf message"); std::ofstream ofile(private_key_file.c_str()); ofile << test_private_key_pem; ofile.close(); std::ofstream ofile2(public_key_file.c_str()); ofile2 << test_public_key_pem; ofile2.close(); this->options->get_mutable_simple_options().set(bzn::option_names::NODE_PRIVATEKEY_FILE, private_key_file); this->options->get_mutable_simple_options().set(bzn::option_names::NODE_PUBKEY_FILE, public_key_file); this->options->get_mutable_simple_options().set(bzn::option_names::CRYPTO_ENABLED_INCOMING, std::to_string(true)); this->options->get_mutable_simple_options().set(bzn::option_names::CRYPTO_ENABLED_OUTGOING, std::to_string(true)); this->crypto = std::make_shared(this->options, this->monitor); } ~crypto_test() { ::unlink(private_key_file.c_str()); ::unlink(public_key_file.c_str()); } }; TEST_F(crypto_test, messages_use_my_public_key) { // bzn::kPbft EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // bzn_envelope::kDatabaseMsg this->msg.set_database_msg("pretend this is a serialized protobuf message"); EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // bzn_envelope::kPbftInternalRequest; this->msg.set_pbft_internal_request("pretend this is a serialized protobuf message"); EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // bzn_envelope::kDatabaseResponse this->msg.set_database_response("pretend this is a serialized protobuf message"); EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // bzn_envelope::kJson this->msg.set_json("pretend this is a serialized protobuf message"); EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // bzn_envelope::kAudit this->msg.set_audit("pretend this is a serialized protobuf message"); EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // bzn_envelope::kPbftMembership this->msg.set_pbft_membership("pretend this is a serialized protobuf message"); EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // bzn_envelope::kStatusRequest this->msg.set_status_request("pretend this is a serialized protobuf message"); EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // bzn_envelope::kStatusResponse this->msg.set_status_response("pretend this is a serialized protobuf message"); EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // bzn_envelope::kCheckpointMsg this->msg.set_checkpoint_msg("pretend this is a serialized protobuf message"); EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // bzn_envelope::kSwarmError this->msg.set_swarm_error("pretend this is a serialized protobuf message"); EXPECT_TRUE(crypto->sign(msg)); EXPECT_EQ(msg.sender(), this->options->get_uuid()); // invalid type throws this->msg.clear_swarm_error(); EXPECT_THROW(crypto->sign(msg), std::exception); EXPECT_EQ(msg.sender(), this->options->get_uuid()); } TEST_F(crypto_test, messages_signed_and_verified) { bzn_envelope msg2 = msg; bzn_envelope msg3 = msg; EXPECT_TRUE(crypto->sign(msg)); EXPECT_TRUE(crypto->verify(msg)); } TEST_F(crypto_test, bad_signature_caught) { bzn_envelope msg2 = msg; EXPECT_TRUE(crypto->sign(msg)); msg2.set_signature("a" + msg.signature()); EXPECT_FALSE(crypto->verify(msg2)); } TEST_F(crypto_test, bad_sender_caught) { bzn_envelope msg3 = msg; EXPECT_TRUE(crypto->sign(msg)); msg3.set_sender('a' + msg.sender()); msg3.set_signature(msg.signature()); EXPECT_FALSE(crypto->verify(msg3)); } TEST_F(crypto_test, hash_no_collision) { /* * It's well outside our scope to test that the hash actually has cryptographically secure hash properties, * so we'll just test that it "looks like" a hash function */ std::set hash_values; std::string hash_data = ""; for(int i=0; i<10000; i++) { hash_data.push_back('A'); } for(int i=0; i<1000; i++) { hash_data[i] = 'a' + (i%31); hash_values.insert(this->crypto->hash(hash_data)); } EXPECT_EQ(hash_values.size(), 1000u); } TEST_F(crypto_test, hash_deterministic_but_not_identity) { for(int i=0; i<1000; i++) { std::string str = std::to_string(i); EXPECT_EQ(this->crypto->hash(str), this->crypto->hash(str)); EXPECT_NE(str, this->crypto->hash(str)); } } ================================================ FILE: depend/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . cmake_minimum_required(VERSION 3.10) include(ExternalProject) macro(add_external_project NAME VERSION) message(STATUS "${NAME} -- ${CMAKE_SYSTEM_NAME} ${CMAKE_BUILD_TYPE} ${VERSION}") add_subdirectory(${NAME}) string(TOLOWER ${CMAKE_SYSTEM_NAME} PKG_SYSTEM_NAME) if("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo") set(PKG_BUILD_TYPE "release") else() string(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE) endif() ExternalProject_Add(${NAME} URL file://${CMAKE_SOURCE_DIR}/depend/${NAME}/package/${NAME}-${PKG_BUILD_TYPE}-${VERSION}-${PKG_SYSTEM_NAME}.tar.gz CONFIGURE_COMMAND "" BUILD_COMMAND "" PREFIX ${CMAKE_BINARY_DIR}/${NAME} INSTALL_COMMAND "" ) endmacro() add_external_project(boost 1.70.0) add_external_project(googletest 1.8.0) add_external_project(jsoncpp 1.8.4) add_external_project(openssl 1.1.1) add_external_project(rocksdb 5.14.3) ================================================ FILE: depend/README.md ================================================ swarmDB uses several precompiled libraries for faster CI builds. ##### Set the required library build number in depend/CMakelists: ```text ... add_external_project(boost 1.70.0) add_external_project(googletest 1.8.0) add_external_project(jsoncpp 1.8.4) add_external_project(openssl 1.1.1) add_external_project(rocksdb 5.14.3) ``` ##### To add the debug version of Boost 1.70.0 using git LFS: ###### For release use: -DCMAKE_BUILD_TYPE=Release ```text $ cd depend/boost/package $ mkdir build-debug && cd build-debug $ cmake .. -DCMAKE_BUILD_TYPE=Debug -DPKG_VER=1.70.0 [-DPKG_HASH=] ``` ###### PKG_HASH is optional and if given will be used to validate the downloaded source code archive. ```text -- The CXX compiler identification is GNU 8.3.0 -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- boost -- debug 1.70.0 (chrono,program_options,random,regex,system,thread,log,serialization) -- boost -- URL: https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz -- boost -- URL_HASH: 882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9 -- Configuring done -- Generating done -- Build files have been written to: /home/username/bluzelle/swarmdb/depend/boost/package/build-debug $ make Scanning dependencies of target boost [ 12%] Creating directories for 'boost' [ 25%] Performing download step (download, verify and extract) for 'boost' -- Downloading... dst='/home/username/bluzelle/swarmdb/depend/boost/package/build-debug/boost/src/boost_1_70_0.tar.gz' timeout='120 seconds' -- Using src='https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz' -- verifying file... file='/home/username/bluzelle/swarmdb/depend/boost/package/build-debug/boost/src/boost_1_70_0.tar.gz' -- Downloading... done -- extracting... src='/home/username/bluzelle/swarmdb/depend/boost/package/build-debug/boost/src/boost_1_70_0.tar.gz' dst='/home/username/bluzelle/swarmdb/depend/boost/package/build-debug/boost/src/boost' -- extracting... [tar xfz] -- extracting... [analysis] -- extracting... [rename] -- extracting... [clean up] -- extracting... done ... [ 87%] No install step for 'boost' [100%] Completed 'boost' [100%] Built target boost $ ``` ##### Create a package to be added to the repo ```text $ make package [100%] Built target boost Run CPack packaging tool... CPack: Create package using TGZ CPack: Install projects CPack: - Run preinstall target for: boost CPack: - Install project: boost CPack: Create package CPack: - package: /home/username/bluzelle/swarmdb/depend/boost/package/build-debug/boost-debug-1.70.0-linux.tar.gz generated. $ mv boost-debug-1.70.0-linux.tar.gz .. $ cd .. $ git lfs track boost-debug-1.70.0-linux.tar.gz $ git add .gitattributes boost-debug-1.70.0-linux.tar.gz $ git commit -m "added debug Boost 1.70.0 for Linux" ``` ================================================ FILE: depend/boost/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . set(SOURCE_DIR ${CMAKE_BINARY_DIR}/boost/src/boost) set(Boost_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE INTERNAL "") set(Boost_LIBRARIES ${SOURCE_DIR}/lib/libboost_log.a ${SOURCE_DIR}/lib/libboost_program_options.a ${SOURCE_DIR}/lib/libboost_system.a ${SOURCE_DIR}/lib/libboost_thread.a pthread ${SOURCE_DIR}/lib/libboost_serialization.a ${SOURCE_DIR}/lib/libboost_date_time.a ${SOURCE_DIR}/lib/libboost_log_setup.a ${SOURCE_DIR}/lib/libboost_filesystem.a ${SOURCE_DIR}/lib/libboost_regex.a ${SOURCE_DIR}/lib/libboost_chrono.a ${SOURCE_DIR}/lib/libboost_atomic.a CACHE INTERNAL "") ================================================ FILE: depend/boost/package/.gitattributes ================================================ boost-debug-1.68.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text boost-release-1.68.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text boost-release-1.68.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text boost-debug-1.68.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text boost-debug-1.70.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text boost-release-1.70.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text boost-debug-1.70.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text boost-release-1.70.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text ================================================ FILE: depend/boost/package/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . cmake_minimum_required(VERSION 3.10) project(boost CXX) include(ExternalProject) include(ProcessorCount) if (NOT DEFINED PKG_VER) message(FATAL_ERROR "usage: -DPKG_VER=x.y.z [-DPKG_HASH=]") endif() if(PKG_HASH) set(URL_HASH_OPTION SHA256=${PKG_HASH}) else() message(WARNING "PKG_HASH not specified! Downloaded package will not be validated.") endif() # default to debug builds if("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE Debug) endif() string(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE) set(PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}) set(BOOST_TARBALL "boost_${PKG_VER}") string(REPLACE "." "_" BOOST_TARBALL ${BOOST_TARBALL}) string(APPEND BOOST_TARBALL ".tar.gz") set(BOOST_LIBS "chrono,program_options,random,regex,system,thread,log,serialization") set(URL https://dl.bintray.com/boostorg/release/${PKG_VER}/source/${BOOST_TARBALL}) ProcessorCount(NPROC) message(STATUS "${PROJECT_NAME} -- ${PKG_BUILD_TYPE} ${PKG_VER} (${BOOST_LIBS})") message(STATUS "${PROJECT_NAME} -- URL: ${URL}") message(STATUS "${PROJECT_NAME} -- URL_HASH: ${PKG_HASH}") ExternalProject_Add(boost PREFIX ${CMAKE_CURRENT_BINARY_DIR}/boost URL ${URL} URL_HASH ${URL_HASH_OPTION} TIMEOUT 120 CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/boost/src/boost/bootstrap.sh --prefix=${PREFIX} --with-libraries=${BOOST_LIBS} BUILD_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/boost/src/boost/b2 variant=${PKG_BUILD_TYPE} link=static visibility=global -j${NPROC} install INSTALL_COMMAND "" BUILD_IN_SOURCE true DOWNLOAD_NO_PROGRESS true ) set(CPACK_GENERATOR TGZ) string(REPLACE "." ";" VERSION_LIST ${PKG_VER}) list(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR) list(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR) list(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH) set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) set(CPACK_PACKAGE_NAME ${PROJECT_NAME}-${PKG_BUILD_TYPE}) string(TOLOWER ${CMAKE_SYSTEM_NAME} CPACK_SYSTEM_NAME) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}/ DESTINATION ${PKG_BUILD_TYPE}/) include(CPack) ================================================ FILE: depend/googletest/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . set(SOURCE_DIR ${CMAKE_BINARY_DIR}/googletest/src/googletest) set(GTEST_INCLUDE_DIR ${SOURCE_DIR}/include CACHE INTERNAL "") set(GMOCK_INCLUDE_DIR ${SOURCE_DIR}/include CACHE INTERNAL "") set(GMOCK_BOTH_LIBRARIES ${SOURCE_DIR}/lib/libgmock_main.a ${SOURCE_DIR}/lib/libgmock.a CACHE INTERNAL "") set(GTEST_BOTH_LIBRARIES ${SOURCE_DIR}/lib/libgtest_main.a ${SOURCE_DIR}/lib/libgtest.a CACHE INTERNAL "") ================================================ FILE: depend/googletest/package/.gitattributes ================================================ googletest-debug-1.8.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text googletest-release-1.8.0-linux.tar.gz filter=lfs diff=lfs merge=lfs -text googletest-debug-1.8.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text googletest-release-1.8.0-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text ================================================ FILE: depend/googletest/package/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . cmake_minimum_required(VERSION 3.10) project(googletest CXX) include(ExternalProject) if (NOT DEFINED PKG_VER) message(FATAL_ERROR "usage: -DPKG_VER=x.y.z [-DPKG_HASH=]") endif() if(PKG_HASH) set(URL_HASH_OPTION SHA256=${PKG_HASH}) else() message(WARNING "PKG_HASH not specified! Downloaded package will not be validated.") endif() # default to debug builds if("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE Debug) endif() string(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE) set(URL https://github.com/google/googletest/archive/release-${PKG_VER}.tar.gz) set(PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}) message(STATUS "${PROJECT_NAME} -- ${PKG_BUILD_TYPE} ${PKG_VER}") message(STATUS "${PROJECT_NAME} -- URL: ${URL}") message(STATUS "${PROJECT_NAME} -- URL_HASH: ${PKG_HASH}") ExternalProject_Add(googletest PREFIX "${CMAKE_CURRENT_BINARY_DIR}/googletest" URL ${URL} URL_HASH ${URL_HASH_OPTION} TIMEOUT 30 CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} DOWNLOAD_NO_PROGRESS true ) set(CPACK_GENERATOR TGZ) string(REPLACE "." ";" VERSION_LIST ${PKG_VER}) list(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR) list(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR) list(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH) set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) set(CPACK_PACKAGE_NAME ${PROJECT_NAME}-${PKG_BUILD_TYPE}) string(TOLOWER ${CMAKE_SYSTEM_NAME} CPACK_SYSTEM_NAME) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}/ DESTINATION ${PKG_BUILD_TYPE}/) include(CPack) ================================================ FILE: depend/jsoncpp/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . set(SOURCE_DIR ${CMAKE_BINARY_DIR}/jsoncpp/src/jsoncpp) set(JSONCPP_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE INTERNAL "") set(JSONCPP_LIBRARIES ${SOURCE_DIR}/lib/libjsoncpp.a CACHE INTERNAL "") ================================================ FILE: depend/jsoncpp/package/.gitattributes ================================================ jsoncpp-debug-1.8.4-linux.tar.gz filter=lfs diff=lfs merge=lfs -text jsoncpp-release-1.8.4-linux.tar.gz filter=lfs diff=lfs merge=lfs -text jsoncpp-debug-1.8.4-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text jsoncpp-release-1.8.4-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text ================================================ FILE: depend/jsoncpp/package/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . cmake_minimum_required(VERSION 3.10) project(jsoncpp CXX) include(ExternalProject) if (NOT DEFINED PKG_VER) message(FATAL_ERROR "usage: -DPKG_VER=x.y.z [-DPKG_HASH=]") endif() if(PKG_HASH) set(URL_HASH_OPTION SHA256=${PKG_HASH}) else() message(WARNING "PKG_HASH not specified! Downloaded package will not be validated.") endif() # default to debug builds if("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE Debug) endif() string(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE) set(PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}) set(URL https://github.com/open-source-parsers/jsoncpp/archive/${PKG_VER}.tar.gz) message(STATUS "${PROJECT_NAME} -- ${PKG_BUILD_TYPE} ${PKG_VER}") message(STATUS "${PROJECT_NAME} -- URL: ${URL}") message(STATUS "${PROJECT_NAME} -- URL_HASH: ${PKG_HASH}") ExternalProject_Add(jsoncpp PREFIX "${CMAKE_CURRENT_BINARY_DIR}/jsoncpp" URL ${URL} URL_HASH ${URL_HASH_OPTION} TIMEOUT 30 CMAKE_ARGS -DJSONCPP_WITH_PKGCONFIG_SUPPORT=OFF -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF -DJSONCPP_WITH_TESTS=OFF -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} DOWNLOAD_NO_PROGRESS true ) set(CPACK_GENERATOR TGZ) string(REPLACE "." ";" VERSION_LIST ${PKG_VER}) list(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR) list(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR) list(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH) set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) set(CPACK_PACKAGE_NAME ${PROJECT_NAME}-${PKG_BUILD_TYPE}) string(TOLOWER ${CMAKE_SYSTEM_NAME} CPACK_SYSTEM_NAME) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}/ DESTINATION ${PKG_BUILD_TYPE}/) include(CPack) ================================================ FILE: depend/openssl/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . set(SOURCE_DIR ${CMAKE_BINARY_DIR}/openssl/src/openssl) set(OPENSSL_INCLUDE_DIR ${SOURCE_DIR}/include CACHE INTERNAL "") set(OPENSSL_LIBRARIES ${SOURCE_DIR}/lib/libssl.a ${SOURCE_DIR}/lib/libcrypto.a dl pthread CACHE INTERNAL "") ================================================ FILE: depend/openssl/package/.gitattributes ================================================ openssl-debug-1.1.1-linux.tar.gz filter=lfs diff=lfs merge=lfs -text openssl-release-1.1.1-linux.tar.gz filter=lfs diff=lfs merge=lfs -text openssl-debug-1.1.1-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text openssl-release-1.1.1-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text ================================================ FILE: depend/openssl/package/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . cmake_minimum_required(VERSION 3.10) project(openssl CXX) include(ExternalProject) include(ProcessorCount) if(PKG_HASH) set(URL_HASH_OPTION SHA256=${PKG_HASH}) else() message(WARNING "PKG_HASH not specified! Downloaded package will not be validated.") endif() # default to debug builds if("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE Debug) endif() string(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE) set(PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}) set(URL https://www.openssl.org/source/openssl-${PKG_VER}.tar.gz) message(STATUS "${PROJECT_NAME} -- ${PKG_BUILD_TYPE} ${PKG_VER}") message(STATUS "${PROJECT_NAME} -- URL: ${URL}") message(STATUS "${PROJECT_NAME} -- URL_HASH: ${PKG_HASH}") # platform detection if (APPLE) set(OPENSSL_BUILD_PLATFORM darwin64-x86_64-cc) set(OPENSSLDIR /usr/local/etc/openssl) else() set(OPENSSL_BUILD_PLATFORM linux-x86_64) set(OPENSSLDIR /etc/ssl) endif() ProcessorCount(NPROC) ExternalProject_Add(openssl PREFIX "${CMAKE_CURRENT_BINARY_DIR}/openssl" URL ${URL} URL_HASH ${URL_HASH_OPTION} TIMEOUT 30 DOWNLOAD_NO_PROGRESS true CONFIGURE_COMMAND ${CMAKE_CURRENT_BINARY_DIR}/openssl/src/openssl/Configure ${OPENSSL_BUILD_PLATFORM} --prefix=${PREFIX} --${PKG_BUILD_TYPE} --openssldir=${OPENSSLDIR} INSTALL_COMMAND make install_sw BUILD_COMMAND make -j${NPROC} ) set(CPACK_GENERATOR TGZ) string(REPLACE "." ";" VERSION_LIST ${PKG_VER}) list(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR) list(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR) list(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH) set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) set(CPACK_PACKAGE_NAME ${PROJECT_NAME}-${PKG_BUILD_TYPE}) string(TOLOWER ${CMAKE_SYSTEM_NAME} CPACK_SYSTEM_NAME) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}/ DESTINATION ${PKG_BUILD_TYPE}/) include(CPack) ================================================ FILE: depend/rocksdb/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . include(FindZLIB) include(FindPackageHandleStandardArgs) # find snappy... find_path(SNAPPY_INCLUDE_DIR NAMES snappy.h HINTS ${SNAPPY_ROOT_DIR}/include) find_library(SNAPPY_LIBRARIES NAMES snappy HINTS ${SNAPPY_ROOT_DIR}/lib) find_package_handle_standard_args(Snappy DEFAULT_MSG SNAPPY_LIBRARIES SNAPPY_INCLUDE_DIR) mark_as_advanced( SNAPPY_ROOT_DIR SNAPPY_LIBRARIES SNAPPY_INCLUDE_DIR) # find bzip2... find_path(BZIP2_INCLUDE_DIR NAMES bzlib.h HINTS ${BZIP2_ROOT_DIR}/include) find_library(BZIP2_LIBRARIES NAMES bz2 HINTS ${BZIP2_ROOT_DIR}/lib) find_package_handle_standard_args(Bzip2 DEFAULT_MSG BZIP2_LIBRARIES BZIP2_INCLUDE_DIR) mark_as_advanced( BZIP2_ROOT_DIR BZIP2_LIBRARIES BZIP2_INCLUDE_DIR) set(SOURCE_DIR ${CMAKE_BINARY_DIR}/rocksdb/src/rocksdb) set(ROCKSDB_INCLUDE_DIRS ${SOURCE_DIR}/include CACHE INTERNAL "") set(ROCKSDB_LIBRARIES ${SOURCE_DIR}/lib/librocksdb.a ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} ${BZIP2_LIBRARIES} CACHE INTERNAL "") if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") find_library(LZ4_LIBRARY NAMES liblz4.a) message(STATUS ${LZ4_LIBRARY}) list(APPEND ROCKSDB_LIBRARIES ${LZ4_LIBRARY}) # rocksdb may of found these libraries... find_library(ZSTD_LIBRARY NAMES libzstd.a) if (ZSTD_LIBRARY) message(STATUS ${ZSTD_LIBRARY}) list(APPEND ROCKSDB_LIBRARIES ${ZSTD_LIBRARY}) endif() find_library(TBB_LIBRARY NAMES libtbb.a) if (TBB_LIBRARY) message(STATUS ${TBB_LIBRARY}) list(APPEND ROCKSDB_LIBRARIES ${TBB_LIBRARY}) endif() set(ROCKSDB_LIBRARIES ${ROCKSDB_LIBRARIES} CACHE INTERNAL "") endif() ================================================ FILE: depend/rocksdb/package/.gitattributes ================================================ rocksdb-debug-5.14.3-linux.tar.gz filter=lfs diff=lfs merge=lfs -text rocksdb-release-5.14.3-linux.tar.gz filter=lfs diff=lfs merge=lfs -text rocksdb-debug-5.14.3-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text rocksdb-release-5.14.3-darwin.tar.gz filter=lfs diff=lfs merge=lfs -text ================================================ FILE: depend/rocksdb/package/CMakeLists.txt ================================================ # Copyright (C) 2019 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . cmake_minimum_required(VERSION 3.10) project(rocksdb CXX) include(ExternalProject) include(ProcessorCount) if (NOT DEFINED PKG_VER) message(FATAL_ERROR "usage: -DPKG_VER=x.y.z [-DPKG_HASH=]") endif() if(PKG_HASH) set(URL_HASH_OPTION SHA256=${PKG_HASH}) else() message(WARNING "PKG_HASH not specified! Downloaded package will not be validated.") endif() # default to debug builds if("${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE Debug) endif() # rocksdb uses "levels" if (${CMAKE_BUILD_TYPE} STREQUAL "Debug") set(DEBUG_LEVEL "2") else() set(DEBUG_LEVEL "0") endif() string(TOLOWER ${CMAKE_BUILD_TYPE} PKG_BUILD_TYPE) set(PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}) set(URL https://github.com/facebook/rocksdb/archive/v${PKG_VER}.tar.gz) ProcessorCount(NPROC) message(STATUS "${PROJECT_NAME} -- ${PKG_BUILD_TYPE} ${PKG_VER}") message(STATUS "${PROJECT_NAME} -- URL: ${URL}") message(STATUS "${PROJECT_NAME} -- URL_HASH: ${PKG_HASH}") ExternalProject_Add(rocksdb PREFIX "${CMAKE_CURRENT_BINARY_DIR}/rocksdb" URL ${URL} URL_HASH ${URL_HASH_OPTION} TIMEOUT 30 CONFIGURE_COMMAND "" BUILD_COMMAND PORTABLE=1 make -e DISABLE_JEMALLOC=1 DEBUG_LEVEL=${DEBUG_LEVEL} static_lib -j${NPROC} INSTALL_COMMAND make INSTALL_PATH=${PREFIX} install BUILD_IN_SOURCE true DOWNLOAD_NO_PROGRESS true ) set(CPACK_GENERATOR TGZ) string(REPLACE "." ";" VERSION_LIST ${PKG_VER}) list(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR) list(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR) list(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH) set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) set(CPACK_PACKAGE_NAME ${PROJECT_NAME}-${PKG_BUILD_TYPE}) string(TOLOWER ${CMAKE_SYSTEM_NAME} CPACK_SYSTEM_NAME) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${PKG_BUILD_TYPE}/ DESTINATION ${PKG_BUILD_TYPE}/) include(CPack) ================================================ FILE: include/bluzelle.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include namespace bzn { using caller_id_t = std::string; using encoded_message = std::string; using hash_t = std::string; using json_message = Json::Value; using key_t = std::string; using service_state_t = std::string; using session_id = uint64_t; using uuid_t = std::string; using value_t = std::string; using swarm_id_t = std::string; } // bzn namespace bzn::utils { constexpr std::string_view basename(const std::string_view& path) { return path.substr(path.rfind('/') + 1); } const std::string ROPSTEN_URL{"https://ropsten.infura.io"}; const std::string DEFAULT_SWARM_INFO_ESR_ADDRESS{"D5B3d7C061F817ab05aF9Fab3b61EEe036e4f4fc"}; } // bzn::utils // logging #define LOG(x) BOOST_LOG_TRIVIAL(x) << "(" << bzn::utils::basename(__FILE__) << ":" << __LINE__ << ") - " // This limits the number of characters that are displayed in "LOG(x) <<" messages. const uint16_t MAX_MESSAGE_SIZE = 1024; const uint16_t MAX_SHORT_MESSAGE_SIZE = 32; ================================================ FILE: include/boost_asio_beast.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include // todo: this file needs a better name! namespace bzn::asio { // types... using accept_handler = std::function; using read_handler = std::function; using write_handler = std::function; using connect_handler = std::function; using close_handler = std::function; using wait_handler = std::function; using task = std::function; /////////////////////////////////////////////////////////////////////////// // mockable interfaces... class tcp_socket_base { public: virtual ~tcp_socket_base() = default; virtual void async_connect(const boost::asio::ip::tcp::endpoint& ep, bzn::asio::connect_handler handler) = 0; virtual boost::asio::ip::tcp::endpoint remote_endpoint() = 0; virtual boost::asio::ip::tcp::socket& get_tcp_socket() = 0; }; /////////////////////////////////////////////////////////////////////////// class udp_socket_base { public: virtual ~udp_socket_base() = default; virtual void async_send_to(const boost::asio::const_buffer& msg, boost::asio::ip::udp::endpoint ep, bzn::asio::write_handler handler) = 0; }; /////////////////////////////////////////////////////////////////////////// class tcp_acceptor_base { public: virtual ~tcp_acceptor_base() = default; virtual void async_accept(bzn::asio::tcp_socket_base& socket, bzn::asio::accept_handler handler) = 0; virtual boost::asio::ip::tcp::acceptor& get_tcp_acceptor() = 0; }; /////////////////////////////////////////////////////////////////////////// class steady_timer_base { public: virtual ~steady_timer_base() = default; virtual void async_wait(wait_handler handler) = 0; virtual std::size_t expires_from_now(const std::chrono::milliseconds& expiry_time) = 0; virtual void cancel() = 0; virtual boost::asio::steady_timer& get_steady_timer() = 0; }; /////////////////////////////////////////////////////////////////////////// class strand_base { public: virtual ~strand_base() = default; virtual bzn::asio::write_handler wrap(write_handler handler) = 0; virtual bzn::asio::close_handler wrap(close_handler handler) = 0; virtual bzn::asio::task wrap(bzn::asio::task action) = 0; virtual void post(bzn::asio::task action) = 0; virtual boost::asio::io_context::strand& get_strand() = 0; }; /////////////////////////////////////////////////////////////////////////// class io_context_base { public: virtual ~io_context_base() = default; virtual std::unique_ptr make_unique_tcp_acceptor(const boost::asio::ip::tcp::endpoint& ep) = 0; virtual std::unique_ptr make_unique_tcp_socket() = 0; virtual std::unique_ptr make_unique_tcp_socket(bzn::asio::strand_base& ctx) = 0; virtual std::unique_ptr make_unique_udp_socket() = 0; virtual std::unique_ptr make_unique_steady_timer() = 0; virtual std::unique_ptr make_unique_strand() = 0; virtual void post(bzn::asio::task) = 0; virtual boost::asio::io_context::count_type run() = 0; virtual void stop() = 0; virtual boost::asio::io_context& get_io_context() = 0; }; /////////////////////////////////////////////////////////////////////////// // the real thing... class udp_socket final : public udp_socket_base { public: explicit udp_socket(boost::asio::io_context& io_context) : socket(io_context) { this->socket.open(boost::asio::ip::udp::v4()); } void async_send_to(const boost::asio::const_buffer& msg, boost::asio::ip::udp::endpoint ep, bzn::asio::write_handler handler) { this->socket.async_send_to(msg, ep, handler); } private: boost::asio::ip::udp::socket socket; }; /////////////////////////////////////////////////////////////////////////// class tcp_socket final : public tcp_socket_base { public: explicit tcp_socket(boost::asio::io_context& io_context) : socket(io_context) { } explicit tcp_socket(bzn::asio::strand_base& ctx) : socket(ctx.get_strand()) { } void async_connect(const boost::asio::ip::tcp::endpoint& ep, bzn::asio::connect_handler handler) override { this->socket.async_connect(ep, handler); } boost::asio::ip::tcp::endpoint remote_endpoint() override { return this->socket.remote_endpoint(); } boost::asio::ip::tcp::socket& get_tcp_socket() override { return this->socket; } private: boost::asio::ip::tcp::socket socket; }; /////////////////////////////////////////////////////////////////////////// class tcp_acceptor final : public tcp_acceptor_base { public: explicit tcp_acceptor(boost::asio::io_context& io_context, const boost::asio::ip::tcp::endpoint& ep) : acceptor(io_context, ep) { } void async_accept(bzn::asio::tcp_socket_base& socket, bzn::asio::accept_handler handler) override { this->acceptor.async_accept(socket.get_tcp_socket(), std::move(handler)); } boost::asio::ip::tcp::acceptor& get_tcp_acceptor() override { return this->acceptor; } private: boost::asio::ip::tcp::acceptor acceptor; }; /////////////////////////////////////////////////////////////////////////// class steady_timer final : public steady_timer_base { public: explicit steady_timer(boost::asio::io_context& io_context) : timer(io_context) { } void async_wait(wait_handler handler) override { this->timer.async_wait(handler); } std::size_t expires_from_now(const std::chrono::milliseconds& expiry_time) override { return this->timer.expires_from_now(expiry_time); } void cancel() override { this->timer.cancel(); } boost::asio::steady_timer& get_steady_timer() override { return this->timer; } private: boost::asio::steady_timer timer; }; /////////////////////////////////////////////////////////////////////////// class strand final : public strand_base { public: explicit strand(boost::asio::io_context& io_context) : s(io_context) { } bzn::asio::write_handler wrap(write_handler handler) override { return this->s.wrap(std::move(handler)); } bzn::asio::close_handler wrap(close_handler handler) override { return this->s.wrap(std::move(handler)); } bzn::asio::task wrap(bzn::asio::task action) override { return this->s.wrap(std::move(action)); } void post(bzn::asio::task action) override { this->s.post(action); } boost::asio::io_context::strand& get_strand() override { return this->s; } private: boost::asio::io_context::strand s; }; /////////////////////////////////////////////////////////////////////////// class io_context final : public io_context_base { public: std::unique_ptr make_unique_tcp_acceptor(const boost::asio::ip::tcp::endpoint& ep) override { return std::make_unique(this->io_context, ep); } std::unique_ptr make_unique_tcp_socket() override { return std::make_unique(this->io_context); } std::unique_ptr make_unique_tcp_socket(bzn::asio::strand_base& ctx) override { return std::make_unique(ctx); } std::unique_ptr make_unique_udp_socket() override { return std::make_unique(this->io_context); } std::unique_ptr make_unique_steady_timer() override { return std::make_unique(this->io_context); } std::unique_ptr make_unique_strand() override { return std::make_unique(this->io_context); } void post(bzn::asio::task func) override { boost::asio::post(this->io_context, func); } boost::asio::io_context::count_type run() override { return this->io_context.run(); } void stop() override { this->io_context.stop(); } boost::asio::io_context& get_io_context() override { return this->io_context; } private: boost::asio::io_context io_context; }; } // bzn::asio namespace bzn::beast { // types... using handshake_handler = std::function; using read_handler = std::function; using write_handler = std::function; using close_handler = std::function; /////////////////////////////////////////////////////////////////////////// // mockable interfaces... class http_socket_base { public: virtual ~http_socket_base() = default; virtual boost::asio::ip::tcp::socket& get_socket() = 0; virtual void async_read(boost::beast::flat_buffer& buffer, boost::beast::http::request& request, bzn::beast::read_handler handler) = 0; virtual void async_write(boost::beast::http::response& response, bzn::beast::write_handler handler) = 0; virtual void close() = 0; }; class http_socket final : public http_socket_base { public: explicit http_socket(boost::asio::ip::tcp::socket socket) : socket(std::move(socket)) { } boost::asio::ip::tcp::socket& get_socket() override { return this->socket; } void async_read(boost::beast::flat_buffer& buffer, boost::beast::http::request& request, bzn::beast::read_handler handler) override { boost::beast::http::async_read(this->socket, buffer, request, std::move(handler)); } void async_write(boost::beast::http::response& response, bzn::beast::write_handler handler) override { boost::beast::http::async_write(this->socket, response, std::move(handler)); } void close() override { this->socket.close(); } private: boost::asio::ip::tcp::socket socket; }; /////////////////////////////////////////////////////////////////////////// class websocket_stream_base { public: virtual ~websocket_stream_base() = default; virtual void async_accept(bzn::asio::accept_handler handler) = 0; virtual void async_read(boost::beast::multi_buffer& buffer, bzn::asio::read_handler handler) = 0; virtual void async_write(const boost::asio::mutable_buffers_1& buffer, bzn::asio::write_handler handler) = 0; virtual size_t write(const boost::asio::mutable_buffers_1& buffer, boost::beast::error_code& ec) = 0; virtual void async_close(boost::beast::websocket::close_code reason, bzn::beast::close_handler handler) = 0; virtual void async_handshake(const std::string& host, const std::string& target, bzn::beast::handshake_handler handler) = 0; virtual void binary(bool bin) = 0; virtual bool is_open() = 0; }; /////////////////////////////////////////////////////////////////////////// class websocket_stream final : public websocket_stream_base { public: explicit websocket_stream(boost::asio::ip::tcp::socket socket) : websocket(std::move(socket)) { } void async_accept(bzn::asio::accept_handler handler) override { this->websocket.async_accept(handler); } void async_read(boost::beast::multi_buffer& buffer, bzn::asio::read_handler handler) override { this->websocket.async_read(buffer, handler); } void async_write(const boost::asio::mutable_buffers_1& buffer, bzn::asio::write_handler handler) override { this->websocket.async_write(buffer, handler); } size_t write(const boost::asio::mutable_buffers_1& buffer, boost::beast::error_code& ec) override { return this->websocket.write(buffer, ec); } void async_close(boost::beast::websocket::close_code reason, bzn::beast::close_handler handler) override { this->websocket.async_close(reason, handler); } void async_handshake(const std::string& host, const std::string& target, bzn::beast::handshake_handler handler) override { this->websocket.async_handshake(host, target, handler); } bool is_open() override { return this->websocket.is_open(); } void binary(bool bin) override { this->websocket.binary(bin); } private: boost::beast::websocket::stream websocket; }; class websocket_secure_stream final : public websocket_stream_base, public std::enable_shared_from_this { public: explicit websocket_secure_stream(boost::asio::ip::tcp::socket socket, boost::asio::ssl::context& ctx) : websocket(std::move(socket), ctx) { // todo: add peer validation } void async_accept(bzn::asio::accept_handler handler) override { boost::beast::get_lowest_layer(this->websocket).expires_after(std::chrono::seconds(30)); this->websocket.next_layer().async_handshake( boost::asio::ssl::stream_base::server, [self = shared_from_this(), handler](auto ec) { if (ec) { LOG(error) << "server ssl handshake failed: " << ec.message(); return; } boost::beast::get_lowest_layer(self->websocket).expires_never(); self->websocket.async_accept(handler); }); } void async_read(boost::beast::multi_buffer& buffer, bzn::asio::read_handler handler) override { this->websocket.async_read(buffer, handler); } void async_write(const boost::asio::mutable_buffers_1& buffer, bzn::asio::write_handler handler) override { this->websocket.async_write(buffer, handler); } size_t write(const boost::asio::mutable_buffers_1& buffer, boost::beast::error_code& ec) override { return this->websocket.write(buffer, ec); } void async_close(boost::beast::websocket::close_code reason, bzn::beast::close_handler handler) override { this->websocket.async_close(reason, handler); } void async_handshake(const std::string& host, const std::string& target, bzn::beast::handshake_handler handler) override { boost::beast::get_lowest_layer(this->websocket).expires_after(std::chrono::seconds(30)); this->websocket.next_layer().async_handshake( boost::asio::ssl::stream_base::client, [self = shared_from_this(), host, target, handler](auto ec) { if (ec) { LOG(error) << "client ssl handshake failed: " << ec.message(); return; } boost::beast::get_lowest_layer(self->websocket).expires_never(); self->websocket.async_handshake(host, target, handler); }); } bool is_open() override { return this->websocket.is_open(); } void binary(bool bin) override { this->websocket.binary(bin); } private: boost::beast::websocket::stream> websocket; }; // /////////////////////////////////////////////////////////////////////////// class websocket_base { public: virtual ~websocket_base() = default; virtual std::unique_ptr make_websocket_stream(boost::asio::ip::tcp::socket& socket) = 0; virtual std::shared_ptr make_websocket_secure_stream(boost::asio::ip::tcp::socket& socket, boost::asio::ssl::context& ctx) = 0; }; /////////////////////////////////////////////////////////////////////////// class websocket final : public websocket_base { public: std::unique_ptr make_websocket_stream(boost::asio::ip::tcp::socket& socket) override { return std::make_unique(std::move(socket)); } std::shared_ptr make_websocket_secure_stream(boost::asio::ip::tcp::socket& socket, boost::asio::ssl::context& ctx) override { return std::make_shared(std::move(socket), ctx); } }; } // bzn::beast ================================================ FILE: include/system_clock.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn { class system_clock_base { public: virtual uint64_t microseconds_since_epoch() = 0; virtual ~system_clock_base() = default; }; class system_clock : public system_clock_base { uint64_t microseconds_since_epoch() { auto res = std::chrono::time_point_cast(std::chrono::high_resolution_clock::now()); return res.time_since_epoch().count(); } }; } ================================================ FILE: mocks/CMakeLists.txt ================================================ add_library(smart_mocks STATIC smart_mock_node.hpp smart_mock_node.cpp smart_mock_io.hpp smart_mock_io.cpp smart_mock_peers_beacon.hpp smart_mock_peers_beacon.cpp ) add_dependencies(smart_mocks boost proto googletest) target_include_directories(smart_mocks PRIVATE ${BLUZELLE_STD_INCLUDES}) ================================================ FILE: mocks/mock_boost_asio_beast.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include // gmock_gen.py generated... namespace bzn::asio { class mock_tcp_socket_base : public tcp_socket_base { public: MOCK_METHOD0(get_tcp_socket, boost::asio::ip::tcp::socket&()); MOCK_METHOD2(async_connect, void(const boost::asio::ip::tcp::endpoint& ep, bzn::asio::connect_handler handler)); MOCK_METHOD0(remote_endpoint, boost::asio::ip::tcp::endpoint()); }; } // namespace bzn::asio namespace bzn::asio { class mock_udp_socket_base : public udp_socket_base { public: MOCK_METHOD3(async_send_to, void(const boost::asio::const_buffer& msg, boost::asio::ip::udp::endpoint ep, std::function handler)); }; } // namespace bzn::asio namespace bzn::asio { class mock_tcp_acceptor_base : public tcp_acceptor_base { public: MOCK_METHOD2(async_accept, void(bzn::asio::tcp_socket_base& socket, bzn::asio::accept_handler handler)); MOCK_METHOD0(get_tcp_acceptor, boost::asio::ip::tcp::acceptor&()); }; } // namespace bzn::asio namespace bzn::asio { class mock_steady_timer_base : public steady_timer_base { public: MOCK_METHOD1(async_wait, void(wait_handler handler)); MOCK_METHOD1(expires_from_now, std::size_t(const std::chrono::milliseconds& expiry_time)); MOCK_METHOD0(cancel, void()); MOCK_METHOD0(get_steady_timer, boost::asio::steady_timer&()); }; } // namespace bzn::asio namespace bzn::asio { class mock_strand_base : public strand_base { public: MOCK_METHOD1(wrap, bzn::asio::write_handler(write_handler handler)); MOCK_METHOD1(wrap, bzn::asio::close_handler(close_handler handler)); MOCK_METHOD1(wrap, bzn::asio::task(bzn::asio::task handler)); MOCK_METHOD1(post, void(bzn::asio::task task)); MOCK_METHOD0(get_strand, boost::asio::io_context::strand&()); }; } // namespace bzn::asio namespace bzn::asio { class mock_io_context_base : public io_context_base { public: MOCK_METHOD1(make_unique_tcp_acceptor, std::unique_ptr(const boost::asio::ip::tcp::endpoint& ep)); MOCK_METHOD0(make_unique_tcp_socket, std::unique_ptr()); MOCK_METHOD1(make_unique_tcp_socket, std::unique_ptr(bzn::asio::strand_base&)); MOCK_METHOD0(make_unique_udp_socket, std::unique_ptr()); MOCK_METHOD0(make_unique_steady_timer, std::unique_ptr()); MOCK_METHOD0(make_unique_strand, std::unique_ptr()); MOCK_METHOD1(post, void(bzn::asio::task)); MOCK_METHOD0(run, boost::asio::io_context::count_type()); MOCK_METHOD0(stop, void()); MOCK_METHOD0(get_io_context, boost::asio::io_context&()); }; } // namespace bzn::asio namespace bzn::beast { class mock_http_socket_base : public http_socket_base { public: MOCK_METHOD0(get_socket, boost::asio::ip::tcp::socket&()); MOCK_METHOD3(async_read, void(boost::beast::flat_buffer& buffer, boost::beast::http::request& request, bzn::beast::read_handler handler)); MOCK_METHOD2(async_write, void(boost::beast::http::response& response, bzn::beast::write_handler handler)); MOCK_METHOD0(close, void()); }; } // namespace bzn::beast namespace bzn::beast { class mock_websocket_stream_base : public websocket_stream_base { public: MOCK_METHOD1(async_accept, void(bzn::asio::accept_handler handler)); MOCK_METHOD2(async_read, void(boost::beast::multi_buffer& buffer, bzn::asio::read_handler handler)); MOCK_METHOD2(async_write, void(const boost::asio::mutable_buffers_1& buffer, bzn::asio::write_handler handler)); MOCK_METHOD2(write, size_t(const boost::asio::mutable_buffers_1& buffer, boost::beast::error_code& ec)); MOCK_METHOD2(async_close, void(boost::beast::websocket::close_code reason, bzn::beast::close_handler handler)); MOCK_METHOD3(async_handshake, void(const std::string& host, const std::string& target, bzn::beast::handshake_handler handler)); MOCK_METHOD0(is_open, bool()); MOCK_METHOD1(binary, void(bool bin)); }; } // namespace bzn::beast namespace bzn::beast { class mock_websocket_base : public websocket_base { public: MOCK_METHOD1(make_websocket_stream, std::unique_ptr(boost::asio::ip::tcp::socket& socket)); MOCK_METHOD2(make_websocket_secure_stream, std::shared_ptr(boost::asio::ip::tcp::socket& socket, boost::asio::ssl::context& ctx)); }; } // namespace bzn::beast ================================================ FILE: mocks/mock_chaos_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class mock_chaos_base : public chaos_base { public: MOCK_METHOD0(start, void()); MOCK_METHOD0(is_message_dropped, bool()); MOCK_METHOD0(is_message_delayed, bool()); MOCK_CONST_METHOD1(reschedule_message, void(std::function callback)); }; } // namespace bzn ================================================ FILE: mocks/mock_crud_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class mock_crud_base : public crud_base { public: MOCK_METHOD3(handle_request, void(const bzn::caller_id_t& caller_id, const database_msg& request, std::shared_ptr session)); MOCK_METHOD2(start, void(std::shared_ptr pbft, size_t max_storage)); MOCK_METHOD0(save_state, bool()); MOCK_METHOD0(get_saved_state, std::shared_ptr()); MOCK_METHOD1(load_state, bool(const std::string&)); }; } // namespace bzn ================================================ FILE: mocks/mock_crypto_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class mock_crypto_base : public crypto_base { public: MOCK_METHOD1(sign, bool(bzn_envelope& msg)); MOCK_METHOD1(verify, bool(const bzn_envelope& msg)); MOCK_METHOD1(hash, std::string(const std::string& msg)); MOCK_METHOD1(hash, std::string(const bzn_envelope& msg)); }; } ================================================ FILE: mocks/mock_monitor.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class mock_monitor : public monitor_base { public: MOCK_METHOD1(start_timer, void(std::string instance_id)); MOCK_METHOD2(finish_timer, void(statistic stat, std::string instance_id)); MOCK_METHOD2(send_counter, void(statistic, uint64_t)); }; } // namespace bzn ================================================ FILE: mocks/mock_node_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include // gmock_gen.py generated... namespace bzn { class mock_node_base : public node_base { public: MOCK_METHOD2(register_for_message, bool(const bzn_envelope::PayloadCase msg_type, bzn::protobuf_handler message_handler)); MOCK_METHOD1(register_error_handler, void(std::function error_callback)); MOCK_METHOD1(start, void(std::shared_ptr pbft)); MOCK_METHOD2(send_signed_message, void(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg)); MOCK_METHOD2(send_signed_message, void(const bzn::uuid_t& uuid, std::shared_ptr msg)); MOCK_METHOD2(send_message_str, void(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg)); MOCK_METHOD2(multicast_signed_message, void(std::shared_ptr> eps, std::shared_ptr msg)); MOCK_METHOD2(send_maybe_signed_message, void(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg)); MOCK_METHOD2(send_maybe_signed_message, void(const bzn::uuid_t& uuid, std::shared_ptr msg)); MOCK_METHOD2(multicast_maybe_signed_message, void(std::shared_ptr> eps, std::shared_ptr msg)); }; } // namespace bzn ================================================ FILE: mocks/mock_options_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include namespace bzn { class mock_options_base : public options_base { public: MOCK_CONST_METHOD0(get_simple_options, const simple_options&()); MOCK_METHOD0(get_mutable_simple_options, simple_options&()); MOCK_CONST_METHOD0(get_listener, boost::asio::ip::tcp::endpoint()); MOCK_CONST_METHOD1(get_monitor_endpoint, std::optional(std::shared_ptr context)); MOCK_CONST_METHOD0(get_ethererum_address, std::string()); MOCK_CONST_METHOD0(get_ethererum_io_api_token, std::string()); MOCK_CONST_METHOD0(get_bootstrap_peers_url, std::string()); MOCK_CONST_METHOD0(get_bootstrap_peers_file, std::string()); MOCK_CONST_METHOD0(get_debug_logging, bool()); MOCK_CONST_METHOD0(get_log_to_stdout, bool()); MOCK_CONST_METHOD0(get_uuid, bzn::uuid_t()); MOCK_CONST_METHOD0(get_swarm_id, bzn::swarm_id_t()); MOCK_CONST_METHOD0(get_ws_idle_timeout, std::chrono::milliseconds()); MOCK_CONST_METHOD0(get_audit_mem_size, size_t()); MOCK_CONST_METHOD0(get_state_dir, std::string()); MOCK_CONST_METHOD0(get_logfile_dir, std::string()); MOCK_CONST_METHOD0(get_max_swarm_storage, size_t()); MOCK_CONST_METHOD0(get_mem_storage, bool()); MOCK_CONST_METHOD0(get_logfile_rotation_size, size_t()); MOCK_CONST_METHOD0(get_logfile_max_size, size_t()); MOCK_CONST_METHOD0(pbft_enabled, bool()); MOCK_CONST_METHOD0(peer_validation_enabled, bool()); MOCK_CONST_METHOD0(get_signed_key, std::string()); MOCK_CONST_METHOD0(get_owner_public_key, std::string()); MOCK_CONST_METHOD0(get_swarm_info_esr_address, std::string()); MOCK_CONST_METHOD0(get_swarm_info_esr_url, std::string()); MOCK_CONST_METHOD0(get_stack, std::string()); MOCK_CONST_METHOD0(get_wss_enabled, bool()); MOCK_CONST_METHOD0(get_wss_server_certificate_file, std::string()); MOCK_CONST_METHOD0(get_wss_server_private_key_file, std::string()); MOCK_CONST_METHOD0(get_wss_server_dh_params_file, std::string()); MOCK_CONST_METHOD0(get_admission_window, size_t()); MOCK_CONST_METHOD0(get_peer_message_signing, bool()); }; } // namespace bzn ================================================ FILE: mocks/mock_pbft_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include // gmock_gen.py generated... namespace bzn { class mock_pbft_base : public pbft_base { public: MOCK_METHOD0(start, void()); MOCK_METHOD2(handle_message, void(const pbft_msg& msg, const bzn_envelope& original_msg)); MOCK_METHOD2(handle_database_message, void(const bzn_envelope& msg, std::shared_ptr session)); MOCK_CONST_METHOD0(is_primary, bool()); MOCK_CONST_METHOD0(get_current_primary, std::optional()); MOCK_CONST_METHOD1(predict_primary, std::optional(uint64_t view)); MOCK_CONST_METHOD0(get_uuid, const bzn::uuid_t&()); MOCK_METHOD0(handle_failure, void()); MOCK_CONST_METHOD1(get_peer_by_uuid, const peer_address_t&(const std::string& uuid)); MOCK_CONST_METHOD0(peers, std::shared_ptr()); }; } // namespace bzn ================================================ FILE: mocks/mock_pbft_failure_detector.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include namespace bzn { class mock_pbft_failure_detector_base : public pbft_failure_detector_base { public: MOCK_METHOD1(request_seen, void(const bzn::hash_t& req)); MOCK_METHOD1(request_executed, void(const bzn::hash_t& req)); MOCK_METHOD1(register_failure_handler, void(std::function handler)); }; } ================================================ FILE: mocks/mock_pbft_service_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include namespace bzn { class mock_pbft_service_base : public pbft_service_base { public: MOCK_CONST_METHOD2(query, void(const database_msg& request, uint64_t sequence_number)); MOCK_CONST_METHOD1(service_state_hash, bzn::hash_t(uint64_t sequence_number)); MOCK_METHOD1(consolidate_log, void(uint64_t sequence_number)); MOCK_METHOD1(register_execute_handler, void(bzn::execute_handler_t handler)); MOCK_METHOD1(apply_operation, void(const std::shared_ptr&)); MOCK_METHOD2(apply_operation_now, bool(const bzn_envelope& msg, std::shared_ptr session)); MOCK_CONST_METHOD1(get_service_state, std::shared_ptr(uint64_t sequence_number)); MOCK_METHOD2(set_service_state, bool(uint64_t sequence_number, const bzn::service_state_t& data)); MOCK_METHOD1(save_service_state_at, void(uint64_t)); }; } // namespace bzn ================================================ FILE: mocks/mock_peers_beacon_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class mock_peers_beacon_base : public peers_beacon_base { public: MOCK_METHOD0(start, void()); MOCK_CONST_METHOD0(current, std::shared_ptr()); MOCK_CONST_METHOD0(ordered, std::shared_ptr()); MOCK_METHOD1(refresh, bool(bool first_run)); bool refresh() { return this->refresh(false); } }; } ================================================ FILE: mocks/mock_session_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include // gmock_gen.py generated... namespace bzn { class mock_session_base : public session_base { public: MOCK_METHOD1(send_message, void(std::shared_ptr msg)); MOCK_METHOD1(send_signed_message, void(std::shared_ptr msg)); MOCK_METHOD0(get_session_id, bzn::session_id()); MOCK_METHOD0(close, void()); MOCK_CONST_METHOD0(is_open, bool()); MOCK_CONST_METHOD0(is_closing, bool()); MOCK_METHOD2(open, void(std::shared_ptr ws_factory, std::function)); MOCK_METHOD1(accept, void(std::shared_ptr ws)); MOCK_METHOD1(add_shutdown_handler, void(bzn::session_shutdown_handler handler)); }; } // namespace bzn ================================================ FILE: mocks/mock_status_provider_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include // gmock_gen.py generated... namespace bzn { class mock_status_provider_base : public status_provider_base { public: MOCK_METHOD0(get_name, std::string()); MOCK_METHOD0(get_status, bzn::json_message()); }; } // namespace bzn ================================================ FILE: mocks/mock_storage_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class mock_storage_base : public storage_base { public: MOCK_METHOD3(create, bzn::storage_result(const bzn::uuid_t& uuid, const std::string& key, const std::string& value)); MOCK_METHOD2(read, std::optional (const bzn::uuid_t& uuid, const std::string& key)); MOCK_METHOD3(update, bzn::storage_result(const bzn::uuid_t& uuid, const std::string& key, const std::string& value)); MOCK_METHOD2(remove, bzn::storage_result(const bzn::uuid_t& uuid, const std::string& key)); MOCK_METHOD0(start, bzn::storage_result()); MOCK_METHOD1(save, bzn::storage_result(const std::string& path)); MOCK_METHOD1(load, bzn::storage_result(const std::string& path)); MOCK_METHOD1(error_msg, std::string(bzn::storage_result error_id)); MOCK_METHOD1(get_keys, std::vector(const bzn::uuid_t& uuid)); MOCK_METHOD2(has, bool(const bzn::uuid_t& uuid, const std::string& key)); MOCK_METHOD1(get_size, std::pair(const bzn::uuid_t& uuid)); MOCK_METHOD2(get_key_size, std::optional(const bzn::uuid_t& uuid, const bzn::key_t& key)); MOCK_METHOD1(remove, bzn::storage_result(const bzn::uuid_t& uuid)); MOCK_METHOD0(create_snapshot, bool()); MOCK_METHOD0(get_snapshot, std::shared_ptr()); MOCK_METHOD1(load_snapshot, bool(const std::string&)); MOCK_METHOD3(remove_range, void(const bzn::uuid_t& uuid, const std::string&, const std::string&)); MOCK_METHOD4(get_keys_if, std::vector(const bzn::uuid_t&, const std::string& , const std::string&, std::optional>)); MOCK_METHOD4(read_if, std::vector>(const bzn::uuid_t&, const std::string& , const std::string&, std::optional>)); }; } // namespace bzn ================================================ FILE: mocks/mock_subscription_manager_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class mock_subscription_manager_base : public subscription_manager_base { public: MOCK_METHOD0(start, void()); MOCK_METHOD5(subscribe, void(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr session)); MOCK_METHOD5(unsubscribe, void(const bzn::uuid_t& uuid, const bzn::key_t& key, uint64_t transaction_id, database_response& response, std::shared_ptr session)); MOCK_METHOD1(inspect_commit, void(const database_msg& msg)); }; } // namespace bzn ================================================ FILE: mocks/mock_system_clock.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class mock_system_clock : public system_clock_base { public: MOCK_METHOD0(microseconds_since_epoch, uint64_t()); }; } ================================================ FILE: mocks/mock_utils_interface.hpp ================================================ #pragma once #include namespace bzn { class mock_utils_interface_base : public utils_interface_base { public: MOCK_CONST_METHOD3(get_peer_ids, std::vector(const bzn::uuid_t& swarm_id, const std::string& esr_address, const std::string& url)); MOCK_CONST_METHOD4(get_peer_info, bzn::peer_address_t(const bzn::uuid_t& swarm_id, const std::string& peer_id, const std::string& esr_address, const std::string& url)); MOCK_CONST_METHOD2(sync_req, std::string(const std::string& url, const std::string& post)); std::string sync_req(const std::string& url) const { return this->sync_req(url, ""); } }; } // namespace bzn ================================================ FILE: mocks/smart_mock_io.cpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include #include using namespace ::testing; using namespace bzn; bzn::asio::smart_mock_io::smart_mock_io() { EXPECT_CALL(*this, make_unique_strand()).WillRepeatedly(Invoke( [&]() { auto strand = std::make_unique(); EXPECT_CALL(*strand, wrap(A())).WillRepeatedly(ReturnArg<0>()); EXPECT_CALL(*strand, wrap(A())).WillRepeatedly(ReturnArg<0>()); EXPECT_CALL(*strand, wrap(A())).WillRepeatedly(ReturnArg<0>()); EXPECT_CALL(*strand, post(A())).WillRepeatedly(Invoke( [&](auto task) { this->wrapped_post(task); })); return strand; })); EXPECT_CALL(*this, post(_)).WillRepeatedly(Invoke( [&](auto func) { this->wrapped_post(func); })); EXPECT_CALL(*this, make_unique_steady_timer()).WillRepeatedly(Invoke( [&]() { auto id = timer_count++; auto timer = std::make_unique(); EXPECT_CALL(*timer, async_wait(_)).WillRepeatedly(Invoke( [&, id](auto wh) { timer_callbacks[id] = wh; })); EXPECT_CALL(*timer, expires_from_now(_)).Times(AnyNumber()); return timer; })); EXPECT_CALL(*this, make_unique_tcp_socket(_)).WillRepeatedly(Invoke( [&](auto& /*strand*/) { return this->make_unique_tcp_socket(); })); EXPECT_CALL(*this, make_unique_tcp_socket()).WillRepeatedly(Invoke( [&]() { auto id = socket_count++; auto mock_socket = std::make_unique(); static boost::asio::io_context io; static boost::asio::ip::tcp::socket socket(io); this->socket_id_map.insert_or_assign(socket.native_handle(), id); EXPECT_CALL(*mock_socket, get_tcp_socket()).WillRepeatedly(ReturnRef(socket)); EXPECT_CALL(*mock_socket, remote_endpoint()).Times(AnyNumber()); EXPECT_CALL(*mock_socket, async_connect(_, _)).Times(AtMost(1)).WillOnce(Invoke( [&](auto, auto handler) { this->wrapped_post(std::bind(handler, this->tcp_connect_works ? boost::system::error_code{} : boost::asio::error::connection_refused)); })); return mock_socket; })); EXPECT_CALL(*this, make_unique_tcp_acceptor(_)).Times(AtMost(1)).WillOnce(Invoke( [&](auto& /*ep*/) { auto mock_acceptor = std::make_unique(); EXPECT_CALL(*mock_acceptor, async_accept(_, _)).WillRepeatedly(Invoke( [&](auto& socket, auto handler) { auto id = this->socket_id_map.at(socket.get_tcp_socket().native_handle()); this->tcp_accept_handlers.insert_or_assign(id, handler); })); return mock_acceptor; })); EXPECT_CALL(*(this->websocket), make_websocket_stream(_)).WillRepeatedly(Invoke( [&](auto& socket) { auto id = this->socket_id_map.at(socket.native_handle()); this->socket_is_open.insert_or_assign(id, true); auto wss = std::make_unique(); EXPECT_CALL(*wss, async_accept(_)).Times(AtMost(1)).WillOnce(Invoke( [&, id](auto handler) { this->ws_accept_handlers.insert_or_assign(id, handler); })); EXPECT_CALL(*wss, async_write(_, _)).WillRepeatedly(Invoke( [&, id](const boost::asio::mutable_buffers_1& buffer, auto handler) { this->ws_write_closures.insert_or_assign(id, [handler, &buffer]() { char* raw_buf = static_cast(buffer.begin()->data()); std::string result(raw_buf, buffer.begin()->size()); handler(boost::system::error_code{}, result.size()); return result; }); })); EXPECT_CALL(*wss, async_read(_, _)).WillRepeatedly(Invoke( [&, id](auto& buffer, auto handler) { this->ws_read_closures.insert_or_assign(id, [handler, &buffer](std::string data) { size_t n = boost::asio::buffer_copy(buffer.prepare(data.size()), boost::asio::buffer(data)); buffer.commit(n); handler(boost::system::error_code{}, data.size()); }); })); EXPECT_CALL(*wss, async_handshake(_, _, _)).Times(AtMost(1)).WillRepeatedly(Invoke( [&](auto, auto, auto handler) { this->wrapped_post(std::bind(handler, boost::system::error_code{})); })); EXPECT_CALL(*wss, is_open()).WillRepeatedly(Invoke( [&, id]() { return this->socket_is_open.at(id); })); this->ws_closed.insert_or_assign(id, false); EXPECT_CALL(*wss, async_close(_, _)).WillRepeatedly(Invoke( [&, id](auto /*reason*/, auto handler) { this->ws_closed.insert_or_assign(id, true); this->wrapped_post(std::bind(handler, boost::system::error_code{})); })); EXPECT_CALL(*wss, binary(_)).Times(AnyNumber()); return wss; })); } void bzn::asio::smart_mock_io::do_incoming_connection(size_t id) { this->tcp_accept_handlers.at(id)(boost::system::error_code{}); this->yield_until_clear(); this->ws_accept_handlers.at(id)(boost::system::error_code{}); this->yield_until_clear(); } void bzn::asio::smart_mock_io::shutdown() { if (this->pending_real_callbacks > 0) { LOG(error) << "Warning: shutting down mock io context while it still has pending real callbacks to execute"; } // These callbacks are likely to transitively hold a shared pointers to us, // so cleaning them up is necessary for us to be cleaned up this->timer_callbacks.clear(); this->ws_read_closures.clear(); this->ws_write_closures.clear(); this->ws_accept_handlers.clear(); this->tcp_accept_handlers.clear(); } void bzn::asio::smart_mock_io::wrapped_post(bzn::asio::task task) { this->pending_real_callbacks++; boost::asio::post([this, task]() { task(); this->pending_real_callbacks--; }); } void bzn::asio::smart_mock_io::yield_until_clear() { uint64_t sleep_time = 1; while (this->pending_real_callbacks > 0) { if (sleep_time > 1) { LOG(debug) << "some callbacks are still pending; mock waiting for " << sleep_time << " ms"; } std::this_thread::sleep_for(std::chrono::milliseconds(sleep_time)); sleep_time *= 2; } } void bzn::asio::smart_mock_io::trigger_timer(unsigned int timer_id) { this->timer_callbacks.at(timer_id)(boost::system::error_code{}); } ================================================ FILE: mocks/smart_mock_io.hpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #pragma once #include namespace bzn::asio { class smart_mock_io : public mock_io_context_base { public: smart_mock_io(); void do_incoming_connection(size_t id); void shutdown(); void yield_until_clear(); void trigger_timer(unsigned int timer_id); std::shared_ptr real_io_context = std::make_shared(); std::shared_ptr websocket = std::make_shared(); size_t timer_count = 0; std::map timer_callbacks; size_t socket_count = 0; std::map tcp_accept_handlers; std::map ws_accept_handlers; std::map> ws_write_closures; std::map> ws_read_closures; std::map ws_closed; std::map socket_is_open; std::map socket_id_map; bool tcp_connect_works = true; private: void wrapped_post(bzn::asio::task task); std::atomic_int pending_real_callbacks; }; } ================================================ FILE: mocks/smart_mock_node.cpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include using namespace ::testing; bzn::smart_mock_node::smart_mock_node() { EXPECT_CALL(*this, register_for_message(_, _)).WillRepeatedly(Invoke( [&](auto type, auto handler) { if (this->registrants.count(type) > 0) { throw std::runtime_error("duplicate node registration"); } this->registrants[type] = handler; return true; } )); EXPECT_CALL(*this, multicast_maybe_signed_message(_, _)).WillRepeatedly(Invoke( [&](auto endpoints, auto message) { for (const auto ep : *endpoints) { this->send_maybe_signed_message(ep, message); } })); } void bzn::smart_mock_node::deliver(const bzn_envelope& msg) { if (this->registrants.count(msg.payload_case()) == 0) { throw std::runtime_error("undeliverable message"); } this->registrants.at(msg.payload_case())(msg, nullptr); } void bzn::smart_mock_node::clear() { this->registrants.clear(); } ================================================ FILE: mocks/smart_mock_node.hpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class smart_mock_node : public mock_node_base { public: smart_mock_node(); void deliver(const bzn_envelope&); std::unordered_map registrants; void clear(); }; } ================================================ FILE: mocks/smart_mock_peers_beacon.cpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include using namespace ::testing; std::shared_ptr bzn::static_peers_beacon_for(bzn::peers_list_t peers) { auto res = std::make_shared(); auto list = std::make_shared(peers); EXPECT_CALL(*res, start()).Times(AtMost(1)); EXPECT_CALL(*res, current()).WillRepeatedly(Return(list)); auto ordered = std::make_shared(); std::for_each(peers.begin(), peers.end(), [&](const auto& peer) { ordered->push_back(peer); }); std::sort(ordered->begin(), ordered->end(), [](const auto& peer1, const auto& peer2) { return peer1.uuid.compare(peer2.uuid) < 0; }); EXPECT_CALL(*res, ordered()).WillRepeatedly(Return(ordered)); EXPECT_CALL(*res, refresh(_)).Times(AnyNumber()); return res; } std::shared_ptr bzn::static_peers_beacon_for(std::vector peers) { bzn::peers_list_t list; std::for_each(peers.begin(), peers.end(), [&](const auto& peer){list.insert(peer);} ); return static_peers_beacon_for(list); } std::shared_ptr bzn::static_empty_peers_beacon() { return static_peers_beacon_for(std::vector{}); } ================================================ FILE: mocks/smart_mock_peers_beacon.hpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #pragma once #include namespace bzn { std::shared_ptr static_peers_beacon_for(peers_list_t peers); std::shared_ptr static_peers_beacon_for(std::vector peers); std::shared_ptr static_empty_peers_beacon(); } ================================================ FILE: monitor/CMakeLists.txt ================================================ add_library(monitor monitor_base.hpp monitor.hpp monitor.cpp ) add_dependencies(monitor boost jsoncpp) target_include_directories(monitor PRIVATE ${BLUZELLE_STD_INCLUDES}) target_link_libraries(utils) add_subdirectory(test) ================================================ FILE: monitor/monitor.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include using namespace bzn; namespace { const std::unordered_map statistic_names{ { {statistic::hash_computed, "crypto.hashes_computed"}, {statistic::hash_computed_bytes, "crypto.bytes_hashed"}, {statistic::signature_computed, "crypto.signatures_computed"}, {statistic::signature_computed_bytes, "crypto.bytes_signed"}, {statistic::signature_verified, "crypto.signatures_verified"}, {statistic::signature_verified_bytes, "crypto.bytes_verified"}, {statistic::signature_rejected, "crypto.signatures_rejected"}, {statistic::session_opened, "node.sessions_opened"}, {statistic::message_sent, "node.messages_sent"}, {statistic::message_sent_bytes, "node.bytes_sent"}, {statistic::pbft_no_primary, "pbft.liveness.no_primary"}, {statistic::pbft_primary_alive, "pbft.liveness.primary_alive"}, {statistic::pbft_commit, "pbft.liveness.commit"}, {statistic::pbft_failure_detected, "pbft.liveness.failure_detected"}, {statistic::pbft_commit_conflict, "pbft.safety.commit_conflict"}, {statistic::pbft_primary_conflict, "pbft.safety.primary_conflict"}, {statistic::request_latency, "total-server-latency"} } }; } monitor::monitor(std::shared_ptr options, std::shared_ptr context, std::shared_ptr clock) : time_last_sent(clock->microseconds_since_epoch()) , options(std::move(options)) , context(std::move(context)) , clock(std::move(clock)) , socket(this->context->make_unique_udp_socket()) , monitor_endpoint(this->options->get_monitor_endpoint(this->context)) , scope_prefix("com.bluzelle." + this->options->get_stack() + "." + this->options->get_swarm_id() + ".swarmdb." + this->options->get_uuid()) { if (this->monitor_endpoint) { LOG(info) << boost::format("Will send stats to %1%:%2%") % this->monitor_endpoint->address().to_string() % this->monitor_endpoint->port(); } else { LOG(info) << "No monitor is configured; stats will not be collected"; } } void monitor::start_timer(std::string timer_id) { if (!this->monitor_endpoint) { return; } std::lock_guard lock(this->lock); if (this->start_times.find(timer_id) != this->start_times.end()) { return; } this->start_times.emplace(std::make_pair(timer_id, this->clock->microseconds_since_epoch())); this->ordered_timers.push_back(timer_id); while (this->ordered_timers.size() > this->options->get_simple_options().get(bzn::option_names::MONITOR_MAX_TIMERS)) { this->start_times.erase(this->ordered_timers.front()); this->ordered_timers.pop_front(); } } void monitor::finish_timer(bzn::statistic stat, std::string timer_id) { if (!this->monitor_endpoint) { return; } uint64_t result; std::lock_guard lock(this->lock); if (this->start_times.find(timer_id) == this->start_times.end()) { return; } result = this->clock->microseconds_since_epoch() - start_times.at(timer_id); this->start_times.erase(timer_id); auto stat_string = this->scope_prefix + "." + statistic_names.at(stat) + ":" + std::to_string(result) + "|us"; this->send(stat_string); } void monitor::send_counter(bzn::statistic stat, uint64_t amount) { if (!this->monitor_endpoint) { return; } std::lock_guard lock(this->lock); if (this->options->get_simple_options().get(option_names::MONITOR_COLLATE)) { this->accumulated_stats.insert(std::make_pair(stat, 0)); // silently fails if key exists this->accumulated_stats.insert_or_assign(stat, this->accumulated_stats.at(stat) + amount); this->maybe_send(); } else { this->send(this->format_counter(stat, amount)); } } std::string monitor::format_counter(bzn::statistic stat, uint64_t amount) { return this->scope_prefix + "." + statistic_names.at(stat) + ":" + std::to_string(amount) + "|c"; } void monitor::send(const std::string& stat) { LOG(trace) << "..." << (stat.length() <= 30 ? stat : stat.substr(stat.length() - 30)); std::shared_ptr buffer = std::make_shared(stat.c_str(), stat.size()); this->socket->async_send_to(*buffer, *(this->monitor_endpoint), [buffer](const boost::system::error_code& ec, std::size_t /*bytes*/) { if (ec) { LOG(error) << "UDP send failed"; } }); } void monitor::maybe_send() { auto threshold = this->time_last_sent + this->options->get_simple_options().get(option_names::MONITOR_COLLATE_INTERVAL_SECONDS)*1000000; if (this->clock->microseconds_since_epoch() >= threshold) { LOG(trace) << "Sending batched statistics:"; for (const auto& pair : this->accumulated_stats) { this->send(this->format_counter(pair.first, pair.second)); } this->accumulated_stats.clear(); this->time_last_sent = this->clock->microseconds_since_epoch(); } } ================================================ FILE: monitor/monitor.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include namespace bzn { class monitor : public monitor_base { public: monitor(std::shared_ptr options, std::shared_ptr context, std::shared_ptr clock); void start_timer(std::string instance_id) override; void finish_timer(statistic stat, std::string instance_id) override; void send_counter(statistic stat, uint64_t amount = 1) override; private: void send(const std::string& stat); std::string format_counter(statistic stat, uint64_t amount); void maybe_send(); uint64_t time_last_sent; std::unordered_map accumulated_stats; std::list ordered_timers; std::unordered_map start_times; std::mutex lock; std::shared_ptr options; std::shared_ptr context; std::shared_ptr clock; std::unique_ptr socket; const std::optional monitor_endpoint; const std::string scope_prefix; }; } ================================================ FILE: monitor/monitor_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { enum class statistic { hash_computed, hash_computed_bytes, signature_computed, signature_computed_bytes, signature_verified, signature_verified_bytes, signature_rejected, session_opened, message_sent, message_sent_bytes, pbft_no_primary, pbft_primary_alive, pbft_failure_detected, pbft_commit_conflict, pbft_primary_conflict, pbft_commit, request_latency }; class monitor_base { public: /* * Start timing for some statistic (e.g. a request completion). Will be ignored if this is a duplicate of some * other recent timer. * @instance_id some globally unique name for this instance of the timer (such as the request hash) */ virtual void start_timer(std::string instance_id) = 0; /* * Finish timing for some statistic (e.g. a request completion). Will be ignored if no such timer has been * started. * @instance_id some globally unique name for this instance of the timer (such as the request hash) * @stat the statistic under which to send the measurement */ virtual void finish_timer(statistic stat, std::string instance_id) = 0; /* * Send a counter statistic * @stat statistic to send * @amount amount of that statistic that has been observed */ virtual void send_counter(statistic stat, uint64_t amount = 1) = 0; virtual ~monitor_base() = default; }; } ================================================ FILE: monitor/test/CMakeLists.txt ================================================ set(test_srcs monitor_test.cpp) set(test_libs monitor options) add_gmock_test(monitor) ================================================ FILE: monitor/test/monitor_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include using namespace ::testing; class monitor_test : public Test { public: std::shared_ptr io_context = std::make_shared(); std::shared_ptr clock = std::make_shared(); std::shared_ptr options = std::make_shared(); std::shared_ptr monitor; uint64_t current_time = 0; std::vector sent_messages; boost::asio::ip::udp::endpoint ep; bool send_works = true; bzn::simple_options soptions; monitor_test() { EXPECT_CALL(*(this->options), get_uuid()).WillRepeatedly(Return("uuid")); EXPECT_CALL(*(this->options), get_monitor_endpoint(_)).WillRepeatedly(Invoke([&](auto){return this->ep;})); EXPECT_CALL(*(this->options), get_stack()).WillRepeatedly(Return("utest")); EXPECT_CALL(*(this->options), get_swarm_id()).WillRepeatedly(Return("0")); this->soptions.set(bzn::option_names::MONITOR_MAX_TIMERS, "100"); this->soptions.set(bzn::option_names::MONITOR_COLLATE, "false"); EXPECT_CALL(*(this->options), get_simple_options()).WillRepeatedly(Invoke( [&]() -> const bzn::simple_options& { return this->soptions; } )); EXPECT_CALL(*(this->clock), microseconds_since_epoch()).WillRepeatedly(Invoke( [&]() { return this->current_time; } )); EXPECT_CALL(*(this->io_context), make_unique_udp_socket()).WillRepeatedly(Invoke( [&]() { auto socket = std::make_unique(); EXPECT_CALL(*socket, async_send_to(_, _, _)).WillRepeatedly(Invoke( [&](auto buffer, auto /*endpoint*/, auto handler) { sent_messages.emplace_back(reinterpret_cast(buffer.data()), buffer.size()); if(this->send_works) { handler(boost::system::error_code{}, buffer.size()); } else { handler(boost::asio::error::connection_refused, 0); } } )); return socket; } )); this->monitor = std::make_shared(this->options, this->io_context, this->clock); } std::pair parse_counter(const std::string& message) { std::regex counter_regex("^(.*):(\\d*)\\|(.*)$"); std::smatch result; EXPECT_TRUE(std::regex_match(message, result, counter_regex)); EXPECT_EQ(result[3].str(), "c"); return std::pair(result[1].str(), std::stoull(result[2].str())); }; std::pair parse_timer(const std::string& message) { std::regex timer_regex("^(.*):(\\d*)\\|(.*)$"); std::smatch result; EXPECT_TRUE(std::regex_match(message, result, timer_regex)); EXPECT_EQ(result[3].str(), "us"); return std::pair(result[1].str(), std::stoull(result[2].str())); }; }; TEST_F(monitor_test, test_that_counters_emit_metric) { this->monitor->send_counter(bzn::statistic::message_sent); this->monitor->send_counter(bzn::statistic::message_sent_bytes, 15u); EXPECT_EQ(this->parse_counter(this->sent_messages.at(0)).second, 1u); EXPECT_EQ(this->parse_counter(this->sent_messages.at(1)).second, 15u); } TEST_F(monitor_test, test_that_timers_emit_metric) { this->monitor->start_timer("hash"); this->current_time = 10; this->monitor->finish_timer(bzn::statistic::request_latency, "hash"); auto res = this->parse_timer(this->sent_messages.at(0)); EXPECT_EQ(res.second, 10u); } TEST_F(monitor_test, test_concurrent_timers) { this->current_time = 10; this->monitor->start_timer("A"); this->current_time = 20; this->monitor->start_timer("B"); this->current_time = 100; this->monitor->finish_timer(bzn::statistic::request_latency, "A"); this->current_time = 1000; this->monitor->finish_timer(bzn::statistic::request_latency, "B"); EXPECT_EQ(this->parse_timer(this->sent_messages.at(0)).second, 100u - 10u); EXPECT_EQ(this->parse_timer(this->sent_messages.at(1)).second, 1000u - 20u); } TEST_F(monitor_test, test_timer_with_duplicate_triggers) { this->current_time = 10; this->monitor->start_timer("A"); this->current_time = 21; this->monitor->start_timer("A"); this->current_time = 30; this->monitor->finish_timer(bzn::statistic::request_latency, "A"); this->current_time = 43; this->monitor->finish_timer(bzn::statistic::request_latency, "A"); EXPECT_EQ(this->parse_timer(this->sent_messages.at(0)).second, 30u - 10u); EXPECT_EQ(this->sent_messages.size(), 1u); } TEST_F(monitor_test, test_no_endpoint) { auto options2 = std::make_shared>(); EXPECT_CALL(*options2, get_monitor_endpoint(_)).WillRepeatedly(Return(std::nullopt)); auto monitor2 = std::make_shared(options2, io_context, clock); monitor2->send_counter(bzn::statistic::message_sent); monitor2->start_timer("a"); monitor2->finish_timer(bzn::statistic::request_latency, "a"); EXPECT_EQ(this->sent_messages.size(), 0u); } TEST_F(monitor_test, test_timers_cleanup) { for(int i=0; i<200; /*more than we remember at once*/ i++) { this->monitor->start_timer(std::to_string(i)); } this->monitor->finish_timer(bzn::statistic::request_latency, std::to_string(0)); EXPECT_EQ(this->sent_messages.size(), 0u); } TEST_F(monitor_test, test_send_fails) { this->send_works = false; monitor->send_counter(bzn::statistic::message_sent); monitor->start_timer("a"); monitor->finish_timer(bzn::statistic::request_latency, "a"); // just testing for no crash } TEST_F(monitor_test, test_collate_no_messages_sent_before_time_passes) { this->soptions.set(bzn::option_names::MONITOR_COLLATE, "true"); this->soptions.set(bzn::option_names::MONITOR_COLLATE_INTERVAL_SECONDS, "1"); monitor->send_counter(bzn::statistic::message_sent); EXPECT_EQ(this->sent_messages.size(), 0u); } TEST_F(monitor_test, test_collate_all_messages_sent) { this->soptions.set(bzn::option_names::MONITOR_COLLATE, "true"); this->soptions.set(bzn::option_names::MONITOR_COLLATE_INTERVAL_SECONDS, "1"); // note that these quantities are chosen such that the sums of any two distinct subsets are distinct; this // is required to make the way we're examining the results work correctly. monitor->send_counter(bzn::statistic::message_sent, 3); monitor->send_counter(bzn::statistic::message_sent, 20); monitor->send_counter(bzn::statistic::message_sent_bytes, 100); EXPECT_EQ(this->sent_messages.size(), 0u); this->current_time = 2000000; monitor->send_counter(bzn::statistic::hash_computed, 4000); std::unordered_map result; for(const auto& msg : this->sent_messages) { auto pair = this->parse_counter(msg); result.insert(std::make_pair(pair.second, pair.first)); } EXPECT_EQ(this->sent_messages.size(), 3u); EXPECT_EQ(result.size(), 3u); EXPECT_NE(result.find(23), result.end()); EXPECT_NE(result.at(23).find("sent"), std::string::npos); EXPECT_EQ(result.at(23).find("bytes"), std::string::npos); EXPECT_NE(result.find(100), result.end()); EXPECT_NE(result.at(100).find("sent"), std::string::npos); EXPECT_NE(result.at(100).find("bytes"), std::string::npos); EXPECT_NE(result.find(4000), result.end()); EXPECT_NE(result.at(4000).find("hash"), std::string::npos); } ================================================ FILE: node/CMakeLists.txt ================================================ add_library(node STATIC ../include/bluzelle.hpp ../include/boost_asio_beast.hpp ../mocks/mock_boost_asio_beast.hpp node_base.hpp node.hpp node.cpp session_base.hpp session.hpp session.cpp ../mocks/mock_session_base.hpp) target_link_libraries(node proto pbft) add_dependencies(node boost proto googletest jsoncpp) # for FRIEND_TEST target_include_directories(node PRIVATE ${BLUZELLE_STD_INCLUDES}) add_subdirectory(test) ================================================ FILE: node/node.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include using namespace bzn; namespace { const std::string BZN_API_KEY = "bzn-api"; /* todo: add to generate_key? * openssl dhparam -out dh.pem 2048 openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 10000 -out cert.pem -subj "//C=US\ST=CA\L=Los Angeles\O=Beast\CN=www.example.com" */ } node::node(std::shared_ptr io_context, std::shared_ptr websocket, std::shared_ptr chaos, const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr crypto, std::shared_ptr options, std::shared_ptr monitor) : tcp_acceptor(io_context->make_unique_tcp_acceptor(ep)) , io_context(std::move(io_context)) , websocket(std::move(websocket)) , chaos(std::move(chaos)) , crypto(std::move(crypto)) , options(std::move(options)) , monitor(std::move(monitor)) { this->initialize_ssl_contexts(); } void node::start(std::shared_ptr pbft) { std::call_once(this->start_once, [&] { this->pbft = std::move(pbft); this->do_accept(); }); } bool node::register_for_message(const bzn_envelope::PayloadCase type, bzn::protobuf_handler msg_handler) { std::lock_guard lock(this->message_map_mutex); // never allow! if (!msg_handler) { return false; } if (this->protobuf_map.find(type) != this->protobuf_map.end()) { LOG(debug) << type << " message type already registered"; return false; } this->protobuf_map[type] = std::move(msg_handler); return true; } void node::register_error_handler(std::function error_handler) { this->error_callback = std::move(error_handler); } void node::do_accept() { std::shared_ptr strand = this->io_context->make_unique_strand(); this->acceptor_socket = this->io_context->make_unique_tcp_socket(*strand); this->tcp_acceptor->async_accept(*this->acceptor_socket, [self = shared_from_this(), strand](const boost::system::error_code& ec) { if (ec) { LOG(error) << "accept failed: " << ec.message(); } else { auto ep = self->acceptor_socket->remote_endpoint(); auto key = self->key_from_ep(ep); // set tcp_nodelay option... boost::system::error_code option_ec; self->acceptor_socket->get_tcp_socket().set_option(boost::asio::ip::tcp::no_delay(true), option_ec); if (option_ec) { LOG(warning) << "failed to set socket option TCP_NODELAY: " << option_ec.message(); } #ifndef __APPLE__ int flags = 1; if (setsockopt(self->acceptor_socket->get_tcp_socket().native_handle(), SOL_TCP, TCP_QUICKACK, &flags, sizeof(flags))) { LOG(warning) << "failed to set socket option TCP_QUICKACK: " << errno; } #endif std::shared_ptr ws = (!self->options->get_wss_enabled()) ? self->websocket->make_websocket_stream(self->acceptor_socket->get_tcp_socket()) : self->websocket->make_websocket_secure_stream(self->acceptor_socket->get_tcp_socket(), *self->server_ctx); auto session = std::make_shared( self->io_context , ++self->session_id_counter , ep , self->chaos , std::bind(&node::priv_protobuf_handler, self, std::placeholders::_1, std::placeholders::_2) , self->options->get_ws_idle_timeout() , std::list{[](){}} , self->crypto , self->monitor , self->options , strand); session->accept(std::move(ws)); LOG(info) << "accepting new incoming connection with " << key; // Do not attempt to identify the incoming session; one ip address could be running multiple daemons // and we can't identify them based on the outgoing ports they choose } self->do_accept(); }); } void node::priv_protobuf_handler(const bzn_envelope& msg, std::shared_ptr session) { std::shared_lock lock(this->message_map_mutex); // lock for read access if (msg.swarm_id() != this->options->get_swarm_id()) { LOG(error) << "Dropping message with invalid swarm id: " << msg.ShortDebugString().substr(0, MAX_MESSAGE_SIZE); return; } if (auto it = this->protobuf_map.find(msg.payload_case()); it != this->protobuf_map.end()) { it->second(msg, std::move(session)); } else { LOG(debug) << "no handler for message type " << msg.payload_case(); } } void node::priv_session_shutdown_handler(const ep_key_t& ep_key) { std::shared_ptr session; std::lock_guard lock(this->session_map_mutex); if (this->sessions.find(ep_key) != this->sessions.end() && (session = this->sessions.at(ep_key).lock()) && session->is_open()) { // the session may have already been replaced, and we don't want to remove the new one if so return; } this->sessions.erase(ep_key); } std::shared_ptr node::find_session(const boost::asio::ip::tcp::endpoint& ep) { std::shared_ptr session; std::lock_guard lock(this->session_map_mutex); auto key = this->key_from_ep(ep); if (this->sessions.find(key) == this->sessions.end() || !(session = this->sessions.at(key).lock()) || session->is_closing()) { session = std::make_shared( this->io_context , ++this->session_id_counter , ep , this->chaos , std::bind(&node::priv_protobuf_handler, shared_from_this(), std::placeholders::_1, std::placeholders::_2) , this->options->get_ws_idle_timeout() , std::list{std::bind(&node::priv_session_shutdown_handler, shared_from_this(), key)} , this->crypto , this->monitor , this->options , std::nullopt , this->client_ctx); session->open(this->websocket, [self = shared_from_this(), ep](const boost::system::error_code& ec) { if (ec && self->error_callback) { self->error_callback(ep, ec); } }); this->sessions.insert_or_assign(key, session); } return session; } void node::send_message_str(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg) { this->find_session(ep)->send_message(msg); } void node::send_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg) { this->find_session(ep)->send_signed_message(msg); } void node::multicast_signed_message(std::shared_ptr> eps, std::shared_ptr msg) { this->io_context->post( [self = shared_from_this(), msg, eps]() { if (msg->signature().empty()) { self->crypto->sign(*msg); } for (const auto& ep : *eps) { self->send_signed_message(ep, msg); } }); } ep_key_t node::key_from_ep(const boost::asio::ip::tcp::endpoint& ep) { return ep.address().to_string() + ":" + std::to_string(ep.port()); } void node::send_signed_message(const bzn::uuid_t& uuid, std::shared_ptr msg) { try { auto point_of_contact_address = this->pbft->get_peer_by_uuid(uuid); if (const auto endpoint = bzn::make_endpoint(point_of_contact_address)) { this->send_signed_message(*endpoint, msg); return; } } catch (const std::runtime_error& err) { LOG(error) << "Unable to send message to " << uuid << ": " << err.what(); return; } LOG(error) << "Unable send_signed_message to " << uuid << " -- resolver error"; } void node::send_maybe_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg) { if (this->options->get_peer_message_signing()) { this->find_session(ep)->send_signed_message(msg); } else { msg->set_sender(this->options->get_uuid()); msg->set_swarm_id(this->options->get_swarm_id()); this->find_session(ep)->send_message(std::make_shared(msg->SerializeAsString())); } } void node::multicast_maybe_signed_message(std::shared_ptr> eps, std::shared_ptr msg) { this->io_context->post( [self = shared_from_this(), msg, eps]() { for (const auto& ep : *eps) { self->send_maybe_signed_message(ep, msg); } }); } void node::send_maybe_signed_message(const bzn::uuid_t& uuid, std::shared_ptr msg) { try { auto point_of_contact_address = this->pbft->get_peer_by_uuid(uuid); if (const auto endpoint = bzn::make_endpoint(point_of_contact_address)) { this->send_maybe_signed_message(*endpoint, msg); return; } } catch (const std::runtime_error& err) { LOG(error) << "Unable to send message to " << uuid << ": " << err.what(); return; } LOG(error) << "Unable send_maybe_signed_message to " << uuid << " -- resolver error"; } void node::initialize_ssl_contexts() { if (!this->options->get_wss_enabled()) { // nothing to do... LOG(info) << "WSS disabled"; return; } LOG(info) << "WSS enabled"; this->server_ctx = std::make_shared(boost::asio::ssl::context::tlsv12_server); // server (inbound) this->server_ctx->set_options( boost::asio::ssl::context::default_workarounds | boost::asio::ssl::context::no_sslv2 | boost::asio::ssl::context::single_dh_use); this->server_ctx->use_certificate_chain_file(this->options->get_wss_server_certificate_file()); this->server_ctx->use_private_key_file(this->options->get_wss_server_private_key_file(), boost::asio::ssl::context::file_format::pem); if (!this->options->get_wss_server_dh_params_file().empty()) { this->server_ctx->use_tmp_dh_file(this->options->get_wss_server_dh_params_file()); } // client (outbound) this->client_ctx = std::make_shared(boost::asio::ssl::context::tlsv12_client); // set default paths for finding CA certificates... //this->client_ctx.set_default_verify_paths(); } ================================================ FILE: node/node.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include #include #include #include #include #include namespace bzn { using ep_key_t = std::string; class node final : public bzn::node_base, public std::enable_shared_from_this { public: node(std::shared_ptr io_context, std::shared_ptr websocket, std::shared_ptr chaos, const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr crypto, std::shared_ptr options, std::shared_ptr monitor); bool register_for_message(const bzn_envelope::PayloadCase type, bzn::protobuf_handler msg_handler) override; void register_error_handler(std::function error_callback) override; void start(std::shared_ptr pbft) override; void send_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg) override; void multicast_signed_message(std::shared_ptr> eps, std::shared_ptr msg) override; void send_message_str(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg) override; void send_signed_message(const bzn::uuid_t& uuid, std::shared_ptr msg) override; void send_maybe_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg) override; void multicast_maybe_signed_message(std::shared_ptr> eps, std::shared_ptr msg) override; void send_maybe_signed_message(const bzn::uuid_t& uuid, std::shared_ptr msg) override; private: FRIEND_TEST(node, test_that_registered_message_handler_is_invoked); FRIEND_TEST(node, test_that_wrongly_signed_messages_are_dropped); void do_accept(); void priv_protobuf_handler(const bzn_envelope& msg, std::shared_ptr session); void priv_session_shutdown_handler(const ep_key_t& ep_key); void initialize_ssl_contexts(); std::shared_ptr pbft; std::shared_ptr find_session(const boost::asio::ip::tcp::endpoint& ep); ep_key_t key_from_ep(const boost::asio::ip::tcp::endpoint& ep); std::unordered_map> sessions; std::mutex session_map_mutex; std::unique_ptr tcp_acceptor; std::shared_ptr io_context; std::unique_ptr acceptor_socket; std::shared_ptr websocket; std::shared_ptr chaos; std::unordered_map protobuf_map; std::shared_mutex message_map_mutex; std::once_flag start_once; std::atomic session_id_counter = 0; std::shared_ptr crypto; std::shared_ptr options; std::shared_ptr monitor; std::function error_callback; std::shared_ptr server_ctx; std::shared_ptr client_ctx; }; } // bzn ================================================ FILE: node/node_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include namespace bzn { class pbft_base; class node_base { public: virtual ~node_base() = default; /** * Register for a callback to be execute when a certain message type arrives * @param msg_type message type (crud, pbft etc.) * @param msg_handler callback * @return true if registration succeeded */ virtual bool register_for_message(const bzn_envelope::PayloadCase type, bzn::protobuf_handler msg_handler) = 0; /** * Register for a callback to be executed when a connection error occurs * @param ep endpoint we tried to connect to * @param ec error that occurred * @param error_callback callback to invoke */ virtual void register_error_handler(std::function error_callback) = 0; /** * Start server's listener etc. */ virtual void start(std::shared_ptr pbft) = 0; /** * Send a raw string message * @param ep host to send the message to * @param msg message to send */ virtual void send_message_str(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg) = 0; /** * Send a message to a node identified by endpoint. If the sender field is empty or contains our uuid, the message will be * signed before sending. If the sender field contains something else, an existing signature will be kept intact. * @param ep host to send the message to * @param msg message to send */ virtual void send_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg) = 0; /** * As send_signed_message, but send the same message to multiple recipients. The signature is computed only once * and the whole operation is async. * @param eps hosts to send the message to * @param msg message to send */ virtual void multicast_signed_message(std::shared_ptr> eps, std::shared_ptr msg) = 0; /** * Send a message to a node identified by uuid. If the sender field is empty or contains our uuid, the message will be * signed before sending. If the sender field contains something else, an existing signature will be kept intact. * @param uuid host to send the message to * @param msg message to send */ virtual void send_signed_message(const bzn::uuid_t& uuid, std::shared_ptr msg) = 0; /** * Send a message to a node identified by endpoint. If the sender field is empty or contains our uuid, the message will be * signed before sending. If the sender field contains something else, an existing signature will be kept intact. * @param ep host to send the message to * @param msg message to send */ virtual void send_maybe_signed_message(const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr msg) = 0; /** * As send_signed_message, but send the same message to multiple recipients. The signature is computed only once * and the whole operation is async. * @param eps hosts to send the message to * @param msg message to send */ virtual void multicast_maybe_signed_message(std::shared_ptr> eps, std::shared_ptr msg) = 0; /** * Send a message to a node identified by uuid. If the sender field is empty or contains our uuid, the message will be * signed before sending. If the sender field contains something else, an existing signature will be kept intact. * @param uuid host to send the message to * @param msg message to send */ virtual void send_maybe_signed_message(const bzn::uuid_t& uuid, std::shared_ptr msg) = 0; }; } // bzn ================================================ FILE: node/session.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include using namespace bzn; session::session( std::shared_ptr io_context, bzn::session_id session_id, boost::asio::ip::tcp::endpoint ep, std::shared_ptr chaos, bzn::protobuf_handler proto_handler, std::chrono::milliseconds ws_idle_timeout, std::list shutdown_handlers, std::shared_ptr crypto, std::shared_ptr monitor, std::shared_ptr options, std::optional> strand_opt, std::optional> ctx_opt ) : session_id(session_id) , ep(std::move(ep)) , io_context(std::move(io_context)) , chaos(std::move(chaos)) , proto_handler(std::move(proto_handler)) , shutdown_handlers(std::move(shutdown_handlers)) , idle_timer(this->io_context->make_unique_steady_timer()) , ws_idle_timeout(std::move(ws_idle_timeout)) , write_buffer(nullptr, 0) , crypto(std::move(crypto)) , monitor(std::move(monitor)) , options(std::move(options)) , strand(strand_opt.has_value() ? *strand_opt : this->io_context->make_unique_strand()) , ctx(ctx_opt.has_value() ? *ctx_opt : nullptr) { LOG(debug) << "creating session " << std::to_string(session_id); } void session::start_idle_timeout() { this->activity = false; this->idle_timer->expires_from_now(this->ws_idle_timeout); this->idle_timer->async_wait( [self = shared_from_this()](auto ec) { if (!self->activity) { LOG(info) << "Closing session " << std::to_string(self->session_id) << " due to inactivity"; self->close(); return; } if (self->closing || ec) { LOG(debug) << "Stopping session " << std::to_string(self->session_id) << "'s idle timer"; return; } self->start_idle_timeout(); }); } void session::open(std::shared_ptr ws_factory, std::function callback) { this->strand->post([self = shared_from_this(), ws_factory, callback]() { std::shared_ptr socket = self->io_context->make_unique_tcp_socket(*(self->strand)); socket->async_connect(self->ep, self->strand->wrap([self, socket, ws_factory, callback](const boost::system::error_code& ec) { self->activity = true; if (ec) { LOG(error) << "failed to connect to: " << self->ep.address().to_string() << ":" << self->ep.port() << " - " << ec.message(); if (callback) { callback(ec); } return; } // we've completed the connect... // set tcp_nodelay option boost::system::error_code option_ec; socket->get_tcp_socket().set_option(boost::asio::ip::tcp::no_delay(true), option_ec); if (option_ec) { LOG(warning) << "failed to set socket option TCP_NODELAY: " << option_ec.message(); } #ifndef __APPLE__ int flags = 1; if (setsockopt(socket->get_tcp_socket().native_handle(), SOL_TCP, TCP_QUICKACK, &flags, sizeof(flags))) { LOG(warning) << "failed to set socket option TCP_QUICKACK: " << errno; } #endif // ctx will always be valid if 'use_wss' is true, otherwise we would not of started... self->websocket = (self->options->get_wss_enabled()) ? ws_factory->make_websocket_secure_stream(socket->get_tcp_socket(), *self->ctx) : ws_factory->make_websocket_stream(socket->get_tcp_socket()); self->websocket->async_handshake(self->ep.address().to_string(), "/", self->strand->wrap([self, ws_factory](const boost::system::error_code& ec) { self->activity = true; if (ec) { LOG(error) << "handshake failed: " << ec.message(); return; } self->start_idle_timeout(); self->do_read(); self->do_write(); })); })); }); } void session::accept(std::shared_ptr ws) { this->strand->post([self = shared_from_this(), ws]() { self->websocket = std::move(ws); self->websocket->async_accept( self->strand->wrap( [self](boost::system::error_code ec) { self->activity = true; if (ec) { LOG(error) << "websocket accept failed: " << ec.message(); return; } self->monitor->send_counter(statistic::session_opened); self->start_idle_timeout(); self->do_read(); self->do_write(); } ) ); }); } void session::add_shutdown_handler(const bzn::session_shutdown_handler handler) { this->strand->post([handler, self = shared_from_this()]() { self->shutdown_handlers.push_back(handler); }); } void session::do_read() { // assume we are invoked inside the strand auto buffer = std::make_shared(); if (this->reading || !this->is_open() || this->closing) { return; } this->reading = true; this->websocket->async_read(*buffer, this->strand->wrap([self = shared_from_this(), buffer](boost::system::error_code ec, auto /*bytes_transferred*/) { self->activity = true; if(ec) { // don't log close of websocket... if (ec != boost::beast::websocket::error::closed && ec != boost::asio::error::eof) { LOG(error) << "websocket read failed: " << ec.message(); } if (ec != boost::beast::websocket::error::closed) { self->close(); } return; } // get the message... bzn_envelope proto_msg; std::stringstream ss; ss << boost::beast::make_printable(buffer->data()); if (proto_msg.ParseFromIstream(&ss)) { self->io_context->post(std::bind(self->proto_handler, proto_msg, self)); } else { LOG(error) << "Failed to parse incoming message"; } self->reading = false; self->do_read(); }) ); } void session::do_write() { // assume we are invoked inside the strand if(this->writing || !this->is_open() || this->write_queue.empty() || this->closing) { return; } this->writing = true; auto msg = this->write_queue.front(); this->write_queue.pop_front(); this->websocket->binary(true); this->write_buffer = boost::asio::buffer(*msg); this->websocket->async_write(this->write_buffer, this->strand->wrap([self = shared_from_this(), msg](boost::system::error_code ec, auto bytes_transferred) { self->activity = true; if (!ec) { self->monitor->send_counter(statistic::message_sent); } self->monitor->send_counter(statistic::message_sent_bytes, bytes_transferred); if(ec) { // don't log close of websocket... if (ec != boost::beast::websocket::error::closed && ec != boost::asio::error::eof) { LOG(error) << "websocket read failed: " << ec.message(); } self->write_queue.push_front(msg); if (ec != boost::beast::websocket::error::closed) { self->close(); } return; } self->writing = false; self->do_write(); })); } void session::send_signed_message(std::shared_ptr msg) { msg->set_swarm_id(this->options->get_swarm_id()); if (msg->signature().empty()) { this->crypto->sign(*msg); } this->send_message(std::make_shared(msg->SerializeAsString())); } void session::send_message(std::shared_ptr msg) { if (this->chaos->is_message_delayed()) { LOG(debug) << "chaos testing delaying message"; this->chaos->reschedule_message(std::bind(static_castl)>(&session::send_message), shared_from_this(), std::move(msg))); return; } if (this->chaos->is_message_dropped()) { LOG(debug) << "chaos testing dropping message"; return; } this->strand->post([self = shared_from_this(), msg]() { self->write_queue.push_back(msg); self->do_write(); }); } void session::close() { this->strand->post(std::bind(&session::private_close, shared_from_this())); } void session::private_close() { // assume we are invoked inside the strand // TODO: re-open socket later if we still have messages to send? (KEP-1037) if (this->closing) { return; } this->closing = true; LOG(debug) << "closing session " << std::to_string(this->session_id); for(const auto& handler : this->shutdown_handlers) { this->io_context->post(handler); } if (this->websocket && this->websocket->is_open()) { this->websocket->async_close(boost::beast::websocket::close_code::normal, this->strand->wrap([self = shared_from_this()](auto ec) { if (ec) { LOG(error) << "failed to close websocket: " << ec.message(); } })); } this->idle_timer->cancel(); } bool session::is_open() const { return this->websocket && this->websocket->is_open() && !this->closing; } bool session::is_closing() const { return this->closing; } session::~session() { if (!this->write_queue.empty()) { LOG(warning) << "dropping session with " << this->write_queue.size() << " messages left in its write queue"; } } ================================================ FILE: node/session.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace bzn { class session final : public bzn::session_base, public std::enable_shared_from_this { public: session( std::shared_ptr io_context, bzn::session_id session_id, boost::asio::ip::tcp::endpoint ep, std::shared_ptr chaos, bzn::protobuf_handler proto_handler, std::chrono::milliseconds ws_idle_timeout, std::list shutdown_handlers, std::shared_ptr crypto, std::shared_ptr monitor, std::shared_ptr options, std::optional> strand, std::optional> ctx_opt = std::nullopt ); ~session(); void send_message(std::shared_ptr msg) override; void send_signed_message(std::shared_ptr msg) override; void close() override; bzn::session_id get_session_id() override { return this->session_id; } bool is_open() const override; bool is_closing() const override; void open(std::shared_ptr ws_factory, std::function callback) override; void accept(std::shared_ptr ws) override; void add_shutdown_handler(const bzn::session_shutdown_handler handler) override; private: void do_read(); void do_write(); void start_idle_timeout(); void private_close(); const bzn::session_id session_id; const boost::asio::ip::tcp::endpoint ep; std::shared_ptr io_context; std::shared_ptr websocket; std::shared_ptr chaos; std::list> write_queue; bzn::protobuf_handler proto_handler; std::list shutdown_handlers; std::unique_ptr idle_timer; const std::chrono::milliseconds ws_idle_timeout; std::atomic writing = false; std::atomic reading = false; std::atomic closing = false; std::atomic activity = false; boost::asio::mutable_buffers_1 write_buffer; std::shared_ptr crypto; std::shared_ptr monitor; std::shared_ptr options; std::shared_ptr strand; std::shared_ptr ctx; // for wss }; } // blz ================================================ FILE: node/session_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include namespace bzn { // forward declare... class session_base; using session_shutdown_handler = std::function; using message_handler = std::function session)>; using protobuf_handler = std::function session)>; class session_base { public: virtual ~session_base() = default; /** * Send a raw string to whatever's on the other end of this session * @param msg message */ virtual void send_message(std::shared_ptr msg) = 0; /** * Send a message to whatever's on the other end of this session. If the sender field is empty or contains * our uuid, the message will be signed before sending. If the sender field contains something else, * an existing signature will be kept intact. * @param msg message to send */ virtual void send_signed_message(std::shared_ptr msg) = 0; /** * Perform an orderly shutdown of the websocket. */ virtual void close() = 0; /** * Is the underlying socket open? (subject to race conditions) */ virtual bool is_open() const = 0; /** * Is the underlying socket in the process of closing? (subject to race conditions) */ virtual bool is_closing() const = 0; /** * Get the id associated with this session * @return id */ virtual bzn::session_id get_session_id() = 0; /** * Create a new websocket connection for this session */ virtual void open(std::shared_ptr ws_factory, std::function callback) = 0; /** * Accept an incoming connection on some websocket */ virtual void accept(std::shared_ptr ws) = 0; /** * Add additional shutdown handlers to the session * @param handler */ virtual void add_shutdown_handler(bzn::session_shutdown_handler handler) = 0; }; } // bzn ================================================ FILE: node/test/CMakeLists.txt ================================================ set(test_srcs node_test.cpp session_test.cpp) set(test_libs node proto options crypto smart_mocks ${Protobuf_LIBRARIES}) add_gmock_test(node) ================================================ FILE: node/test/node_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::testing; namespace { const auto TEST_ENDPOINT = boost::asio::ip::tcp::endpoint{boost::asio::ip::address_v4::from_string("127.0.0.1"), 0}; // any port const auto TEST_ENDPOINT_2 = boost::asio::ip::tcp::endpoint{boost::asio::ip::address_v4::from_string("127.0.0.2"), 0}; // any port } class node_test2 : public Test { public: std::shared_ptr mock_chaos = std::make_shared>(); std::shared_ptr options = std::make_shared(); std::shared_ptr crypto = std::shared_ptr(); std::shared_ptr monitor = std::make_shared>(); std::shared_ptr mock_io = std::make_shared(); std::shared_ptr node = std::make_shared(mock_io, mock_io->websocket, mock_chaos, TEST_ENDPOINT, crypto, options, monitor); bzn_envelope db_msg; uint callback_invoked = 0; node_test2() { db_msg.set_database_msg("hihi"); this->node->register_for_message(bzn_envelope::kDatabaseMsg, [&](auto, auto){callback_invoked++;}); } ~node_test2() { this->mock_io->shutdown(); } }; namespace bzn { TEST(node, test_that_node_constructed_with_invalid_address_throws) { auto io_context = std::make_shared(); auto mock_chaos = std::make_shared>(); auto options = std::shared_ptr(); auto crypto = std::shared_ptr(); std::shared_ptr monitor = std::make_shared>(); EXPECT_THROW( bzn::node(io_context, nullptr, mock_chaos, boost::asio::ip::tcp::endpoint{boost::asio::ip::address_v4::from_string("8.8.8.8"), 8080}, crypto, options, monitor), std::exception ); } TEST_F(node_test2, test_accept_incoming_connection) { this->node->start(nullptr); EXPECT_EQ(mock_io->socket_count, 1u); mock_io->do_incoming_connection(0); mock_io->ws_read_closures.at(0)(this->db_msg.SerializeAsString()); this->mock_io->yield_until_clear(); EXPECT_EQ(callback_invoked, 1u); } TEST_F(node_test2, test_make_new_connection) { this->node->start(nullptr); this->node->send_message_str(TEST_ENDPOINT, std::make_shared("test string")); this->mock_io->yield_until_clear(); EXPECT_EQ(this->mock_io->ws_write_closures.at(1)(), "test string"); } TEST_F(node_test2, test_reuse_connection) { this->node->start(nullptr); this->node->send_message_str(TEST_ENDPOINT, std::make_shared("test string")); this->mock_io->yield_until_clear(); EXPECT_EQ(this->mock_io->ws_write_closures.at(1)(), "test string"); this->node->send_message_str(TEST_ENDPOINT, std::make_shared("test string2")); this->mock_io->yield_until_clear(); EXPECT_EQ(this->mock_io->ws_write_closures.at(1)(), "test string2"); this->mock_io->yield_until_clear(); EXPECT_EQ(mock_io->socket_count, 2u); } TEST_F(node_test2, new_session_for_new_ep) { this->node->start(nullptr); this->node->send_message_str(TEST_ENDPOINT, std::make_shared("test A")); this->mock_io->yield_until_clear(); EXPECT_EQ(this->mock_io->ws_write_closures.at(1)(), "test A"); this->node->send_message_str(TEST_ENDPOINT_2, std::make_shared("test B")); this->mock_io->yield_until_clear(); EXPECT_EQ(this->mock_io->ws_write_closures.at(2)(), "test B"); this->mock_io->yield_until_clear(); EXPECT_EQ(mock_io->socket_count, 3u); } TEST_F(node_test2, DISABLED_test_replace_dead_session) { this->node->start(nullptr); this->node->send_message_str(TEST_ENDPOINT, std::make_shared("test string")); this->mock_io->yield_until_clear(); EXPECT_EQ(this->mock_io->ws_write_closures.at(1)(), "test string"); // kill connection this->mock_io->socket_is_open[1] = false; this->node->send_message_str(TEST_ENDPOINT, std::make_shared("test string2")); this->mock_io->yield_until_clear(); EXPECT_EQ(this->mock_io->ws_write_closures.at(2)(), "test string2"); this->mock_io->yield_until_clear(); EXPECT_EQ(mock_io->socket_count, 3u); } TEST(node, test_that_registering_message_handler_can_only_be_done_once) { auto mock_chaos = std::make_shared>(); auto mock_io_context = std::make_shared>(); auto options = std::make_shared(); auto crypto = std::shared_ptr(); auto monitor = std::make_shared>(); auto node = std::make_shared(mock_io_context, nullptr, mock_chaos, TEST_ENDPOINT, crypto, options, monitor); // test that nulls are rejected... ASSERT_FALSE(node->register_for_message(bzn_envelope::kDatabaseMsg, nullptr)); // test that non-null handler is added... ASSERT_TRUE(node->register_for_message(bzn_envelope::kDatabaseMsg, [](const auto&, auto){})); // test that we can't overwrite previous registration... ASSERT_FALSE(node->register_for_message(bzn_envelope::kDatabaseMsg, [](const auto&, auto){})); } TEST(node, test_that_node_doesnt_call_error_handler_on_successful_connect) { std::shared_ptr mock_chaos = std::make_shared>(); std::shared_ptr options = std::make_shared(); std::shared_ptr crypto = std::shared_ptr(); std::shared_ptr monitor = std::make_shared>(); std::shared_ptr mock_io = std::make_shared(); std::shared_ptr node = std::make_shared(mock_io, mock_io->websocket, mock_chaos, TEST_ENDPOINT, crypto, options, monitor); bool called{false}; node->register_error_handler([&called](auto &/*ep*/, auto& ec) { ASSERT_NE(ec, boost::system::error_code{}); called = true; }); node->send_message_str(TEST_ENDPOINT_2, std::make_shared("test string")); mock_io->yield_until_clear(); ASSERT_EQ(called, false); mock_io->shutdown(); } TEST(node, test_that_node_calls_error_handler_on_no_connect) { std::shared_ptr mock_chaos = std::make_shared>(); std::shared_ptr options = std::make_shared(); std::shared_ptr crypto = std::shared_ptr(); std::shared_ptr monitor = std::make_shared>(); std::shared_ptr mock_io = std::make_shared(); std::shared_ptr node = std::make_shared(mock_io, mock_io->websocket, mock_chaos, TEST_ENDPOINT, crypto, options, monitor); bool called{false}; node->register_error_handler([&called](auto &/*ep*/, auto& ec) { ASSERT_NE(ec, boost::system::error_code{}); called = true; }); mock_io->tcp_connect_works = false; node->send_message_str(TEST_ENDPOINT_2, std::make_shared("test string")); mock_io->yield_until_clear(); ASSERT_EQ(called, true); mock_io->shutdown(); } #if 0 TEST(node, test_that_wrongly_signed_messages_are_dropped) { auto mock_chaos = std::make_shared>(); auto mock_io_context = std::make_shared>(); auto options = std::make_shared(); options->get_mutable_simple_options().set(bzn::option_names::CRYPTO_ENABLED_INCOMING, "true"); auto monitor = std::make_shared>(); auto crypto = std::make_shared(options, monitor); auto mock_session = std::make_shared(); auto node = std::make_shared(mock_io_context, nullptr, mock_chaos, TEST_ENDPOINT, crypto, options, monitor); // Add our test callback... unsigned int callback_execute = 0u; node->register_for_message(bzn_envelope::kPbft, [&](const auto& /*msg*/, auto) { callback_execute++; }); bzn_envelope bad_msg; bad_msg.set_pbft("some stuff"); bad_msg.set_sender("Elizabeth the Second, by the Grace of God of the United Kingdom, Canada and Her other Realms and Territories Queen, Head of the Commonwealth, Defender of the Faith"); bad_msg.set_signature("probably not a valid signature"); bzn_envelope anon_msg; anon_msg.set_pbft("some stuff"); anon_msg.set_sender(""); anon_msg.set_signature(""); node->priv_protobuf_handler(bad_msg, mock_session); EXPECT_EQ(callback_execute, 0u); node->priv_protobuf_handler(anon_msg, mock_session); EXPECT_EQ(callback_execute, 1u); } #endif } // namespace bzn ================================================ FILE: node/test/session_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::testing; namespace { const auto TEST_ENDPOINT = boost::asio::ip::tcp::endpoint{boost::asio::ip::address_v4::from_string("127.0.0.1"), 0}; // any port const auto TEST_TIMEOUT = std::chrono::milliseconds(10000); } class session_test : public Test { public: std::shared_ptr io_context = std::make_shared(); std::shared_ptr mock_chaos = std::make_shared>(); std::shared_ptr monitor = std::make_shared>(); bzn::asio::wait_handler timer_expiry; session_test() { EXPECT_CALL(*(this->io_context), make_unique_steady_timer()).WillRepeatedly(Invoke( [&]() { auto timer = std::make_unique(); EXPECT_CALL(*timer, async_wait(_)).WillRepeatedly(Invoke( [&](auto wh) { this->timer_expiry = wh; })); EXPECT_CALL(*timer, expires_from_now(_)).Times(AnyNumber()); return timer; })); EXPECT_CALL(*(this->io_context), make_unique_strand()).WillRepeatedly(Invoke( []() { auto strand = std::make_unique(); EXPECT_CALL(*strand, wrap(A())).WillRepeatedly(ReturnArg<0>()); EXPECT_CALL(*strand, wrap(A())).WillRepeatedly(ReturnArg<0>()); EXPECT_CALL(*strand, wrap(A())).WillRepeatedly(ReturnArg<0>()); EXPECT_CALL(*strand, post(A())).WillRepeatedly(Invoke( [](auto task) { task(); })); return strand; })); EXPECT_CALL(*(this->io_context), post(_)).WillRepeatedly(Invoke( [](auto task) { task(); })); } }; class session_test2 : public Test { public: std::shared_ptr mock_io = std::make_shared(); std::shared_ptr mock_chaos = std::make_shared>(); std::shared_ptr monitor = std::make_shared>(); std::shared_ptr mock_crypto = std::make_shared>(); std::shared_ptr options = std::make_shared(); uint handler_called = 0; std::shared_ptr session; session_test2() { session = std::make_shared(this->mock_io, 0, TEST_ENDPOINT, this->mock_chaos, [&](auto, auto){this->handler_called++;}, TEST_TIMEOUT, std::list{[](){}}, this->mock_crypto, this->monitor, this->options, std::nullopt); } void yield() { // For making sure that async callbacks get a chance to be executed before we assert their result std::this_thread::sleep_for(std::chrono::milliseconds(10)); } ~session_test2() { this->mock_io->shutdown(); } }; namespace bzn { TEST_F(session_test, test_that_when_session_starts_it_accepts_and_read_is_scheduled) { auto mock_websocket_stream = std::make_shared(); EXPECT_CALL(*mock_websocket_stream, is_open()).WillRepeatedly(Return(true)); bzn::asio::accept_handler accept_handler; EXPECT_CALL(*mock_websocket_stream, async_accept(_)).WillRepeatedly(Invoke( [&](auto handler) { accept_handler = handler; })); EXPECT_CALL(*mock_websocket_stream, async_read(_,_)); auto session = std::make_shared(this->io_context, bzn::session_id(1), TEST_ENDPOINT, this->mock_chaos, [](auto, auto){}, TEST_TIMEOUT, std::list{[](){}}, nullptr, this->monitor, nullptr, std::nullopt); session->accept(mock_websocket_stream); accept_handler(boost::system::error_code{}); EXPECT_EQ(bzn::session_id(1), session->get_session_id()); } TEST_F(session_test2, session_sets_swarm_id_when_sending_a_message) { const bzn::uuid_t TEST_SWARM_UUID{"0096a9f1-544c-443f-9783-e54b322c1544"}; this->options->get_mutable_simple_options().set("swarm_id", TEST_SWARM_UUID); auto msg{std::make_shared()}; this->session->send_signed_message(msg); this->yield(); EXPECT_EQ(TEST_SWARM_UUID, msg->swarm_id()); } TEST_F(session_test2, message_queued_before_handshake_gets_sent) { this->session->send_message(std::make_shared("hihi")); this->session->accept(this->mock_io->websocket->make_websocket_stream( this->mock_io->make_unique_tcp_socket()->get_tcp_socket())); this->yield(); this->mock_io->ws_accept_handlers.at(0)(boost::system::error_code{}); this->yield(); EXPECT_EQ(this->mock_io->ws_write_closures.at(0)(), "hihi"); } TEST_F(session_test2, idle_timeout_closes_session) { this->session->accept(this->mock_io->websocket->make_websocket_stream( this->mock_io->make_unique_tcp_socket()->get_tcp_socket())); this->yield(); this->mock_io->ws_accept_handlers.at(0)(boost::system::error_code{}); this->mock_io->timer_callbacks.at(0)(boost::system::error_code{}); this->yield(); this->mock_io->timer_callbacks.at(0)(boost::system::error_code{}); this->yield(); EXPECT_TRUE(this->mock_io->ws_closed.at(0)); } TEST_F(session_test2, no_idle_timeout_when_connect_rejected) { auto io2 = std::make_shared(); io2->tcp_connect_works = false; auto session = std::make_shared(io2, 0, TEST_ENDPOINT, this->mock_chaos, [](auto, auto){}, TEST_TIMEOUT, std::list{[](){}}, nullptr, this->monitor, nullptr, std::nullopt); session->open(io2->websocket, nullptr); this->yield(); EXPECT_EQ(io2->timer_callbacks.size(), 0u); io2->shutdown(); } TEST_F(session_test2, additional_shutdown_handlers_can_be_added_to_session) { auto io2 = std::make_shared(); std::vector handler_counters { 0,0,0 }; { auto options = std::make_shared(); auto session = std::make_shared(io2 , 0, TEST_ENDPOINT, this->mock_chaos, [](auto, auto){}, TEST_TIMEOUT , std::list{[&handler_counters]() { ++handler_counters[0]; }}, nullptr, this->monitor, options, std::nullopt); session->add_shutdown_handler([&handler_counters](){++handler_counters[1];}); session->add_shutdown_handler([&handler_counters](){++handler_counters[2];}); session->open(io2->websocket, nullptr); io2->yield_until_clear(); // we are just testing that this doesn't cause a segfault io2->timer_callbacks.at(0)(boost::system::error_code{}); io2->timer_callbacks.at(0)(boost::system::error_code{}); } io2->yield_until_clear(); // each shutdown handler must be called exactly once. for(const auto handler_counter : handler_counters) { EXPECT_EQ(handler_counter, 1); } io2->shutdown(); } } // bzn ================================================ FILE: options/CMakeLists.txt ================================================ add_library(options STATIC ../include/bluzelle.hpp options.cpp options.hpp options_base.hpp simple_options.cpp simple_options.hpp ) target_link_libraries(options utils) target_include_directories(options PRIVATE ${BLUZELLE_STD_INCLUDES}) add_dependencies(options boost jsoncpp) add_subdirectory(test) ================================================ FILE: options/options.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include using namespace bzn; using namespace bzn::option_names; bool options::parse_command_line(int argc, const char* argv[]) { return this->raw_opts.parse(argc, argv); } const simple_options& options::get_simple_options() const { return this->raw_opts; } simple_options& options::get_mutable_simple_options() { return this->raw_opts; } boost::asio::ip::tcp::endpoint options::get_listener() const { try { if (auto ep = bzn::make_endpoint(this->raw_opts.get(LISTENER_ADDRESS), std::to_string(this->raw_opts.get(LISTENER_PORT)))) { return *ep; } else { throw std::runtime_error(std::string("\nCould not create listener -- resolver error")); } } catch (std::exception& ex) { throw std::runtime_error(std::string("\nCould not create listener: ") + ex.what()); } } std::optional options::get_monitor_endpoint(std::shared_ptr context) const { if (this->raw_opts.has(MONITOR_PORT) && this->raw_opts.has(MONITOR_ADDRESS)) { try { boost::asio::ip::udp::resolver resolver(context->get_io_context()); auto eps = resolver.resolve(boost::asio::ip::udp::v4(), this->raw_opts.get(MONITOR_ADDRESS), std::to_string(this->raw_opts.get(MONITOR_PORT))); return std::optional{*eps.begin()}; } catch (std::exception& ex) { throw std::runtime_error(std::string("\nCould not create monitor endpoint: ") + ex.what()); } } else { return std::optional{}; } } std::string options::get_bootstrap_peers_file() const { //TODO: Remove this return this->raw_opts.get(BOOTSTRAP_PEERS_FILE); } std::string options::get_bootstrap_peers_url() const { //TODO: Remove this return this->raw_opts.get(BOOTSTRAP_PEERS_URL); } bzn::uuid_t options::get_uuid() const { if (this->raw_opts.has(NODE_UUID)) { return this->raw_opts.get(NODE_UUID); } static std::string my_uuid{}; if (my_uuid.empty()) { std::string pubkey_raw = bzn::utils::crypto::read_pem_file(this->raw_opts.get(NODE_PUBKEY_FILE) , "PUBLIC KEY"); my_uuid = boost::beast::detail::base64_encode(pubkey_raw); } return my_uuid; } bzn::swarm_id_t options::get_swarm_id() const { return this->raw_opts.get(SWARM_ID); } bool options::get_debug_logging() const { //TODO: Remove this return this->raw_opts.get(DEBUG_LOGGING); } bool options::get_log_to_stdout() const { //TODO: Remove this return this->raw_opts.get(LOG_TO_STDOUT); } std::chrono::milliseconds options::get_ws_idle_timeout() const { //TODO: Remove this? return std::chrono::milliseconds(raw_opts.get(WS_IDLE_TIMEOUT)); } size_t options::get_audit_mem_size() const { //TODO: Remove this return this->raw_opts.get(AUDIT_MEM_SIZE); } std::string options::get_state_dir() const { //TODO: Remove this return this->raw_opts.get(STATE_DIR); } std::string options::get_logfile_dir() const { //TODO: Remove this return this->raw_opts.get(LOGFILE_DIR); } size_t options::get_max_swarm_storage() const { return this->parse_size(this->raw_opts.get(MAX_SWARM_STORAGE)); } bool options::get_mem_storage() const { return this->raw_opts.get(MEM_STORAGE); } size_t options::get_logfile_rotation_size() const { return this->parse_size(this->raw_opts.get(LOGFILE_ROTATION_SIZE)); } size_t options::get_logfile_max_size() const { return this->parse_size(this->raw_opts.get(LOGFILE_MAX_SIZE)); } size_t options::parse_size(const std::string& max_value) const { const std::regex expr{"(\\d+)([K,M,G,T]?[B]?)"}; std::smatch base_match; if (std::regex_match(max_value, base_match, expr)) { std::string suffix = base_match[2]; return boost::lexical_cast(base_match[1]) * utils::BYTE_SUFFIXES.at(suffix.empty() ? 'B' : suffix[0]); } throw std::runtime_error(std::string("\nUnable to parse size value from options: " + max_value)); } bool options::peer_validation_enabled() const { //TODO: Remove this return this->raw_opts.get(PEER_VALIDATION_ENABLED); } std::string options::get_signed_key() const { return this->raw_opts.get(SIGNED_KEY); } std::string options::get_owner_public_key() const { return this->raw_opts.has(OWNER_PUBLIC_KEY) ? this->raw_opts.get(OWNER_PUBLIC_KEY) : ""; } std::string options::get_swarm_info_esr_address() const { return this->raw_opts.get(SWARM_INFO_ESR_ADDRESS); } std::string options::get_swarm_info_esr_url() const { return this->raw_opts.get(SWARM_INFO_ESR_URL); } std::string options::get_stack() const { return this->raw_opts.get(STACK); } bool options::get_wss_enabled() const { return this->raw_opts.get(WSS_ENABLED); } std::string options::get_wss_server_certificate_file() const { return this->raw_opts.get(WSS_SERVER_CERTIFICATE_FILE); } std::string options::get_wss_server_private_key_file() const { return this->raw_opts.get(WSS_SERVER_PRIVATE_KEY_FILE); } std::string options::get_wss_server_dh_params_file() const { return this->raw_opts.get(WSS_SERVER_DH_PARAMS_FILE); } size_t options::get_admission_window() const { return this->raw_opts.get(ADMISSION_WINDOW); } bool options::get_peer_message_signing() const { return this->raw_opts.get(PEER_MESSAGE_SIGNING); } ================================================ FILE: options/options.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class options final : public bzn::options_base { public: const simple_options& get_simple_options() const override; simple_options& get_mutable_simple_options() override; bool parse_command_line(int argc, const char* argv[]); boost::asio::ip::tcp::endpoint get_listener() const override; std::optional get_monitor_endpoint(std::shared_ptr context) const override; std::string get_bootstrap_peers_file() const override; std::string get_bootstrap_peers_url() const override; bool get_debug_logging() const override; bool get_log_to_stdout() const override; bzn::uuid_t get_uuid() const override; bzn::swarm_id_t get_swarm_id() const override; std::chrono::milliseconds get_ws_idle_timeout() const override; size_t get_audit_mem_size() const override; std::string get_state_dir() const override; std::string get_logfile_dir() const override; size_t get_max_swarm_storage() const override; bool get_mem_storage() const override; size_t get_logfile_rotation_size() const override ; size_t get_logfile_max_size() const override; bool peer_validation_enabled() const override; std::string get_signed_key() const override; std::string get_owner_public_key() const override; std::string get_swarm_info_esr_address() const override; std::string get_swarm_info_esr_url() const override; std::string get_stack() const override; bool get_wss_enabled() const override; std::string get_wss_server_certificate_file() const override; std::string get_wss_server_private_key_file() const override; std::string get_wss_server_dh_params_file() const override; size_t get_admission_window() const override; bool get_peer_message_signing() const override; private: size_t parse_size(const std::string& key) const; simple_options raw_opts; }; } // bzn ================================================ FILE: options/options_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include #include #include #include namespace bzn { // Suffixes for the max size parser. namespace utils { const std::map BYTE_SUFFIXES = std::map({{'B', 1}, {'K', 1024}, {'M', 1048576}, {'G', 1073741824}, {'T', 1099511627776}}); } class options_base { public: virtual ~options_base() = default; /** * @return the raw_options container for accessing simple options */ virtual const simple_options& get_simple_options() const = 0; /** * @return the raw_options container for accessing simple options */ virtual simple_options& get_mutable_simple_options() = 0; /** * Get the address and port for the node to listen on * @return endpoint */ virtual boost::asio::ip::tcp::endpoint get_listener() const = 0; /** * The address and port to send stats.d data to, if this is enabled * @return optional */ virtual std::optional get_monitor_endpoint( std::shared_ptr context) const = 0; /** * Get the url to fetch initial peers from * @return url */ virtual std::string get_bootstrap_peers_url() const = 0; /** * Get the file to fetch initial peers from * @return filename */ virtual std::string get_bootstrap_peers_file() const = 0; /** * Debug logging level? * @return true if we should log debug entries */ virtual bool get_debug_logging() const = 0; /** * Log to terminal instead of disk. * @return true if we log to stdout */ virtual bool get_log_to_stdout() const = 0; /** * Get the peer's unique id * @return uuid */ virtual bzn::uuid_t get_uuid() const = 0; /** * Get the swarm id this peer belongs to * @return swarm_id */ virtual bzn::swarm_id_t get_swarm_id() const = 0; /** * Get the websocket activity timeout * @return seconds */ virtual std::chrono::milliseconds get_ws_idle_timeout() const = 0; /** * Get the number of entries allowed to be stored in audit's datastructures * @return size */ virtual size_t get_audit_mem_size() const = 0; /** * Get the directory for storing swarm state data * @return directory */ virtual std::string get_state_dir() const = 0; /** * Get the director to log into * @return directory */ virtual std::string get_logfile_dir() const = 0; /** * Get the maximum allowed storage for the daemon. * @return size */ virtual size_t get_max_swarm_storage() const = 0; /** * Database to use * @return true if we are using in memory data */ virtual bool get_mem_storage() const = 0; /** * Get the size of a log file to rotate * @return size */ virtual size_t get_logfile_rotation_size() const = 0; /** * Get the total size of logs before deletion * @return size */ virtual size_t get_logfile_max_size() const = 0; /** * Temporary toggle for the peer validation while in QA. Defaults to false. * @return boolean if the peer_validation member is set to true. Default is false. */ virtual bool peer_validation_enabled() const = 0; /** * Signature for uuid signing verification * @return string containing the signature */ virtual std::string get_signed_key() const = 0; /** * Retrieve the path to the Bluzelle public key pem file * @return string containing the path to the Bluzelle publi key pem file */ virtual std::string get_owner_public_key() const = 0; /** * Retrieve the address of the ESR where the contract to return the swarm info is * @return string containing the address of the swarm info contract */ virtual std::string get_swarm_info_esr_address() const = 0; /** * Retrieve the url of the server where the ESR is served * @return string containing the url of the server */ virtual std::string get_swarm_info_esr_url() const = 0; /** * Retrieve the name of the stack the swarm is using * @return string stack name */ virtual std::string get_stack() const = 0; /** * Retrieve if we should be using tls or not * @return true if ssl should be used */ virtual bool get_wss_enabled() const = 0; /** * * @return certificate file */ virtual std::string get_wss_server_certificate_file() const = 0; /** * * @return private key file */ virtual std::string get_wss_server_private_key_file() const = 0; /** * * @return dh params file */ virtual std::string get_wss_server_dh_params_file() const = 0; // todo: enable/disable peer validation /** * Get the number of entries allowed to be stored in audit's datastructures * @return size */ virtual size_t get_admission_window() const = 0; /** * Get whether we should sign/verify messages to peers * @return true/false */ virtual bool get_peer_message_signing() const = 0; }; } // bzn ================================================ FILE: options/simple_options.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include using namespace bzn; using namespace bzn::option_names; namespace po = boost::program_options; namespace { const std::string DEFAULT_CONFIG_FILE = "bluzelle.json"; } simple_options::simple_options() : options_root("Core configuration") , cmd_opts(&(this->options_root)) , config_file_opts(&(this->options_root)) { this->build_options(); } bool simple_options::parse(int argc, const char* argv[]) { return this->handle_command_line_options(argc, argv) && this->handle_config_file_options() && this->combine_options() && this->validate_options(); } void simple_options::build_options() { po::options_description cmd_only("Command line only"); cmd_only.add_options() ("help,h", "Shows this information") ("version,v", "Shows the application's version") ("config,c", po::value()->default_value(DEFAULT_CONFIG_FILE), "Path to configuration file"); this->options_root.add(cmd_only); this->options_root.add_options() (BOOTSTRAP_PEERS_FILE.c_str(), po::value(), "file path for bootstrap peers list") (BOOTSTRAP_PEERS_URL.c_str(), po::value(), "url for bootstrap peers list") (CPR_URL.c_str(), po::value()->default_value("https://cpr.bluzelle.com/api/v1"), "api root for centralized peers registry") (PEERS_REFRESH_INTERVAL_SECONDS.c_str(), po::value()->default_value(600), "interval at which to check for updates to the peers list") (LISTENER_ADDRESS.c_str(), po::value()->required(), "listener address for consensus node") (LISTENER_PORT.c_str(), po::value()->required(), "port for consensus node") (MAX_SWARM_STORAGE.c_str(), po::value()->default_value("0"), "maximum db storage (bytes) in the swarm (default value of zero indicates no limit)") (MEM_STORAGE.c_str(), po::value()->default_value(true), "enable in memory storage for debugging") (NODE_UUID.c_str(), po::value(), "uuid of this node") (SWARM_ID.c_str(), po::value()->required(), "swarm id of this node") (STATE_DIR.c_str(), po::value()->default_value("./.state/"), "location for state files") (OVERRIDE_NUM_THREADS.c_str(), po::value(), "number of worker threads to run (default is automatic based on hardware") (WS_IDLE_TIMEOUT.c_str(), po::value()->default_value(300000), "websocket idle timeout (ms)") (SWARM_INFO_ESR_ADDRESS.c_str(), po::value()->default_value(bzn::utils::DEFAULT_SWARM_INFO_ESR_ADDRESS), "Address of ESR Swarm Info contract") (SWARM_INFO_ESR_URL.c_str(), po::value()->default_value(bzn::utils::ROPSTEN_URL), "url of ESR Swarm Info contract server") (IGNORE_ESR.c_str(), po::value()->default_value(false), "do not use esr as a peer source") (IGNORE_CPR.c_str(), po::value()->default_value(false), "do not use cpr as a peer source") (STACK.c_str(), po::value()->required(), "software stack used by swarm") (ADMISSION_WINDOW.c_str(), po::value()->default_value(500), "admission control request window") (PEER_MESSAGE_SIGNING.c_str(), po::value()->default_value(false), "should peer messages be signed/verified"); po::options_description logging("Logging"); logging.add_options() (LOG_TO_STDOUT.c_str(), po::value()->default_value(false), "log to stdout") (LOGFILE_DIR.c_str(), po::value()->default_value("logs/"), "directory for log files") (LOGFILE_MAX_SIZE.c_str(), po::value()->default_value("512K"), "maximum size for log files") (LOGFILE_ROTATION_SIZE.c_str(), po::value()->default_value("64K"), "size at which to rotate log files") (DEBUG_LOGGING.c_str(), po::value()->default_value(false), "enable debug logging"); this->options_root.add(logging); po::options_description audit("Audit"); audit.add_options() (AUDIT_ENABLED.c_str(), po::value()->default_value(true), "enable audit module") (AUDIT_MEM_SIZE.c_str(), po::value()->default_value(10000), "max size of audit datastructures") (MONITOR_ADDRESS.c_str(), po::value(), "address of stats.d listener for audit module") (MONITOR_PORT.c_str(), po::value(), "port of stats.d listener for audit module") (MONITOR_COLLATE.c_str(), po::value()->default_value(true), "send monitor packets at an interval to reduce packet count (and log spam)") (MONITOR_COLLATE_INTERVAL_SECONDS.c_str(), po::value()->default_value(5), "interval at which to send monitor packets (if collation is enabled)") (MONITOR_MAX_TIMERS.c_str(), po::value(), "maximum number of outstanding monitor timers"); this->options_root.add(audit); po::options_description experimental("Experimental"); experimental.add_options() (PEER_VALIDATION_ENABLED.c_str(), po::value()->default_value(false), "require signed key for new peers to join swarm") (SIGNED_KEY.c_str(), po::value(), "signed key for node's uuid") (OWNER_PUBLIC_KEY.c_str(), po::value(), "swarm owner's public key"); this->options_root.add(experimental); po::options_description crypto("Cryptography"); crypto.add_options() (NODE_PUBKEY_FILE.c_str(), po::value()->default_value(".state/public-key.pem"), "public key of this node") (NODE_PRIVATEKEY_FILE.c_str(), po::value()->default_value(".state/private-key.pem"), "private key of this node") (CRYPTO_ENABLED_INCOMING.c_str(), po::value()->default_value(true), "check signatures on incoming messages") (CRYPTO_ENABLED_OUTGOING.c_str(), po::value()->default_value(true), "attach signatures on outgoing messages") (CRYPTO_SELF_VERIFY.c_str(), po::value()->default_value(true), "verify own signatures as a sanity check"); this->options_root.add(crypto); po::options_description wss("Websocket Secure"); wss.add_options() (WSS_ENABLED.c_str(), po::value()->default_value(false), "enable websocket secure") (WSS_SERVER_CERTIFICATE_FILE.c_str(), po::value()->default_value(".state/wss-cert.pem"), "wss server certificate") (WSS_SERVER_PRIVATE_KEY_FILE.c_str(), po::value()->default_value(".state/wss-private-key.pem"), "wss server private key") (WSS_SERVER_DH_PARAMS_FILE.c_str(), po::value(), "Diffie–Hellman params"); this->options_root.add(wss); po::options_description chaos("Chaos testing"); chaos.add_options() (CHAOS_ENABLED.c_str(), po::value()->default_value(false), "enable chaos testing module") /* * With the default parameters specified here, * 10% of nodes will fail within a couple minutes * 20% more will fail within the first hour * 40% will last 1-12 hours * 20% will last 12-48 hours * 10% will last 48+ hours */ (CHAOS_NODE_FAILURE_SHAPE.c_str(), po::value()->default_value(0.5), "shape parameter of Weibull distribution for node lifetime") (CHAOS_NODE_FAILURE_SCALE.c_str(), po::value()->default_value(10), "scale parameter of Weibull distribution for node lifetime (expressed in hours)") /* * These parameters are chosen arbitrarily, but a cursory search suggests that * an exponential distribution is indeed reasonable for internet packet delay */ (CHAOS_MESSAGE_DELAY_CHANCE.c_str(), po::value()->default_value(0.1), "chance by which outgoing messages are delayed (independently at random)") (CHAOS_MESSAGE_DELAY_TIME.c_str(), po::value()->default_value(2500), "how long to wait before attempting to resend a delayed message (at which point it can be delayed again, resulting in an exponential distribution on the actual delay)") (CHAOS_MESSAGE_DROP_CHANCE.c_str(), po::value()->default_value(0.025), "chance that outgoing messages are dropped entirely (independently at random)"); this->options_root.add(chaos); } bool simple_options::validate_options() { this->vm.notify(); bool errors = false; // Boost will enforce required-ness and types of options, we only need to validate more complex constraints auto port = this->get(LISTENER_PORT); if (port <= 1024) { std::cerr << "Invalid listener port " << std::to_string(port); errors = true; } if (! (this->has(BOOTSTRAP_PEERS_FILE) || this->has(BOOTSTRAP_PEERS_URL))) { std::cerr << "Bootstrap peers source not specified"; errors = true; } if (!this->vm[NODE_PUBKEY_FILE].defaulted() && this->has(NODE_UUID)) { std::cerr << "You cannot specify both a uuid and a public key; public keys act as uuids"; errors = true; } return !errors; } bool simple_options::handle_config_file_options() { std::ifstream ifile; ifile.exceptions(std::ios::failbit); try { ifile.open(config_file); } catch (const std::exception& /*ex*/) { throw std::runtime_error("Failed to load: " + config_file + " : " + strerror(errno)); } Json::CharReaderBuilder rbuilder; std::string parse_err; Json::Value json; if (!Json::parseFromStream(rbuilder, ifile, &json, &parse_err)) { throw std::runtime_error("Failed to parse: " + config_file + " : " + parse_err); } if (!json.isObject()) { throw std::runtime_error("Config file should be an object"); } this->config_file_opts = po::parsed_options{&(this->options_root)}; for (const auto& name : json.getMemberNames()) { const auto& json_val = json[name]; if (! this->options_root.find_nothrow(name.c_str(), false)) { std::cerr << "Warning: ignoring unknown config file option '" << name << "'\n"; continue; } boost::program_options::basic_option opt; opt.string_key = name; if (json_val.isString()) { opt.value.push_back(json_val.asString()); } else { // If it's not a string, then it should be a bool or a number, so we can let boost parse it auto option_value = json_val.toStyledString(); boost::trim(option_value); // jsoncpp sometimes includes a trailing newline here opt.value.push_back(option_value); } this->config_file_opts.options.push_back(opt); } return true; } bool simple_options::handle_command_line_options(int argc, const char* argv[]) { try { this->cmd_opts = po::parse_command_line(argc, argv, this->options_root); po::variables_map early_vm; po::store(this->cmd_opts, early_vm); if (early_vm.count("version")) { std::cout << "swarmdb" << ": " << SWARM_GIT_COMMIT << std::endl; std::string compiler_name = "unknown"; if (BOOST_COMP_CLANG) { compiler_name = "clang"; } if (BOOST_COMP_GNUC){ compiler_name = "gcc"; } if (BOOST_COMP_LLVM){ compiler_name = "llvm"; } #ifdef __OPTIMIZE__ bool opt = true; #else bool opt = false; #endif std::cout << "compiled by " << compiler_name << __VERSION__ << "; optimize=" << opt << std::endl; return false; } if (early_vm.count("help") || early_vm.count("config") == 0) { std::cout << "Usage:" << '\n' << " " << "bluzelle" << " [OPTION]" << '\n' << "Long form options may be specified on command line or in json object in config file" << '\n' << '\n' << this->options_root << '\n'; return false; } this->config_file = early_vm["config"].as(); return true; } catch (po::error& e) { std::cerr << "ERROR: " << e.what() << std::endl << std::endl; return false; } catch (std::exception& e) { std::cerr << "Unhandled Exception: " << e.what() << ", application will now exit" << std::endl; return false; } } bool simple_options::combine_options() { boost::program_options::parsed_options override_opts(&(this->options_root)); for (const auto& pair : this->overrides) { po::basic_option opt; opt.string_key = pair.first; opt.value.push_back(pair.second); override_opts.options.push_back(opt); } this->vm = boost::program_options::variables_map{}; po::store(override_opts, this->vm); po::store(this->cmd_opts, this->vm); po::store(this->config_file_opts, this->vm); return true; } bool simple_options::has(const std::string& option_name) const { return this->vm.count(option_name) > 0; } void simple_options::set(const std::string& option_name, const std::string& option_value) { std::lock_guard lock(this->lock); this->overrides[option_name] = option_value; this->combine_options(); } ================================================ FILE: options/simple_options.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include namespace bzn::option_names { const std::string AUDIT_MEM_SIZE = "audit_mem_size"; const std::string AUDIT_ENABLED = "audit_enabled"; const std::string PEERS_REFRESH_INTERVAL_SECONDS = "peers_refresh_interval_seconds"; const std::string BOOTSTRAP_PEERS_FILE = "bootstrap_file"; const std::string BOOTSTRAP_PEERS_URL = "bootstrap_url"; const std::string CPR_URL = "cpr_url"; const std::string DEBUG_LOGGING = "debug_logging"; const std::string LISTENER_ADDRESS = "listener_address"; const std::string LISTENER_PORT = "listener_port"; const std::string LOG_TO_STDOUT = "log_to_stdout"; const std::string LOGFILE_DIR = "logfile_dir"; const std::string LOGFILE_MAX_SIZE = "logfile_max_size"; const std::string LOGFILE_ROTATION_SIZE = "logfile_rotation_size"; const std::string MAX_SWARM_STORAGE = "max_swarm_storage"; const std::string MEM_STORAGE = "mem_storage"; const std::string MONITOR_ADDRESS = "monitor_address"; const std::string MONITOR_PORT = "monitor_port"; const std::string MONITOR_COLLATE = "monitor_collate"; const std::string MONITOR_COLLATE_INTERVAL_SECONDS = "monitor_collate_interval_seconds"; const std::string NODE_UUID = "uuid"; const std::string NODE_PUBKEY_FILE = "public_key_file"; const std::string NODE_PRIVATEKEY_FILE = "private_key_file"; const std::string STATE_DIR = "state_dir"; const std::string SWARM_ID = "swarm_id"; const std::string WS_IDLE_TIMEOUT = "ws_idle_timeout"; const std::string PEER_VALIDATION_ENABLED = "peer_validation_enabled"; const std::string SIGNED_KEY = "signed_key"; const std::string OWNER_PUBLIC_KEY = "owner_public_key"; const std::string ADMISSION_WINDOW = "admission_window"; const std::string PEER_MESSAGE_SIGNING = "peer_message_signing"; const std::string CHAOS_ENABLED = "chaos_testing_enabled"; const std::string CHAOS_NODE_FAILURE_SHAPE = "chaos_node_failure_shape"; const std::string CHAOS_NODE_FAILURE_SCALE = "chaos_node_failure_scale_hours"; const std::string CHAOS_MESSAGE_DROP_CHANCE = "chaos_message_drop_chance"; const std::string CHAOS_MESSAGE_DELAY_CHANCE = "chaos_message_delay_chance"; const std::string CHAOS_MESSAGE_DELAY_TIME = "chaos_message_delay_time_milliseconds"; const std::string CRYPTO_ENABLED_OUTGOING = "crypto_enabled_outgoing"; const std::string CRYPTO_ENABLED_INCOMING = "crypto_enabled_incoming"; const std::string CRYPTO_SELF_VERIFY = "crypto_self_verify"; const std::string MONITOR_MAX_TIMERS = "monitor_max_timers"; const std::string OVERRIDE_NUM_THREADS = "override_num_threads"; const std::string SWARM_INFO_ESR_ADDRESS = "swarm_info_esr_address"; const std::string SWARM_INFO_ESR_URL = "swarm_info_esr_url"; const std::string IGNORE_ESR = "ignore_esr"; const std::string IGNORE_CPR = "ignore_cpr"; const std::string STACK = "stack"; const std::string WSS_ENABLED = "wss_enabled"; const std::string WSS_SERVER_CERTIFICATE_FILE = "wss_server_certificate_file"; const std::string WSS_SERVER_PRIVATE_KEY_FILE = "wss_server_private_key_file"; const std::string WSS_SERVER_DH_PARAMS_FILE = "wss_server_dh_params_file"; } namespace bzn { class simple_options { public: simple_options(); /* * Read command line to find location of config file, read config file for everything else */ bool parse(int argc, const char* argv[]); /* * Get the value of a particular option (options defined in bzn::options) with a particular type */ template T get(const std::string& option_name) const { std::lock_guard lock(this->lock); if (this->has(option_name)) { return this->vm[option_name].as(); } else { // T is a string and option_name doesn't exist, the lookup will throw an exception return T(); } } /* * Assign a value to an option at runtime */ void set(const std::string& option_name, const std::string& option_value); /* * Do we have a value for an option (either explicit or default) */ bool has(const std::string& option_name) const; private: void build_options(); bool validate_options(); bool handle_command_line_options(int argc, const char* argv[]); bool handle_config_file_options(); bool combine_options(); std::string config_file; boost::program_options::options_description options_root; boost::program_options::variables_map vm; boost::program_options::basic_parsed_options cmd_opts; boost::program_options::basic_parsed_options config_file_opts; std::unordered_map overrides; mutable std::mutex lock; }; } ================================================ FILE: options/test/CMakeLists.txt ================================================ set(test_srcs options_test.cpp) set(test_libs options utils) add_gmock_test(options) ================================================ FILE: options/test/options_test.cpp ================================================ // Copyright (c) 2017-2018 Bluzelle Networks // // This file is part of Bluzelle. // // Bluzelle is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include namespace { const char* NO_ARGS[] = {"config_tests"}; const std::string TEST_CONFIG_FILE = "bluzelle.json"; const std::string DEFAULT_CONFIG_CONTENT = " \"listener_address\" : \"0.0.0.0\",\n" " \"listener_port\" : 49152,\n" " \"bootstrap_file\" : \"peers.json\",\n" " \"bootstrap_url\" : \"example.org/peers.json\",\n" " \"uuid\" : \"c05c0dff-3c27-4532-96de-36f53d8a278e\",\n" " \"swarm_id\" : \"utest\",\n" " \"stack\" : \"utest\", \n" " \"debug_logging\" : true," " \"log_to_stdout\" : true," " \"state_dir\" : \"./daemon_state/\"," " \"logfile_max_size\" : \"1M\"," " \"logfile_rotation_size\" : \"2M\"," " \"logfile_dir\" : \".\"," " \"signed_key\" : \"Oo8ZlDQcMlZF4hqnhN/2D...hoEgc0jRUl1b9mHSY7E4puk=\"," " \"owner_public_key\" : \"MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRAKb7PX3Pr+LgaqIAyhcXgTMCAwEAAQ==\"," " \"mem_storage\" : false," " \"swarm_info_esr_address\" : \"this_would_be_a_good_ESR_address\"," " \"swarm_info_esr_url\" : \"192.0.0.1:41000\"," " \"wss_enabled\" : false," " \"wss_server_certificate_file\" : \"cert.pem\"," " \"wss_server_private_key_file\" : \"key.pem\"," " \"wss_server_dh_params_file\" : \"dhparams.pem\""; const std::string DEFAULT_CONFIG_DATA = "{" + DEFAULT_CONFIG_CONTENT + "}"; std::string compose_config_data(const std::string& a, const std::string& b) { std::string result = "{" + a + ",\n" + b + "}"; return result; } const auto DEFAULT_LISTENER = boost::asio::ip::tcp::endpoint{boost::asio::ip::address::from_string("0.0.0.0"), 49152}; void config_text_to_json(bzn::json_message& json) { std::string config_data{DEFAULT_CONFIG_DATA}; std::string errors; Json::CharReaderBuilder builder; Json::CharReader* reader = builder.newCharReader(); reader->parse( DEFAULT_CONFIG_DATA.c_str() , DEFAULT_CONFIG_DATA.c_str() + DEFAULT_CONFIG_DATA.size() , &json , &errors); delete reader; } } using namespace ::testing; // create default options and remove when done... class options_file_test : public Test { public: std::unordered_set open_files; options_file_test() { this->save_options_file(DEFAULT_CONFIG_DATA); } ~options_file_test() { for(const auto& file : this->open_files) { unlink(file.c_str()); } } void save_file(const std::string& filename, const std::string& content) { if (this->open_files.count(filename) > 0) { unlink(TEST_CONFIG_FILE.c_str()); } else { this->open_files.insert(filename); } //std::cout << filename; std::ofstream ofile(filename.c_str()); ofile.exceptions(std::ios::failbit); ofile << content; } void save_options_file(const std::string& content) { save_file(TEST_CONFIG_FILE, content); } }; TEST_F(options_file_test, test_that_missing_arguments_fail) { this->save_options_file("{}"); bzn::options options; EXPECT_THROW(options.parse_command_line(1, NO_ARGS), std::exception); } TEST_F(options_file_test, test_that_loading_of_default_config_file) { bzn::options options; options.parse_command_line(1, NO_ARGS); EXPECT_EQ(DEFAULT_LISTENER, options.get_listener()); ASSERT_EQ(true, options.get_debug_logging()); ASSERT_EQ(true, options.get_log_to_stdout()); EXPECT_EQ("utest", options.get_swarm_id()); EXPECT_EQ("utest", options.get_stack()); EXPECT_EQ("./daemon_state/", options.get_state_dir()); EXPECT_EQ("peers.json", options.get_bootstrap_peers_file()); EXPECT_EQ("example.org/peers.json", options.get_bootstrap_peers_url()); EXPECT_EQ(size_t(0), options.get_max_swarm_storage()); EXPECT_EQ(size_t(1048576), options.get_logfile_max_size()); EXPECT_EQ(size_t(2097152), options.get_logfile_rotation_size()); EXPECT_EQ(".", options.get_logfile_dir()); EXPECT_FALSE(options.peer_validation_enabled()); EXPECT_FALSE(options.get_mem_storage()); EXPECT_EQ("Oo8ZlDQcMlZF4hqnhN/2D...hoEgc0jRUl1b9mHSY7E4puk=",options.get_signed_key()); EXPECT_EQ("MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRAKb7PX3Pr+LgaqIAyhcXgTMCAwEAAQ==", options.get_owner_public_key()); EXPECT_EQ("this_would_be_a_good_ESR_address", options.get_swarm_info_esr_address()); EXPECT_EQ("192.0.0.1:41000", options.get_swarm_info_esr_url()); EXPECT_EQ(false, options.get_wss_enabled()); EXPECT_EQ("cert.pem", options.get_wss_server_certificate_file()); EXPECT_EQ("key.pem", options.get_wss_server_private_key_file()); EXPECT_EQ("dhparams.pem", options.get_wss_server_dh_params_file()); // defaults.. { bzn::options options0; this->save_options_file("{}"); // Will fail without many required arguments, but we can still get default values where they exist EXPECT_THROW(options0.parse_command_line(1, NO_ARGS), std::exception); EXPECT_EQ("./.state/", options0.get_state_dir()); EXPECT_EQ(size_t(524288), options0.get_logfile_max_size()); EXPECT_EQ(size_t(65536), options0.get_logfile_rotation_size()); EXPECT_EQ("logs/", options0.get_logfile_dir()); EXPECT_TRUE(options0.get_mem_storage()); EXPECT_EQ("", options0.get_swarm_id()); EXPECT_EQ(bzn::utils::DEFAULT_SWARM_INFO_ESR_ADDRESS, options0.get_swarm_info_esr_address()); EXPECT_EQ(bzn::utils::ROPSTEN_URL, options0.get_swarm_info_esr_url()); EXPECT_EQ(false, options0.get_wss_enabled()); EXPECT_EQ(".state/wss-cert.pem", options0.get_wss_server_certificate_file()); EXPECT_EQ(".state/wss-private-key.pem", options0.get_wss_server_private_key_file()); EXPECT_EQ("", options0.get_wss_server_dh_params_file()); } } TEST(options, test_that_missing_default_config_throws_exception) { bzn::options options; EXPECT_THROW(options.parse_command_line(1, NO_ARGS), std::runtime_error); } TEST_F(options_file_test, test_max_storage_parsing) { bzn::json_message json; config_text_to_json(json); std::for_each(bzn::utils::BYTE_SUFFIXES.cbegin() , bzn::utils::BYTE_SUFFIXES.cend() , [&](const auto& p) { const size_t expected = 3 * 1099511627776; // 3TB in B { json["max_swarm_storage"] = boost::lexical_cast(expected / p.second) + p.first; this->save_options_file(json.toStyledString()); bzn::options options; options.parse_command_line(1, NO_ARGS); EXPECT_EQ(expected, options.get_max_swarm_storage()); } { std::string max_storage{boost::lexical_cast(expected / p.second)}; max_storage = max_storage + p.first; if (p.first!='B') { max_storage = max_storage.append("B"); } json["max_swarm_storage"] = max_storage; this->save_options_file(json.toStyledString()); bzn::options options; options.parse_command_line(1, NO_ARGS); EXPECT_EQ(expected, options.get_max_swarm_storage()); } }); } TEST_F(options_file_test, test_enable_whitlelist_temporary) { bzn::json_message json; config_text_to_json(json); { json[bzn::option_names::PEER_VALIDATION_ENABLED] = false; this->save_options_file(json.toStyledString()); bzn::options options; options.parse_command_line(1, NO_ARGS); EXPECT_FALSE(options.peer_validation_enabled()); } { json[bzn::option_names::PEER_VALIDATION_ENABLED] = true; this->save_options_file(json.toStyledString()); bzn::options options; options.parse_command_line(1, NO_ARGS); EXPECT_TRUE(options.peer_validation_enabled()); } } TEST_F(options_file_test, test_that_command_line_options_work) { bzn::options options; const char* ARGS[] = {"swarm", "-c", TEST_CONFIG_FILE.c_str()}; options.parse_command_line(3, ARGS); std::cout << options.get_bootstrap_peers_file() << std::endl; EXPECT_EQ(DEFAULT_LISTENER, options.get_listener()); ASSERT_EQ(true, options.get_debug_logging()); ASSERT_EQ(true, options.get_log_to_stdout()); EXPECT_EQ("./daemon_state/", options.get_state_dir()); EXPECT_EQ("peers.json", options.get_bootstrap_peers_file()); EXPECT_EQ("example.org/peers.json", options.get_bootstrap_peers_url()); EXPECT_EQ(size_t(0), options.get_max_swarm_storage()); EXPECT_EQ(size_t(1048576), options.get_logfile_max_size()); EXPECT_EQ(size_t(2097152), options.get_logfile_rotation_size()); EXPECT_EQ(".", options.get_logfile_dir()); EXPECT_FALSE(options.peer_validation_enabled()); EXPECT_EQ("MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRAKb7PX3Pr+LgaqIAyhcXgTMCAwEAAQ==", options.get_owner_public_key()); EXPECT_EQ("this_would_be_a_good_ESR_address", options.get_swarm_info_esr_address()); } TEST_F(options_file_test, test_that_no_monitor_endpoint_when_not_specified) { bzn::options options; try { options.parse_command_line(1, NO_ARGS); } catch (const std::exception& e) { // We are missing some required arguments, that's fine, we want to test against defaults } auto io_context = std::make_shared(); EXPECT_EQ(options.get_monitor_endpoint(io_context), std::optional{}); } TEST_F(options_file_test, test_that_endpoint_built) { bzn::options options; this->save_options_file("{\"" + bzn::option_names::MONITOR_ADDRESS + "\": \"localhost\", \"" + bzn::option_names::MONITOR_PORT + "\": 12345}"); try { options.parse_command_line(1, NO_ARGS); } catch (const std::exception& e) { // We are missing some required arguments, that's fine, we want to test against what we've specified } auto io_context = std::make_shared(); boost::asio::ip::udp::resolver resolver(io_context->get_io_context()); auto eps = resolver.resolve(boost::asio::ip::udp::v4(), "localhost", "12345"); auto expect = std::optional{*eps.begin()}; EXPECT_EQ(options.get_monitor_endpoint(io_context), expect); } TEST_F(options_file_test, test_that_pubkey_used_for_uuid) { bzn::options options; this->save_options_file("{\"public_key_file\": \"pkey.pem\"}"); this->save_file("pkey.pem", "-----BEGIN PUBLIC KEY-----\n" "hFWG\n" "-----END PUBLIC KEY-----\n" ); try { options.parse_command_line(1, NO_ARGS); } catch (const std::exception& e) { } EXPECT_EQ(options.get_uuid(), "hFWG"); } TEST_F(options_file_test, test_that_uuid_and_pubkey_conflict) { bzn::options options; this->save_options_file(compose_config_data(DEFAULT_CONFIG_CONTENT, "\"public_key_file\": \"somefile\"")); EXPECT_FALSE(options.parse_command_line(1, NO_ARGS)); } TEST_F(options_file_test, test_set_option_at_runtime) { bzn::options options; this->save_options_file(DEFAULT_CONFIG_DATA); EXPECT_TRUE(options.parse_command_line(1, NO_ARGS)); options.get_mutable_simple_options().set(bzn::option_names::DEBUG_LOGGING, "false"); EXPECT_FALSE(options.get_simple_options().get(bzn::option_names::DEBUG_LOGGING)); options.get_mutable_simple_options().set(bzn::option_names::DEBUG_LOGGING, "true"); EXPECT_TRUE(options.get_simple_options().get(bzn::option_names::DEBUG_LOGGING)); options.get_mutable_simple_options().set(bzn::option_names::DEBUG_LOGGING, "false"); EXPECT_FALSE(options.get_simple_options().get(bzn::option_names::DEBUG_LOGGING)); } ================================================ FILE: pbft/CMakeLists.txt ================================================ add_library(pbft STATIC pbft_base.hpp pbft.hpp pbft.cpp dummy_pbft_service.cpp dummy_pbft_service.hpp pbft_service_base.hpp pbft_checkpoint_manager.cpp pbft_checkpoint_manager.hpp database_pbft_service.cpp database_pbft_service.hpp pbft_persistent_state.cpp) target_link_libraries(pbft utils pbft_operations proto) target_include_directories(pbft PRIVATE ${BLUZELLE_STD_INCLUDES}) add_dependencies(pbft boost openssl) add_subdirectory(test) add_subdirectory(operations) ================================================ FILE: pbft/database_pbft_service.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include using namespace bzn; namespace { const std::string NEXT_REQUEST_SEQUENCE_KEY{"next_request_sequence"}; } database_pbft_service::database_pbft_service( std::shared_ptr io_context, std::shared_ptr unstable_storage, std::shared_ptr crud, std::shared_ptr monitor, bzn::uuid_t uuid) : io_context(std::move(io_context)) , unstable_storage(std::move(unstable_storage)) , crud(std::move(crud)) , monitor(std::move(monitor)) , uuid(std::move(uuid)) { this->load_next_request_sequence(); } database_pbft_service::~database_pbft_service() { this->save_next_request_sequence(); } void database_pbft_service::apply_operation(const std::shared_ptr& op) { std::lock_guard lock(this->lock); // store op... if (auto result = this->unstable_storage->create(this->uuid, std::to_string(op->get_sequence()), op->get_database_msg().SerializeAsString()); result != bzn::storage_result::ok) { if (result == bzn::storage_result::exists) { // KEP-899 - We do not want to throw a runtime error for duplicates, as it is possible that // during a view change we may try to perform duplicate operatiosn that have already been // done in previous views. LOG(warning) << "failed to store pbft request, possible duplicate? : " << op->get_database_msg().DebugString().substr(0, MAX_MESSAGE_SIZE) << ", " << uint32_t(result); return; } LOG(fatal) << "failed to store pbft request: " << op->get_database_msg().DebugString().substr(0, MAX_MESSAGE_SIZE) << ", " << uint32_t(result); // these are fatal... something bad is going on. throw std::runtime_error("Failed to store pbft request! (" + std::to_string(uint8_t(result)) + ")"); } // store requester session for eventual response... this->operations_awaiting_result[op->get_sequence()] = op; this->process_awaiting_operations(); } bool database_pbft_service::apply_operation_now(const bzn_envelope& msg, std::shared_ptr session) { database_msg db_msg; if (db_msg.ParseFromString(msg.database_msg())) { if (const auto msg_case = db_msg.msg_case(); msg_case == database_msg::kQuickRead || msg_case == database_msg::kSubscribe || msg_case == database_msg::kUnsubscribe) { LOG(debug) << "handling: " << msg_case; this->crud->handle_request(msg.sender(), db_msg, session); return true; } } return false; } void database_pbft_service::process_awaiting_operations() { while (this->unstable_storage->has(this->uuid, std::to_string(this->next_request_sequence))) { const key_t key{std::to_string(this->next_request_sequence)}; auto result = this->unstable_storage->read(this->uuid, key); if (!result) { // these are fatal... something bad is going on. throw std::runtime_error("Failed to store pbft request!"); } database_msg request; if (!request.ParseFromString(*result)) { // these are fatal... something bad is going on. throw std::runtime_error("Failed to create pbft_request from database read!"); } LOG(info) << "Executing request " << request.DebugString().substr(0, MAX_MESSAGE_SIZE) << "..., sequence: " << key; if (auto op_it = this->operations_awaiting_result.find(this->next_request_sequence); op_it != this->operations_awaiting_result.end()) { // set request hash field for responses... request.mutable_header()->set_request_hash(op_it->second->get_request_hash()); if (op_it->second->has_session() && op_it->second->session()->is_open()) { this->crud->handle_request(op_it->second->get_request().sender(), request, op_it->second->session()); } else { // session not found then this was probably loaded from the database... LOG(info) << "We do not have a pending operation for this request"; this->crud->handle_request(op_it->second->get_request().sender(), request, nullptr); } // update stats... this->monitor->finish_timer(bzn::statistic::request_latency, op_it->second->get_request_hash()); if (this->next_request_sequence == this->next_checkpoint) { if (this->crud->save_state()) { this->last_checkpoint = this->next_request_sequence; } } this->io_context->post(std::bind(this->execute_handler, (*op_it).second)); } if (auto result = this->unstable_storage->remove(this->uuid, key); result != bzn::storage_result::ok) { // these are fatal... something bad is going on. throw std::runtime_error("Failed to remove pbft_request from database! (" + std::to_string(uint8_t(result)) + ")"); } ++this->next_request_sequence; this->save_next_request_sequence(); } } bzn::hash_t database_pbft_service::service_state_hash(uint64_t /*sequence_number*/) const { // TODO: not sure how this works... (KEP-1203) return ""; } std::shared_ptr database_pbft_service::get_service_state(uint64_t sequence_number) const { if (sequence_number == this->last_checkpoint) { return this->crud->get_saved_state(); } return nullptr; } bool database_pbft_service::set_service_state(uint64_t sequence_number, const bzn::service_state_t& data) { std::lock_guard lock(this->lock); if (this->next_request_sequence > sequence_number) { LOG(debug) << "No need to apply service state"; return true; } // initialize database state from checkpoint data if (!this->crud->load_state(data)) { return false; } this->last_checkpoint = sequence_number; // remove all backlogged requests prior to checkpoint uint64_t seq = this->next_request_sequence; while (seq <= sequence_number) { const key_t key{std::to_string(seq)}; this->unstable_storage->remove(uuid, key); seq++; } this->next_request_sequence = seq; this->process_awaiting_operations(); return true; } void database_pbft_service::save_service_state_at(uint64_t sequence_number) { this->next_checkpoint = sequence_number; } void database_pbft_service::consolidate_log(uint64_t sequence_number) { LOG(info) << "TODO: consolidating log at sequence number " << sequence_number; } void database_pbft_service::register_execute_handler(bzn::execute_handler_t handler) { this->execute_handler = std::move(handler); } uint64_t database_pbft_service::applied_requests_count() const { return this->next_request_sequence - 1; } void database_pbft_service::load_next_request_sequence() { if (auto result = this->unstable_storage->read(this->uuid, NEXT_REQUEST_SEQUENCE_KEY); result) { LOG(debug) << "read: next_request_sequence: " << *result; this->next_request_sequence = boost::lexical_cast(*result); return; } if (auto result = this->unstable_storage->create(this->uuid, NEXT_REQUEST_SEQUENCE_KEY, std::to_string(this->next_request_sequence)); result != bzn::storage_result::ok) { LOG(fatal) << "failed to create \"" << NEXT_REQUEST_SEQUENCE_KEY << "\": " << uint32_t(result); throw std::runtime_error("Failed to create: " + NEXT_REQUEST_SEQUENCE_KEY); } LOG(debug) << "next_request_sequence: " << this->next_request_sequence; } void database_pbft_service::save_next_request_sequence() { if (auto result = this->unstable_storage->update(this->uuid, NEXT_REQUEST_SEQUENCE_KEY, std::to_string(this->next_request_sequence)); result != bzn::storage_result::ok) { LOG(error) << "failed to save next_request_sequence: " << uint32_t(result); return; } LOG(debug) << "updated: next_request_sequence: " << this->next_request_sequence; } ================================================ FILE: pbft/database_pbft_service.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include namespace bzn { class database_pbft_service final : public bzn::pbft_service_base, public std::enable_shared_from_this { public: database_pbft_service(std::shared_ptr io_context, std::shared_ptr unstable_storage, std::shared_ptr crud, std::shared_ptr monitor, bzn::uuid_t uuid); virtual ~database_pbft_service(); void apply_operation(const std::shared_ptr& op) override; bool apply_operation_now(const bzn_envelope& msg, std::shared_ptr session) override; bzn::hash_t service_state_hash(uint64_t sequence_number) const override; std::shared_ptr get_service_state(uint64_t sequence_number) const override; bool set_service_state(uint64_t sequence_number, const bzn::service_state_t& data) override; void save_service_state_at(uint64_t sequence_number) override; void consolidate_log(uint64_t sequence_number) override; void register_execute_handler(bzn::execute_handler_t handler) override; uint64_t applied_requests_count() const; private: void process_awaiting_operations(); void load_next_request_sequence(); void save_next_request_sequence(); std::shared_ptr io_context; std::shared_ptr unstable_storage; std::shared_ptr crud; std::shared_ptr monitor; uint64_t next_request_sequence = 1; const bzn::uuid_t uuid; std::unordered_map> operations_awaiting_result; bzn::execute_handler_t execute_handler; std::once_flag start_once; std::mutex lock; uint64_t next_checkpoint = 0; uint64_t last_checkpoint = 0; }; } // bzn ================================================ FILE: pbft/dummy_pbft_service.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include "pbft/dummy_pbft_service.hpp" using namespace bzn; dummy_pbft_service::dummy_pbft_service(std::shared_ptr io_context) : io_context(std::move(io_context)) { } void dummy_pbft_service::apply_operation(const std::shared_ptr& op) { std::lock_guard lock(this->lock); this->waiting_operations[op->get_sequence()] = std::move(op); while (this->waiting_operations.count(this->next_request_sequence) > 0) { auto op = waiting_operations[this->next_request_sequence]; LOG(info) << "Executing request sequence " << this->next_request_sequence << "\n"; this->send_execute_response(op); // todo: use shared from this as post could act on a long gone dummy_pbft_service? this->io_context->post(std::bind(this->execute_handler, op)); this->waiting_operations.erase(this->next_request_sequence); this->next_request_sequence++; } } bool dummy_pbft_service::apply_operation_now(const bzn_envelope& /*msg*/, std::shared_ptr /*session*/) { return false; } void dummy_pbft_service::consolidate_log(uint64_t sequence_number) { LOG(info) << "Consolidating log at sequence number " << sequence_number; } uint64_t dummy_pbft_service::applied_requests_count() { return this->next_request_sequence - 1; } void dummy_pbft_service::register_execute_handler(execute_handler_t handler) { this->execute_handler = std::move(handler); } bzn::hash_t dummy_pbft_service::service_state_hash(uint64_t sequence_number) const { return "I don't actually have a database [" + std::to_string(sequence_number) + "]"; } std::shared_ptr dummy_pbft_service::get_service_state(uint64_t sequence_number) const { return std::make_shared("I don't actually have a database [" + std::to_string(sequence_number) + "]"); } bool dummy_pbft_service::set_service_state(uint64_t /*sequence_number*/, const bzn::service_state_t& /*data*/) { return true; } void dummy_pbft_service::save_service_state_at(uint64_t /*sequence_number*/) { } void dummy_pbft_service::send_execute_response(const std::shared_ptr& op) { database_response resp; resp.mutable_read()->set_value("dummy database execution of sequence " + std::to_string(op->get_sequence())); LOG(debug) << "Sending request result " << resp.ShortDebugString(); op->session()->send_message(std::make_shared(resp.SerializeAsString())); } ================================================ FILE: pbft/dummy_pbft_service.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include namespace bzn { // This is a placeholder implementation! Eventually, a pbft_service will // wrap crud. It needs to be that way around (rather than crud calling // pbft) because pbft needs to decide when crud gets to see messages. class dummy_pbft_service : public bzn::pbft_service_base { public: dummy_pbft_service(std::shared_ptr io_context); void apply_operation(const std::shared_ptr& op) override; bool apply_operation_now(const bzn_envelope& msg, std::shared_ptr session) override; void consolidate_log(uint64_t sequence_number) override; void register_execute_handler(execute_handler_t handler) override; bzn::hash_t service_state_hash(uint64_t sequence_number) const override; std::shared_ptr get_service_state(uint64_t sequence_number) const override; bool set_service_state(uint64_t sequence_number, const bzn::service_state_t& data) override; void save_service_state_at(uint64_t sequence_number) override; uint64_t applied_requests_count(); private: execute_handler_t execute_handler; std::shared_ptr io_context; void send_execute_response(const std::shared_ptr& op); uint64_t next_request_sequence = 1; std::unordered_map> waiting_operations; std::mutex lock; }; } ================================================ FILE: pbft/operations/CMakeLists.txt ================================================ add_library(pbft_operations STATIC pbft_operation.hpp pbft_operation.cpp pbft_memory_operation.hpp pbft_memory_operation.cpp pbft_persistent_operation.cpp pbft_persistent_operation.cpp pbft_operation_manager.hpp pbft_operation_manager.cpp ) target_link_libraries(pbft_operations utils proto pbft) target_include_directories(pbft_operations PRIVATE ${BLUZELLE_STD_INCLUDES}) add_subdirectory(test) ================================================ FILE: pbft/operations/pbft_memory_operation.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include using namespace bzn; pbft_memory_operation::pbft_memory_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash) : pbft_operation(view, sequence, request_hash) { } bool pbft_memory_operation::has_request() const { return this->request_saved; } bool pbft_memory_operation::has_db_request() const { return this->has_request() && this->request.payload_case() == bzn_envelope::kDatabaseMsg; } bool pbft_memory_operation::has_config_request() const { return this->has_request() && this->request.payload_case() == bzn_envelope::kPbftInternalRequest; } const bzn_envelope& pbft_memory_operation::get_request() const { if (!this->request_saved) { throw std::runtime_error("Tried to get a request that is not saved"); } return this->request; } const pbft_config_msg& pbft_memory_operation::get_config_request() const { if (!this->has_config_request()) { throw std::runtime_error("Tried to get a config request that is not saved"); } return this->parsed_config; } const database_msg& pbft_memory_operation::get_database_msg() const { if (!this->has_db_request()) { throw std::runtime_error("Tried to get a db request that is not saved"); } return this->parsed_db; } void pbft_memory_operation::record_request(const bzn_envelope& wrapped_request) { if (wrapped_request.payload_case() == bzn_envelope::kDatabaseMsg) { if (!this->parsed_db.ParseFromString(wrapped_request.database_msg())) { LOG(error) << "Failed to parse database request"; LOG(error) << wrapped_request.database_msg(); return; } } else if (wrapped_request.payload_case() == bzn_envelope::kPbftInternalRequest) { if (!this->parsed_config.ParseFromString(wrapped_request.pbft_internal_request())) { LOG(error) << "Failed to parse pbft internal request"; return; } } else { LOG(error) << "Tried to record request as envelope that does not actually contain a request type"; return; } this->request = wrapped_request; this->request_saved = true; } void pbft_memory_operation::record_pbft_msg(const pbft_msg& message, const bzn_envelope& original_message) { switch(message.type()) { case pbft_msg_type::PBFT_MSG_PREPREPARE : this->preprepare_seen = true; this->preprepare_message = original_message; break; case pbft_msg_type::PBFT_MSG_PREPARE : this->prepares_seen.emplace(original_message.sender()); this->prepare_messages[original_message.sender()] = original_message; break; case pbft_msg_type::PBFT_MSG_COMMIT : this->commits_seen.emplace(original_message.sender()); break; default: throw std::runtime_error("this is not an appropriate pbft_msg_type"); } //TODO: save original message } bool pbft_memory_operation::is_preprepared() const { return this->preprepare_seen; } bool pbft_memory_operation::is_ready_for_commit(const std::shared_ptr& peers) const { // TODO: may have to count based only on uuids that are still in the peers list return this->has_request() && this->is_preprepared() && this->prepares_seen.size() >= pbft::honest_majority_size(peers->current()->size()); } bool pbft_memory_operation::is_ready_for_execute(const std::shared_ptr& peers) const { // TODO: may have to count based only on uuids that are still in the peers list return this->is_prepared() && this->commits_seen.size() >= pbft::honest_majority_size(peers->current()->size()); } bool pbft_memory_operation::is_prepared() const { return this->stage != pbft_operation_stage::prepare; } bool pbft_memory_operation::is_committed() const { return this->stage == pbft_operation_stage::execute; } void pbft_memory_operation::advance_operation_stage(bzn::pbft_operation_stage new_stage, const std::shared_ptr& peers) { switch(new_stage) { case pbft_operation_stage::prepare : throw std::runtime_error("cannot advance to initial stage"); case pbft_operation_stage::commit : if (!this->is_ready_for_commit(peers) || this->stage != pbft_operation_stage::prepare) { throw std::runtime_error("illegal move to commit phase"); } break; case pbft_operation_stage::execute : if (!this->is_ready_for_execute(peers) || this->stage != pbft_operation_stage::commit) { throw std::runtime_error("illegal move to execute phase"); } break; default: throw std::runtime_error("unknown pbft_operation_stage"); } this->stage = new_stage; } pbft_operation_stage pbft_memory_operation::get_stage() const { return this->stage; } bzn_envelope pbft_memory_operation::get_preprepare() const { return this->preprepare_message; } std::map pbft_memory_operation::get_prepares() const { return this->prepare_messages; } ================================================ FILE: pbft/operations/pbft_memory_operation.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { class pbft_memory_operation : public pbft_operation { public: pbft_memory_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash); pbft_operation_stage get_stage() const override; void record_pbft_msg(const pbft_msg& msg, const bzn_envelope& encoded_msg) override; bool is_preprepared() const override; bool is_prepared() const override; bool is_committed() const override; bool is_ready_for_commit(const std::shared_ptr& peers) const override; bool is_ready_for_execute(const std::shared_ptr& peers) const override; void advance_operation_stage(pbft_operation_stage new_stage, const std::shared_ptr& peers) override; void record_request(const bzn_envelope& encoded_request) override; bool has_request() const override; bool has_db_request() const override; bool has_config_request() const override; const bzn_envelope& get_request() const override; const pbft_config_msg& get_config_request() const override; const database_msg& get_database_msg() const override; bzn_envelope get_preprepare() const override ; std::map get_prepares() const override; private: bzn_envelope preprepare_message; std::map prepare_messages; pbft_operation_stage stage = pbft_operation_stage::prepare; bool preprepare_seen = false; std::set prepares_seen; std::set commits_seen; bzn_envelope request; database_msg parsed_db; pbft_config_msg parsed_config; bool request_saved = false; const std::shared_ptr peers; }; } ================================================ FILE: pbft/operations/pbft_operation.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include using namespace bzn; pbft_operation::pbft_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash) : view(view) , sequence(sequence) , request_hash(request_hash) { } operation_key_t pbft_operation::get_operation_key() const { return {this->view, this->sequence, this->request_hash}; } void pbft_operation::set_session(std::shared_ptr session) { this->listener_session = std::move(session); this->session_saved = true; } std::shared_ptr pbft_operation::session() const { return this->listener_session; } bool pbft_operation::has_session() const { return this->session_saved; } uint64_t pbft_operation::get_sequence() const { return this->sequence; } uint64_t pbft_operation::get_view() const { return this->view; } const hash_t& pbft_operation::get_request_hash() const { return this->request_hash; } ================================================ FILE: pbft/operations/pbft_operation.hpp ================================================ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include namespace bzn { // View, sequence, hash using operation_key_t = std::tuple; // View, sequence using log_key_t = std::tuple; enum class pbft_operation_stage { prepare, commit, execute }; class pbft_operation { public: pbft_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash); /** * Store a session that waits on the result of the operation (will not persist across crashes) * @param session shared_ptr to session */ virtual void set_session(std::shared_ptr session); /** * @return the saved session, if any */ virtual std::shared_ptr session() const; /** * @return do we have a session */ virtual bool has_session() const; /** * @return the operation_key_t that uniquely identifies this operation */ virtual operation_key_t get_operation_key() const; virtual uint64_t get_sequence() const; virtual uint64_t get_view() const; virtual const hash_t& get_request_hash() const; /** * @return the current stage of the operation, defined as * pbft_operation_stage::prepare: waiting for preprepare and 2f+1 prepares * pbft_operation_stage::commit: prepared, waiting for 2f+1 commits * pbft_operation_stage::execute: committed-local, ready to be executed */ virtual pbft_operation_stage get_stage() const = 0; /** * Save a pbft_message about this operation * @param msg preprepare/prepare/commit * @param encoded_msg the original message containing this message, signature intact. */ virtual void record_pbft_msg(const pbft_msg& msg, const bzn_envelope& encoded_msg) = 0; /** * @return has this operation moved to the prepare phase */ virtual bool is_preprepared() const = 0; /** * @return has this operation moved to the commit phase */ virtual bool is_prepared() const = 0; /** * @return has this operation moved to the execute phase */ virtual bool is_committed() const = 0; /** * @return is this operation ready to move to the commit phase */ virtual bool is_ready_for_commit(const std::shared_ptr& peers) const = 0; /** * @return is this operation ready to move to the execute phase */ virtual bool is_ready_for_execute(const std::shared_ptr& peers) const = 0; /** * record the request that this operation is for. caller is responsible for checking that the request's hash * actually matches this operation's hash. * @param encoded_request original message containing the request, signature intact */ virtual void record_request(const bzn_envelope& encoded_request) = 0; /** * advance the operation to the next stage, checking that doing so is legal * @param new_stage */ virtual void advance_operation_stage(pbft_operation_stage new_stage, const std::shared_ptr& peers) = 0; /** * @return do we know the full request associated with this operation? */ virtual bool has_request() const = 0; /** * @return do we know the full request associated with this operation, and is it a database request? */ virtual bool has_db_request() const = 0; /** * @return do we know the full request associated with this operation, and is it a new configuration? */ virtual bool has_config_request() const = 0; /** * @return the signed envelope containing the request associated with this operation */ virtual const bzn_envelope& get_request() const = 0; /** * @return the parsed new configuration associated with this operation */ virtual const pbft_config_msg& get_config_request() const = 0; /** * @return the parsed database_msg associated wtih this operation */ virtual const database_msg& get_database_msg() const = 0; /** * @return the recorded preprepare envelope */ virtual bzn_envelope get_preprepare() const = 0; /** * @return the collection of saved prepare envelopes as a map of sender -> envelope */ virtual std::map get_prepares() const = 0; virtual ~pbft_operation() = default; private: bool session_saved = false; std::shared_ptr listener_session; const uint64_t view; const uint64_t sequence; const bzn::hash_t request_hash; }; } ================================================ FILE: pbft/operations/pbft_operation_manager.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include using namespace bzn; pbft_operation_manager::pbft_operation_manager(std::shared_ptr peers, std::optional> storage) : peers(peers) , storage(storage) { if (!storage) { LOG(warning) << "pbft operation operation manager constructed without a storage backend; operations will not be persistent"; } } std::shared_ptr pbft_operation_manager::find_or_construct(uint64_t view, uint64_t sequence, const bzn::hash_t &request_hash) { std::lock_guard lock(this->pbft_lock); auto key = bzn::operation_key_t(view, sequence, request_hash); auto lookup = this->held_operations.find(key); if (lookup == this->held_operations.end()) { LOG(debug) << "Creating operation for seq " << sequence << " view " << view << " req " << bytes_to_debug_string(request_hash); std::shared_ptr op; if (this->storage) { op = std::make_shared(view, sequence, request_hash, *(this->storage)); } else { op = std::make_shared(view, sequence, request_hash); } bool added; std::tie(std::ignore, added) = this->held_operations.emplace(std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::forward_as_tuple(op)); assert(added); return op; } return lookup->second; } std::shared_ptr pbft_operation_manager::find_or_construct(const pbft_msg& msg) { return this->find_or_construct(msg.view(), msg.sequence(), msg.request_hash()); } void pbft_operation_manager::delete_operations_until(uint64_t sequence) { std::lock_guard lock(this->pbft_lock); size_t ops_removed = 0; auto it = this->held_operations.begin(); while (it != this->held_operations.end()) { if (it->second->get_sequence() <= sequence) { it = this->held_operations.erase(it); ops_removed++; } else { it++; } } LOG(debug) << boost::format("Cleared %1% old operation records") % ops_removed; if (this->storage) { LOG(debug) << "cleaning up operation state from storage"; pbft_persistent_operation::remove_range(*this->storage, 0, sequence); } } std::map> pbft_operation_manager::prepared_operations_since(uint64_t sequence) { // If there are multiple operations for a sequence number, we may return arbitrarily one of them, so long as we // choose one thats prepared. We choose the one in the most recent view, which maximizes the likelihood of some // simpleness with respect to dynamic peering. There cannot be multiple prepared operations with distinct // request hashes because we wouldn't accept the preprepares. std::map> result; const auto maybe_store = [&](const std::shared_ptr& op) { const auto search = result.find(op->get_sequence()); if (search == result.end() || result[op->get_sequence()]->get_view() < op->get_view()) { result[op->get_sequence()] = op; } }; if (this->storage) { for (const auto& op : pbft_persistent_operation::prepared_operations_in_range(*this->storage, sequence + 1)) { maybe_store(op); } } else { for (const auto& pair : this->held_operations) { if (pair.second->get_sequence() > sequence && pair.second->is_prepared()) { maybe_store(pair.second); } } } return result; } size_t pbft_operation_manager::held_operations_count() { return this->held_operations.size(); } ================================================ FILE: pbft/operations/pbft_operation_manager.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include #include namespace bzn { class pbft_operation_manager { public: pbft_operation_manager(std::shared_ptr peers, std::optional> storage = std::nullopt); /* * Returns a (possibly freshly constructed) pbft_operation for a particular view/sequence/request_hash. * Guarenteed to consistently return the same pbft_operation instance over the lifetime of the * pbft_operations_manager - this is important because pbft_operation only stores sessions in memory */ std::shared_ptr find_or_construct(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash); std::shared_ptr find_or_construct(const pbft_msg& msg); std::map> prepared_operations_since(uint64_t sequence); size_t held_operations_count(); void delete_operations_until(uint64_t sequence); private: std::mutex pbft_lock; std::shared_ptr peers; const std::optional> storage; std::map> held_operations; }; } ================================================ FILE: pbft/operations/pbft_persistent_operation.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include using namespace bzn; namespace { const std::string STAGE_KEY = "stage"; const std::string REQUEST_KEY = "request"; const std::string OPERATIONS_UUID = "pbft_operations_data"; } std::string pbft_persistent_operation::generate_prefix(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash) { // Integers formatted to 20 digits, which is the maximum length of a 64 bit uint- they need to have constant length // to be sorted correctly for prefix searches and the like return (boost::format("%020u_%s_%020u") % sequence % request_hash % view).str(); } std::string pbft_persistent_operation::generate_key(const std::string& prefix, const std::string& key) { // Integers formatted to 20 digits, which is the maximum length of a 64 bit uint- they need to have constant length // to be sorted correctly for prefix searches and the like return prefix + "_" + key; } std::string pbft_persistent_operation::prefix_for_sequence(uint64_t sequence) { return (boost::format("%020u_") % sequence).str(); // This is an inefficient search, but we can fix it if it matters } bool pbft_persistent_operation::parse_prefix(const std::string& prefix, uint64_t& view, uint64_t& sequence, bzn::hash_t& hash) { auto hash_start = prefix.find_first_of('_'); auto hash_end = prefix.find_last_of('_'); if (hash_end >= (prefix.size() - 1) || hash_start >= hash_end) { return false; } sequence = std::stoul(prefix.substr(0, hash_start)); view = std::stoul(prefix.substr(hash_end + 1)); hash = prefix.substr(hash_start + 1, hash_end - hash_start - 1); return true; } const std::string& pbft_persistent_operation::get_uuid() { return OPERATIONS_UUID; } pbft_persistent_operation::pbft_persistent_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash, std::shared_ptr storage) : pbft_operation(view, sequence, request_hash) , storage(std::move(storage)) , prefix(pbft_persistent_operation::generate_prefix(view, sequence, request_hash)) { const auto response = this->storage->create(get_uuid(), generate_key(this->prefix, STAGE_KEY) , std::to_string(static_cast(pbft_operation_stage::prepare))); switch (response) { case storage_result::ok: LOG(trace) << "created persistent operation with prefix " << bzn::bytes_to_debug_string(this->prefix) << "; this is our first record of it"; break; case storage_result::exists: LOG(trace) << "created persistent operation with prefix " << bzn::bytes_to_debug_string(this->prefix) << "; using existing records"; break; default: throw std::runtime_error("failed to write stage of new persistent operation " + storage_result_msg.at(response)); } } // constructs operation already in storage without re-adding to storage pbft_persistent_operation::pbft_persistent_operation(std::shared_ptr storage, uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash) : pbft_operation(view, sequence, request_hash) , storage(std::move(storage)) , prefix(pbft_persistent_operation::generate_prefix(view, sequence, request_hash)) { assert(this->storage->read(get_uuid(), generate_key(this->prefix, STAGE_KEY))); LOG(trace) << "re-hydrated operation with prefix " << bzn::bytes_to_debug_string(this->prefix); } void pbft_persistent_operation::record_pbft_msg(const pbft_msg& msg, const bzn_envelope& encoded_msg) { if (msg.type() != pbft_msg_type::PBFT_MSG_PREPREPARE && msg.type() != pbft_msg_type::PBFT_MSG_PREPARE && msg.type() != pbft_msg_type::PBFT_MSG_COMMIT) { LOG(error) << "tried to record a pbft message with inappropriate type: " << pbft_msg_type_Name(msg.type()); return; } const auto response = this->storage->create(get_uuid() , generate_key(this->typed_prefix(msg.type()), encoded_msg.sender()), encoded_msg.SerializeAsString()); switch (response) { case storage_result::ok: LOG(debug) << "saved " << pbft_msg_type_Name(msg.type()) << " from " << encoded_msg.sender() << " for operation " << bzn::bytes_to_debug_string(this->prefix); break; case storage_result::exists: LOG(debug) << "ignored duplicate " << pbft_msg_type_Name(msg.type()) << " from " << encoded_msg.sender() << " for operation " << bzn::bytes_to_debug_string(this->prefix); break; default: throw std::runtime_error("failed to write pbft_msg " + storage_result_msg.at(response)); } } pbft_operation_stage pbft_persistent_operation::get_stage() const { const auto response = this->storage->read(get_uuid(), generate_key(this->prefix, STAGE_KEY)); if (!response) { throw std::runtime_error("failed to read stage of pbft_operation " + bzn::bytes_to_debug_string(this->prefix) + " from storage"); } return static_cast(std::stoi(*response)); } void pbft_persistent_operation::advance_operation_stage(pbft_operation_stage new_stage, const std::shared_ptr& peers) { switch (new_stage) { case pbft_operation_stage::prepare : throw std::runtime_error("cannot advance to initial stage"); case pbft_operation_stage::commit : if (!this->is_ready_for_commit(peers) || this->get_stage() != pbft_operation_stage::prepare) { throw std::runtime_error("illegal move to commit phase"); } break; case pbft_operation_stage::execute : if (!this->is_ready_for_execute(peers) || this->get_stage() != pbft_operation_stage::commit) { throw std::runtime_error("illegal move to execute phase"); } break; default: throw std::runtime_error("unknown pbft_operation_stage: " + std::to_string(static_cast(new_stage))); } const auto response = this->storage->update(get_uuid(), generate_key(this->prefix, STAGE_KEY) , std::to_string(static_cast(new_stage))); if (response != storage_result::ok) { throw std::runtime_error("failed to write operation stage update: " + storage_result_msg.at(response)); } } bool pbft_persistent_operation::is_preprepared() const { // TODO: maybe check if the sender of the preprepare is still in the peers list auto prefix = this->typed_prefix(pbft_msg_type::PBFT_MSG_PREPREPARE); return this->storage->get_keys_if(get_uuid(), prefix, this->increment_prefix(prefix)).size() > 0; } bool pbft_persistent_operation::is_prepared() const { return this->get_stage() != pbft_operation_stage::prepare; } bool pbft_persistent_operation::is_committed() const { return this->get_stage() == pbft_operation_stage::execute; } bool pbft_persistent_operation::is_ready_for_commit(const std::shared_ptr& peers) const { auto prefix = this->typed_prefix(pbft_msg_type::PBFT_MSG_PREPARE); return this->storage->get_keys_if(get_uuid(), prefix, this->increment_prefix(prefix)).size() >= pbft::honest_majority_size(peers->current()->size()) && this->is_preprepared() && this->has_request(); } bool pbft_persistent_operation::is_ready_for_execute(const std::shared_ptr& peers) const { auto prefix = this->typed_prefix(pbft_msg_type::PBFT_MSG_COMMIT); return this->storage->get_keys_if(get_uuid(), prefix, this->increment_prefix(prefix)).size() >= pbft::honest_majority_size(peers->current()->size()) && this->is_prepared(); } void pbft_persistent_operation::record_request(const bzn_envelope& encoded_request) { if (this->transient_request_available) { LOG(trace) << "ignoring record of request for operation " << bzn::bytes_to_debug_string(this->prefix) << " because we already have one"; return; } const auto response = this->storage->create(get_uuid(), generate_key(this->prefix, REQUEST_KEY) , encoded_request.SerializeAsString()); switch (response) { case storage_result::ok: LOG(trace) << "recorded request for operation " << bzn::bytes_to_debug_string(this->prefix); break; case storage_result::exists: LOG(trace) << "ignoring record of request for operation " << bzn::bytes_to_debug_string(this->prefix) << " because we already have one"; break; case storage_result::value_too_large: LOG(debug) << "request too large to store: " << encoded_request.SerializeAsString().size() << " bytes, " << bzn::bytes_to_debug_string(this->prefix); break; default: throw std::runtime_error("failed to write request for operation " + bzn::bytes_to_debug_string(this->prefix)); } // this will allow future calls to record_request to short circuit this->load_transient_request(); } bool pbft_persistent_operation::has_request() const { this->load_transient_request(); return this->transient_request_available; } void pbft_persistent_operation::load_transient_request() const { if (this->transient_request_available) { return; } const auto response = this->storage->read(get_uuid(), generate_key(this->prefix, REQUEST_KEY)); if (!response.has_value()) { return; } this->transient_request.ParseFromString(*response); this->transient_request_available = true; if (this->transient_request.payload_case() == bzn_envelope::kDatabaseMsg) { this->transient_database_request.ParseFromString(this->transient_request.database_msg()); } else if (this->transient_request.payload_case() == bzn_envelope::kPbftInternalRequest) { this->transient_config_request.ParseFromString(this->transient_request.pbft_internal_request()); } } bool pbft_persistent_operation::has_db_request() const { return this->has_request() && this->get_request().payload_case() == bzn_envelope::kDatabaseMsg; } bool pbft_persistent_operation::has_config_request() const { return this->has_request() && this->get_request().payload_case() == bzn_envelope::kPbftInternalRequest; } const bzn_envelope& pbft_persistent_operation::get_request() const { if (!this->has_request()) { throw std::runtime_error("tried to get request of operation " + bzn::bytes_to_debug_string(this->prefix) + "; we have no such request"); } return this->transient_request; } const pbft_config_msg& pbft_persistent_operation::get_config_request() const { if (!this->has_config_request()) { throw std::runtime_error("tried to get config request of operation " + bzn::bytes_to_debug_string(this->prefix) + "; we have no such request"); } return this->transient_config_request; } const database_msg& pbft_persistent_operation::get_database_msg() const { if (!this->has_db_request()) { throw std::runtime_error("tried to get database request of operation " + bzn::bytes_to_debug_string(this->prefix) + "; we have no such request"); } return this->transient_database_request; } std::string pbft_persistent_operation::typed_prefix(pbft_msg_type pbft_type) const { return this->prefix + "_" + std::to_string(pbft_type); } bzn_envelope pbft_persistent_operation::get_preprepare() const { auto keys = this->storage->get_keys_if(get_uuid(), this->typed_prefix(pbft_msg_type::PBFT_MSG_PREPREPARE) , this->typed_prefix(pbft_msg_type::PBFT_MSG_PREPARE)); if (keys.size() == 0) { throw std::runtime_error("tried to fetch a preprepare that we don't have for operation " + bzn::bytes_to_debug_string(this->prefix)); } bzn_envelope env; if (!env.ParseFromString(this->storage->read(get_uuid(), keys.at(0)).value_or(""))) { throw std::runtime_error("failed to parse or fetch preprepare that we supposedly have? " + bzn::bytes_to_debug_string(this->prefix)); } return env; } std::map pbft_persistent_operation::get_prepares() const { auto keys = this->storage->get_keys_if(get_uuid(), this->typed_prefix(pbft_msg_type::PBFT_MSG_PREPARE) , this->typed_prefix(pbft_msg_type::PBFT_MSG_COMMIT)); std::map result; for (const auto& key : keys) { if (!result[key].ParseFromString(this->storage->read(get_uuid(), key).value_or(""))) { throw std::runtime_error("failed to parse or fetch prepare that we supposedly have? " + bzn::bytes_to_debug_string(this->prefix)); } } return result; } std::vector> pbft_persistent_operation::prepared_operations_in_range(std::shared_ptr storage, uint64_t start , std::optional end) { static const std::regex pattern(STAGE_KEY + "$"); auto first = (boost::format("%020u_") % start).str(); auto last = end ? (boost::format("%020u_") % *end).str() : ""; auto matches = storage->read_if(get_uuid(), first, last, [](const std::string& key, const std::string& value)->bool { return (value == std::to_string(static_cast(pbft_operation_stage::commit)) || value == std::to_string(static_cast(pbft_operation_stage::execute))) && std::regex_search(key, pattern); }); std::vector> results; for (const auto& m : matches) { auto prefix = m.first.substr(0, m.first.find("_" + STAGE_KEY)); auto key = generate_key(prefix, REQUEST_KEY); auto res = storage->read(get_uuid(), key); if (res) { uint64_t view; uint64_t sequence; bzn::hash_t hash; if (parse_prefix(prefix, view, sequence, hash)) { auto op = std::make_shared(storage, view, sequence, hash); results.push_back(op); } else { LOG(error) << boost::format("Unable to parse stored operation at view:%1% sequence:%2% hash:%3%") % view % sequence % hash; } } } return results; } void pbft_persistent_operation::remove_range(std::shared_ptr storage, uint64_t first, uint64_t last) { storage->remove_range(get_uuid(), prefix_for_sequence(first), prefix_for_sequence(last)); } std::string pbft_persistent_operation::increment_prefix(const std::string& prefix) const { auto result = prefix; if (result.back() < std::numeric_limits::max()) { result.back()++; } else { result += char(0x1); } return result; } ================================================ FILE: pbft/operations/pbft_persistent_operation.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include namespace bzn { class pbft_persistent_operation : public pbft_operation { public: pbft_persistent_operation(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash, std::shared_ptr storage); // constructs operation already in storage pbft_persistent_operation(std::shared_ptr storage, uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash); void record_pbft_msg(const pbft_msg& msg, const bzn_envelope& encoded_msg) override; pbft_operation_stage get_stage() const override; void advance_operation_stage(pbft_operation_stage new_stage, const std::shared_ptr& peers) override; bool is_preprepared() const override; bool is_prepared() const override; bool is_committed() const override; bool is_ready_for_commit(const std::shared_ptr& peers) const override; bool is_ready_for_execute(const std::shared_ptr& peers) const override; void record_request(const bzn_envelope& encoded_request) override; bool has_request() const override; bool has_db_request() const override; bool has_config_request() const override; const bzn_envelope& get_request() const override; const pbft_config_msg& get_config_request() const override; const database_msg& get_database_msg() const override; bzn_envelope get_preprepare() const override; std::map get_prepares() const override; static std::string generate_prefix(uint64_t view, uint64_t sequence, const bzn::hash_t& request_hash); static const std::string& get_uuid(); static std::vector> prepared_operations_in_range( std::shared_ptr storage, uint64_t start, std::optional end = std::nullopt); static void remove_range(std::shared_ptr storage, uint64_t first, uint64_t last); private: std::string typed_prefix(pbft_msg_type pbft_type) const; void load_transient_request() const; static std::string prefix_for_sequence(uint64_t sequence); static std::string generate_key(const std::string& prefix, const std::string& key); static bool parse_prefix(const std::string& prefix, uint64_t& view, uint64_t& sequence, bzn::hash_t& hash); std::string increment_prefix(const std::string& prefix) const; const std::shared_ptr storage; const std::string prefix; mutable bool transient_request_available = false; mutable bzn_envelope transient_request; mutable database_msg transient_database_request; mutable pbft_config_msg transient_config_request; }; } ================================================ FILE: pbft/operations/test/CMakeLists.txt ================================================ set(test_srcs pbft_operation_test_common.cpp pbft_persistent_operation_test.cpp pbft_operation_manager_test.cpp ) set(test_libs pbft_operations storage pbft smart_mocks ${Protobuf_LIBRARIES}) add_gmock_test(pbft_operation) ================================================ FILE: pbft/operations/test/pbft_operation_manager_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include using namespace ::testing; namespace { const std::vector TEST_PEER_LIST{{ "127.0.0.1", 8081, "name1", "uuid0"} , {"127.0.0.1", 8082, "name2", "uuid2"} , {"127.0.0.1", 8083, "name3", "uuid3"} , {"127.0.0.1", 8084, "name4", "uuid4"}}; const auto peers_ptr = std::make_shared>(TEST_PEER_LIST); void make_prepared(const std::shared_ptr& op) { bzn_envelope outer; pbft_msg inner; inner.set_type(PBFT_MSG_PREPREPARE); op->record_pbft_msg(inner, outer); inner.set_type(PBFT_MSG_PREPARE); for (const auto& peer : TEST_PEER_LIST) { outer.set_sender(peer.uuid); op->record_pbft_msg(inner, outer); } database_msg req; outer.set_database_msg(req.SerializeAsString()); op->record_request(outer); op->advance_operation_stage(bzn::pbft_operation_stage::commit, static_peers_beacon_for(TEST_PEER_LIST)); EXPECT_TRUE(op->is_prepared()); } TEST(pbft_operation_manager_test, returned_operation_matches_key) { bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)}; auto op = manager.find_or_construct(1, 6, "hash"); EXPECT_EQ(op->get_view(), 1u); EXPECT_EQ(op->get_sequence(), 6u); EXPECT_EQ(op->get_request_hash(), "hash"); } TEST(pbft_operation_manager_test, returns_same_operation_instance) { bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)}; auto op1 = manager.find_or_construct(1, 6, "hash"); auto op2 = manager.find_or_construct(2, 6, "hash"); auto op3 = manager.find_or_construct(1, 6, "hash"); EXPECT_NE(op1, op2); EXPECT_EQ(op1, op3); } TEST(pbft_operation_manager_test, prepared_operations_since_only_prepared_ops) { bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)}; auto op1 = manager.find_or_construct(1, 1, "hash"); auto op2 = manager.find_or_construct(1, 2, "hash"); make_prepared(op1); auto prepared = manager.prepared_operations_since(0); EXPECT_EQ(prepared.size(), 1u); EXPECT_EQ(prepared.begin()->second, op1); } TEST(pbft_operation_manager_test, prepared_operations_since_prefers_prepared_ops_when_duplicate) { bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)}; auto op1 = manager.find_or_construct(1, 1, "hash"); auto op2 = manager.find_or_construct(2, 1, "hash"); make_prepared(op2); auto prepared = manager.prepared_operations_since(0); EXPECT_EQ(prepared.begin()->second, op2); } TEST(pbft_operation_manager_test, prepared_operations_since_no_duplicates) { bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)}; auto op1 = manager.find_or_construct(1, 1, "hash"); auto op2 = manager.find_or_construct(2, 1, "hash"); auto op3 = manager.find_or_construct(3, 1, "hash"); auto op4 = manager.find_or_construct(4, 1, "hash"); make_prepared(op1); make_prepared(op2); auto prepared = manager.prepared_operations_since(0); EXPECT_EQ(prepared.size(), 1u); } TEST(pbft_operation_manager_test, delete_clears_operations) { bzn::pbft_operation_manager manager{static_peers_beacon_for(TEST_PEER_LIST)}; auto op1 = manager.find_or_construct(1, 1, "hash"); auto op2 = manager.find_or_construct(2, 2, "hash"); auto op3 = manager.find_or_construct(3, 3, "hash"); auto op4 = manager.find_or_construct(4, 4, "hash"); EXPECT_EQ(manager.held_operations_count(), 4u); manager.delete_operations_until(2); EXPECT_EQ(manager.held_operations_count(), 2u); manager.delete_operations_until(4); EXPECT_EQ(manager.held_operations_count(), 0u); } } ================================================ FILE: pbft/operations/test/pbft_operation_test_common.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include #include #include #include #include #include #include #include using namespace ::testing; namespace { const bzn::uuid_t TEST_NODE_UUID{"uuid4"}; const std::vector TEST_PEER_LIST{{ "127.0.0.1", 8081, "name1", "uuid1"} , {"127.0.0.1", 8082, "name2", "uuid2"} , {"127.0.0.1", 8083, "name3", "uuid3"} , {"127.0.0.1", 8084, "name4", TEST_NODE_UUID}}; const std::vector TEST_2F_PEER_LIST{{ "127.0.0.1", 8081, "name1", "uuid1"} , {"127.0.0.1", 8084, "name4", TEST_NODE_UUID}}; const std::vector TEST_2F_PLUS_1_PEER_LIST{{ "127.0.0.1", 8081, "name1", "uuid1"} , {"127.0.0.1", 8082, "name2", "uuid2"} , {"127.0.0.1", 8084, "name4", TEST_NODE_UUID}}; class pbft_operation_test_common : public Test { public: bzn_envelope request; bzn::hash_t request_hash = "somehash"; uint64_t view = 6; uint64_t sequence = 19; std::shared_ptr static_beacon = static_peers_beacon_for(TEST_PEER_LIST); std::shared_ptr storage = std::make_shared(); std::vector> operations{ std::make_shared(view, sequence, request_hash), std::make_shared(view, sequence, request_hash, this->storage) }; bzn_envelope empty_original_msg; pbft_msg preprepare; pbft_msg prepare; pbft_msg commit; pbft_operation_test_common() { database_msg msg; request.set_database_msg(msg.SerializeAsString()); this->preprepare.set_type(pbft_msg_type::PBFT_MSG_PREPREPARE); this->prepare.set_type(pbft_msg_type::PBFT_MSG_PREPARE); this->commit.set_type(pbft_msg_type::PBFT_MSG_COMMIT); } }; TEST_F(pbft_operation_test_common, initially_unprepared) { for (const auto& op : this->operations){ EXPECT_FALSE(op->is_prepared()); } } TEST_F(pbft_operation_test_common, prepared_after_all_msgs) { for (const auto& op : this->operations) { op->record_pbft_msg(this->preprepare, this->empty_original_msg); op->record_request(this->request); for (const auto& peer : TEST_PEER_LIST) { bzn_envelope msg; msg.set_sender(peer.uuid); op->record_pbft_msg(this->prepare, msg); } EXPECT_TRUE(op->is_ready_for_commit(this->static_beacon)); } } TEST_F(pbft_operation_test_common, not_prepared_without_request) { for (const auto& op : this->operations) { op->record_pbft_msg(this->preprepare, this->empty_original_msg); for (const auto& peer : TEST_PEER_LIST) { bzn_envelope msg; msg.set_sender(peer.uuid); op->record_pbft_msg(this->prepare, msg); } EXPECT_FALSE(op->is_ready_for_commit(this->static_beacon)); } } TEST_F(pbft_operation_test_common, not_prepared_without_preprepare) { for (const auto& op : this->operations) { for (const auto& peer : TEST_PEER_LIST) { bzn_envelope msg; msg.set_sender(peer.uuid); op->record_pbft_msg(this->prepare, msg); } EXPECT_FALSE(op->is_ready_for_commit(this->static_beacon)); } } TEST_F(pbft_operation_test_common, not_prepared_with_2f) { for (const auto& op : this->operations) { op->record_pbft_msg(this->preprepare, this->empty_original_msg); for (const auto& peer : TEST_2F_PEER_LIST) { bzn_envelope msg; msg.set_sender(peer.uuid); op->record_pbft_msg(this->prepare, msg); } EXPECT_FALSE(op->is_ready_for_commit(this->static_beacon)); } } TEST_F(pbft_operation_test_common, prepared_with_2f_PLUS_1) { for (const auto& op : this->operations) { op->record_pbft_msg(this->preprepare, this->empty_original_msg); op->record_request(this->request); for (const auto& peer : TEST_2F_PLUS_1_PEER_LIST) { bzn_envelope msg; msg.set_sender(peer.uuid); op->record_pbft_msg(this->prepare, msg); } EXPECT_TRUE(op->is_ready_for_commit(this->static_beacon)); } } TEST_F(pbft_operation_test_common, remembers_preprepare) { for (const auto& op : this->operations) { bzn_envelope env; env.set_sender("alice"); op->record_pbft_msg(this->preprepare, env); EXPECT_EQ(op->get_preprepare().sender(), "alice"); } } TEST_F(pbft_operation_test_common, remembers_multiple_distinct_prepares) { for (const auto& op : this->operations) { bzn_envelope env; env.set_sender("alice"); op->record_pbft_msg(this->prepare, env); env.set_sender("bob"); op->record_pbft_msg(this->prepare, env); env.set_sender("carlos"); op->record_pbft_msg(this->prepare, env); EXPECT_EQ(op->get_prepares().size(), 3u); } } TEST_F(pbft_operation_test_common, ignores_duplicate_prepares) { for (const auto& op : this->operations) { bzn_envelope env; op->record_request(this->request); op->record_pbft_msg(this->preprepare, env); env.set_sender("alice"); op->record_pbft_msg(this->prepare, env); env.set_sender("mallory"); op->record_pbft_msg(this->prepare, env); op->record_pbft_msg(this->prepare, env); op->record_pbft_msg(this->prepare, env); EXPECT_EQ(op->get_prepares().size(), 2u); EXPECT_FALSE(op->is_ready_for_commit(this->static_beacon)); } } } ================================================ FILE: pbft/operations/test/pbft_persistent_operation_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include using namespace ::testing; namespace { const std::vector UUIDS{"alice", "bob", "cindy", "dave"}; const std::vector TEST_PEER_LIST{{ "127.0.0.1", 8081, "name1", "alice"} , {"127.0.0.1", 8082, "name2", "bob"} , {"127.0.0.1", 8083, "name3", "cindy"} , {"127.0.0.1", 8084, "name4", "dave"}}; void record_pbft_messages(int from, int until, pbft_msg_type type, std::shared_ptr op) { pbft_msg message; message.set_view(op->get_view()); message.set_sequence(op->get_sequence()); message.set_request_hash(op->get_request_hash()); message.set_type(type); for (; fromrecord_pbft_msg(message, message_env); } } void record_request(std::shared_ptr op, uint64_t nonce = 6) { database_msg request; bzn_envelope request_env; request.mutable_header()->set_nonce(nonce); request_env.set_database_msg(request.SerializeAsString()); request_env.set_sender("a client"); op->record_request(request_env); } class persistent_operation_test : public Test { public: const uint64_t view = 1; const uint64_t sequence = 2; const std::string request_hash = "a very hashy hash"; const size_t peers_size = 4; std::shared_ptr static_beacon = static_peers_beacon_for(TEST_PEER_LIST); std::shared_ptr storage = std::make_shared(); std::shared_ptr operation = std::make_shared(this->view, this->sequence, this->request_hash, this->storage); }; TEST_F(persistent_operation_test, remembers_state_after_rehydrate) { record_request(this->operation); record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, this->operation); record_pbft_messages(0, 4, PBFT_MSG_PREPARE, this->operation); this->operation->advance_operation_stage(bzn::pbft_operation_stage::commit, static_peers_beacon_for(TEST_PEER_LIST)); EXPECT_TRUE(this->operation->is_ready_for_commit(this->static_beacon)); EXPECT_EQ(this->operation->get_stage(), bzn::pbft_operation_stage::commit); this->operation = nullptr; auto op2 = std::make_shared(this->view, this->sequence, this->request_hash, this->storage); EXPECT_TRUE(op2->is_ready_for_commit(this->static_beacon)); EXPECT_EQ(op2->get_stage(), bzn::pbft_operation_stage::commit); auto op3 = std::make_shared(this->view, this->sequence+1, this->request_hash, this->storage); EXPECT_FALSE(op3->is_ready_for_commit(this->static_beacon)); EXPECT_EQ(op3->get_stage(), bzn::pbft_operation_stage::prepare); } TEST_F(persistent_operation_test, remembers_request_after_rehydrate) { record_request(this->operation, 9999u); EXPECT_TRUE(this->operation->has_db_request()); EXPECT_EQ(this->operation->get_database_msg().header().nonce(), 9999u); this->operation = nullptr; auto op2 = std::make_shared(this->view, this->sequence, this->request_hash, this->storage); EXPECT_TRUE(op2->has_db_request()); EXPECT_EQ(op2->get_database_msg().header().nonce(), 9999u); auto op3 = std::make_shared(this->view+1, this->sequence, this->request_hash, this->storage); EXPECT_FALSE(op3->has_db_request()); } TEST_F(persistent_operation_test, continue_progressing_state_after_rehydrate) { record_request(this->operation); record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, this->operation); record_pbft_messages(0, 2, PBFT_MSG_PREPARE, this->operation); EXPECT_EQ(this->operation->get_stage(), bzn::pbft_operation_stage::prepare); EXPECT_TRUE(this->operation->is_preprepared()); EXPECT_TRUE(this->operation->has_request()); this->operation = nullptr; auto op2 = std::make_shared(this->view, this->sequence, this->request_hash, this->storage); EXPECT_EQ(op2->get_stage(), bzn::pbft_operation_stage::prepare); EXPECT_TRUE(op2->is_preprepared()); EXPECT_TRUE(op2->has_request()); record_pbft_messages(2, 4, PBFT_MSG_PREPARE, op2); EXPECT_TRUE(op2->is_ready_for_commit(this->static_beacon)); op2->advance_operation_stage(bzn::pbft_operation_stage::commit, this->static_beacon); record_pbft_messages(0, 4, PBFT_MSG_COMMIT, op2); EXPECT_TRUE(op2->is_ready_for_execute(this->static_beacon)); op2->advance_operation_stage(bzn::pbft_operation_stage::execute, this->static_beacon); } TEST_F(persistent_operation_test, no_contamination_from_different_request) { auto op2 = std::make_shared(this->view, this->sequence, this->request_hash, this->storage); auto op3 = std::make_shared(this->view+1, this->sequence, this->request_hash, this->storage); auto op4 = std::make_shared(this->view, this->sequence, this->request_hash+"xx", this->storage); //op2 gets just a preprepare, op3 gets 2f prepares, op4 gets 2f+1 prepares for (const auto& op : std::vector>{op2, op3, op4}) { record_request(op); record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, op); } record_pbft_messages(0, 2, PBFT_MSG_PREPARE, op3); record_pbft_messages(0, 3, PBFT_MSG_PREPARE, op4); op4->advance_operation_stage(bzn::pbft_operation_stage::commit, this->static_beacon); EXPECT_FALSE(op2->is_ready_for_commit(this->static_beacon)); EXPECT_FALSE(op3->is_ready_for_commit(this->static_beacon)); EXPECT_TRUE(op4->is_ready_for_commit(this->static_beacon)); } TEST_F(persistent_operation_test, remembers_messages_after_rehydrate) { record_request(this->operation); record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, this->operation); record_pbft_messages(0, 2, PBFT_MSG_PREPARE, this->operation); this->operation = nullptr; auto op2 = std::make_shared(this->view, this->sequence, this->request_hash, this->storage); record_pbft_messages(2, 4, PBFT_MSG_PREPARE, op2); op2->advance_operation_stage(bzn::pbft_operation_stage::commit, this->static_beacon); EXPECT_TRUE(op2->is_ready_for_commit(this->static_beacon)); EXPECT_EQ(op2->get_preprepare().sender(), UUIDS.at(0)); EXPECT_EQ(op2->get_prepares().size(), 4u); } TEST_F(persistent_operation_test, test_prepared_in_range) { for (auto i : boost::irange(0, 100)) { auto op = std::make_shared(1, i, "some_hash", this->storage); record_request(op); record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, op); // record 1-4 prepares record_pbft_messages(0, (i % 4) + 1, PBFT_MSG_PREPARE, op); if ((i % 4 + 1) > 2) { op->advance_operation_stage(bzn::pbft_operation_stage::commit, this->static_beacon); } } EXPECT_EQ(bzn::pbft_persistent_operation::prepared_operations_in_range(this->storage, 0, 100).size(), 50u); } TEST_F(persistent_operation_test, test_remove_range) { for (auto i : boost::irange(0, 100)) { auto op = std::make_shared(1, i, "some_hash", this->storage); record_request(op); record_pbft_messages(0, 1, PBFT_MSG_PREPREPARE, op); } // note - there's an extra operation in there from the constructor EXPECT_EQ(this->storage->get_size(bzn::pbft_persistent_operation::get_uuid()).first, 301u); bzn::pbft_persistent_operation::remove_range(this->storage, 50, 60); EXPECT_EQ(this->storage->get_size(bzn::pbft_persistent_operation::get_uuid()).first, 271u); bzn::pbft_persistent_operation::remove_range(this->storage, 0, 10); EXPECT_EQ(this->storage->get_size(bzn::pbft_persistent_operation::get_uuid()).first, 240u); } } ================================================ FILE: pbft/pbft.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace bzn; pbft::pbft( std::shared_ptr node , std::shared_ptr io_context , std::shared_ptr peers , std::shared_ptr options , std::shared_ptr service , std::shared_ptr crypto , std::shared_ptr operation_manager , std::shared_ptr storage , std::shared_ptr monitor ) : storage(storage) , node(std::move(node)) , uuid(options->get_uuid()) , options(options) , service(std::move(service)) , io_context(io_context) , audit_heartbeat_timer(this->io_context->make_unique_steady_timer()) , crypto(std::move(crypto)) , operation_manager(std::move(operation_manager)) , peers_beacon(std::move(peers)) , checkpoint_manager(std::make_shared(this->io_context, this->storage, this->peers_beacon, this->node)) , monitor(std::move(monitor)) { if (this->peers_beacon->current()->empty()) { throw std::runtime_error("No peers found!"); } this->initialize_persistent_state(); this->service->save_service_state_at(((this->next_issued_sequence_number.value() / CHECKPOINT_INTERVAL) + 1) * CHECKPOINT_INTERVAL); } void pbft::start() { std::call_once(this->start_once, [this]() { this->node->register_for_message(bzn_envelope::kPbft, std::bind(&pbft::handle_bzn_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2)); this->node->register_for_message(bzn_envelope::kPbftMembership, std::bind(&pbft::handle_membership_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2)); this->node->register_for_message(bzn_envelope::kDatabaseMsg, std::bind(&pbft::handle_database_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2)); this->node->register_for_message(bzn_envelope::kDatabaseResponse, std::bind(&pbft::handle_database_response_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2)); this->node->register_for_message(bzn_envelope::kSwarmError, [weak_this = weak_from_this()](auto msg, auto session) { if (auto strong_this = weak_this.lock()) { strong_this->handle_swarm_error_response_message(msg, session); } }); this->node->register_error_handler([weak_this = this->weak_from_this()](const boost::asio::ip::tcp::endpoint& ep, const boost::system::error_code& ec) { if (auto strong_this = weak_this.lock()) { auto prim = strong_this->get_current_primary(); if (ec && prim.has_value() && ep == bzn::make_endpoint(*prim)) { strong_this->handle_failure(); } } }); this->checkpoint_manager->start(); this->audit_heartbeat_timer->expires_from_now(HEARTBEAT_INTERVAL); this->audit_heartbeat_timer->async_wait( std::bind(&pbft::handle_audit_heartbeat_timeout, shared_from_this(), std::placeholders::_1)); this->service->register_execute_handler( [weak_this = this->weak_from_this()] (std::shared_ptr op) { auto strong_this = weak_this.lock(); if (strong_this) { strong_this->last_executed_sequence_number = op->get_sequence(); if (op->get_sequence() % CHECKPOINT_INTERVAL == 0) { // tell service to save the next checkpoint after this one strong_this->service->save_service_state_at(op->get_sequence() + CHECKPOINT_INTERVAL); checkpoint_t chk{op->get_sequence(), strong_this->service->service_state_hash( op->get_sequence())}; strong_this->checkpoint_manager->local_checkpoint_reached(chk); const auto safe_delete_bound = std::min( strong_this->checkpoint_manager->get_latest_stable_checkpoint().first , strong_this->checkpoint_manager->get_latest_local_checkpoint().first); strong_this->operation_manager->delete_operations_until(safe_delete_bound); } } else { throw std::runtime_error("pbft_service callback failed because pbft does not exist"); } } ); auto peers = this->peers_beacon->ordered(); this->pinned_primary = peers->at(this->view.value() % peers->size()); }); } void pbft::handle_audit_heartbeat_timeout(const boost::system::error_code& ec) { if (ec) { LOG(error) << "pbft audit heartbeat canceled? " << ec.message(); return; } if (this->is_primary() && this->audit_enabled) { audit_message msg; msg.mutable_primary_status()->set_view(this->view.value()); msg.mutable_primary_status()->set_primary(this->uuid); this->async_signed_broadcast(msg); } this->audit_heartbeat_timer->expires_from_now(HEARTBEAT_INTERVAL); this->audit_heartbeat_timer->async_wait(std::bind(&pbft::handle_audit_heartbeat_timeout, shared_from_this(), std::placeholders::_1)); } void pbft::handle_bzn_message(const bzn_envelope& msg, std::shared_ptr /*session*/) { if (msg.payload_case() != bzn_envelope::kPbft) { LOG(error) << "Got misdirected message " << msg.DebugString().substr(0, MAX_MESSAGE_SIZE); } pbft_msg inner_msg; if (!inner_msg.ParseFromString(msg.pbft())) { LOG(error) << "Failed to parse payload of wrapped message " << msg.DebugString().substr(0, MAX_MESSAGE_SIZE); return; } this->handle_message(inner_msg, msg); } void pbft::handle_membership_message(const bzn_envelope& msg, std::shared_ptr session) { LOG(debug) << "Received membership message: " << msg.ShortDebugString().substr(0, MAX_MESSAGE_SIZE); pbft_membership_msg inner_msg; if (!inner_msg.ParseFromString(msg.pbft_membership())) { LOG(error) << "Failed to parse payload of wrapped message " << msg.DebugString().substr(0, MAX_MESSAGE_SIZE); return; } if ((!msg.sender().empty()) && this->options->get_peer_message_signing() && (!this->crypto->verify(msg))) { LOG(error) << "Dropping message with invalid signature: " << msg.ShortDebugString().substr(0, MAX_MESSAGE_SIZE); return; } const auto hash = this->crypto->hash(msg); std::lock_guard lock(this->pbft_lock); switch (inner_msg.type()) { case PBFT_MMSG_GET_STATE: this->handle_get_state(inner_msg, std::move(session)); break; case PBFT_MMSG_SET_STATE: this->handle_set_state(inner_msg); break; default: LOG(error) << "Invalid membership message received " << inner_msg.DebugString().substr(0, MAX_MESSAGE_SIZE); } } void pbft::handle_message(const pbft_msg& msg, const bzn_envelope& original_msg) { LOG(debug) << "Received message: " << msg.ShortDebugString().substr(0, MAX_MESSAGE_SIZE) << "\nFrom: " << original_msg.sender(); std::lock_guard lock(this->pbft_lock); auto peers = this->peers_beacon->current(); auto find = std::find_if(peers->begin(), peers->end(), [&](const auto& peer) { return peer.uuid == original_msg.sender(); }); if (find == std::end(*peers)) { LOG(debug) << "Dropping message because it is not from a peer"; return; } if (!this->preliminary_filter_msg(msg)) { return; } if ((!original_msg.sender().empty()) && this->options->get_peer_message_signing() && (!this->crypto->verify(original_msg))) { LOG(error) << "Dropping message with invalid signature: " << original_msg.ShortDebugString().substr(0, MAX_MESSAGE_SIZE); return; } switch (msg.type()) { case PBFT_MSG_PREPREPARE : this->handle_preprepare(msg, original_msg); break; case PBFT_MSG_PREPARE : this->handle_prepare(msg, original_msg); break; case PBFT_MSG_COMMIT : this->handle_commit(msg, original_msg); break; case PBFT_MSG_VIEWCHANGE : this->handle_viewchange(msg, original_msg); break; case PBFT_MSG_NEWVIEW : this->handle_newview(msg, original_msg); break; default : throw std::runtime_error("Unsupported message type"); } } bool pbft::preliminary_filter_msg(const pbft_msg& msg) { if (!this->is_view_valid() && !(msg.type() == PBFT_MSG_VIEWCHANGE || msg.type() == PBFT_MSG_NEWVIEW)) { LOG(debug) << "Dropping message because local view is invalid"; return false; } if (auto t = msg.type();t == PBFT_MSG_PREPREPARE || t == PBFT_MSG_PREPARE || t == PBFT_MSG_COMMIT) { if (msg.view() != this->view.value()) { LOG(debug) << "Dropping message because it has the wrong view number"; return false; } } return true; } std::shared_ptr pbft::setup_request_operation(const bzn_envelope& request_env, const bzn::hash_t& request_hash) { const uint64_t request_seq = this->next_issued_sequence_number.value(); this->next_issued_sequence_number = request_seq + 1; auto op = this->operation_manager->find_or_construct(this->view.value(), request_seq, request_hash); op->record_request(request_env); return op; } void pbft::send_error_response(const bzn_envelope& request_env, const std::shared_ptr& session , const std::string& hash, const std::string& msg) const { database_msg req; if (session && req.ParseFromString(request_env.database_msg())) { swarm_error err; *err.mutable_message() = msg; *err.mutable_data() = std::to_string(req.header().nonce()); *err.mutable_hash() = hash; bzn_envelope response; response.set_swarm_error(err.SerializeAsString()); response.set_sender(this->uuid); response.set_timestamp(this->now()); response.set_swarm_id(this->options->get_swarm_id()); session->send_message(std::make_shared(response.SerializeAsString())); } } void pbft::handle_request(const bzn_envelope& request_env, const std::shared_ptr& session) { const auto hash = this->crypto->hash(request_env); if (request_env.timestamp() < (this->now() - MAX_REQUEST_AGE_MS) || request_env.timestamp() > (this->now() + MAX_REQUEST_AGE_MS)) { this->send_error_response(request_env, session, hash, TIMESTAMP_ERROR_MSG); LOG(info) << "Rejecting request because it is outside allowable timestamp range: " << request_env.ShortDebugString(); return; } // Allowing the maximum size to simply be bzn::MAX_VALUE_SIZE does not take into account the overhead that the // primary peer will add to the message when it re-broadcasts the request to the other peers in the swarm. This // additional overhead has been experimentally determined, on MacOS, to be 245 bytes. For now we shall use the magic // number overhead size of 512 when we limit const size_t OVERHEAD_SIZE{512}; if (!request_env.database_msg().empty() && request_env.database_msg().size() >= (bzn::MAX_VALUE_SIZE - OVERHEAD_SIZE)) { this->send_error_response(request_env, session, hash, TOO_LARGE_ERROR_MSG); LOG(warning) << "Rejecting request because it is too large [" << request_env.database_msg().size() << " bytes]"; return; } if (session) { if (this->sessions_waiting_on_forwarded_requests.find(hash) == this->sessions_waiting_on_forwarded_requests.end()) { this->add_session_to_sessions_waiting(hash, session); } } this->monitor->start_timer(hash); if (!this->is_primary()) { this->forward_request_to_primary(request_env); return; } if ((this->next_issued_sequence_number.value()) - this->last_executed_sequence_number > this->options->get_admission_window()) { LOG(debug) << "Rejecting request because we're too busy"; this->send_error_response(request_env, session, hash, TOO_BUSY_ERROR_MSG); return; } // keep track of what requests we've seen based on timestamp and only send preprepares once if (this->already_seen_request(request_env, hash)) { LOG(debug) << "Rejecting duplicate request: " << request_env.ShortDebugString().substr(0, MAX_MESSAGE_SIZE); this->send_error_response(request_env, session, hash, DUPLICATE_ERROR_MSG); return; } if ((!request_env.sender().empty()) && (!this->crypto->verify(request_env))) { LOG(error) << "Dropping message with invalid signature: " << request_env.ShortDebugString().substr(0, MAX_MESSAGE_SIZE); return; } this->saw_request(request_env, hash); auto op = setup_request_operation(request_env, hash); this->do_preprepare(op); } void pbft::forward_request_to_primary(const bzn_envelope& request_env) { auto primary = this->get_current_primary(); if (!primary.has_value()) { LOG(error) << "Would forward request to primary, but we don't know the primary so we can't"; return; } if (const auto endpoint = bzn::make_endpoint(*primary)) { this->node->send_signed_message(*endpoint, std::make_shared(request_env)); } else { LOG(error) << "Unable to forward request to primary: " << (*primary).uuid << " -- resolver error"; return; } const bzn::hash_t req_hash = this->crypto->hash(request_env); LOG(info) << "Forwarded request to primary, " << bzn::bytes_to_debug_string(req_hash); } void pbft::maybe_record_request(const bzn_envelope &request_env, const std::shared_ptr &op) { if (request_env.payload_case() == bzn_envelope::PayloadCase::PAYLOAD_NOT_SET || this->crypto->hash(request_env) != op->get_request_hash()) { LOG(trace) << "Not recording request because hashes do not match"; return; } op->record_request(request_env); } void pbft::handle_preprepare(const pbft_msg& msg, const bzn_envelope& original_msg) { // If we've already accepted a preprepare for this view+sequence, and it's not this one, then we should reject this one // Note that if we get the same preprepare more than once, we can still accept it const log_key_t log_key(msg.view(), msg.sequence()); if (auto lookup = this->accepted_preprepares.find(log_key); lookup != this->accepted_preprepares.end() && std::get<2>(lookup->second.value()) != msg.request_hash()) { LOG(debug) << "Rejecting preprepare: already accepted a conflicting one"; return; } else { auto op = this->operation_manager->find_or_construct(msg); auto env_copy{original_msg}; env_copy.clear_piggybacked_requests(); op->record_pbft_msg(msg, env_copy); this->maybe_record_request(msg.request(), op); if (original_msg.piggybacked_requests_size()) { this->maybe_record_request(original_msg.piggybacked_requests(0), op); } // This assignment will be redundant if we've seen this preprepare before, but that's fine accepted_preprepares[log_key] = persistent{this->storage, op->get_operation_key() , ACCEPTED_PREPREPARES_KEY, log_key}; this->do_preprepared(op); this->maybe_advance_operation_state(op); } } void pbft::handle_prepare(const pbft_msg& msg, const bzn_envelope& original_msg) { // Prepare messages are never rejected, assuming the sanity checks passed auto op = this->operation_manager->find_or_construct(msg); op->record_pbft_msg(msg, original_msg); this->maybe_advance_operation_state(op); } void pbft::handle_commit(const pbft_msg& msg, const bzn_envelope& original_msg) { // Commit messages are never rejected, assuming the sanity checks passed auto op = this->operation_manager->find_or_construct(msg); op->record_pbft_msg(msg, original_msg); this->maybe_advance_operation_state(op); } void pbft::handle_get_state(const pbft_membership_msg& msg, std::shared_ptr session) const { LOG(debug) << boost::format("Got request for state data for checkpoint: seq: %1%, hash: %2%") % msg.sequence() % msg.state_hash(); // get stable checkpoint for request checkpoint_t req_cp(msg.sequence(), msg.state_hash()); std::shared_ptr state; if (this->checkpoint_manager->get_latest_stable_checkpoint() != req_cp || !(state = this->get_checkpoint_state(req_cp))) { LOG(debug) << boost::format("I'm missing data for checkpoint: seq: %1%, hash: %2%") % msg.sequence() % msg.state_hash(); // TODO: send error response return; } if (this->get_view() > 1 && this->saved_newview.payload_case() != bzn_envelope::kPbft) { LOG(warning) << "No saved NEWVIEW message to send for state message. Not responding"; return; } pbft_membership_msg reply; reply.set_type(PBFT_MMSG_SET_STATE); reply.set_sequence(req_cp.first); reply.set_state_hash(req_cp.second); reply.set_state_data(*state); // TODO: the latest stable checkpoint may have advanced by the time we pull it here, which will cause the receiver // to reject this message. This is innocuous, but we could avoid the awkwardness by requesting a specific checkpoint // proof from the manager instead of the latest. for (const auto& pair : this->checkpoint_manager->get_latest_stable_checkpoint_proof()) { bzn_envelope checkpoint_claim; checkpoint_claim.ParseFromString(pair.second); *(reply.add_checkpoint_proof()) = checkpoint_claim; } if (this->saved_newview.payload_case() == bzn_envelope::kPbft) { reply.set_allocated_newview_msg(new bzn_envelope(this->saved_newview)); } auto msg_ptr = std::make_shared(this->wrap_message(reply).SerializeAsString()); session->send_message(msg_ptr); } void pbft::handle_set_state(const pbft_membership_msg& msg) { checkpoint_t cp(msg.sequence(), msg.state_hash()); for (size_t i{0}; i < static_cast(msg.checkpoint_proof_size()); i++) { this->checkpoint_manager->handle_checkpoint_message(msg.checkpoint_proof(i)); } if (this->checkpoint_manager->get_latest_stable_checkpoint() != cp) { LOG(info) << boost::format("Ignoring state message at %1% because it does not match latest stable checkpoint") % msg.sequence(); return; } if (this->checkpoint_manager->get_latest_local_checkpoint() == cp) { LOG(info) << boost::format("Ignoring state message at %1% because we already have that state") % msg.sequence(); return; } if (this->checkpoint_manager->get_latest_local_checkpoint().first > msg.sequence()) { LOG(info) << boost::format("Ignoring state message at %1% because we have a newer state") % msg.sequence(); return; } LOG(info) << boost::format("Adopting checkpoint %1% at seq %2%") % cp.second % cp.first; // TODO: validate the state data this->set_checkpoint_state(cp, msg.state_data()); // TODO: This should maybe use normal newview handling if (msg.has_newview_msg()) { pbft_msg newview; if (newview.ParseFromString(msg.newview_msg().pbft())) { this->view = newview.view(); LOG(info) << "setting view to " << this->view.value(); this->set_primary_from_newview(msg.newview_msg()); } } } void pbft::broadcast(const bzn_envelope& msg) { auto msg_ptr = std::make_shared(msg); for (const auto& peer : *this->peers_beacon->current()) { if (const auto endpoint = bzn::make_endpoint(peer)) { this->node->send_maybe_signed_message(*endpoint, msg_ptr); } else { LOG(error) << "Unable to broadcast to " << uuid << " -- resolver error"; } } } void pbft::async_signed_broadcast(const pbft_membership_msg& msg) { auto msg_env = std::make_shared(); msg_env->set_pbft_membership(msg.SerializeAsString()); this->async_signed_broadcast(std::move(msg_env)); } void pbft::async_signed_broadcast(const pbft_msg& msg) { auto msg_env = std::make_shared(); msg_env->set_pbft(msg.SerializeAsString()); this->async_signed_broadcast(std::move(msg_env)); } void pbft::async_signed_broadcast(const audit_message& msg) { auto msg_env = std::make_shared(); msg_env->set_audit(msg.SerializeAsString()); this->async_signed_broadcast(std::move(msg_env)); } void pbft::async_signed_broadcast(std::shared_ptr msg_env) { msg_env->set_timestamp(this->now()); auto targets = std::make_shared>(); for (const auto& peer : *this->peers_beacon->current()) { if (const auto endpoint = bzn::make_endpoint(peer)) { targets->emplace_back(*endpoint); } else { LOG(error) << "Unable to async_signed_broadcast to " << peer.uuid << "-- resolver error"; } } this->node->multicast_maybe_signed_message(std::move(targets), msg_env); } void pbft::maybe_advance_operation_state(const std::shared_ptr& op) { if (op->get_stage() == pbft_operation_stage::prepare && op->is_ready_for_commit(this->peers_beacon)) { this->do_prepared(op); } if (op->get_stage() == pbft_operation_stage::commit && op->is_ready_for_execute(this->peers_beacon)) { this->do_committed(op); } } pbft_msg pbft::common_message_setup(const std::shared_ptr& op, pbft_msg_type type) { pbft_msg msg; msg.set_view(op->get_view()); msg.set_sequence(op->get_sequence()); msg.set_request_hash(op->get_request_hash()); msg.set_type(type); return msg; } void pbft::do_preprepare(const std::shared_ptr& op) { LOG(debug) << "Doing preprepare for operation " << op->get_sequence(); pbft_msg msg = this->common_message_setup(op, PBFT_MSG_PREPREPARE); const bzn_envelope& req_env = op->get_request(); auto msg_env = std::make_shared(); if (req_env.payload_case() == bzn_envelope::kPbftInternalRequest) { msg.set_allocated_request(new bzn_envelope(req_env)); msg.set_request_type(pbft_request_type::PBFT_REQUEST_INTERNAL); } else { *(msg_env->add_piggybacked_requests()) = req_env; } msg_env->set_pbft(msg.SerializeAsString()); this->async_signed_broadcast(std::move(msg_env)); } void pbft::do_preprepared(const std::shared_ptr& op) { LOG(debug) << "Entering prepare phase for operation " << op->get_sequence(); pbft_msg msg = this->common_message_setup(op, PBFT_MSG_PREPARE); this->async_signed_broadcast(msg); } void pbft::do_prepared(const std::shared_ptr& op) { LOG(debug) << "Entering commit phase for operation " << op->get_sequence(); op->advance_operation_stage(pbft_operation_stage::commit, this->peers_beacon); pbft_msg msg = this->common_message_setup(op, PBFT_MSG_COMMIT); this->async_signed_broadcast(msg); } void pbft::do_committed(const std::shared_ptr& op) { LOG(debug) << "Operation " << op->get_sequence() << " " << bzn::bytes_to_debug_string(op->get_request_hash()) << " is committed-local"; op->advance_operation_stage(pbft_operation_stage::execute, this->peers_beacon); // If we have a pending session for this request, attach to the operation just before we pass off to the service. // If we were to do that before this moment, then maybe the pbft_operation we attached it to never gets executed and // it gets executed in a different view (earlier or later), so the client never gets a response. If we do it here, // then the only reason this pbft_operation instance wouldn't be executed eventually is if the service already has // a pbft_operation for this sequence, meaning we committed this before we got the request, or if we crash, which // kills the session anyway. const auto session = this->sessions_waiting_on_forwarded_requests.find(op->get_request_hash()); if (session != this->sessions_waiting_on_forwarded_requests.end() && !op->has_session()) { LOG(debug) << "Found pending session for this operation"; op->set_session(session->second); } else { LOG(debug) << "No pending session for this operation"; } if (this->audit_enabled) { audit_message msg; msg.mutable_pbft_commit()->set_operation(op->get_request_hash()); msg.mutable_pbft_commit()->set_sequence_number(op->get_sequence()); msg.mutable_pbft_commit()->set_sender_uuid(this->uuid); this->async_signed_broadcast(msg); } // TODO: this needs to be refactored to be service-agnostic if (op->has_db_request()) { LOG(debug) << "Posting operation " << op->get_sequence() << " for execution"; this->io_context->post(std::bind(&pbft_service_base::apply_operation, this->service, op)); } else { LOG(debug) << "No db_request for operation " << op->get_sequence(); // the service needs sequentially sequenced operations. post a null request to fill in this hole database_msg msg; msg.mutable_nullmsg(); bzn_envelope request; request.set_database_msg(msg.SerializeAsString()); auto new_op = std::make_shared(op->get_view(), op->get_sequence() , this->crypto->hash(request)); new_op->record_request(request); this->io_context->post(std::bind(&pbft_service_base::apply_operation, this->service, new_op)); } } bool pbft::is_primary() const { auto primary = this->get_current_primary(); return primary.has_value() && (*primary).uuid == this->uuid; } std::optional pbft::get_current_primary() const { return this->pinned_primary; } std::optional pbft::predict_primary(uint64_t view) const { if (view == this->view.value()) { return this->get_current_primary(); } auto peers = this->peers_beacon->ordered(); if (peers->size() == 0) { return std::nullopt; } return peers->at(view % peers->size()); } bzn_envelope pbft::wrap_message(bzn_envelope& env) const { env.set_sender(this->uuid); env.set_timestamp(this->now()); env.set_swarm_id(this->options->get_swarm_id()); this->crypto->sign(env); return env; } bzn_envelope pbft::wrap_message(const pbft_msg& msg) const { bzn_envelope result; result.set_pbft(msg.SerializeAsString()); return this->wrap_message(result); } bzn_envelope pbft::wrap_message(const pbft_membership_msg& msg) const { bzn_envelope result; result.set_pbft_membership(msg.SerializeAsString()); return this->wrap_message(result); } bzn_envelope pbft::wrap_message(const database_response& msg) const { bzn_envelope result; result.set_database_response(msg.SerializeAsString()); return this->wrap_message(result); } const bzn::uuid_t& pbft::get_uuid() const { return this->uuid; } void pbft::set_audit_enabled(bool setting) { this->audit_enabled = setting; } void pbft::notify_audit_failure_detected() { if (this->audit_enabled) { audit_message msg; msg.mutable_failure_detected()->set_sender_uuid(this->uuid); this->async_signed_broadcast(msg); } } void pbft::handle_failure() { std::lock_guard lock(this->pbft_lock); LOG (error) << "handle_failure - PBFT failure - invalidating current view and sending VIEWCHANGE to view: " << this->view.value() + 1; this->notify_audit_failure_detected(); this->initiate_viewchange(); } void pbft::initiate_viewchange(std::optional opt_view) { uint64_t view_to_set = opt_view.has_value() ? *opt_view : this->view.value() + 1; if (view_to_set > this->last_view_sent.value()) { pbft_msg view_change; std::vector requests; this->view_is_valid = false; auto msg_env = pbft::make_viewchange(view_to_set , this->checkpoint_manager->get_latest_stable_checkpoint().first , this->checkpoint_manager->get_latest_stable_checkpoint_proof() , this->operation_manager->prepared_operations_since( this->checkpoint_manager->get_latest_stable_checkpoint().first)); LOG(debug) << "Sending VIEWCHANGE for view " << view_to_set << " (currently at " << this->view.value() << ")"; this->async_signed_broadcast(std::move(msg_env)); this->last_view_sent = view_to_set; } else { LOG(debug) << "Not sending VIEWCHANGE for view " << view_to_set; } } std::shared_ptr pbft::get_checkpoint_state(const checkpoint_t& cp) const { // call service to retrieve state at this checkpoint return this->service->get_service_state(cp.first); } void pbft::set_checkpoint_state(const checkpoint_t& cp, const std::string& data) { // set the service state at the given checkpoint sequence // the service is expected to load the state and discard any pending operations // prior to the sequence number, then execute any subsequent operations sequentially this->service->set_service_state(cp.first, data); } size_t pbft::quorum_size() const { return 1 + (2*this->max_faulty_nodes()); } size_t pbft::max_faulty_nodes() const { return (this->peers_beacon->current()->size()-1)/3; } void pbft::handle_database_message(const bzn_envelope& msg, std::shared_ptr session) { LOG(debug) << "got database message"; if (!this->service->apply_operation_now(msg, session)) { std::lock_guard lock(this->pbft_lock); if (msg.timestamp() == 0) { bzn_envelope mutable_msg(msg); mutable_msg.set_timestamp(this->now()); this->handle_request(mutable_msg, session); } else { this->handle_request(msg, session); } } } void pbft::handle_database_response_message(const bzn_envelope& msg, std::shared_ptr /*session*/) { database_msg db_msg; std::lock_guard lock(this->pbft_lock); if (db_msg.ParseFromString(msg.database_response())) { if (const auto session_it = this->sessions_waiting_on_forwarded_requests.find(db_msg.header().request_hash()); session_it != this->sessions_waiting_on_forwarded_requests.end()) { session_it->second->send_message(std::make_shared(msg.SerializeAsString())); this->monitor->finish_timer(bzn::statistic::request_latency, db_msg.header().request_hash()); return; } LOG(warning) << "session not found for database response"; return; } LOG(error) << "failed to read database response"; } void pbft::handle_swarm_error_response_message(const bzn_envelope& msg, std::shared_ptr /*session*/) { swarm_error err; std::lock_guard lock(this->pbft_lock); if (err.ParseFromString(msg.swarm_error())) { if (const auto session_it = this->sessions_waiting_on_forwarded_requests.find(err.hash()); session_it != this->sessions_waiting_on_forwarded_requests.end()) { session_it->second->send_message(std::make_shared(msg.SerializeAsString())); this->monitor->finish_timer(bzn::statistic::request_latency, err.hash()); return; } LOG(warning) << "session not found for swarm error response"; return; } LOG(error) << "failed to read swarm error response"; } uint64_t pbft::get_low_water_mark() { return this->checkpoint_manager->get_latest_stable_checkpoint().first; } uint64_t pbft::get_high_water_mark() { return this->checkpoint_manager->get_latest_stable_checkpoint().first + HIGH_WATER_INTERVAL_IN_CHECKPOINTS * CHECKPOINT_INTERVAL; } bool pbft::is_view_valid() const { return this->view_is_valid.value(); } uint64_t pbft::get_view() const { return this->view.value(); } std::shared_ptr pbft::get_node() { return this->node; } bool pbft::is_peer(const bzn::uuid_t& sender) const { auto ptr = this->peers_beacon->current(); return std::find_if (ptr->begin(), ptr->end(), [&](const auto& address) { return sender == address.uuid; }) != ptr->end(); } std::map> pbft::validate_and_extract_checkpoint_hashes(const pbft_msg &viewchange_message) const { std::map> checkpoint_hashes; for (size_t i{0}; i < static_cast(viewchange_message.checkpoint_messages_size()); ++i) { const bzn_envelope& envelope{viewchange_message.checkpoint_messages(i)}; checkpoint_msg checkpoint_message; if ((this->options->get_peer_message_signing() && !this->crypto->verify(envelope)) || !this->is_peer(envelope.sender()) || !checkpoint_message.ParseFromString(envelope.checkpoint_msg())) { LOG (error) << "Checkpoint validation failure - unable to verify envelope"; continue; } checkpoint_hashes[checkpoint_t(checkpoint_message.sequence(), checkpoint_message.state_hash())].insert(envelope.sender()); } // filter checkpoint_hashes to only those pairs (checkpoint, senders) such that |senders| >= 2f+1 std::map> retval; std::copy_if(checkpoint_hashes.begin(), checkpoint_hashes.end(), std::inserter(retval, retval.end()) , [&](const auto& h) {return h.second.size() >= this->honest_member_size(this->peers_beacon->current()->size());}); return retval; } bool pbft::is_valid_prepared_proof(const prepared_proof& proof, uint64_t valid_checkpoint_sequence) const { const bzn_envelope& pre_prepare_envelope{proof.pre_prepare()}; if (!this->is_peer(pre_prepare_envelope.sender()) || (this->options->get_peer_message_signing() && !this->crypto->verify(pre_prepare_envelope))) { LOG(error) << "is_valid_prepared_proof - a pre prepare message has a bad envelope, or the sender is not in the peers list"; LOG(error) << "Sender: " << pre_prepare_envelope.sender() << " is " << (this->is_peer(pre_prepare_envelope.sender()) ? "" : "not ") << "a peer"; return false; } pbft_msg preprepare_message; if (!preprepare_message.ParseFromString(pre_prepare_envelope.pbft()) || (preprepare_message.sequence() <= valid_checkpoint_sequence) || preprepare_message.type() != PBFT_MSG_PREPREPARE) { LOG(error) << "is_valid_prepared_proof - a pre prepare message has an invalid sequence number, or is malformed"; return false; } std::set senders; for (int j{0}; j < proof.prepare_size(); ++j) { bzn_envelope prepare_envelope{proof.prepare(j)}; if (!this->is_peer(prepare_envelope.sender()) || (this->options->get_peer_message_signing() && !this->crypto->verify(prepare_envelope))) { LOG(error) << "is_valid_prepared_proof - a prepare message has a bad envelope, " "the sender may not be in the peer list, or the envelope failed cryptographic verification"; LOG(error) << "Sender: " << pre_prepare_envelope.sender() << " is " << (this->is_peer(pre_prepare_envelope.sender()) ? "" : "not ") << "a peer"; return false; } // does the sequence number, view number and hash match those of the pre prepare pbft_msg prepare_msg; if (!prepare_msg.ParseFromString(prepare_envelope.pbft()) || prepare_msg.type() != PBFT_MSG_PREPARE) { LOG(error) << "is_valid_prepared_proof - a prepare message is invalid"; return false; } if (preprepare_message.sequence() != prepare_msg.sequence() || preprepare_message.view() != prepare_msg.view() || preprepare_message.request_hash() != prepare_msg.request_hash()) { LOG(error) << "is_valid_prepared_proof - a pre prepare message has mismatched sequence, view or request hash"; return false; } senders.insert(prepare_envelope.sender()); } if (senders.size() < 2 * this->max_faulty_nodes() + 1) { LOG(error) << "is_valid_prepared_proof - not enough prepares in a prepared_proof"; return false; } return true; } bool pbft::is_valid_viewchange_message(const pbft_msg& viewchange_message, const bzn_envelope& original_msg) const { if (!this->is_peer(original_msg.sender()))// TODO: Rich - If redundant, keep this check, remove the other { LOG(debug) << "is_valid_viewchange_message - message not from a peer"; return false; } if (!(viewchange_message.view() > this->get_view())) { LOG(error) << "is_valid_viewchange_message - new view " << viewchange_message.view() << " is not greater than current view " << this->get_view(); return false; } auto valid_checkpoint_hashes{this->validate_and_extract_checkpoint_hashes(viewchange_message)}; if (valid_checkpoint_hashes.empty() && viewchange_message.sequence() != 0) { LOG(error) << "is_valid_viewchange_message - the checkpoint is invalid"; return false; } // If we do not have a valid checkpoint hash, then we must set the valid_checkpoint_sequence value to 0. uint64_t valid_checkpoint_sequence = (valid_checkpoint_hashes.empty() ? 0 : valid_checkpoint_hashes.begin()->first.first); // Snuck into KEP-902: Isabel notes that viewchange messages should not have sequences, and this will be refactored // out in the near future, but since we are using it we must make the comparison to the expected // valid_checkpoint_sequence if (viewchange_message.sequence() != valid_checkpoint_sequence) { LOG(error) << "is_valid_viewchange_message - the viewchange sequence: " << viewchange_message.sequence() << ", is different from the sequence that is expected: " << valid_checkpoint_sequence; return false; } // all the the prepared proofs are valid (contains a pre prepare and 2f+1 mathcin prepares) for (int i{0}; i < viewchange_message.prepared_proofs_size(); ++i) { if (!this->is_valid_prepared_proof(viewchange_message.prepared_proofs(i), valid_checkpoint_sequence)){ LOG(error) << "is_valid_viewchange_message - prepared proof is invalid"; return false; } } return true; } bool pbft::get_sequences_and_request_hashes_from_proofs( const pbft_msg& viewchange_msg , std::set>& sequence_request_pairs) const { for (int j{0}; j < viewchange_msg.prepared_proofs_size(); ++j) { // --- add the sequence/hash to a set auto const& prepared_proof = viewchange_msg.prepared_proofs(j); pbft_msg msg; if (const bzn_envelope& envelope{prepared_proof.pre_prepare()}; !this->is_peer(envelope.sender()) || !msg.ParseFromString(envelope.pbft())) { return false; } sequence_request_pairs.insert(std::make_pair(msg.sequence(), msg.request_hash())); } return true; } bool pbft::is_valid_newview_message(const pbft_msg& theirs, const bzn_envelope& original_theirs) const { auto expected_primary = this->predict_primary(theirs.view()); if (!expected_primary.has_value()) { LOG(error) << "rejecting newview because we have no peers list"; return false; } if (original_theirs.sender() != expected_primary.value().uuid) { LOG(error) << "rejecting newview because it is not from the primary of that view"; return false; } // - does it contain 2f+1 viewchange messages if (static_cast(theirs.viewchange_messages_size()) < 2 * this->max_faulty_nodes() + 1) { return false; } std::set viewchange_senders; pbft_msg viewchange_msg; for (int i{0};i < theirs.viewchange_messages_size();++i) { const bzn_envelope& original_msg{theirs.viewchange_messages(i)}; // - are each of those viewchange messages valid? if (!viewchange_msg.ParseFromString(original_msg.pbft()) || viewchange_msg.type() != PBFT_MSG_VIEWCHANGE || !this->is_valid_viewchange_message(viewchange_msg, original_msg)) { LOG(error) << "is_valid_newview_message - new view message contains invalid viewchange message"; return false; } if (viewchange_msg.view() != theirs.view()) { LOG(error) << "is_valid_newview_message - a view change message has a different view than the new view message"; return false; } viewchange_senders.insert(original_msg.sender()); } if (viewchange_senders.size() != size_t(theirs.viewchange_messages_size())) { LOG (error) << "is_valid_newview_message - unexpected viewchange message count"; return false; } std::map viewchange_envelopes_from_senders; for (int i{0};i < theirs.viewchange_messages_size();++i) { auto const& viewchange_env = theirs.viewchange_messages(i); viewchange_envelopes_from_senders[viewchange_env.sender()] = viewchange_env; } pbft_msg ours = this->build_newview(theirs.view(), viewchange_envelopes_from_senders, false); if (ours.pre_prepare_messages_size() != theirs.pre_prepare_messages_size()) { LOG(error) << "is_valid_newview_message - expected " << ours.pre_prepare_messages_size() << " preprepares in new view, found " << theirs.pre_prepare_messages_size(); return false; } for (int i{0};i < theirs.pre_prepare_messages_size();++i) { if (this->options->get_peer_message_signing() && !this->crypto->verify(theirs.pre_prepare_messages(i))) { LOG(error) << "is_valid_newview_message - unable to verify thier pre prepare message"; return false; } if (theirs.pre_prepare_messages(i).sender() != original_theirs.sender()) { LOG(error) << "is_valid_newview_message - pre prepare messaged does not come from the correct sender"; return false; } pbft_msg ours_pbft; pbft_msg theirs_pbft; ours_pbft.ParseFromString(ours.pre_prepare_messages(i).pbft()); theirs_pbft.ParseFromString(theirs.pre_prepare_messages(i).pbft()); if (ours_pbft.type() != theirs_pbft.type()) { LOG(error) << "Invalid new view message: (ours_pbft.type() != theirs_pbft.type()): ours:[" << ours_pbft.type() << "] theirs:[" << theirs_pbft.type() << "]"; return false; } else if (theirs_pbft.type() != PBFT_MSG_PREPREPARE) { LOG(error) << "Invalid new view message: (theirs_pbft.type() != PBFT_MSG_PREPREPARE): [" << theirs_pbft.type() << "]"; return false; } else if (ours_pbft.view() != theirs_pbft.view()) { LOG(error) << "Invalid new view message: (ours_pbft.view() != theirs_pbft.view()): ours:[" << ours_pbft.view() << "] theirs:[" << theirs_pbft.view() << "]"; return false; } else if (ours_pbft.sequence() != theirs_pbft.sequence()) { LOG(error) << "Invalid new view message: ours_pbft.sequence() != theirs_pbft.sequence(): ours sequence:[" << ours_pbft.sequence() << "] theirs:[" << theirs_pbft.sequence() << "]" ; return false; } else if (ours_pbft.request_hash() != theirs_pbft.request_hash()) { LOG(error) << "Invalid new view message: ours_pbft.request_hash() != theirs_pbft.request_hash(): ours: [" << ours_pbft.request_hash() << "] theirs:[" << theirs_pbft.request_hash() << "]"; return false; } } return true; } void pbft::fill_in_missing_pre_prepares(uint64_t max_checkpoint_sequence, uint64_t new_view, std::map& pre_prepares) const { uint64_t last_sequence_number{0}; for(const auto& pre_prepare : pre_prepares) { last_sequence_number = std::max(last_sequence_number, pre_prepare.first); } for (uint64_t i = max_checkpoint_sequence + 1; i <= last_sequence_number; ++i) { // -- create a new preprepare for a no-op operation using this sequence number if (pre_prepares.find(i) == pre_prepares.end()) { database_msg msg; msg.set_allocated_nullmsg(new database_nullmsg); auto request = new bzn_envelope; request->set_database_msg(msg.SerializeAsString()); // don't sign message as it doesn't have a valid sender pbft_msg msg2; msg2.set_view(new_view); msg2.set_sequence(i); msg2.set_type(PBFT_MSG_PREPREPARE); msg2.set_request_hash(this->crypto->hash(*request)); pre_prepares[i] = this->wrap_message(msg2); *(pre_prepares[i].add_piggybacked_requests()) = *request; } } } pbft_msg pbft::make_newview( uint64_t new_view_index , const std::map& viewchange_envelopes_from_senders , const std::map& pre_prepare_messages ) const { pbft_msg newview; newview.set_type(PBFT_MSG_NEWVIEW); newview.set_view(new_view_index); // V is the set of 2f+1 view change messages for (const auto &sender_viewchange_envelope: viewchange_envelopes_from_senders) { *(newview.add_viewchange_messages()) = sender_viewchange_envelope.second; } // O for (const auto& preprepare_message : pre_prepare_messages) { *(newview.add_pre_prepare_messages()) = preprepare_message.second; } return newview; } pbft_msg pbft::build_newview(uint64_t new_view, const std::map& viewchange_envelopes_from_senders , bool attach_reqs) const { // Computing O (set of new preprepares for new-view message) std::map pre_prepares; uint64_t max_checkpoint_sequence{0}; for (const auto& sender_viewchange_envelope : viewchange_envelopes_from_senders) { pbft_msg viewchange; viewchange.ParseFromString(sender_viewchange_envelope.second.pbft()); max_checkpoint_sequence = std::max(max_checkpoint_sequence, viewchange.sequence()); } // - for each of the 2f+1 viewchange messages for (const auto& sender_viewchange_envelope : viewchange_envelopes_from_senders) { // -- for each operation included in that viewchange message pbft_msg viewchange_message; viewchange_message.ParseFromString(sender_viewchange_envelope.second.pbft()); for (int i{0}; i < viewchange_message.prepared_proofs_size(); ++i) { const auto& prepared_proof = viewchange_message.prepared_proofs(i); // --- if we have not already created a new preprepare for an operation with that sequence number // ---- Create a new preprepare for that operation using its original sequence number // and request hash, but using the new view number pbft_msg pre_prepare; pre_prepare.ParseFromString(prepared_proof.pre_prepare().pbft()); if (pre_prepares.count(pre_prepare.sequence())>0) { continue; } uint64_t old_view = pre_prepare.view(); pre_prepare.set_view(new_view); if (pre_prepare.sequence() <= max_checkpoint_sequence) { continue; } auto env = this->wrap_message(pre_prepare); if (pre_prepare.request_type() == pbft_request_type::PBFT_REQUEST_PAYLOAD && attach_reqs) { auto op = this->operation_manager->find_or_construct(old_view, pre_prepare.sequence() , pre_prepare.request_hash()); if (op->has_request()) { *(env.add_piggybacked_requests()) = op->get_request(); } else { LOG(error) << "No request found for operation " << pre_prepare.sequence() << " in view " << old_view; } } pre_prepares[pre_prepare.sequence()] = env; } } this->fill_in_missing_pre_prepares(max_checkpoint_sequence, new_view, pre_prepares); return this->make_newview(new_view, viewchange_envelopes_from_senders, pre_prepares); } void pbft::save_checkpoint(const pbft_msg& msg) { for (int i{0}; i < msg.checkpoint_messages_size(); ++i) { const bzn_envelope& original_checkpoint{msg.checkpoint_messages(i)}; if (this->options->get_peer_message_signing() && !this->crypto->verify(original_checkpoint)) { LOG(error) << "ignoring invalid checkpoint message"; continue; } this->checkpoint_manager->handle_checkpoint_message(original_checkpoint); } } std::map pbft::map_request_to_hash(const bzn_envelope& env) { std::map piggybacked_request_hashes; for (int i{0}; i < env.piggybacked_requests_size(); ++i) { const bzn_envelope request{env.piggybacked_requests(i)}; const auto hash{this->crypto->hash(request)}; piggybacked_request_hashes[hash] = i; } return piggybacked_request_hashes; } void pbft::save_all_requests(const pbft_msg& msg, const bzn_envelope& original_msg) { const auto piggybacked_request_hashes{this->map_request_to_hash(original_msg)}; // go through the prepared proofs for (int i{0}; i < msg.prepared_proofs_size(); ++i) { const auto &prepared_proof = msg.prepared_proofs(i); // look at the pre-prepare for each proof if (prepared_proof.has_pre_prepare()) { const bzn_envelope &pre_prepare{prepared_proof.pre_prepare()}; pbft_msg pp_msg; pp_msg.ParseFromString(pre_prepare.pbft()); const hash_t& hash = pp_msg.request_hash(); // find the piggybacked request in original_msg that corresponds to the hash const auto piggybacked_request_it{piggybacked_request_hashes.find(hash)}; // if you find one, then save the request in the appropriate operation, because we used map::find, we know // that if we got a mapo::end then we didn't find a request if (piggybacked_request_it != piggybacked_request_hashes.end()) { const bzn_envelope &request_env{original_msg.piggybacked_requests(piggybacked_request_it->second)}; const uint64_t& pre_prep_view{pp_msg.view()}; auto op = this->operation_manager->find_or_construct( pre_prep_view, pp_msg.sequence(), pp_msg.request_hash()); op->record_request(request_env); } } } } void pbft::handle_viewchange(const pbft_msg& msg, const bzn_envelope& original_msg) { if (!this->is_valid_viewchange_message(msg, original_msg)) { LOG(error) << "handle_viewchange - invalid viewchange message, ignoring"; return; } save_all_requests(msg, original_msg); auto mutable_env{original_msg}; mutable_env.clear_piggybacked_requests(); this->valid_viewchange_messages_for_view[msg.view()][original_msg.sender()] = {this->storage, mutable_env, VALID_VIEWCHANGE_MESSAGES_FOR_VIEW_KEY, original_msg.sender(), msg.view()}; this->save_checkpoint(msg); if (this->is_view_valid() && this->valid_viewchange_messages_for_view[msg.view()].size() == this->max_faulty_nodes() + 1 && msg.view() > this->last_view_sent.value()) { this->initiate_viewchange(msg.view()); } const auto viewchange = std::find_if(this->valid_viewchange_messages_for_view.begin() , this->valid_viewchange_messages_for_view.end(), [&](const auto& p) { auto predicted = this->predict_primary(p.first); return predicted.has_value() && predicted.value().uuid == this->get_uuid() && (p.first > this->view.value()) && (p.second.size() == 2 * this->max_faulty_nodes() + 1); }); if (viewchange == this->valid_viewchange_messages_for_view.end()) { return; } std::map viewchange_envelopes_from_senders; for (const auto &sender_envelope : this->valid_viewchange_messages_for_view[msg.view()]) { const auto &sender{sender_envelope.first}; const auto &viewchange_envelope{sender_envelope.second.value()}; viewchange_envelopes_from_senders[sender] = viewchange_envelope; } auto newview_msg = this->build_newview(viewchange->first, viewchange_envelopes_from_senders); LOG(debug) << "Sending NEWVIEW for view " << this->view.value() + 1; this->async_signed_broadcast(newview_msg); } void pbft::handle_newview(const pbft_msg& msg, const bzn_envelope& original_msg) { if (!this->is_valid_newview_message(msg, original_msg)) { LOG (debug) << "handle_newview - ignoring invalid NEWVIEW message "; return; } pbft_msg viewchange; viewchange.ParseFromString(msg.viewchange_messages(0).pbft()); // this is redundant (but harmless) unless it's a new node this->save_checkpoint(viewchange); // initially set next sequence from viewchange then update from preprepares later this->next_issued_sequence_number = viewchange.sequence() + 1; this->set_primary_from_newview(original_msg); LOG(debug) << "handle_newview - received valid NEWVIEW message"; this->view = msg.view(); this->view_is_valid = true; // after moving to the new view processes the preprepares LOG(debug) << "Processing " << msg.pre_prepare_messages_size() << " pre-prepares"; for (size_t i{0}; i < static_cast(msg.pre_prepare_messages_size()); ++i) { const bzn_envelope original_msg2 = msg.pre_prepare_messages(i); pbft_msg msg2; if (msg2.ParseFromString(original_msg2.pbft())) { this->handle_preprepare(msg2, original_msg2); this->next_issued_sequence_number = msg2.sequence() + 1; } } // save the newview message for providing with state messages this->saved_newview = original_msg; } std::string pbft::get_name() { return "pbft"; } bzn::json_message pbft::get_status() { bzn::json_message status; std::string status_str; std::lock_guard lock(this->pbft_lock); status_str += "my uuid: " + this->uuid + "\n"; auto primary = this->get_current_primary(); if (primary.has_value()) { status_str += "primary: " + primary.value().uuid + "\n"; status["primary"]["host"] = primary.value().host; status["primary"]["host_port"] = primary.value().port; status["primary"]["name"] = primary.value().name; status["primary"]["uuid"] = primary.value().uuid; } else { status_str += "primary unknown\n"; } status_str += "view: " + std::to_string(this->get_view()) + "\n"; status_str += "last exec: " + std::to_string(this->last_executed_sequence_number) + "\n"; status_str += "last local cp: " + std::to_string(this->checkpoint_manager->get_latest_local_checkpoint().first) + "\n"; status_str += "last stable cp: " + std::to_string(this->checkpoint_manager->get_latest_stable_checkpoint().first) + "\n"; if (this->is_primary()) { status_str += "next seq: " + std::to_string(this->next_issued_sequence_number.value()); } LOG(debug) << "status:\n" << status_str; status["outstanding_operations_count"] = uint64_t(this->operation_manager->held_operations_count()); status["is_primary"] = this->is_primary(); status["latest_stable_checkpoint"]["sequence_number"] = this->checkpoint_manager->get_latest_stable_checkpoint().first; status["latest_stable_checkpoint"]["hash"] = this->checkpoint_manager->get_latest_stable_checkpoint().second; status["latest_checkpoint"]["sequence_number"] = this->checkpoint_manager->get_latest_local_checkpoint().first; status["latest_checkpoint"]["hash"] = this->checkpoint_manager->get_latest_local_checkpoint().second; status["next_issued_sequence_number"] = this->next_issued_sequence_number.value(); status["view"] = this->view.value(); status["peer_index"] = bzn::json_message(); for (const auto& p : *this->peers_beacon->current()) { bzn::json_message peer; peer["host"] = p.host; peer["port"] = p.port; peer["name"] = p.name; peer["uuid"] = p.uuid; status["peer_index"].append(peer); } return status; } const peer_address_t& pbft::get_peer_by_uuid(const std::string& uuid) const { for (auto const& peer : *this->peers_beacon->current()) { if (peer.uuid == uuid) { return peer; } } // something went wrong. this uuid should exist throw std::runtime_error("peer missing from peers list"); } timestamp_t pbft::now() const { return static_cast(std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count()); } void pbft::saw_request(const bzn_envelope& req, const request_hash_t& hash) { this->recent_requests.insert(std::make_pair(req.timestamp(), std::make_pair(req.sender(), hash))); this->recent_requests.erase(this->recent_requests.begin(), this->recent_requests.upper_bound(this->now() - MAX_REQUEST_AGE_MS)); } bool pbft::already_seen_request(const bzn_envelope& req, const request_hash_t& hash) const { auto range = this->recent_requests.equal_range(req.timestamp()); for (auto r = range.first; r != range.second; r++) { if (r->second.first == req.sender() && r->second.second == hash) { return true; } } return false; } std::shared_ptr pbft::make_viewchange( uint64_t new_view , uint64_t base_sequence_number , const std::unordered_map& stable_checkpoint_proof , const std::map>& prepared_operations) { auto env = std::make_shared(); pbft_msg viewchange; viewchange.set_type(PBFT_MSG_VIEWCHANGE); viewchange.set_view(new_view); viewchange.set_sequence(base_sequence_number); // base_sequence_number = n = sequence # of last valid checkpoint // C = a set of local 2*f + 1 valid checkpoint messages for (const auto& msg : stable_checkpoint_proof) { bzn_envelope envelope; envelope.ParseFromString(msg.second); *(viewchange.add_checkpoint_messages()) = envelope; } // P = a set (of client requests) containing a set P_m for each request m that prepared at i with a sequence # higher than n // P_m = the pre prepare and the 2 f + 1 prepares // get the set of operations, from each operation get the messages.. for (const auto& operation : prepared_operations) { prepared_proof* prepared_proof = viewchange.add_prepared_proofs(); auto pre_prepare = operation.second->get_preprepare(); if (!operation.second->has_config_request()) { auto req = operation.second->get_request(); *(env->add_piggybacked_requests()) = req; } prepared_proof->set_allocated_pre_prepare(new bzn_envelope(pre_prepare)); for (const auto& sender_envelope : operation.second->get_prepares()) { *(prepared_proof->add_prepare()) = sender_envelope.second; } } env->set_pbft(viewchange.SerializeAsString()); return env; } size_t pbft::faulty_nodes_bound(size_t swarm_size) { return (swarm_size - 1)/3; } size_t pbft::honest_member_size(size_t swarm_size) { return pbft::faulty_nodes_bound(swarm_size) + 1; } size_t pbft::honest_majority_size(size_t swarm_size) { return pbft::faulty_nodes_bound(swarm_size) * 2 + 1; } uint32_t pbft::generate_random_number(uint32_t min, uint32_t max) { std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution dist(min, max); return dist(gen); } void pbft::add_session_to_sessions_waiting(const std::string& msg_hash, std::shared_ptr session) { if (session) { LOG(debug) << "Holding session for request " << bzn::bytes_to_debug_string(msg_hash); this->sessions_waiting_on_forwarded_requests[msg_hash] = session; session->add_shutdown_handler([msg_hash, this, session]() { std::lock_guard lock(this->pbft_lock); auto it = this->sessions_waiting_on_forwarded_requests.find(msg_hash); if (it != this->sessions_waiting_on_forwarded_requests.end() && (it->second->get_session_id() == session->get_session_id())) { this->sessions_waiting_on_forwarded_requests.erase(it); } }); } } void pbft::initialize_persistent_state() { persistent::init_kv_container(this->storage, ACCEPTED_PREPREPARES_KEY, this->accepted_preprepares); persistent::init_kv_container2(this->storage, VALID_VIEWCHANGE_MESSAGES_FOR_VIEW_KEY, this->valid_viewchange_messages_for_view); } checkpoint_t pbft::latest_stable_checkpoint() const { return this->checkpoint_manager->get_latest_stable_checkpoint(); } std::shared_ptr pbft::peers() const { return this->peers_beacon; } void pbft::set_primary_from_newview(const bzn_envelope& new_view) { auto peers = this->peers_beacon->current(); auto find = std::find_if(peers->begin(), peers->end(), [&](const auto& peer) { return peer.uuid == new_view.sender(); }); if (find == std::end(*peers)) { LOG(error) << "Cannot operate in this view because its primary is not in my peers list; voting for view change"; this->pinned_primary = std::nullopt; this->initiate_viewchange(); return; } this->pinned_primary = *find; } ================================================ FILE: pbft/pbft.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { const std::chrono::milliseconds HEARTBEAT_INTERVAL{std::chrono::milliseconds(5000)}; const uint64_t CHECKPOINT_INTERVAL = 100; //TODO: KEP-574 const double HIGH_WATER_INTERVAL_IN_CHECKPOINTS = 200.0; //TODO: KEP-574 const uint64_t MAX_REQUEST_AGE_MS = 3600000; // 1 hour const std::string NOOP_REQUEST_HASH = ""; const std::string VIEW_KEY{"view"}; const std::string NEXT_ISSUED_SEQUENCE_NUMBER_KEY{"next_issued_sequence_number"}; const std::string ACCEPTED_PREPREPARES_KEY{"accepted_preprepares"}; const std::string VIEW_IS_VALID_KEY{"view_is_valid"}; const std::string LAST_VIEW_SENT_KEY{"last_view_sent"}; const std::string VALID_VIEWCHANGE_MESSAGES_FOR_VIEW_KEY{"valid_viewchange_messages_for_view"}; const std::string SAVED_NEWVIEW_KEY{"saved_newview"}; const std::string TIMESTAMP_ERROR_MSG{"INVALID TIMESTAMP"}; const std::string TOO_LARGE_ERROR_MSG{"REQUEST TOO LARGE"}; const std::string TOO_BUSY_ERROR_MSG{"SERVER TOO BUSY"}; const std::string DUPLICATE_ERROR_MSG{"DUPLICATE REQUEST"}; } namespace bzn { namespace test { // fwd declare test as it's not in the same namespace... class pbft_test_database_response_is_forwarded_to_session_Test; class pbft_test_add_session_to_sessions_waiting_can_add_a_session_and_shutdown_handler_removes_session_from_sessions_waiting_Test; class pbft_test_pbft_wrap_message_sets_swarm_id_Test; class pbft_test_ensure_save_all_requests_records_requests_Test; } using request_hash_t = std::string; using timestamp_t = uint64_t; class pbft final : public bzn::pbft_base, public bzn::status_provider_base, public std::enable_shared_from_this { public: pbft( std::shared_ptr node , std::shared_ptr io_context , std::shared_ptr peers , std::shared_ptr options , std::shared_ptr service , std::shared_ptr crypto , std::shared_ptr operation_manager , std::shared_ptr storage , std::shared_ptr monitor ); void start() override; void handle_message(const pbft_msg& msg, const bzn_envelope& original_msg) override; void handle_database_message(const bzn_envelope& msg, std::shared_ptr session) override; void handle_database_response_message(const bzn_envelope& msg, std::shared_ptr session); void handle_swarm_error_response_message(const bzn_envelope& msg, std::shared_ptr session); bool is_primary() const override; std::optional get_current_primary() const override; std::optional predict_primary(uint64_t view) const override; const bzn::uuid_t& get_uuid() const override; void handle_failure() override; void set_audit_enabled(bool setting); uint64_t get_low_water_mark(); uint64_t get_high_water_mark(); std::string get_name() override; bool is_view_valid() const; uint64_t get_view() const; bzn::json_message get_status() override; bool is_valid_viewchange_message(const pbft_msg& msg, const bzn_envelope& original_msg) const; bool is_valid_newview_message(const pbft_msg& theirs, const bzn_envelope& original_theirs) const; bool is_valid_prepared_proof(const prepared_proof& proof, uint64_t valid_checkpoint_sequence) const; std::shared_ptr get_node(); const peer_address_t& get_peer_by_uuid(const std::string& uuid) const override; /* * maximum number of tolerable faults (this can be a parameter, but for now we assume it has the worst-case value) * f = floor( (n-1) / 3 ) */ static size_t faulty_nodes_bound(size_t swarm_size); /* * minimum quorum size such that the majority of the quorum is guaranteed to be honest * 2f+1 */ static size_t honest_majority_size(size_t swarm_size); /* * minimum quorum size such that at least one member is guaranteed to be honest */ static size_t honest_member_size(size_t swarm_size); static uint32_t generate_random_number(uint32_t min, uint32_t max); checkpoint_t latest_stable_checkpoint() const; std::shared_ptr peers() const override; private: bool preliminary_filter_msg(const pbft_msg& msg); void handle_request(const bzn_envelope& request, const std::shared_ptr& session = nullptr); void handle_preprepare(const pbft_msg& msg, const bzn_envelope& original_msg); void handle_prepare(const pbft_msg& msg, const bzn_envelope& original_msg); void handle_commit(const pbft_msg& msg, const bzn_envelope& original_msg); void handle_checkpoint(const pbft_msg& msg, const bzn_envelope& original_msg); void handle_get_state(const pbft_membership_msg& msg, std::shared_ptr session) const; void handle_set_state(const pbft_membership_msg& msg); void handle_config_message(const pbft_msg& msg, const std::shared_ptr& op); void handle_viewchange(const pbft_msg& msg, const bzn_envelope& original_msg); void handle_newview(const pbft_msg& msg, const bzn_envelope& original_msg); void maybe_advance_operation_state(const std::shared_ptr& op); void do_preprepare(const std::shared_ptr& op); void do_preprepared(const std::shared_ptr& op); void do_prepared(const std::shared_ptr& op); void do_committed(const std::shared_ptr& op); void handle_bzn_message(const bzn_envelope& msg, std::shared_ptr session); void handle_membership_message(const bzn_envelope& msg, std::shared_ptr session = nullptr); bzn_envelope wrap_message(bzn_envelope& env) const; bzn_envelope wrap_message(const pbft_msg& message) const; bzn_envelope wrap_message(const pbft_membership_msg&) const; bzn_envelope wrap_message(const database_response&) const; void async_signed_broadcast(const pbft_msg& msg); void async_signed_broadcast(const pbft_membership_msg& message); void async_signed_broadcast(const audit_message& message); void async_signed_broadcast(std::shared_ptr message); pbft_msg common_message_setup(const std::shared_ptr& op, pbft_msg_type type); std::shared_ptr setup_request_operation(const bzn_envelope& msg , const bzn::hash_t& request_hash); void forward_request_to_primary(const bzn_envelope& request_env); void broadcast(const bzn_envelope& message); void send_error_response(const bzn_envelope& request_env, const std::shared_ptr& session , const std::string& hash, const std::string& msg) const; void handle_audit_heartbeat_timeout(const boost::system::error_code& ec); void notify_audit_failure_detected(); std::shared_ptr get_checkpoint_state(const checkpoint_t& cp) const; void set_checkpoint_state(const checkpoint_t& cp, const std::string& data); inline size_t quorum_size() const; size_t max_faulty_nodes() const; void initialize_persistent_state(); void maybe_record_request(const bzn_envelope &env, const std::shared_ptr &op); timestamp_t now() const; bool already_seen_request(const bzn_envelope& msg, const request_hash_t& hash) const; void saw_request(const bzn_envelope& msg, const request_hash_t& hash); // VIEWCHANGE/NEWVIEW Helper methods void initiate_viewchange(std::optional opt_view = std::nullopt); std::shared_ptr make_viewchange(uint64_t new_view, uint64_t n, const std::unordered_map& stable_checkpoint_proof, const std::map>& prepared_operations); pbft_msg make_newview(uint64_t new_view_index, const std::map& viewchange_envelopes_from_senders, const std::map& pre_prepare_messages) const; pbft_msg build_newview(uint64_t new_view, const std::map& viewchange_envelopes_from_senders, bool attach_reqs = true) const; std::map> validate_and_extract_checkpoint_hashes(const pbft_msg &viewchange_message) const; void save_checkpoint(const pbft_msg& msg); void fill_in_missing_pre_prepares(uint64_t max_checkpoint_sequence, uint64_t new_view, std::map& pre_prepares) const; bool is_peer(const bzn::uuid_t& peer) const; bool get_sequences_and_request_hashes_from_proofs( const pbft_msg& viewchange_msg, std::set>& sequence_request_pairs) const; void add_session_to_sessions_waiting(const std::string &msg_hash, std::shared_ptr session); std::map map_request_to_hash(const bzn_envelope& original_msg); void save_all_requests(const pbft_msg& msg, const bzn_envelope& original_msg); void set_primary_from_newview(const bzn_envelope& env); std::shared_ptr storage; // Using 1 as first value here to distinguish from default value of 0 in protobuf persistent view{storage, uint64_t{1}, VIEW_KEY}; persistent next_issued_sequence_number{storage, 1, NEXT_ISSUED_SEQUENCE_NUMBER_KEY}; uint64_t last_executed_sequence_number{0}; std::shared_ptr node; const bzn::uuid_t uuid; std::shared_ptr options; std::shared_ptr service; std::mutex pbft_lock; std::map> accepted_preprepares; std::once_flag start_once; const std::shared_ptr io_context; std::unique_ptr audit_heartbeat_timer; bool audit_enabled = true; std::multimap> recent_requests; std::shared_ptr crypto; // VIEWCHANGE/NEWVIEW members persistent view_is_valid{storage, true, VIEW_IS_VALID_KEY}; persistent last_view_sent{storage, 0, LAST_VIEW_SENT_KEY}; std::map>> valid_viewchange_messages_for_view; // set of bzn_envelope, strings since we cannot have a set bzn_envelope saved_newview; std::optional pinned_primary; std::shared_ptr operation_manager; std::shared_ptr peers_beacon; std::shared_ptr checkpoint_manager; std::shared_ptr monitor; FRIEND_TEST(pbft_viewchange_test, pbft_with_invalid_view_drops_messages); FRIEND_TEST(pbft_viewchange_test, test_make_signed_envelope); FRIEND_TEST(pbft_viewchange_test, test_is_peer); FRIEND_TEST(pbft_viewchange_test, validate_and_extract_checkpoint_hashes); FRIEND_TEST(pbft_viewchange_test, validate_viewchange_checkpoints); FRIEND_TEST(pbft_viewchange_test, test_is_valid_viewchange_message); FRIEND_TEST(pbft_viewchange_test, make_viewchange_makes_valid_message); FRIEND_TEST(pbft_viewchange_test, test_prepared_operations_since_last_checkpoint); FRIEND_TEST(pbft_viewchange_test, test_fill_in_missing_pre_prepares); FRIEND_TEST(pbft_viewchange_test, test_save_checkpoint); FRIEND_TEST(pbft_viewchange_test, test_handle_viewchange); FRIEND_TEST(pbft_viewchange_test, is_valid_viewchange_does_not_throw_if_no_checkpoint_yet); FRIEND_TEST(pbft_newview_test, test_pre_prepares_contiguous); FRIEND_TEST(pbft_newview_test, make_newview); FRIEND_TEST(pbft_newview_test, build_newview); FRIEND_TEST(pbft_newview_test, primary_handle_newview); FRIEND_TEST(pbft_newview_test, backup_handle_newview); FRIEND_TEST(pbft_newview_test, validate_and_extract_checkpoint_hashes); FRIEND_TEST(pbft_newview_test, test_get_primary); FRIEND_TEST(pbft_newview_test, get_sequences_and_request_hashes_from_proofs); FRIEND_TEST(pbft_newview_test, test_last_sequence_in_newview_prepared_proofs); FRIEND_TEST(bzn::test::pbft_test, database_response_is_forwarded_to_session); FRIEND_TEST(bzn::test::pbft_test, add_session_to_sessions_waiting_can_add_a_session_and_shutdown_handler_removes_session_from_sessions_waiting); FRIEND_TEST(bzn::test::pbft_test, pbft_wrap_message_sets_swarm_id); FRIEND_TEST(bzn::test::pbft_test, ensure_save_all_requests_records_requests); friend class pbft_proto_test; friend class pbft_viewchange_test; std::map> sessions_waiting_on_forwarded_requests; }; } // namespace bzn ================================================ FILE: pbft/pbft_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include #include namespace bzn { using client_t = std::string; //placeholder class pbft_base { public: virtual void start() = 0; virtual void handle_message(const pbft_msg& msg, const bzn_envelope& original_msg) = 0; virtual void handle_database_message(const bzn_envelope& msg, std::shared_ptr session) = 0; virtual bool is_primary() const = 0; virtual std::optional get_current_primary() const = 0; virtual std::optional predict_primary(uint64_t view) const = 0; virtual const bzn::uuid_t& get_uuid() const = 0; virtual void handle_failure() = 0; virtual const peer_address_t& get_peer_by_uuid(const std::string& uuid) const = 0; virtual std::shared_ptr peers() const = 0; virtual ~pbft_base() = default; }; } ================================================ FILE: pbft/pbft_checkpoint_manager.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include namespace { const std::chrono::milliseconds CHECKPOINT_CATCHUP_GRACE_PERIOD{std::chrono::milliseconds(100)}; } using namespace bzn; pbft_checkpoint_manager::pbft_checkpoint_manager( std::shared_ptr io_context, std::shared_ptr storage, std::shared_ptr peers_beacon, std::shared_ptr node ) : io_context(std::move(io_context)) , storage(std::move(storage)) , peers_beacon(std::move(peers_beacon)) , node(std::move(node)) { this->init_persists(); } void pbft_checkpoint_manager::start() { this->node->register_for_message(bzn_envelope::kCheckpointMsg, std::bind(&pbft_checkpoint_manager::handle_checkpoint_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2)); } checkpoint_t pbft_checkpoint_manager::get_latest_stable_checkpoint() const { std::lock_guard lock(this->lock); return this->latest_stable_checkpoint.value(); } checkpoint_t pbft_checkpoint_manager::get_latest_local_checkpoint() const { std::lock_guard lock(this->lock); return this->latest_local_checkpoint.value(); } void pbft_checkpoint_manager::local_checkpoint_reached(const bzn::checkpoint_t& cp) { std::lock_guard lock(this->lock); LOG(info) << "reached local checkpoint at " << cp.first << " (" << bytes_to_debug_string(cp.second) << ")"; if (cp.first <= this->latest_local_checkpoint.value().first) { throw std::runtime_error("reached a checkpoint at " + std::to_string(cp.first) + " which is not newer than the previous checkpoint at " + std::to_string(this->latest_local_checkpoint.value().first)); } this->latest_local_checkpoint = cp; // Compose and send our own cp message checkpoint_msg cp_msg; cp_msg.set_sequence(cp.first); cp_msg.set_state_hash(cp.second); bzn_envelope msg; msg.set_checkpoint_msg(cp_msg.SerializeAsString()); auto msg_ptr = std::make_shared(msg); for (const auto& peer : *(this->peers_beacon->current())) { if (const auto endpoint = bzn::make_endpoint(peer)) { this->node->send_maybe_signed_message(*endpoint, msg_ptr); } else { LOG(error) << "Unable to send_signed_message to " << peer.uuid << "-- resolver error"; } } if (cp.first == this->latest_local_checkpoint.value().first && cp.second != this->latest_local_checkpoint.value().second) { LOG(error) << "our checkpoint state disagrees with swarm! sending state request to reconcile"; this->send_state_request(); } // We will do the stabilization check upon receiving the message from ourself } void pbft_checkpoint_manager::handle_checkpoint_message(const bzn_envelope& msg, std::shared_ptr /*session*/) { std::lock_guard lock(this->lock); checkpoint_msg inner; if (!inner.ParseFromString(msg.checkpoint_msg())) { LOG(error) << "Failed to parse payload of checkpoint message: " << bytes_to_debug_string(msg.checkpoint_msg()); return; } if (inner.sequence() < this->latest_local_checkpoint.value().first) { LOG(debug) << "Ignoring old checkpoint message at " << inner.sequence(); return; } // check that sender is in current config LOG(debug) << boost::format("Got checkpoint message for seq %1% from %2%") % inner.sequence() % msg.sender(); checkpoint_t cp(inner.sequence(), inner.state_hash()); if (cp.first == this->latest_stable_checkpoint.value().first) { if (cp == this->latest_stable_checkpoint.value()) { // save the message as more evidence on the current stable checkpoint (may matter as configs change) this->latest_stable_checkpoint_proof[msg.sender()] = persistent { this->storage, msg.SerializeAsString(), STABLE_CHECKPOINT_PROOF_KEY, msg.sender() }; } else { LOG(error) << "Ignoring checkpoint message from " << msg.sender() << "; it conflicts with latest stable"; return; } } else { if (this->partial_checkpoint_proofs[cp].count(msg.sender()) == 0) { this->partial_checkpoint_proofs[cp][msg.sender()] = persistent{ this->storage, msg.SerializeAsString(), PARTIAL_CHECKPOINT_PROOFS_KEY, cp, msg.sender() }; } this->maybe_stabilize_checkpoint(cp); } } void pbft_checkpoint_manager::maybe_stabilize_checkpoint(const checkpoint_t& cp) { auto peers = this->peers_beacon->current(); // how many messages do we have supporting this checkpoint from peers in the current config? size_t checkpoint_attestants = std::count_if(this->partial_checkpoint_proofs[cp].begin(), this->partial_checkpoint_proofs[cp].end(), [&peers](const auto& pair) { return peers->end() != std::find_if( peers->begin(), peers->end(), [&pair](const auto& peer) { return peer.uuid == pair.first; } ); } ); if (checkpoint_attestants >= pbft::honest_member_size(peers->size())) { this->stabilize_checkpoint(cp); if (this->latest_local_checkpoint.value().first < cp.first) { LOG(info) << "We are behind the newly stable checkpoint; scheduling delayed state request"; this->send_delayed_state_request(cp); } else if (this->latest_local_checkpoint.value().first == cp.first && this->latest_stable_checkpoint.value().second != cp.second) { LOG(error) << "our checkpoint state disagrees with swarm! sending state request to reconcile"; this->send_state_request(); } } } void pbft_checkpoint_manager::stabilize_checkpoint(const bzn::checkpoint_t& cp) { LOG(info) << "Checkpoint at " << cp.first << " is now stable (" << bytes_to_debug_string(cp.second) << ")"; // update the checkpoint this->latest_stable_checkpoint = cp; // clear the old proof for (auto& pair : this->latest_stable_checkpoint_proof) { pair.second.destroy(); } this->latest_stable_checkpoint_proof.clear(); // copy over the new proof for (const auto& pair : this->partial_checkpoint_proofs[cp]) { this->latest_stable_checkpoint_proof[pair.first] = {this->storage, pair.second.value(), STABLE_CHECKPOINT_PROOF_KEY, pair.first}; } // TODO: don't store incomplete proofs seperately // clear old data // for each partial proof for (auto& map_pair : this->partial_checkpoint_proofs) { const checkpoint_t& this_cp = map_pair.first; // if it's not newer than the newly stabilized proof if (this_cp.first > cp.first) { continue; } // delete all the entries for (auto& msg_pair : map_pair.second) { msg_pair.second.destroy(); } } // now remove them from memory as well for (auto it = this->partial_checkpoint_proofs.begin(); it != this->partial_checkpoint_proofs.end();) { auto seq = it->first.first; if (seq > cp.first) { it++; } else { it = this->partial_checkpoint_proofs.erase(it); } } } void pbft_checkpoint_manager::send_delayed_state_request(const checkpoint_t& cp) { this->trigger_catchup_timer = this->io_context->make_unique_steady_timer(); this->trigger_catchup_timer->expires_from_now(CHECKPOINT_CATCHUP_GRACE_PERIOD); this->trigger_catchup_timer->async_wait( [cp, weak_this = weak_from_this()](auto ec) { if (ec) { return; } auto strong_this = weak_this.lock(); // only request state if we are still behind the stable checkpoint if (strong_this && strong_this->latest_local_checkpoint.value().first < cp.first) { std::lock_guard lock(strong_this->lock); strong_this->send_state_request(); } } ); } void pbft_checkpoint_manager::send_state_request() { pbft_membership_msg msg; msg.set_type(PBFT_MMSG_GET_STATE); msg.set_sequence(this->latest_stable_checkpoint.value().first); msg.set_state_hash(this->latest_stable_checkpoint.value().second); uint32_t selected = pbft::generate_random_number(0, this->latest_stable_checkpoint_proof.size() - 1); auto it = this->latest_stable_checkpoint_proof.begin(); std::advance(it, selected); auto selected_peer = (*it).first; LOG(info) << "Requesting state at " << msg.sequence() << " from " << selected_peer; auto msg_ptr = std::make_shared(); msg_ptr->set_pbft_membership(msg.SerializeAsString()); this->node->send_maybe_signed_message(selected_peer, msg_ptr); } void pbft_checkpoint_manager::init_persists() { persistent::init_kv_container(this->storage, STABLE_CHECKPOINT_PROOF_KEY, this->latest_stable_checkpoint_proof); persistent::init_kv_container2(this->storage, PARTIAL_CHECKPOINT_PROOFS_KEY, this->partial_checkpoint_proofs); } std::unordered_map pbft_checkpoint_manager::get_latest_stable_checkpoint_proof() const { std::lock_guard lock(this->lock); std::unordered_map result; for (const auto& pair : this->latest_stable_checkpoint_proof) { result[pair.first] = pair.second.value(); } return result; } size_t pbft_checkpoint_manager::partial_checkpoint_proofs_count() const { std::lock_guard lock(this->lock); return this->partial_checkpoint_proofs.size(); } ================================================ FILE: pbft/pbft_checkpoint_manager.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include namespace bzn { const std::string LATEST_STABLE_CHECKPOINT_KEY{"stable_checkpoint"}; const std::string STABLE_CHECKPOINT_PROOF_KEY{"stable_checkpoint_proof"}; const std::string LATEST_LOCAL_CHECKPOINT_KEY{"local_checkpoint"}; const std::string PARTIAL_CHECKPOINT_PROOFS_KEY{"partial_checkpoint_proofs"}; const std::string INITIAL_CHECKPOINT_HASH = ""; using checkpoint_t = std::pair; class pbft_checkpoint_manager : public std::enable_shared_from_this { public: pbft_checkpoint_manager(std::shared_ptr io_context, std::shared_ptr storage, std::shared_ptr peers_beacon, std::shared_ptr node); void handle_checkpoint_message(const bzn_envelope& msg, std::shared_ptr /*session*/ = nullptr); void local_checkpoint_reached(const checkpoint_t& cp); checkpoint_t get_latest_stable_checkpoint() const; checkpoint_t get_latest_local_checkpoint() const; std::unordered_map get_latest_stable_checkpoint_proof() const; size_t partial_checkpoint_proofs_count() const; void start(); private: void init_persists(); void maybe_stabilize_checkpoint(const checkpoint_t& cp); void stabilize_checkpoint(const checkpoint_t& cp); void send_state_request(); void send_delayed_state_request(const checkpoint_t& cp); std::shared_ptr io_context; std::shared_ptr storage; std::shared_ptr peers_beacon; std::shared_ptr node; std::unique_ptr trigger_catchup_timer; persistent latest_stable_checkpoint{storage, {0, INITIAL_CHECKPOINT_HASH}, LATEST_STABLE_CHECKPOINT_KEY}; std::unordered_map> latest_stable_checkpoint_proof; persistent latest_local_checkpoint{storage, {0, INITIAL_CHECKPOINT_HASH}, LATEST_LOCAL_CHECKPOINT_KEY}; std::map>> partial_checkpoint_proofs; mutable std::mutex lock; }; } ================================================ FILE: pbft/pbft_persistent_state.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include using namespace bzn; std::set persist_base::initialized_containers; std::string persist_base::escape(const std::string& input) { std::string output; for (auto ch : input) { output += (ch == ESCAPE_1) ? std::string{ESCAPE_1} + ESCAPE_2 : std::string{ch}; } return output; } std::string persist_base::unescape(const std::string& input) { std::string output; auto it = input.begin(); while (it != input.end()) { if (*it == ESCAPE_1) { if (it + 1 != input.end() && *(it + 1) == ESCAPE_2) { output += *it; it += 2; } else { // a bare ESCAPE_1 character was found, which should never happen. // if you hit this you've likely specified a key incorrectly LOG(error) << "illegal character unescaping key for persistent value"; throw std::runtime_error("illegal character unescaping key for persistent value"); } } else { output += *it++; } } return output; } template<> std::string persistent::to_string(const std::string &value) { return value; } template<> std::string persistent::from_string(const std::string &value) { return value; } template<> std::string persistent::to_string(const bzn::log_key_t &key) { return (boost::format("%020u_%020u") % std::get<0>(key) % std::get<1>(key)).str(); } template<> bzn::log_key_t persistent::from_string(const std::string &value) { auto offset = value.find('_'); if (offset < value.size()) { try { uint64_t v0 = boost::lexical_cast(value.substr(0, offset).c_str()); uint64_t v1 = boost::lexical_cast(value.substr(offset + 1).c_str()); if (v0 && v1) { return log_key_t{v0, v1}; } } catch (boost::bad_lexical_cast &) { LOG(error) << "Error converting log key from persistent state"; } } LOG(error) << "bad log key from persistent state"; throw std::runtime_error("bad log key from persistent state"); } template<> std::string persistent::to_string(const bzn::operation_key_t &key) { return (boost::format("%020u_%020u_%s") % std::get<0>(key) % std::get<1>(key) % std::get<2>(key)).str(); } template<> bzn::operation_key_t persistent::from_string(const std::string &value) { auto offset1 = value.find('_'); if (offset1 < value.size()) { auto offset2 = value.find('_', offset1 + 1); if (offset2 < value.size()) { try { uint64_t v0 = boost::lexical_cast(value.substr(0, offset1).c_str()); uint64_t v1 = boost::lexical_cast( value.substr(offset1 + 1, offset2 - (offset1 + 1)).c_str()); if (v0 && v1 && !value.substr(offset2 + 1).empty()) { return operation_key_t{v0, v1, value.substr(offset2 + 1)}; } } catch (boost::bad_lexical_cast &) { LOG(warning) << "Error converting operation key"; } } } LOG(error) << "bad log key from persistent state"; throw std::runtime_error("bad log key from persistent state"); } template<> std::string persistent::to_string(const bzn::checkpoint_t &cp) { return (boost::format("%020u_%s") % cp.first % cp.second).str(); } template<> bzn::checkpoint_t persistent::from_string(const std::string &value) { auto offset = value.find('_'); if (offset < value.size()) { try { uint64_t v0 = boost::lexical_cast(value.substr(0, offset).c_str()); // TODO: checkpoint hashes are currently empty. remove comments after they're done (KEP-1203) // if (!value.substr(offset + 1).empty()) // { return checkpoint_t{v0, value.substr(offset + 1)}; // } } catch (boost::bad_lexical_cast &) { LOG(warning) << "Error converting checkpoint"; } } LOG(error) << "bad checkpoint from persistent state"; throw std::runtime_error("bad checkpoint from persistent state"); } template <> std::string persistent::to_string(const uint64_t& val) { return (boost::format("%020u") % val).str(); } template <> uint64_t persistent::from_string(const std::string& value) { try { return boost::lexical_cast(value); } catch (boost::bad_lexical_cast &) { } LOG(error) << "bad uint64_t from persistent state"; throw std::runtime_error("bad uint64_t from persistent state"); } template<> std::string persistent::to_string(const bool &val) { return (boost::format("%01u") % val).str(); } template<> bool persistent::from_string(const std::string &value) { try { return boost::lexical_cast(value); } catch (boost::bad_lexical_cast &) { } LOG(error) << "bad bool from persistent state"; throw std::runtime_error("bad bool from persistent state"); } template<> std::string persistent::to_string(const bzn_envelope &val) { return val.SerializeAsString(); } template<> bzn_envelope persistent::from_string(const std::string &value) { bzn_envelope env; if (env.ParseFromString(value)) { return env; } LOG(error) << "bad bzn_envelope from persistent state"; throw std::runtime_error("bad bzn_envelope from persistent state"); } ================================================ FILE: pbft/pbft_persistent_state.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include namespace { const char ESCAPE_1 = '/'; const char ESCAPE_2 = '$'; const std::string SEPARATOR = "//"; const std::string SEPARATOR_END = "/" + std::string{'/' + 1}; const std::string STATE_UUID{"pbftstate"}; } namespace bzn { using checkpoint_t = std::pair; class persist_base { protected: static std::string escape(const std::string& input); static std::string unescape(const std::string& input); static std::set initialized_containers; }; // A persistent value that is stored with a unique key specified by an object name and a series of // zero or more sub-keys. The sub-keys are used to create a unique storage key for each element within a // (possibly nested) collection such as a map or set. // // For non-collection types, declare an object of type persistent and initialize it with // { storage, default-value, unique-key }. If the variable already exists in storage it will be initialized // with its stored state. If not it will use the provided default value. // // For containers, at instantiation time (e.g. insert, emplace, etc), insert the value as // { storage, value, unique-object-name, key-name, key-name... }, where the key-names are the // keys for each nested map, set, vector, etc. // E.g. for map> items, you would insert a string mapped to the integer 9 using: // map.insert(std::make_pair(9, {storage, "value", "items", 9}); which would yield a storage key "items_00009". // // In the case of nested maps, multiple subkeys are needed to guarantee the uniqueness of the generated // storage key. e.g. for map>> nesty; you would insert an item in the 7 map, // mapped to the char 'x' like so: nesty[7]['x'] = {storage, "value", "nesty", 'x', 7}; which would yield a // storage key "nesty_x_00007". // // For consistency, it's recommended that in nested collections the sub-keys be ordered from inner to outer. // // Containers of persistent values MUST be initialized before use. Use one of the initialize methods below // to load any existing contents of a container from storage before accessing the container, even if empty. // The basic initialize methods take a lambda that should emplace elements into the container. There are also // helper methods for initializing key/value-style containers such as maps. // // Each type used as a value or a key requires specialized to_string and from_string methods. Implementation are // provided for std::string, uint64_t and a couple of types used by pbft. Unfortunately it's not possible to // implement a generic *_string methods for tuples, or even for each tuple arity, as C++ doesn't allow // specialization for (non-concrete) templated types without specializing the entire class template. // // In order to permanently remove a persistent variable it is necessary to call the destroy() method. This is // because the variable's value is intended to persist after the object representing it is destructed. // In the case of members of a collection (e.g. map, set), each member must be destroy()'d if you wish to erase // it from storage. If you do not do this, it will re-appear with its previous value the next time the collection // is initialized, or if an element with the same key is added later. // template class persistent : public persist_base { public: // construct a persistent variable, retrieving its value from storage if it exists, otherwise // initializing it with the provided default. template persistent(std::shared_ptr persist_storage, const T& default_value, const std::string& name, K... subkeys) : storage(persist_storage), key(escape(name) + generate_key(subkeys...)) { std::scoped_lock locker(*(this->lock)); if (this->storage) { if (sizeof...(subkeys)) { if (initialized_containers.find(name) == initialized_containers.end()) { LOG(error) << "Use of uninitialized collection of persistent values: " << name; throw std::runtime_error("Use of uninitialized collection of persistent values: " + name); } } auto val = this->storage->read(STATE_UUID, this->key); if (val) { t = from_string(*val); } else { t = default_value; auto val = to_string(t); auto result = this->storage->create(STATE_UUID, this->key, val); if (result != storage_result::ok) { LOG(error) << "Failed to initialize value in storage - result: " << static_cast(result) << " key: " << this->key << " value size: " << val.size() << " value: " << val.substr(0, MAX_MESSAGE_SIZE); throw std::runtime_error("Error initializing value in storage"); } } } else { throw std::runtime_error("No persistent storage defined"); } } // conversion constructor for comparison in maps etc. without placing in storage // made explicit to avoid unintentionally assign a raw type to a persistent explicit persistent(const T& value) : t(value) {} // default constructor to allow use of [] and insert_or_assign in maps, etc. persistent() {} // assign a new value to a persistent variable. the new value is immediately placed in storage persistent& operator=(const T& value) { std::scoped_lock locker(*(this->lock)); this->validate(); t = value; if (this->storage) { auto res = this->storage->update(STATE_UUID, this->key, to_string(value)); if (res != storage_result::ok) { LOG(error) << "Error " << static_cast(res) << " storing persistent value with key: " << this->key; throw(std::runtime_error("Error storing persistent value")); } } else { throw(std::runtime_error("Object has no storage")); } return *this; } // since the lifetime of the value is not tied to the object, it's necessary to explicitly // destroy it in order to remove from storage void destroy() { std::scoped_lock locker(*(this->lock)); if (this->storage) { this->storage->remove(STATE_UUID, this->key); } else { throw(std::runtime_error("Object has no storage")); } } // get the value of the variable const T& value() const { std::scoped_lock locker(*(this->lock)); this->validate(); return t; } // comparison operator, mainly for ordering in collections bool operator<(const persistent& rhs) const { std::scoped_lock locker(*(this->lock)); return t < rhs.t; } // test for equality bool operator==(const persistent& rhs) const { std::scoped_lock locker(*(this->lock)); return t == rhs.t; } static T from_string(const std::string& /*value*/) { // this method needs to be specialized for each type used throw std::runtime_error("no conversion available for this type from string"); } static std::string to_string(const T& /*value*/) { // this method needs to be specialized for each type used throw std::runtime_error("no conversion available for this type to string"); } // initialize values in a container template static void initialize(std::shared_ptr storage, const std::string& basename , std::function&, const A&)> store) { // record that this collection has been initialized initialized_containers.insert(basename); auto escaped_base = escape(basename); auto results = storage->get_keys_if(STATE_UUID, escaped_base + SEPARATOR , escaped_base + SEPARATOR_END); for (const auto& res : results) { auto key_str = unescape(res.substr(escaped_base.size() + SEPARATOR.size())); A key{persistent::from_string(key_str)}; LOG(debug) << "initializing state " << res << " from storage"; // instantiate this member from storage and pass it to be emplaced into container store(persistent{storage, {}, basename, key}, key); } } // initialize values in a nested container // note - we need a version of this function for each number of sub-keys template static void initialize(std::shared_ptr storage, const std::string& basename , std::function&, const A&, const B&)> store) { // record that this container has been initialized initialized_containers.insert(basename); auto escaped_base = escape(basename); auto results = storage->get_keys_if(STATE_UUID, escaped_base + SEPARATOR , escaped_base + SEPARATOR_END); for (const auto& res : results) { std::tuple subkeys = extract_subkeys(res.substr(escaped_base.size() + SEPARATOR.size())); LOG(debug) << "initializing state " << res << " from storage"; // instantiate this member from storage and pass it to be emplaced into container store(persistent{storage, {}, basename, std::get<0>(subkeys), std::get<1>(subkeys)} , std::get<0>(subkeys), std::get<1>(subkeys)); } } // helper to initialize values in a key-value container template static void init_kv_container(std::shared_ptr storage, const std::string& basename, C& container) { initialize(storage, basename, [&container](auto value, auto key) { container.emplace(key, value); }); } // helper to initialize values in a nested key-value container // note - the outer container can be non-kv such as a set template static void init_kv_container2(std::shared_ptr storage, const std::string& basename, C& container) { initialize(storage, basename, [&container](auto value, auto key1, auto key2) { container[key2].emplace(key1, value); }); } // note - this could be expanded into a variadic to support an arbitrary number of sub-keys template static std::tuple extract_subkeys(const std::string& key) { // find unescaped separator size_t offset{0}; while (offset < key.size()) { offset = key.find(ESCAPE_1, offset); if (offset >= key.size() || key[offset + 1] != ESCAPE_2) { break; } offset += 2; } assert(offset <= key.size() - SEPARATOR.size()); assert(key[offset + 1] == ESCAPE_1); std::string v0 = key.substr(0, offset); std::string v1 = key.substr(offset + SEPARATOR.size()); return {persistent::from_string(unescape(v0)), persistent::from_string(unescape(v1))}; } private: T t; std::shared_ptr storage; std::string key; std::shared_ptr lock = std::make_shared(); static std::string generate_key() { return ""; } template static std::string generate_key(K k, Rest... rest) { return SEPARATOR + escape(persistent::to_string(k)) + generate_key(rest...); } void validate() const { #ifndef NDEBUG if (this->storage) { auto val = this->storage->read(STATE_UUID, this->key); if (val) { if (val != to_string(t)) { LOG(error) << "validation error for persistent value with key: " << this->key; LOG(error) << "stored value size is: " << (*val).size(); LOG(error) << "in-mem value size is: " << to_string(t).size(); throw std::runtime_error(this->key + ": Persistent value in memory does not match stored value"); } } else { LOG(error) << "missing value for persistent value with key: " << this->key; throw std::runtime_error(this->key + ": Persistent value missing from storage"); } } else { throw std::runtime_error("No persistent storage defined"); } #endif } FRIEND_TEST(persistent_state_test, test_escaping); }; template<> std::string persistent::to_string(const std::string& value); template<> std::string persistent::from_string(const std::string& value); template<> std::string persistent::to_string(const bzn::log_key_t& key); template<> bzn::log_key_t persistent::from_string(const std::string& value); template<> std::string persistent::to_string(const bzn::operation_key_t& key); template<> bzn::operation_key_t persistent::from_string(const std::string& value); template<> std::string persistent::to_string(const bzn::checkpoint_t& cp); template<> bzn::checkpoint_t persistent::from_string(const std::string& value); template <> std::string persistent::to_string(const uint64_t& val); template <> uint64_t persistent::from_string(const std::string& value); template<> std::string persistent::to_string(const bool& val); template<> bool persistent::from_string(const std::string& value); template<> std::string persistent::to_string(const bzn_envelope& val); template<> bzn_envelope persistent::from_string(const std::string& value); } ================================================ FILE: pbft/pbft_service_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include namespace bzn { using execute_handler_t = std::function)>; class pbft_service_base { public: virtual ~pbft_service_base() = default; /* * Interface for some service that is replicated by pbft. There could a layer that just handles the logic * required by this interface, but if the underlying service is a database than that would probably be awkward. * * Caller must guarantee: * - If apply_operation(x, y) is called, then apply_operation(x2, y) will never be called with x != x2 * - If apply_operation(_, y) is called and y != 0, then apply_operation(_, y-1) will be called at least once * (may be before or after apply_operation(_, y). * - If consolidate_log(y) is called, then no subsequenent call to query(x, y2) will have y2 < y * (so the service may consolidate all the updates before y into a single version of the service on disk) * - consolidate_log(y) is called if forall y2= curr, use the most up to date version of the key you have applied (still obeying constraint 1) * if curr > y > cp, use the most up to date version of the key written before y, or the stable checkpoint * if it hasn't been written to in that interval * if cp == y, use the version of the key from the stable checkpoint * if cp > y, the caller has broken a constraint * - Operations are applied at most once (crud operations are idempotent anyway) * * Notably not guarenteed: * - apply_operation(x, y) called only once for the same value y * - apply_operation(x, y) called with monotomically increasing y */ /* * PBFT has concluded that an operation is committed-local, it can now be applied as soon as all earlier * operations have been applied. */ virtual void apply_operation(const std::shared_ptr& op) = 0; virtual bool apply_operation_now(const bzn_envelope& msg, std::shared_ptr session) = 0; /* * Get the hash of the database state (presumably this will be a merkle tree root, but the details don't matter * for now)- same semantics as query */ virtual bzn::hash_t service_state_hash(uint64_t sequence_number) const = 0; /* * Get the full database state at the given sequence number, if available */ virtual std::shared_ptr get_service_state(uint64_t sequence_number) const = 0; /* * Set the full database state at the given sequence number */ virtual bool set_service_state(uint64_t sequence_number, const bzn::service_state_t& data) = 0; /* * Tell the service to checkpoint its state when it reaches this sequence number */ virtual void save_service_state_at(uint64_t sequence_number) = 0; /* * A checkpoint has been stabilized, so we no longer need any history from before then. */ virtual void consolidate_log(uint64_t sequence_number) = 0; /* * Callback when a request is executed (not committed, since the service is responsible for the difference * between the two). Should only be called once for each sequence number, in strictly increasing order. */ virtual void register_execute_handler(bzn::execute_handler_t handler) = 0; }; } ================================================ FILE: pbft/test/CMakeLists.txt ================================================ set(test_srcs pbft_test.cpp pbft_audit_test.cpp pbft_test_common.cpp pbft_checkpoint_tests.cpp pbft_proto_test.cpp pbft_catchup_test.cpp pbft_timestamp_test.cpp database_pbft_service_test.cpp pbft_proto_test.cpp pbft_newview_test.cpp pbft_persistent_state_test.cpp pbft_viewchange_test.cpp pbft_peer_change_test.cpp) set(test_libs pbft pbft_operations crypto options ${Protobuf_LIBRARIES} storage ${ROCKSDB_LIBRARIES} smart_mocks) add_gmock_test(pbft) ================================================ FILE: pbft/test/database_pbft_service_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include #include #include #include #include #include #include #include using namespace ::testing; namespace { const std::string TEST_UUID{"uuid"}; const std::string DEFAULT_NEXT_REQUEST_SEQUENCE{"1"}; } TEST(database_pbft_service, test_that_on_construction_if_next_request_sequence_doesnt_exist_its_created) { auto mock_storage = std::make_shared(); EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional())); EXPECT_CALL(*mock_storage, create(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::ok)); EXPECT_CALL(*mock_storage, update(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::ok)); bzn::database_pbft_service dps(std::make_shared(), mock_storage, std::make_shared(), nullptr, TEST_UUID); } TEST(database_pbft_service, test_that_on_construction_if_next_request_sequence_exists_its_loaded) { auto mock_storage = std::make_shared(); EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional("123"))); EXPECT_CALL(*mock_storage, update(_, _, "123")).WillOnce(Return(bzn::storage_result::ok)); bzn::database_pbft_service dps(std::make_shared(), mock_storage, std::make_shared(), nullptr, TEST_UUID); } TEST(database_pbft_service, test_that_on_construction_if_next_request_sequence_doesnt_exist_it_throws_if_error_occurs) { auto mock_storage = std::make_shared(); EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional())); EXPECT_CALL(*mock_storage, create(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::value_too_large)); EXPECT_THROW(bzn::database_pbft_service dps(std::make_shared(), mock_storage, std::make_shared(), nullptr, TEST_UUID), std::runtime_error); } TEST(database_pbft_service, test_that_failed_storing_of_operation_does_not_throw_for_duplicate) { auto mock_storage = std::make_shared(); EXPECT_CALL(*mock_storage, read(_, _)).WillOnce(Return(std::optional())); EXPECT_CALL(*mock_storage, create(_, _, DEFAULT_NEXT_REQUEST_SEQUENCE)).WillOnce(Return(bzn::storage_result::ok)); bzn::database_pbft_service dps(std::make_shared(), mock_storage, std::make_shared(), nullptr, TEST_UUID); EXPECT_CALL(*mock_storage, create(_, _, _)).WillOnce(Return(bzn::storage_result::exists)); EXPECT_CALL(*mock_storage, update(_, _, _)).WillOnce(Return(bzn::storage_result::ok)); auto operation = std::make_shared(0, 1, "somehash"); database_msg dmsg; bzn_envelope request; request.set_database_msg(dmsg.SerializeAsString()); operation->record_request(request); EXPECT_NO_THROW(dps.apply_operation(operation)); } TEST(database_pbft_service, test_that_executed_operation_fires_callback_with_operation) { auto mem_storage = std::make_shared(); auto mock_io_context = std::make_shared(); auto mock_crud = std::make_shared>(); EXPECT_CALL(*mock_io_context, post(_)).WillOnce(InvokeArgument<0>()); auto mock_monitor = std::make_shared(); EXPECT_CALL(*mock_monitor, finish_timer(bzn::statistic::request_latency, "somehash")); bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, mock_monitor, TEST_UUID); auto operation = std::make_shared(0, 1, "somehash"); bool execute_handler_called_with_operation = false; database_msg msg; msg.mutable_header()->set_db_uuid(TEST_UUID); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create()->set_key("key2"); msg.mutable_create()->set_value("value2"); bzn_envelope env; env.set_database_msg(msg.SerializeAsString()); operation->record_request(env); dps.register_execute_handler( [&](const auto& operation_ptr) { execute_handler_called_with_operation = operation_ptr->get_request_hash() == "somehash"; }); dps.apply_operation(operation); EXPECT_TRUE(execute_handler_called_with_operation); } TEST(database_pbft_service, test_that_apply_operation_now_is_handled) { auto mem_storage = std::make_shared(); auto mock_io_context = std::make_shared(); auto mock_crud = std::make_shared(); bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, nullptr, TEST_UUID); // requires pbft... { database_msg msg; msg.mutable_header()->set_db_uuid(TEST_UUID); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create()->set_key("key2"); msg.mutable_create()->set_value("value2"); bzn_envelope env; env.set_database_msg(msg.SerializeAsString()); ASSERT_FALSE(dps.apply_operation_now(env, nullptr)); } // bypass pbft using quick read... { database_msg msg; msg.mutable_header()->set_db_uuid(TEST_UUID); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_quick_read()->set_key("key2"); bzn_envelope env; env.set_database_msg(msg.SerializeAsString()); EXPECT_CALL(*mock_crud, handle_request(_,_,_)); ASSERT_TRUE(dps.apply_operation_now(env, nullptr)); } } TEST(database_pbft_service, test_that_stored_operation_is_executed_in_order_and_registered_handler_is_scheduled) { auto mem_storage = std::make_shared(); auto mock_io_context = std::make_shared(); auto mock_crud = std::make_shared(); auto mock_monitor = std::make_shared(); bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, mock_monitor, TEST_UUID); database_msg msg; msg.mutable_header()->set_db_uuid(TEST_UUID); msg.mutable_header()->set_nonce(uint64_t(123)); msg.mutable_create()->set_key("key2"); msg.mutable_create()->set_value("value2"); auto operation2 = std::make_shared(0, 2, "somehasha"); bzn_envelope env; env.set_database_msg(msg.SerializeAsString()); operation2->record_request(env); dps.apply_operation(operation2); ASSERT_EQ(uint64_t(0), dps.applied_requests_count()); msg.mutable_header()->set_nonce(uint64_t(321)); msg.mutable_create()->set_key("key3"); msg.mutable_create()->set_value("value3"); auto mock_session = std::make_shared(); EXPECT_CALL(*mock_session, is_open()).WillRepeatedly(Return(true)); auto operation3 = std::make_shared(0, 3, "somehashb"); env.set_database_msg(msg.SerializeAsString()); operation3->record_request(env); operation3->set_session(mock_session); dps.apply_operation(operation3); ASSERT_EQ(uint64_t(0), dps.applied_requests_count()); msg.mutable_header()->set_nonce(uint64_t(321)); msg.mutable_create()->set_key("key1"); msg.mutable_create()->set_value("value1"); auto operation1 = std::make_shared(0, 1, "somehashc"); env.set_database_msg(msg.SerializeAsString()); operation1->record_request(env); auto session2 = std::make_shared(); EXPECT_CALL(*session2, is_open()).WillRepeatedly(Return(true)); operation1->set_session(std::move(session2)); EXPECT_CALL(*mock_io_context, post(_)).Times(3); // test crud calls are in the correct order... { InSequence dummy; EXPECT_CALL(*mock_crud, handle_request(_, _, _)).WillOnce(Invoke( [](const bzn::caller_id_t& /*caller_id*/, const database_msg& request, const std::shared_ptr /*session*/) { EXPECT_EQ(request.msg_case(), database_msg::kCreate); EXPECT_EQ(request.create().key(), "key1"); EXPECT_EQ(request.create().value(), "value1"); EXPECT_EQ(request.header().request_hash(), "somehashc"); })); EXPECT_CALL(*mock_crud, handle_request(_, _, _)).WillOnce(Invoke( [](const bzn::caller_id_t& /*caller_id*/, const database_msg& request, const std::shared_ptr /*session*/) { EXPECT_EQ(request.msg_case(), database_msg::kCreate); EXPECT_EQ(request.create().key(), "key2"); EXPECT_EQ(request.create().value(), "value2"); EXPECT_EQ(request.header().request_hash(), "somehasha"); })); EXPECT_CALL(*mock_crud, handle_request(_, _, _)).WillOnce(Invoke( [](const bzn::caller_id_t& /*caller_id*/, const database_msg& request, const std::shared_ptr /*session*/) { EXPECT_EQ(request.msg_case(), database_msg::kCreate); EXPECT_EQ(request.create().key(), "key3"); EXPECT_EQ(request.create().value(), "value3"); EXPECT_EQ(request.header().request_hash(), "somehashb"); })); } EXPECT_CALL(*mock_monitor, finish_timer(bzn::statistic::request_latency, _)).Times(3); dps.apply_operation(operation1); ASSERT_EQ(uint64_t(3), dps.applied_requests_count()); } namespace test { void do_operation(uint64_t seq, bzn::database_pbft_service &dps) { database_msg msg; msg.mutable_header()->set_db_uuid(TEST_UUID); msg.mutable_header()->set_nonce(uint64_t(seq)); msg.mutable_create()->set_key("key" + std::to_string(seq)); msg.mutable_create()->set_value("value" + std::to_string(seq)); auto operation = std::make_shared(0, seq, "somehash" + std::to_string(seq)); bzn_envelope env; env.set_database_msg(msg.SerializeAsString()); operation->record_request(env); dps.apply_operation(operation); } uint64_t database_msg_seq(const database_msg& msg) { return msg.header().nonce(); } } TEST(database_pbft_service, test_that_set_state_catches_up_backlogged_operations) { auto mem_storage = std::make_shared(); auto mock_io_context = std::make_shared(); auto mock_crud = std::make_shared(); bzn::database_pbft_service dps(mock_io_context, mem_storage, mock_crud, std::make_shared>(), TEST_UUID); test::do_operation(99, dps); test::do_operation(100, dps); test::do_operation(101, dps); test::do_operation(102, dps); ASSERT_EQ(uint64_t(0), dps.applied_requests_count()); // only the last two operations should be applied after we set the state @ 100 EXPECT_CALL(*mock_crud, handle_request(_, ResultOf(test::database_msg_seq, 101), _)) .Times(Exactly(1)); EXPECT_CALL(*mock_crud, handle_request(_, ResultOf(test::database_msg_seq, 102), _)) .Times(Exactly(1)); EXPECT_CALL(*mock_io_context, post(_)) .Times(Exactly(2)); // push state for checkpoint at sequence 100 EXPECT_CALL(*mock_crud, load_state(_)) .Times(Exactly(1)) .WillOnce(Invoke([](auto &) {return true;})); dps.set_service_state(100, "state_at_sequence_100"); // operations applied should be caught up now ASSERT_EQ(uint64_t(102), dps.applied_requests_count()); } ================================================ FILE: pbft/test/pbft_audit_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include namespace bzn::test { TEST_F(pbft_test, test_local_commit_sends_audit_messages) { EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_audit, Eq(false)))) .Times(AnyNumber()); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_audit, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); this->build_pbft(); this->pbft->set_audit_enabled(true); pbft_msg preprepare = pbft_msg(this->preprepare_msg); preprepare.set_sequence(1); this->pbft->handle_message(preprepare, this->default_original_msg); for (const auto& peer : TEST_PEER_LIST) { pbft_msg prepare = pbft_msg(preprepare); bzn_envelope prepare_wrap; pbft_msg commit = pbft_msg(preprepare); bzn_envelope commit_wrap; prepare.set_type(PBFT_MSG_PREPARE); prepare_wrap.set_sender(peer.uuid); commit.set_type(PBFT_MSG_COMMIT); commit_wrap.set_sender(peer.uuid); this->pbft->handle_message(prepare, prepare_wrap); this->pbft->handle_message(commit, commit_wrap); } } TEST_F(pbft_test, primary_sends_primary_status) { EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_audit, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); this->build_pbft(); this->pbft->set_audit_enabled(true); ASSERT_TRUE(this->pbft->is_primary()); this->audit_heartbeat_timer_callback(boost::system::error_code()); } TEST_F(pbft_test, nonprimary_does_not_send_primary_status) { EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_audit, Eq(true)))) .Times(Exactly(0)); this->uuid = SECOND_NODE_UUID; this->build_pbft(); this->pbft->set_audit_enabled(true); ASSERT_FALSE(this->pbft->is_primary()); this->audit_heartbeat_timer_callback(boost::system::error_code()); } } ================================================ FILE: pbft/test/pbft_catchup_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include #include #include using namespace ::testing; namespace bzn { namespace test { pbft_membership_msg extract_pbft_membership_msg(const std::string& msg) { bzn_envelope outer; outer.ParseFromString(msg); pbft_membership_msg result; result.ParseFromString(outer.pbft_membership()); return result; } bool is_get_state(std::shared_ptr wrapped_msg) { pbft_membership_msg msg; msg.ParseFromString(wrapped_msg->pbft_membership()); return msg.type() == PBFT_MMSG_GET_STATE && msg.sequence() > 0 && !msg.state_hash().empty(); } bool is_set_state(std::shared_ptr wrapped_msg) { pbft_membership_msg msg = extract_pbft_membership_msg(*wrapped_msg); return msg.type() == PBFT_MMSG_SET_STATE && msg.sequence() > 0 && !(extract_sender(*wrapped_msg).empty()) && msg.state_hash() != ""; } } using namespace test; class pbft_catchup_test : public pbft_proto_test { public: void send_get_state_request(uint64_t sequence) { pbft_membership_msg msg; msg.set_type(PBFT_MMSG_GET_STATE); msg.set_sequence(sequence); msg.set_state_hash(std::to_string(sequence)); auto wmsg = wrap_pbft_membership_msg(msg, this->pbft->get_uuid()); this->membership_handler(wmsg, this->mock_session); } bzn_envelope build_viewchange_msg(const uuid_t& uuid, uint64_t view, uint64_t sequence) { pbft_msg viewchange; viewchange.set_type(PBFT_MSG_VIEWCHANGE); viewchange.set_view(view); viewchange.set_sequence(sequence); for (auto& p : TEST_PEER_LIST) { checkpoint_msg cp = this->build_checkpoint_msg(sequence); bzn_envelope msg; msg.set_checkpoint_msg(cp.SerializeAsString()); msg.set_sender(p.uuid); *(viewchange.add_checkpoint_messages()) = msg; } return wrap_pbft_msg(viewchange, uuid); } bzn_envelope build_newview_msg(uint64_t view, uint64_t sequence) { pbft_msg newview; newview.set_type(PBFT_MSG_NEWVIEW); newview.set_view(view); newview.set_sequence(sequence); for (auto& p : TEST_PEER_LIST) { *(newview.add_viewchange_messages()) = build_viewchange_msg(p.uuid, view, sequence); } return wrap_pbft_msg(newview, this->uuid); } }; TEST_F(pbft_catchup_test, node_requests_state_after_unknown_checkpoint) { this->uuid = SECOND_NODE_UUID; this->build_pbft(); // node shouldn't be sending any checkpoint messages right now EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_checkpoint, Eq(true)))) .Times((Exactly(0))); auto nodes = TEST_PEER_LIST.begin(); size_t req_nodes = this->faulty_nodes_bound(); for (size_t i = 0; i < req_nodes; i++) { bzn::peer_address_t node(*nodes++); send_checkpoint(node, 100); } // one more checkpoint message and the node should request state from a random node auto primary = this->pbft->get_current_primary().value(); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_get_state, Eq(true)))) .Times((Exactly(1))); bzn::peer_address_t node(*nodes++); send_checkpoint(node, 100); this->cp_manager_timer_callbacks.at(0)(boost::system::error_code{}); } TEST_F(pbft_catchup_test, node_doesnt_request_state_after_known_checkpoint) { this->uuid = SECOND_NODE_UUID; this->build_pbft(); prepare_for_checkpoint(100); for (size_t i = 0; i < 100; i++) { run_transaction_through_backup(); } // since the node has this checkpoint it should NOT request state for it EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_get_state, Eq(true)))) .Times((Exactly(0))); stabilize_checkpoint(100); EXPECT_EQ(this->cp_manager_timer_callback_count, 0u); } TEST_F(pbft_catchup_test, primary_provides_state) { this->build_pbft(); for (size_t i = 0; i < 99; i++) { run_transaction_through_primary(); } prepare_for_checkpoint(100); run_transaction_through_primary(); stabilize_checkpoint(100); EXPECT_CALL(*this->mock_service, get_service_state(_)).Times(Exactly(1)) .WillOnce(Invoke([](auto &) {return std::make_shared("dummy_state");})); EXPECT_CALL(*mock_session, send_message(ResultOf(is_set_state, Eq(true)))) .Times((Exactly(1))); send_get_state_request(100); } TEST_F(pbft_catchup_test, node_adopts_requested_checkpoint) { this->uuid = SECOND_NODE_UUID; this->build_pbft(); // get the node to request state auto primary = this->pbft->get_current_primary().value(); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_get_state, Eq(true)))) .Times((Exactly(1))); auto nodes = TEST_PEER_LIST.begin(); size_t req_nodes = 2 * this->faulty_nodes_bound() + 1; for (size_t i = 0; i < req_nodes; i++) { bzn::peer_address_t node(*nodes++); send_checkpoint(node, 100); } this->cp_manager_timer_callbacks.at(0)(boost::system::error_code{}); // send the node the checkpoint "data" const uint64_t new_view = 3; pbft_membership_msg reply; reply.set_type(PBFT_MMSG_SET_STATE); reply.set_sequence(100); reply.set_state_hash("100"); reply.set_state_data("state_100"); reply.set_allocated_newview_msg(new bzn_envelope(build_newview_msg(new_view, 100))); auto wmsg = wrap_pbft_membership_msg(reply, "see_node_adopts_requested_checkpoint"); this->membership_handler(wmsg, nullptr); EXPECT_EQ(this->pbft->latest_stable_checkpoint(), checkpoint_t(100, "100")); EXPECT_EQ(this->pbft->get_view(), new_view); } TEST_F(pbft_catchup_test, node_doesnt_adopt_wrong_checkpoint) { this->uuid = SECOND_NODE_UUID; this->build_pbft(); // get the node to request state auto primary = this->pbft->get_current_primary().value(); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_get_state, Eq(true)))) .Times((Exactly(1))); auto nodes = TEST_PEER_LIST.begin(); size_t req_nodes = 2 * this->faulty_nodes_bound() + 1; for (size_t i = 0; i < req_nodes; i++) { bzn::peer_address_t node(*nodes++); send_checkpoint(node, 100); } this->cp_manager_timer_callbacks.at(0)(boost::system::error_code{}); // send the node the checkpoint "data" pbft_membership_msg reply; reply.set_type(PBFT_MMSG_SET_STATE); reply.set_sequence(200); reply.set_state_hash("200"); reply.set_state_data("state_200"); auto wmsg = wrap_pbft_membership_msg(reply, "see_node_doesnt_adopt_wrong_checkpoint"); this->membership_handler(wmsg, nullptr); EXPECT_NE(this->pbft->latest_stable_checkpoint(), checkpoint_t(200, "200")); } } ================================================ FILE: pbft/test/pbft_checkpoint_tests.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include #include #include #include #include #include #include #include #include using namespace ::testing; namespace bzn::test { class pbft_checkpoint_test : public Test { public: std::shared_ptr mock_io = std::make_shared(); std::shared_ptr storage = std::make_shared(); std::shared_ptr node = std::make_shared(); std::shared_ptr cp_manager = std::make_shared(mock_io, storage, static_peers_beacon_for(TEST_PEER_LIST), node); checkpoint_t cp{100, "100"}; checkpoint_t cp2{200, "200"}; void send_checkpoint_messages(const checkpoint_t& cp, size_t count = INT_MAX) { checkpoint_msg cp_msg; cp_msg.set_state_hash(cp.second); cp_msg.set_sequence(cp.first); for (const auto& peer : TEST_PEER_LIST) { if (count-- <= 0) { break; } bzn_envelope env; env.set_checkpoint_msg(cp_msg.SerializeAsString()); env.set_sender(peer.uuid); this->cp_manager->handle_checkpoint_message(env); } } }; TEST_F(pbft_checkpoint_test, test_checkpoint_messages_sent_on_execute) { for (const auto& peer : TEST_PEER_LIST) { EXPECT_CALL(*node, send_maybe_signed_message(*make_endpoint(peer), ResultOf(is_checkpoint, Eq(true)))); } this->cp_manager->local_checkpoint_reached(this->cp); } TEST_F(pbft_checkpoint_test, no_checkpoint_on_message_before_local_state) { this->send_checkpoint_messages(this->cp); EXPECT_EQ(0u, this->cp_manager->get_latest_local_checkpoint().first); EXPECT_EQ(100u, this->cp_manager->get_latest_stable_checkpoint().first); } TEST_F(pbft_checkpoint_test, unstable_checkpoint_on_local_state_before_message) { for (const auto& peer : TEST_PEER_LIST) { EXPECT_CALL(*node, send_maybe_signed_message(*make_endpoint(peer), ResultOf(is_checkpoint, Eq(true)))); } this->cp_manager->local_checkpoint_reached(this->cp); EXPECT_EQ(100u, this->cp_manager->get_latest_local_checkpoint().first); } TEST_F(pbft_checkpoint_test, stable_checkpoint_on_message_after_local_state) { this->cp_manager->local_checkpoint_reached(this->cp); this->send_checkpoint_messages(this->cp); EXPECT_EQ(this->cp_manager->get_latest_stable_checkpoint(), this->cp); EXPECT_EQ(this->cp_manager->get_latest_local_checkpoint(), this->cp); } TEST_F(pbft_checkpoint_test, stable_checkpoint_on_local_state_after_message) { this->send_checkpoint_messages(this->cp); this->cp_manager->local_checkpoint_reached(this->cp); EXPECT_EQ(this->cp_manager->get_latest_stable_checkpoint(), this->cp); EXPECT_EQ(this->cp_manager->get_latest_local_checkpoint(), this->cp); } TEST_F(pbft_checkpoint_test, unstable_checkpoint_does_not_discard_stable_checkpoint) { this->send_checkpoint_messages(this->cp); this->send_checkpoint_messages(this->cp2, 1); // 4 node swarm; this will not be enough this->cp_manager->local_checkpoint_reached(this->cp); this->cp_manager->local_checkpoint_reached(this->cp2); EXPECT_EQ(this->cp_manager->get_latest_stable_checkpoint(), this->cp); EXPECT_EQ(this->cp_manager->get_latest_local_checkpoint(), this->cp2); EXPECT_EQ(this->cp_manager->partial_checkpoint_proofs_count(), 1u); } TEST_F(pbft_checkpoint_test, stable_checkpoint_discards_old_stable_checkpoint) { this->send_checkpoint_messages(this->cp); this->send_checkpoint_messages(this->cp2); EXPECT_EQ(this->cp_manager->get_latest_stable_checkpoint(), this->cp2); EXPECT_EQ(this->cp_manager->partial_checkpoint_proofs_count(), 0u); } TEST_F(pbft_checkpoint_test, initial_checkpoint_matches) { EXPECT_EQ(this->cp_manager->get_latest_stable_checkpoint(), checkpoint_t(0, INITIAL_CHECKPOINT_HASH)); EXPECT_EQ(this->cp_manager->get_latest_local_checkpoint(), checkpoint_t(0, INITIAL_CHECKPOINT_HASH)); } } ================================================ FILE: pbft/test/pbft_newview_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include namespace bzn { class pbft_newview_test : public pbft_proto_test { public: std::shared_ptr build_pft_with_mock_crypto() { std::shared_ptr mockcrypto = std::make_shared(); this->crypto = mockcrypto; this->build_pbft(); return mockcrypto; } void generate_checkpoint_at_sequence_100(uint64_t& current_sequence) { auto mockcrypto = this->build_pft_with_mock_crypto(); EXPECT_CALL(*mockcrypto, hash(An())) .WillRepeatedly(Invoke([&](const bzn_envelope& envelope) { return envelope.sender() + "_" + std::to_string(current_sequence) + "_" + std::to_string(envelope.timestamp()); })); EXPECT_CALL(*mockcrypto, sign(_)).WillRepeatedly(Return(true)); EXPECT_CALL(*mockcrypto, verify(_)).WillRepeatedly(Return(true)); for (current_sequence=1; current_sequence < 100; ++current_sequence) { run_transaction_through_primary(); } prepare_for_checkpoint(current_sequence); run_transaction_through_primary(); this->stabilize_checkpoint(current_sequence); } void run_transaction_through_primary_times(const size_t repeat, uint64_t& current_sequence) { for (size_t i{0}; igenerate_checkpoint_at_sequence_100(current_sequence); this->run_transaction_through_primary_times(2, current_sequence); bzn_envelope viewchange_envelope; EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(test::is_viewchange, Eq(true)))) .WillRepeatedly(Invoke([&](const auto & /*endpoint*/, const auto& viewchange_env) {viewchange_envelope = *viewchange_env;})); this->pbft->handle_failure(); pbft_msg viewchange; viewchange.ParseFromString(viewchange_envelope.pbft()); uint64_t new_view_index{viewchange.view()}; std::map viewchange_envelopes_from_senders; std::map pre_prepare_messages; // we can generate valid newview now pbft_msg newview{this->pbft->make_newview(new_view_index, viewchange_envelopes_from_senders, pre_prepare_messages)}; EXPECT_EQ(PBFT_MSG_NEWVIEW, newview.type()); EXPECT_EQ(new_view_index, newview.view()); EXPECT_EQ(this->pbft->next_issued_sequence_number.value(), current_sequence + 1); } TEST_F(pbft_newview_test, test_get_primary) { build_pbft(); // the pbft sut must be the current view's primay EXPECT_EQ(this->uuid, this->pbft->get_current_primary().value().uuid); EXPECT_NE(this->uuid, this->pbft->predict_primary(this->pbft->view.value() + 1).value().uuid); // given a view, get_primary must provide the address of a primary // TODO: this is a pretty sketchy test. for (size_t view{0}; view < 100; ++view) { const bzn::uuid_t uuid = this->pbft->predict_primary(view).value().uuid; const bzn::uuid_t accepted_uuid = this->pbft->peers()->ordered()->at(view % this->pbft->peers()->ordered()->size()).uuid; EXPECT_EQ(uuid, accepted_uuid); } } } ================================================ FILE: pbft/test/pbft_peer_change_test.cpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include /* * the goal here is to check that pbft remains functional and does the right thing even when the peers list * can change at any moment, by putting it through a series of tests and each time changing the peers list at a different moment */ namespace { const bzn::peers_list_t PEER_LIST_A{{ "127.0.0.1", 8080, "name0", "uuid0"} , {"127.0.0.1", 8081, "name1", "uuid1"} , {"127.0.0.1", 8082, "name2", "uuid2"} , {"127.0.0.1", 8083, "name3", "uuid3"}}; const bzn::peers_list_t PEER_LIST_A_PLUS{{ "127.0.0.1", 8080, "name0", "uuid0"} , {"127.0.0.1", 8081, "name1", "uuid1"} , {"127.0.0.1", 8082, "name2", "uuid2"} , {"127.0.0.1", 8083, "name3", "uuid3"} , {"127.0.0.1", 8084, "name4", "uuid4"}}; const bzn::peers_list_t PEER_LIST_B{{ "127.0.0.1", 8080, "name0", "uuid0"} , {"127.0.0.1", 8081, "name1", "uuid1"} , {"127.0.0.1", 8082, "name2", "uuid2"} , {"127.0.0.1", 8085, "name5", "uuid5"}}; using peer_switch_t = std::pair; std::map peer_cases{ std::make_pair("add_peer", std::make_pair(PEER_LIST_A, PEER_LIST_A_PLUS)), std::make_pair("remove_peer", std::make_pair(PEER_LIST_A_PLUS, PEER_LIST_A)), std::make_pair("replace_peer", std::make_pair(PEER_LIST_A, PEER_LIST_B)) }; /* * Which switch point are we using, how many are there in total, and what peers lists are we switching between * * The second param is passed so that the common test code can verify that the callsite has the correct (potentially updated) * total number of switch points * * The third parameter is passed as a string that's a key in the global map instead of passing the lists * directly in order to avoid filling the test names with junk */ using test_param_t = std::tuple; } using namespace ::testing; class changeover_test : public bzn::test::pbft_test, public testing::WithParamInterface { public: changeover_test() : current_peers_list(std::make_shared(this->before_list())) { this->set_up_beacon(); } ~changeover_test() { EXPECT_EQ(this->potential_switch_points_hit, this->max_change_point()); EXPECT_LT(this->this_change_point(), this->potential_switch_points_hit); } protected: void switch_here() { if (this->potential_switch_points_hit == this->this_change_point()) { this->do_switch(); } this->potential_switch_points_hit++; } unsigned int this_change_point() { return std::get<0>(GetParam()); } unsigned int max_change_point() { return std::get<1>(GetParam()); } bzn::peers_list_t before_list() { auto pair = peer_cases.at(std::get<2>(GetParam())); return pair.first; } bzn::peers_list_t after_list() { auto pair = peer_cases.at(std::get<2>(GetParam())); return pair.second; } std::shared_ptr current_peers_list; private: void do_switch() { this->current_peers_list = std::make_shared(this->after_list()); } void set_up_beacon() { auto changing_beacon = std::make_shared(); EXPECT_CALL(*changing_beacon, start()).Times(AtMost(1)); EXPECT_CALL(*changing_beacon, current()).WillRepeatedly(Invoke( [&]() { return this->current_peers_list; })); EXPECT_CALL(*changing_beacon, ordered()).WillRepeatedly(Invoke( [&]() { auto ordered = std::make_shared(); std::for_each(this->current_peers_list->begin(), this->current_peers_list->end(), [&](const auto& peer) { ordered->push_back(peer); }); std::sort(ordered->begin(), ordered->end(), [](const auto& peer1, const auto& peer2) { return peer1.uuid.compare(peer2.uuid) < 0; }); return ordered; })); EXPECT_CALL(*changing_beacon, refresh(_)).Times(AnyNumber()); this->beacon = changing_beacon; } unsigned int potential_switch_points_hit = 0; }; auto test_namer = [](const ::testing::TestParamInfo& info) { std::stringstream res; res << std::get<0>(info.param) << "_out_of_" << std::get<1>(info.param) << "_" << std::get<2>(info.param); return res.str(); }; //gtest is going to want to apply our parameter set over an entire test suite, and we would rather not have that because //the number of possible changeover points varies per-test. Therefore, we define a test suite per test. class changeover_test_operations : public changeover_test {}; TEST_P(changeover_test_operations, perform_pbft_operation) { EXPECT_CALL(*(this->mock_io_context), post(_)).Times(Exactly(1)); this->build_pbft(); switch_here(); pbft_msg preprepare = pbft_msg(this->preprepare_msg); preprepare.set_sequence(1); this->pbft->handle_message(preprepare, default_original_msg); switch_here(); for (const auto& peer : *(this->current_peers_list)) { pbft_msg prepare = pbft_msg(preprepare); prepare.set_type(PBFT_MSG_PREPARE); this->pbft->handle_message(prepare, bzn::test::from(peer.uuid)); } switch_here(); for (const auto& peer : *(this->current_peers_list)) { pbft_msg commit = pbft_msg(preprepare); commit.set_type(PBFT_MSG_COMMIT); this->pbft->handle_message(commit, bzn::test::from(peer.uuid)); } } INSTANTIATE_TEST_CASE_P(changeover_test_set, changeover_test_operations, testing::Combine( Range(0u, 3u), Values(3u), Values("add_peer", "remove_peer", "replace_peer") ), ); class changeover_test_checkpoints : public changeover_test {}; TEST_P(changeover_test_checkpoints, perform_checkpoinnt) { std::shared_ptr cp_manager = std::make_shared(this->mock_io_context, storage, this->beacon, this->mock_node); const bzn::hash_t cp_hash = "a very hashy hash"; const uint64_t cp_seq = 42; const std::pair cp{cp_seq, cp_hash}; switch_here(); cp_manager->local_checkpoint_reached(cp); switch_here(); for (const auto& peer : *(this->current_peers_list)) { checkpoint_msg cp_msg; cp_msg.set_state_hash(cp_hash); cp_msg.set_sequence(cp_seq); bzn_envelope env; env.set_checkpoint_msg(cp_msg.SerializeAsString()); env.set_sender(peer.uuid); cp_manager->handle_checkpoint_message(env); } EXPECT_EQ(cp_manager->get_latest_stable_checkpoint(), cp); EXPECT_EQ(cp_manager->get_latest_local_checkpoint(), cp); switch_here(); EXPECT_EQ(cp_manager->get_latest_stable_checkpoint(), cp); EXPECT_EQ(cp_manager->get_latest_local_checkpoint(), cp); } INSTANTIATE_TEST_CASE_P(changeover_test_set, changeover_test_checkpoints, testing::Combine( Range(0u, 3u), Values(3u), Values("add_peer", "remove_peer", "replace_peer") ), ); ================================================ FILE: pbft/test/pbft_persistent_state_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include #include #include #include using namespace ::testing; namespace { const bzn::uuid_t NODE_UUID = "d1e04722-41f0-4c43-a6c0-86a9e62a88e3"; } namespace bzn { class persistent_state_test : public Test { public: std::shared_ptr storage = std::make_shared(); }; TEST_F(persistent_state_test, test_assignment) { persistent value(this->storage, uint64_t{}, "value"); value = 10u; persistent value2(this->storage, uint64_t{}, "value"); EXPECT_EQ(value2.value(), 10u); } TEST_F(persistent_state_test, test_no_storage_generates_exception) { EXPECT_THROW(persistent value(nullptr, 0, "value"), std::runtime_error); persistent v2; EXPECT_THROW(v2 = 10, std::runtime_error); EXPECT_THROW(v2.destroy(), std::runtime_error); } TEST_F(persistent_state_test, no_conversion_generates_exception) { struct test_struct { int a = 0; int b = 0; }; EXPECT_THROW(persistent t(this->storage, {}, "test"), std::runtime_error); } TEST_F(persistent_state_test, uninitialized_map_generates_exception) { std::map> m; EXPECT_THROW(m.insert({1u, {this->storage, "one", std::string("m"), static_cast(1)}}), std::runtime_error); } TEST_F(persistent_state_test, test_initialize) { std::map> m; persistent::init_kv_container(this->storage, "m", m); m.insert({1u, {this->storage, "one", std::string("m"), static_cast(1)}}); m.insert({2u, {this->storage, "two", std::string("m"), static_cast(2)}}); std::map> m2; persistent::init_kv_container(this->storage, "m", m2); EXPECT_EQ(m, m2); } TEST_F(persistent_state_test, test_initialize_nested) { std::map>> m; persistent::init_kv_container2(this->storage, "m", m); m[1].insert({3u, {this->storage, "one", std::string("m"), static_cast(3), static_cast(1)}}); m[2].insert({4u, {this->storage, "two", std::string("m"), static_cast(4), static_cast(2)}}); std::map>> m2; persistent::init_kv_container2(this->storage, "m", m2); EXPECT_EQ(m, m2); } TEST_F(persistent_state_test, test_escaping) { std::map>> m; persistent::init_kv_container2(this->storage , std::string{"m"} + ESCAPE_1 + "1", m); // m[1].insert({"test/one", {this->storage, "one", std::string("m/1"), std::string{"test/one"}, static_cast(1)}}); m[1].insert({std::string{"test"} + ESCAPE_1 + "one", {this->storage, "one", std::string{"m"} + ESCAPE_1 + "1" , std::string{"test"} + ESCAPE_1 + "one", static_cast(1)}}); m[2].insert({std::string{"test"} + ESCAPE_1 + "two", {this->storage, "two", std::string{"m"} + ESCAPE_1 + "1" , std::string{"test"} + ESCAPE_1 + "two", static_cast(2)}}); std::map>> m2; persistent::init_kv_container2(this->storage , std::string{"m"} + ESCAPE_1 + "1", m2); EXPECT_EQ(m, m2); auto key1 = persistent::generate_key(std::string{"hello"} + ESCAPE_1, std::string{"world"}); auto key2 = persistent::generate_key(std::string{"hello"}, std::string{ESCAPE_1} + "world"); EXPECT_NE(key1, key2); std::string subkey1{ESCAPE_1}; std::string subkey2{std::string{ESCAPE_2} + "x"}; auto key_res = persistent::generate_key(subkey1, subkey2); auto extracted = persistent::extract_subkeys(key_res.substr(SEPARATOR.size())); EXPECT_EQ(subkey1, std::get<0>(extracted)); EXPECT_EQ(subkey2, std::get<1>(extracted)); } TEST_F(persistent_state_test, test_physical_storage) { if (system(std::string("rm -r -f " + NODE_UUID).c_str())) {} { auto phys_storage = std::make_shared("./", "utest", NODE_UUID); persistent int_value(phys_storage, 10u, "int_value"); persistent str_value(phys_storage, "my_value", "str_value"); std::map> map_value; persistent::init_kv_container(phys_storage, "map_value", map_value); map_value[1] = {phys_storage, "one", "map_value", uint64_t{1u}}; map_value[2] = {phys_storage, "two", "map_value", uint64_t{2u}}; map_value[10] = {phys_storage, "ten", "map_value", uint64_t{10u}}; } { auto phys_storage = std::make_shared("./", "utest", NODE_UUID); persistent int_value(phys_storage, 0, "int_value"); EXPECT_EQ(int_value.value(), 10u); persistent str_value(phys_storage, "", "str_value"); EXPECT_EQ(str_value.value(), "my_value"); std::map> map_value; persistent::init_kv_container(phys_storage, "map_value", map_value); EXPECT_EQ(map_value[1].value(), "one"); EXPECT_EQ(map_value[2].value(), "two"); EXPECT_EQ(map_value[10].value(), "ten"); } if (system(std::string("rm -r -f " + NODE_UUID).c_str())) {} } TEST_F(persistent_state_test, test_conversions) { std::string str1{"This is a test"}; std::string str1_1{persistent::to_string(str1)}; std::string str1_2{persistent::from_string(str1)}; EXPECT_EQ(str1, str1_1); EXPECT_EQ(str1, str1_2); bzn::log_key_t log_key{1u, 2u}; std::string log_key_1{persistent::to_string(log_key)}; bzn::log_key_t log_key_2{persistent::from_string(log_key_1)}; EXPECT_EQ(log_key, log_key_2); bzn::operation_key_t operation_key{1u, 2u, "hash"}; std::string operation_key_1{persistent::to_string(operation_key)}; bzn::operation_key_t operation_key_2{persistent::from_string(operation_key_1)}; EXPECT_EQ(operation_key, operation_key_2); bzn::checkpoint_t checkpoint{1u, "hash"}; std::string checkpoint_1{persistent::to_string(checkpoint)}; bzn::checkpoint_t checkpoint_2{persistent::from_string(checkpoint_1)}; EXPECT_EQ(checkpoint, checkpoint_2); bzn_envelope envelope; std::string envelope_1{persistent::to_string(envelope)}; bzn_envelope envelope_2{persistent::from_string(envelope_1)}; EXPECT_EQ(envelope.SerializeAsString(), envelope_2.SerializeAsString()); EXPECT_THROW(persistent::from_string({"00000abc_0000001"}), std::runtime_error); EXPECT_THROW(persistent::from_string({"00000001_000x001"}), std::runtime_error); EXPECT_THROW(persistent::from_string({"00000abc_0000001_hash"}), std::runtime_error); EXPECT_THROW(persistent::from_string({"00000001_000x001_hash"}), std::runtime_error); EXPECT_THROW(persistent::from_string({"00000abc_hash"}), std::runtime_error); EXPECT_THROW(persistent::from_string({"garbage_string"}), std::runtime_error); } TEST_F(persistent_state_test, test_forked_alias_generates_exception) { persistent str{this->storage, "test", "test_key"}; persistent str2{this->storage, "test2", "test_key"}; EXPECT_EQ(str2.value(), "test"); str2 = "test2"; #ifndef NDEBUG EXPECT_THROW(str = "test", std::runtime_error); #endif } } ================================================ FILE: pbft/test/pbft_proto_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include #include using namespace ::testing; namespace { // uint64_t MAX_REQUEST_SIZE{249 * 1024}; uint64_t MAX_REQUEST_SIZE{10 * 1024}; } namespace bzn { using namespace test; size_t pbft_proto_test::faulty_nodes_bound() const { return this->pbft->max_faulty_nodes(); } std::shared_ptr pbft_proto_test::send_request() { // after request is sent, SUT will send out pre-prepares to all nodes auto operation = std::shared_ptr(); EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_preprepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())) .WillRepeatedly(Invoke([&](auto, auto wmsg) { pbft_msg msg; if (msg.ParseFromString(wmsg->pbft())) { if (operation == nullptr) { operation = this->operation_manager->find_or_construct(this->view, msg.sequence(), msg.request_hash()); // the SUT needs the pre-prepare it sends to itself in order to execute state machine this->send_preprepare(operation->get_sequence(), operation->get_request()); } } })); bzn_envelope request; database_msg dmsg; dmsg.mutable_create()->set_key(std::string("key_" + std::to_string(++this->index))); dmsg.mutable_create()->set_value(std::string(MAX_REQUEST_SIZE, 'a')); request.set_database_msg(dmsg.SerializeAsString()); request.set_timestamp(this->now()); request.set_sender(this->pbft->get_uuid()); pbft->handle_request(request); return operation; } // send a preprepare message to SUT void pbft_proto_test::send_preprepare(uint64_t sequence, const bzn_envelope& request) { // after preprepare is sent, SUT will send out prepares to all nodes EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_prepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); auto peer = *(TEST_PEER_LIST.begin()); pbft_msg preprepare; preprepare.set_view(this->view); preprepare.set_sequence(sequence); preprepare.set_type(PBFT_MSG_PREPREPARE); if (request.payload_case() == bzn_envelope::kPbftInternalRequest) { preprepare.set_allocated_request(new bzn_envelope(request)); } preprepare.set_request_hash(this->pbft->crypto->hash(request)); auto wmsg = wrap_pbft_msg(preprepare, peer.uuid); if (request.payload_case() != bzn_envelope::kPbftInternalRequest) { *wmsg.add_piggybacked_requests() = request; } pbft->handle_message(preprepare, wmsg); } // send fake prepares from all nodes to SUT void pbft_proto_test::send_prepares(uint64_t sequence, const bzn::hash_t& request_hash) { // after prepares are sent, SUT will send out commits to all nodes EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_commit, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); for (const auto& peer : TEST_PEER_LIST) { pbft_msg prepare; prepare.set_view(this->view); prepare.set_sequence(sequence); prepare.set_type(PBFT_MSG_PREPARE); prepare.set_request_hash(request_hash); auto wmsg = wrap_pbft_msg(prepare, peer.uuid); pbft->handle_message(prepare, wmsg); } } // send fake commits from all nodes to SUT void pbft_proto_test::send_commits(uint64_t sequence, const bzn::hash_t& request_hash) { // after commits are sent, SUT will post the operation for execution // we want to simulate that it's been executed successfully EXPECT_CALL(*(this->mock_io_context), post(_)).Times(Exactly(1)); for (const auto& peer : TEST_PEER_LIST) { pbft_msg commit; commit.set_view(this->view); commit.set_sequence(sequence); commit.set_type(PBFT_MSG_COMMIT); commit.set_request_hash(request_hash); auto wmsg = wrap_pbft_msg(commit, peer.uuid); pbft->handle_message(commit, wmsg); } // tell pbft that this operation has been executed this->service_execute_handler(this->operation_manager->find_or_construct(this->view, sequence, request_hash)); } void pbft_proto_test::prepare_for_checkpoint(size_t seq) { // pbft needs a hash for this checkpoint EXPECT_CALL(*this->mock_service, service_state_hash(seq)).Times(AnyNumber()) .WillRepeatedly(Invoke([&](auto s) { return std::to_string(s); })); // after enough commits are sent, SUT will send out checkpoint message to all nodes EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_checkpoint, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); } void pbft_proto_test::force_checkpoint(size_t seq) { this->pbft->checkpoint_manager->local_checkpoint_reached(checkpoint_t{seq, "dummy checkpoint state"}); } checkpoint_msg pbft_proto_test::build_checkpoint_msg(uint64_t sequence) { checkpoint_msg cp; cp.set_sequence(sequence); cp.set_state_hash(std::to_string(sequence)); return cp; } void pbft_proto_test::send_checkpoint(bzn::peer_address_t node, uint64_t sequence) { auto msg = build_checkpoint_msg(sequence); bzn_envelope wrapper; wrapper.set_checkpoint_msg(msg.SerializeAsString()); wrapper.set_sender(node.uuid); this->pbft->checkpoint_manager->handle_checkpoint_message(wrapper); } void pbft_proto_test::stabilize_checkpoint(size_t seq) { for (const auto& peer : TEST_PEER_LIST) { if (peer.uuid == this->uuid) { continue; } this->send_checkpoint(peer, seq); } } void pbft_proto_test::run_transaction_through_primary(bool commit) { // send request to SUT and handle expected calls auto op = send_request(); ASSERT_NE(op, nullptr); // send node prepares to SUT send_prepares(op->get_sequence(), op->get_request_hash()); // send node commits to SUT if (commit) { send_commits(op->get_sequence(), op->get_request_hash()); } } void pbft_proto_test::run_transaction_through_backup(bool commit) { // create request bzn_envelope request; database_msg dmsg; dmsg.mutable_create()->set_key(std::string("key_" + std::to_string(++this->index))); dmsg.mutable_create()->set_value(std::string("value_" + std::to_string(this->index))); request.set_database_msg(dmsg.SerializeAsString()); // send pre-prepare to SUT send_preprepare(this->index, request); // send prepares to SUT auto request_hash = this->pbft->crypto->hash(request); send_prepares(this->index, request_hash); // send commits to SUT if (commit) { send_commits(this->index, request_hash); } } TEST_F(pbft_proto_test, test_primary_full_checkpoint) { this->build_pbft(); for (size_t i = 0; i < 99; i++) { run_transaction_through_primary(); } prepare_for_checkpoint(100); run_transaction_through_primary(); } TEST_F(pbft_proto_test, test_primary_quick_checkpoint) { this->build_pbft(); for (size_t i = 0; i < 9; i++) { run_transaction_through_primary(); } prepare_for_checkpoint(10); run_transaction_through_primary(); force_checkpoint(10); } TEST_F(pbft_proto_test, test_backup_full_checkpoint) { this->uuid = SECOND_NODE_UUID; this->build_pbft(); for (size_t i = 0; i < 99; i++) { run_transaction_through_backup(); } prepare_for_checkpoint(100); run_transaction_through_backup(); } TEST_F(pbft_proto_test, test_backup_quick_checkpoint) { this->uuid = SECOND_NODE_UUID; this->build_pbft(); for (size_t i = 0; i < 9; i++) { run_transaction_through_backup(); } prepare_for_checkpoint(10); run_transaction_through_backup(); force_checkpoint(10); } } ================================================ FILE: pbft/test/pbft_proto_test.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include using namespace ::testing; namespace bzn { using namespace test; class pbft_proto_test : public pbft_test { public: // send a fake request to SUT std::shared_ptr send_request(); // send a preprepare message to SUT void send_preprepare(uint64_t sequence, const bzn_envelope& request); // send fake prepares from all nodes to SUT void send_prepares(uint64_t sequence, const bzn::hash_t& request_hash); // send fake commits from all nodes to SUT void send_commits(uint64_t sequence, const bzn::hash_t& request_hash); // set expectations for upcoming checkpoint void prepare_for_checkpoint(size_t seq); // build a checkpoint message checkpoint_msg build_checkpoint_msg(uint64_t sequence); // send a checkpoint message on behalf of a node void send_checkpoint(bzn::peer_address_t node, uint64_t sequence); // send checkpoints from all nodes void stabilize_checkpoint(size_t seq); // get SUT to create a checkpoint at a specific sequence number void force_checkpoint(size_t seq); // send a database request through a primary all the way to possibly committing it void run_transaction_through_primary(bool commit = true); // send a database request through a backup node all the way to possibly committing it void run_transaction_through_backup(bool commit = true); // return the number of nodes that represent "f" size_t faulty_nodes_bound() const; // current request sequence size_t index = 0; // current view uint64_t view = 1; // get the current time in milliseconds uint64_t now() { return this->pbft->now(); } // send request to pbft void handle_request(const bzn_envelope& msg, const std::shared_ptr& session = nullptr) { this->pbft->handle_request(msg, session); } }; } ================================================ FILE: pbft/test/pbft_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include #include #include #include #include #include namespace bzn::test { TEST_F(pbft_test, test_requests_create_operations) { this->build_pbft(); ASSERT_TRUE(pbft->is_primary()); ASSERT_EQ(0u, this->operation_manager->held_operations_count()); pbft->handle_database_message(this->request_msg, this->mock_session); ASSERT_EQ(1u, this->operation_manager->held_operations_count()); } TEST_F(pbft_test, test_requests_fire_preprepare) { this->build_pbft(); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_preprepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); pbft->handle_database_message(this->request_msg, this->mock_session); } TEST_F(pbft_test, test_forwarded_to_primary_when_not_primary) { EXPECT_CALL(*mock_node, send_signed_message(A(), A>())).Times(1).WillRepeatedly(Invoke( [&](auto ep, auto msg) { EXPECT_EQ(ep, make_endpoint(this->pbft->get_current_primary().value())); EXPECT_EQ(msg->payload_case(), bzn_envelope::kDatabaseMsg); })); this->uuid = SECOND_NODE_UUID; this->build_pbft(); EXPECT_FALSE(pbft->is_primary()); pbft->handle_database_message(this->request_msg, this->mock_session); } std::set seen_sequences; void save_sequences(const boost::asio::ip::tcp::endpoint& /*ep*/, std::shared_ptr wrapped_msg) { pbft_msg msg; msg.ParseFromString(wrapped_msg->pbft()); seen_sequences.insert(msg.sequence()); } TEST_F(pbft_test, test_different_requests_get_different_sequences) { this->build_pbft(); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), _)).WillRepeatedly(Invoke(save_sequences)); database_msg req, req2; req.mutable_header()->set_nonce(5); req2.mutable_header()->set_nonce(1055); seen_sequences = std::set(); pbft->handle_database_message(wrap_request(req), this->mock_session); pbft->handle_database_message(wrap_request(req2), this->mock_session); ASSERT_EQ(seen_sequences.size(), 2u); } TEST_F(pbft_test, test_preprepare_triggers_prepare) { this->build_pbft(); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_prepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); this->pbft->handle_message(this->preprepare_msg, default_original_msg); } TEST_F(pbft_test, test_wrong_view_preprepare_rejected) { this->build_pbft(); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), _)).Times(Exactly(0)); pbft_msg preprepare2(this->preprepare_msg); preprepare2.set_view(6); this->pbft->handle_message(preprepare2, default_original_msg); } TEST_F(pbft_test, test_no_duplicate_prepares_same_sequence_number) { this->build_pbft(); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), _)).Times(Exactly(TEST_PEER_LIST.size())); pbft_msg preprepare2(this->preprepare_msg); preprepare2.set_request_hash("some other hash"); this->pbft->handle_message(this->preprepare_msg, default_original_msg); this->pbft->handle_message(preprepare2, default_original_msg); } TEST_F(pbft_test, test_commit_messages_sent) { this->build_pbft(); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_prepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_commit, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); this->pbft->handle_message(this->preprepare_msg, default_original_msg); for (const auto& peer : TEST_PEER_LIST) { pbft_msg prepare = pbft_msg(this->preprepare_msg); prepare.set_type(PBFT_MSG_PREPARE); this->pbft->handle_message(prepare, from(peer.uuid)); } } TEST_F(pbft_test, test_commits_applied) { EXPECT_CALL(*(this->mock_io_context), post(_)).Times(Exactly(1)); this->build_pbft(); pbft_msg preprepare = pbft_msg(this->preprepare_msg); preprepare.set_sequence(1); this->pbft->handle_message(preprepare, default_original_msg); for (const auto& peer : TEST_PEER_LIST) { pbft_msg prepare = pbft_msg(preprepare); pbft_msg commit = pbft_msg(preprepare); prepare.set_type(PBFT_MSG_PREPARE); commit.set_type(PBFT_MSG_COMMIT); this->pbft->handle_message(prepare, from(peer.uuid)); this->pbft->handle_message(commit, from(peer.uuid)); } } TEST_F(pbft_test, dummy_pbft_service_does_not_crash) { database_msg db; mock_service->query(db, 0); mock_service->consolidate_log(2); } TEST_F(pbft_test, client_request_does_not_result_in_message_ack) { this->build_pbft(); auto mock_session = std::make_shared>(); EXPECT_CALL(*mock_session, send_message(A>())).Times(Exactly(0)); this->database_handler(this->request_msg, mock_session); } TEST_F(pbft_test, database_response_is_forwarded_to_session) { this->build_pbft(); auto mock_session = std::make_shared>(); EXPECT_CALL(*mock_session, send_message(A>())).Times(Exactly(1)); this->pbft->sessions_waiting_on_forwarded_requests["utest"] = mock_session; database_response resp; resp.mutable_header()->set_request_hash("utest"); this->request_msg.set_database_response(resp.SerializeAsString()); this->database_response_handler(this->request_msg, mock_session); } TEST_F(pbft_test, add_session_to_sessions_waiting_can_add_a_session_and_shutdown_handler_removes_session_from_sessions_waiting) { this->build_pbft(); EXPECT_EQ(size_t(0), this->pbft->sessions_waiting_on_forwarded_requests.size()); bzn::session_shutdown_handler shutdown_handler{0}; EXPECT_CALL(*mock_session, add_shutdown_handler(_)) .Times(Exactly(1)) .WillRepeatedly(Invoke([&](auto handler) { shutdown_handler = handler; })); pbft->handle_database_message(this->request_msg, this->mock_session); EXPECT_EQ(size_t(1), this->pbft->sessions_waiting_on_forwarded_requests.size()); EXPECT_TRUE(shutdown_handler != nullptr); shutdown_handler(); EXPECT_EQ(size_t(0), this->pbft->sessions_waiting_on_forwarded_requests.size()); } TEST_F(pbft_test, client_request_executed_results_in_message_response) { auto mock_session = std::make_shared(); EXPECT_CALL(*mock_session, send_message(A>())).Times(Exactly(1)); std::vector peers; auto op = std::make_shared(1, 1, "somehash"); op->set_session(mock_session); dummy_pbft_service service(this->mock_io_context); service.register_execute_handler([](auto){}); service.apply_operation(op); } MATCHER(operation_ptr_has_session, "") { return arg->has_session(); } TEST_F(pbft_test, request_redirect_attaches_session) { EXPECT_CALL(*mock_service, apply_operation(operation_ptr_has_session())); EXPECT_CALL(*mock_io_context, post(_)).WillRepeatedly(Invoke( [](const auto task) { task(); } )); this->uuid = SECOND_NODE_UUID; this->build_pbft(); EXPECT_FALSE(pbft->is_primary()); this->request_msg.set_timestamp(now()); pbft->handle_database_message(this->request_msg, this->mock_session); auto hash = this->crypto->hash(this->request_msg); this->send_preprepare(1, 1, hash, this->request_msg); this->send_prepares(1, 1, hash); this->send_commits(1, 1, hash); } TEST_F(pbft_test, late_request_redirect_attaches_session) { EXPECT_CALL(*mock_service, apply_operation(operation_ptr_has_session())); EXPECT_CALL(*mock_io_context, post(_)).WillRepeatedly(Invoke( [](const auto task) { task(); } )); this->uuid = SECOND_NODE_UUID; this->build_pbft(); EXPECT_FALSE(pbft->is_primary()); this->request_msg.set_timestamp(now()); auto hash = this->crypto->hash(this->request_msg); this->send_preprepare(1, 1, hash, this->request_msg); this->send_prepares(1, 1, hash); pbft->handle_database_message(this->request_msg, this->mock_session); this->send_commits(1, 1, hash); } TEST_F(pbft_test, bzn_envelope_has_repeated_request_body_field) { // My goal here is to generate a bzn_envelope and ensure that it has the repeated request_body field EXPECT_CALL(*mock_node, send_signed_message(A(), A>())).Times(1).WillRepeatedly(Invoke( [&](auto /*ep*/, auto msg) { EXPECT_EQ( 0, msg->piggybacked_requests_size()); auto piggybacked_requests = msg->mutable_piggybacked_requests(); EXPECT_TRUE(piggybacked_requests->empty()); bzn_envelope env; *(msg->add_piggybacked_requests()) = env; *(msg->add_piggybacked_requests()) = env; EXPECT_FALSE(piggybacked_requests->empty()); EXPECT_EQ( 2, msg->piggybacked_requests_size()); })); this->uuid = SECOND_NODE_UUID; this->build_pbft(); EXPECT_FALSE(pbft->is_primary()); pbft->handle_database_message(this->request_msg, this->mock_session); } TEST_F(pbft_test, ensure_save_all_requests_records_requests) { EXPECT_CALL(*mock_node, send_signed_message(A(), A>())).Times(1).WillRepeatedly(Invoke( [&](auto /*ep*/, auto msg) { EXPECT_EQ( 0, msg->piggybacked_requests_size()); auto piggybacked_requests = msg->mutable_piggybacked_requests(); EXPECT_TRUE(piggybacked_requests->empty()); bzn_envelope env; pbft_msg d_msg; env.set_pbft(d_msg.SerializeAsString()); *(msg->add_piggybacked_requests()) = env; d_msg.set_view(3); env.set_pbft(d_msg.SerializeAsString()); *(msg->add_piggybacked_requests()) = env; auto hash_to_env = this->pbft->map_request_to_hash(*msg); EXPECT_FALSE(piggybacked_requests->empty()); EXPECT_EQ( 2u, hash_to_env.size()); })); this->uuid = SECOND_NODE_UUID; this->build_pbft(); this->pbft->handle_database_message(this->request_msg, this->mock_session); } TEST_F(pbft_test, test_admission_control) { const size_t reqs{5}; this->options->get_mutable_simple_options().set("admission_window", std::to_string(reqs)); this->build_pbft(); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(is_preprepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size() * reqs)); this->request_msg.set_timestamp(now()); for (size_t i = 0; i < reqs; i++) { pbft->handle_database_message(this->request_msg, this->mock_session); this->request_msg.set_timestamp(this->request_msg.timestamp() + 1); } EXPECT_CALL(*mock_session, send_message(_)) .Times(Exactly(1)) .WillOnce(Invoke([&](auto& msg) { bzn_envelope env; ASSERT_TRUE(env.ParseFromString(*msg)); ASSERT_EQ(env.payload_case(), bzn_envelope::kSwarmError); swarm_error err; ASSERT_TRUE(err.ParseFromString(env.swarm_error())); ASSERT_EQ(err.message(), "SERVER TOO BUSY"); })); pbft->handle_database_message(this->request_msg, this->mock_session); } TEST_F(pbft_test, too_big_request_generates_error) { this->build_pbft(); database_msg dmsg; dmsg.mutable_create()->set_key(std::string("key")); dmsg.mutable_create()->set_value(std::string(bzn::MAX_VALUE_SIZE + 1, 'a')); bzn_envelope request; request.set_database_msg(dmsg.SerializeAsString()); request.set_sender(TEST_NODE_UUID); EXPECT_CALL(*this->mock_session, send_message(ResultOf(test::is_swarm_error, Eq(true)))); pbft->handle_database_message(request, this->mock_session); } } ================================================ FILE: pbft/test/pbft_test_common.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include namespace bzn::test { pbft_test::pbft_test() { // This pattern copied from audit_test, to allow us to declare expectations on the timer that pbft will // construct EXPECT_CALL(*(this->mock_node), register_for_message(bzn_envelope::kPbft, _)) .Times(Exactly(1)) .WillOnce( Invoke( [&](const auto&, auto handler) { this->message_handler = handler; return true; } )); EXPECT_CALL(*(this->mock_node), register_for_message(bzn_envelope::kPbftMembership, _)) .Times(Exactly(1)) .WillOnce( Invoke( [&](const auto&, auto handler) { this->membership_handler = handler; return true; } )); EXPECT_CALL(*(this->mock_node), register_for_message(bzn_envelope::kDatabaseMsg, _)) .Times(Exactly(1)) .WillOnce( Invoke( [&](const auto&, auto handler) { this->database_handler = handler; return true; } )); EXPECT_CALL(*(this->mock_node), register_for_message(bzn_envelope::kDatabaseResponse, _)) .Times(Exactly(1)) .WillOnce( Invoke( [&](const auto&, auto handler) { this->database_response_handler = handler; return true; } )); EXPECT_CALL(*(this->mock_node), register_for_message(bzn_envelope::kCheckpointMsg, _)) .Times(Exactly(1)) .WillOnce( Invoke( [&](const auto&, auto handler) { this->checkpoint_msg_handler = handler; return true; } )); EXPECT_CALL(*(this->mock_node), register_error_handler(_)) .Times(Exactly(1)); EXPECT_CALL(*(this->mock_node), send_maybe_signed_message(A(), _)) .Times(AnyNumber()); EXPECT_CALL(*(this->mock_io_context), make_unique_steady_timer()) .Times(AnyNumber()) .WillOnce( Invoke( [&]() { return std::move(this->audit_heartbeat_timer); } )) .WillRepeatedly( Invoke( [&]() { auto timer = std::make_unique>(); EXPECT_CALL(*timer, async_wait(_)) .Times(AnyNumber()) .WillOnce( Invoke( [&](const auto handler) { this->cp_manager_timer_callbacks[cp_manager_timer_callback_count++] = handler; } ) ); return timer; } )); EXPECT_CALL(*(this->audit_heartbeat_timer), async_wait(_)) .Times(AnyNumber()) .WillRepeatedly( Invoke( [&](auto handler) { this->audit_heartbeat_timer_callback = handler; } )); EXPECT_CALL(*(this->new_config_timer), async_wait(_)) .Times(AnyNumber()) .WillRepeatedly( Invoke( [&](auto handler) { this->new_config_timer_callback = handler; } )); EXPECT_CALL(*(this->mock_service), register_execute_handler(_)) .Times(Exactly(1)) .WillOnce( Invoke( [&](auto handler) { this->service_execute_handler = handler; } )); database_msg db; this->request_msg.set_database_msg(db.SerializeAsString()); this->options->get_mutable_simple_options().set("listener_address", TEST_NODE_ADDR); this->options->get_mutable_simple_options().set("listener_port", std::to_string(TEST_NODE_LISTEN_PORT)); this->options->get_mutable_simple_options().set("crypto_enabled_incoming", std::to_string(false)); this->options->get_mutable_simple_options().set("crypto_enabled_outgoing", std::to_string(false)); preprepare_msg = pbft_msg(); preprepare_msg.set_type(PBFT_MSG_PREPREPARE); preprepare_msg.set_sequence(19); preprepare_msg.set_view(1); preprepare_msg.set_request_hash(this->crypto->hash(this->request_msg)); *(this->default_original_msg.add_piggybacked_requests()) = this->request_msg; this->default_original_msg.set_sender("uuid0"); } void pbft_test::build_pbft() { this->options->get_mutable_simple_options().set("uuid", this->uuid); this->pbft = std::make_shared( this->mock_node , this->mock_io_context , this->beacon , this->options , this->mock_service , this->crypto , this->operation_manager , this->storage , this->monitor ); this->pbft->set_audit_enabled(false); this->pbft->start(); this->pbft_built = true; } void pbft_test::TearDown() { // The code that extracts callbacks, etc expects that this will actually happen at some point, but some // of the tests do not actually require it if (!this->pbft_built) { this->build_pbft(); } } void pbft_test::send_preprepare(uint64_t view, uint64_t sequence, bzn::hash_t req_hash, std::optional request) { pbft_msg preprepare; preprepare.set_view(view); preprepare.set_sequence(sequence); preprepare.set_request_hash(req_hash); preprepare.set_type(PBFT_MSG_PREPREPARE); bzn_envelope original; if (request) { (*original.add_piggybacked_requests()) = *request; } original.set_pbft(preprepare.SerializeAsString()); original.set_sender("uuid0"); this->pbft->handle_message(preprepare, original); } void pbft_test::send_prepares(uint64_t view, uint64_t sequence, bzn::hash_t req_hash) { pbft_msg prepare; prepare.set_view(view); prepare.set_sequence(sequence); prepare.set_request_hash(req_hash); prepare.set_type(PBFT_MSG_PREPARE); for (const auto& peer : TEST_PEER_LIST) { bzn_envelope original; original.set_pbft(prepare.SerializeAsString()); original.set_sender(peer.uuid); this->pbft->handle_message(prepare, original); } } void pbft_test::send_commits(uint64_t view, uint64_t sequence, bzn::hash_t req_hash) { pbft_msg commit; commit.set_view(view); commit.set_sequence(sequence); commit.set_request_hash(req_hash); commit.set_type(PBFT_MSG_COMMIT); for (const auto& peer : TEST_PEER_LIST) { bzn_envelope original; original.set_pbft(commit.SerializeAsString()); original.set_sender(peer.uuid); this->pbft->handle_message(commit, original); } } uint64_t now() { return (std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count()); } pbft_msg extract_pbft_msg(bzn_envelope msg) { pbft_msg result; result.ParseFromString(msg.pbft()); return result; } pbft_membership_msg extract_pbft_membership_msg(bzn_envelope msg) { pbft_membership_msg result; result.ParseFromString(msg.pbft_membership()); return result; } std::string extract_sender(std::string msg) { bzn_envelope outer; outer.ParseFromString(msg); return outer.sender(); } bzn_envelope wrap_pbft_msg(const pbft_msg& msg, const bzn::uuid_t sender) { bzn_envelope result; result.set_pbft(msg.SerializeAsString()); result.set_sender(sender); return result; } bzn_envelope wrap_pbft_membership_msg(const pbft_membership_msg& msg, const bzn::uuid_t sender) { bzn_envelope result; result.set_pbft_membership(msg.SerializeAsString()); result.set_sender(sender); return result; } bool is_preprepare(std::shared_ptr wrapped_msg) { if (wrapped_msg->payload_case() != bzn_envelope::kPbft) { return false; } pbft_msg msg = extract_pbft_msg(*wrapped_msg); return msg.type() == PBFT_MSG_PREPREPARE && msg.view() > 0 && msg.sequence() > 0; } bool is_prepare(std::shared_ptr wrapped_msg) { if (wrapped_msg->payload_case() != bzn_envelope::kPbft) { return false; } pbft_msg msg = extract_pbft_msg(*wrapped_msg); return msg.type() == PBFT_MSG_PREPARE && msg.view() > 0 && msg.sequence() > 0; } bool is_commit(std::shared_ptr wrapped_msg) { if (wrapped_msg->payload_case() != bzn_envelope::kPbft) { return false; } pbft_msg msg = extract_pbft_msg(*wrapped_msg); return msg.type() == PBFT_MSG_COMMIT && msg.view() > 0 && msg.sequence() > 0; } bool is_checkpoint(std::shared_ptr wrapped_msg) { if (wrapped_msg->payload_case() != bzn_envelope::kCheckpointMsg) { return false; } checkpoint_msg msg; return msg.ParseFromString(wrapped_msg->checkpoint_msg()) && msg.sequence() != 0 && msg.state_hash() != ""; } bool is_join(std::shared_ptr wrapped_msg) { if (wrapped_msg->payload_case() != bzn_envelope::kPbftMembership) { return false; } auto msg = extract_pbft_membership_msg(*wrapped_msg); return msg.type() == PBFT_MMSG_JOIN && wrapped_msg->sender() != ""; } bool is_audit(std::shared_ptr msg) { audit_message parsed; return (msg->payload_case() == bzn_envelope::kAudit && parsed.ParseFromString(msg->audit())); } bool is_viewchange(std::shared_ptr wrapped_msg) { pbft_msg msg; msg.ParseFromString(wrapped_msg->pbft()); return msg.type() == PBFT_MSG_VIEWCHANGE; } bool is_newview(std::shared_ptr wrapped_msg) { pbft_msg msg; msg.ParseFromString(wrapped_msg->pbft()); return msg.type() == PBFT_MSG_NEWVIEW; } bool is_swarm_error(std::shared_ptr msg) { bzn_envelope env; return env.ParseFromString(*msg) && env.payload_case() == bzn_envelope::kSwarmError; } bzn_envelope from(uuid_t uuid) { bzn_envelope result; result.set_sender(uuid); return result; } bzn_envelope wrap_request(const database_msg& db) { bzn_envelope env; env.set_database_msg(db.SerializeAsString()); return env; } } ================================================ FILE: pbft/test/pbft_test_common.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::testing; namespace bzn::test { const bzn::uuid_t TEST_NODE_UUID{"uuid1"}; const bzn::uuid_t SECOND_NODE_UUID{"uuid0"}; const std::string TEST_NODE_ADDR("127.0.0.1"); const uint16_t TEST_NODE_LISTEN_PORT(8084); const bzn::peers_list_t TEST_PEER_LIST{{ "127.0.0.1", 8081, "name1", "uuid0"} , {"127.0.0.1", 8082, "name2", "uuid2"} , {"127.0.0.1", 8083, "name3", "uuid3"} , {TEST_NODE_ADDR, TEST_NODE_LISTEN_PORT, "name4", TEST_NODE_UUID}}; const std::string TEST_NODE_ADDR_0("127.0.0.1"); const bzn::peers_list_t BAD_TEST_PEER_LIST_0{{ "127.0.0.1", 8081, "name1", "uuid0"} , {"127.0.0.1", 8082, "name2", "uuid2"} , {"127.0.0.1", 8083, "name3", "uuid3"} , {TEST_NODE_ADDR_0, TEST_NODE_LISTEN_PORT, "name4", "uuid_of_bad_node"}}; const bzn::peers_list_t GOOD_TEST_PEER_LIST{{ "127.0.0.1", 8081, "name1", "uuid0"} , {"127.0.0.1", 8082, "name2", "uuid2"} , {"127.0.0.1", 8083, "name3", "uuid3"} , {TEST_NODE_ADDR_0, uint16_t(TEST_NODE_LISTEN_PORT + 73), "name4", "uuid_of_good_node"}}; class pbft_test : public Test { public: bzn_envelope request_msg; pbft_msg preprepare_msg; bzn_envelope default_original_msg; std::shared_ptr mock_io_context = std::make_shared>(); std::shared_ptr mock_node = std::make_shared(); std::shared_ptr mock_service = std::make_shared>(); std::shared_ptr mock_session = std::make_shared>(); std::shared_ptr storage = std::make_shared(); std::shared_ptr operation_manager = std::make_shared(static_peers_beacon_for(TEST_PEER_LIST), storage); std::shared_ptr options = std::make_shared(); std::shared_ptr monitor = std::make_shared>(); std::shared_ptr crypto = std::make_shared(options, monitor); std::shared_ptr beacon = bzn::static_peers_beacon_for(bzn::test::TEST_PEER_LIST); std::shared_ptr pbft; std::unique_ptr audit_heartbeat_timer = std::make_unique>(); std::unique_ptr new_config_timer = std::make_unique>(); std::unique_ptr join_retry_timer = std::make_unique>(); std::unique_ptr cp_manager_timer1 = std::make_unique>(); bzn::asio::wait_handler audit_heartbeat_timer_callback; bzn::asio::wait_handler new_config_timer_callback; size_t cp_manager_timer_callback_count = 0; std::unordered_map cp_manager_timer_callbacks; bzn::execute_handler_t service_execute_handler; bzn::protobuf_handler message_handler; bzn::protobuf_handler database_handler; bzn::protobuf_handler database_response_handler; bzn::protobuf_handler membership_handler; bzn::protobuf_handler checkpoint_msg_handler; bzn::uuid_t uuid = TEST_NODE_UUID; bool pbft_built = false; pbft_test(); void build_pbft(); void TearDown(); void send_preprepare(uint64_t view, uint64_t sequence, bzn::hash_t req_hash, std::optional request); void send_prepares(uint64_t view, uint64_t sequence, bzn::hash_t req_hash); void send_commits(uint64_t view, uint64_t sequence, bzn::hash_t req_hash); }; uint64_t now(); pbft_msg extract_pbft_msg(std::string msg); uuid_t extract_sender(std::string msg); bzn_envelope wrap_pbft_msg(const pbft_msg& msg, const bzn::uuid_t sender=""); bzn_envelope wrap_pbft_membership_msg(const pbft_membership_msg& msg, const bzn::uuid_t sender); bzn_envelope wrap_request(const database_msg& msg); bool is_preprepare(std::shared_ptr msg); bool is_prepare(std::shared_ptr msg); bool is_commit(std::shared_ptr msg); bool is_checkpoint(std::shared_ptr msg); bool is_join(std::shared_ptr msg); bool is_audit(std::shared_ptr msg); bool is_viewchange(std::shared_ptr wrapped_msg); bool is_newview(std::shared_ptr wrapped_msg); bool is_swarm_error(std::shared_ptr msg); bzn_envelope from(uuid_t uuid); } ================================================ FILE: pbft/test/pbft_timestamp_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License #include #include #include #include using namespace ::testing; namespace bzn { using namespace test; TEST_F(pbft_proto_test, repeated_request_doesnt_generate_preprepare) { this->build_pbft(); database_msg dmsg; dmsg.mutable_create()->set_key(std::string("key")); dmsg.mutable_create()->set_value(std::string("value")); bzn_envelope request; request.set_database_msg(dmsg.SerializeAsString()); request.set_timestamp(this->now()); request.set_sender(TEST_NODE_UUID); // the first time we should get pre-prepare messages EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_preprepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); this->handle_request(request); auto request2 = bzn_envelope(request); // this time no pre-prepare should be issued EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_preprepare, Eq(true)))) .Times(Exactly(0)); std::shared_ptr session = std::make_shared(); EXPECT_CALL(*session, send_message(ResultOf(test::is_swarm_error, Eq(true)))); this->handle_request(request2, session); } TEST_F(pbft_proto_test, similar_request_generates_preprepare) { this->build_pbft(); // send an initial message database_msg dmsg; dmsg.mutable_create()->set_key(std::string("key")); dmsg.mutable_create()->set_value(std::string("value")); bzn_envelope request; request.set_database_msg(dmsg.SerializeAsString()); request.set_timestamp(this->now()); request.set_sender(TEST_NODE_UUID); // we should get pre-prepare messages EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_preprepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); this->handle_request(request); // send a second message the same as first but with a slightly different timestamp auto request2 = bzn_envelope(request); request2.set_timestamp(request2.timestamp() + 1); // again we should get pre-prepare messages EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_preprepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); this->handle_request(request2); // send a third message the same as first but with same timestamp and different operation database_msg dmsg3; dmsg3.mutable_create()->set_key(std::string("key3")); dmsg3.mutable_create()->set_value(std::string("value3")); auto request3 = bzn_envelope(request); request3.set_database_msg(dmsg3.SerializeAsString()); // again we should get pre-prepare messages EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_preprepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); this->handle_request(request3); } TEST_F(pbft_proto_test, same_request_from_different_client_generates_preprepare) { this->build_pbft(); // send an initial message database_msg dmsg; dmsg.mutable_create()->set_key(std::string("key")); dmsg.mutable_create()->set_value(std::string("value")); bzn_envelope request; request.set_database_msg(dmsg.SerializeAsString()); request.set_timestamp(this->now()); request.set_sender(TEST_NODE_UUID); // we should get pre-prepare messages EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_preprepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); this->handle_request(request); // send a second message the same as first but from different client auto request2 = bzn_envelope(request); request2.set_sender(SECOND_NODE_UUID); // again we should get pre-prepare messages EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_preprepare, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); this->handle_request(request2); } TEST_F(pbft_proto_test, old_request_is_rejected) { this->build_pbft(); database_msg dmsg; dmsg.mutable_create()->set_key(std::string("key")); dmsg.mutable_create()->set_value(std::string("value")); bzn_envelope request; request.set_database_msg(dmsg.SerializeAsString()); request.set_timestamp(0); request.set_sender(TEST_NODE_UUID); // we should NOT get pre-prepare messages since this is an old request EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_preprepare, Eq(true)))) .Times(Exactly(0)); std::shared_ptr session = std::make_shared(); EXPECT_CALL(*session, send_message(ResultOf(test::is_swarm_error, Eq(true)))); this->handle_request(request, session); } TEST_F(pbft_proto_test, range_test) { std::map m; m.insert(std::make_pair(2, "2")); m.insert(std::make_pair(3, "3")); m.insert(std::make_pair(4, "4")); auto r = m.equal_range(1); EXPECT_EQ(r.first, r.second); } } ================================================ FILE: pbft/test/pbft_viewchange_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include namespace bzn { class pbft_viewchange_test : public pbft_proto_test { public: std::shared_ptr options = std::make_shared(); std::shared_ptr build_pft_with_mock_crypto() { std::shared_ptr mockcrypto = std::make_shared(); this->crypto = mockcrypto; this->build_pbft(); return mockcrypto; } void run_transaction_through_primary_times(const size_t repeat, uint64_t& current_sequence) { for (size_t i{0}; ibuild_pbft(); for (current_sequence=1; current_sequence < 100; ++current_sequence) { run_transaction_through_primary(); } prepare_for_checkpoint(current_sequence); run_transaction_through_primary(); this->stabilize_checkpoint(current_sequence); } }; TEST_F(pbft_viewchange_test, test_fill_in_missing_pre_prepares) { this->build_pbft(); bzn_envelope envelope; std::map pre_prepares; pre_prepares.insert(std::make_pair(uint64_t(103), envelope)); pre_prepares.insert(std::make_pair(uint64_t(101), envelope)); this->pbft->fill_in_missing_pre_prepares(99, 4, pre_prepares); EXPECT_TRUE(0 < pre_prepares.count(102)); /////////////////////////////////////// })); pre_prepares.insert(std::make_pair(uint64_t(107), envelope)); this->pbft->fill_in_missing_pre_prepares(99, 4, pre_prepares); uint64_t sequence = 100; for (const auto pre_prepare : pre_prepares) { EXPECT_EQ(sequence , pre_prepare.first); ++sequence; } EXPECT_TRUE(0 == pre_prepares.count(sequence)); } TEST_F(pbft_viewchange_test, pbft_with_invalid_view_drops_messages) { this->uuid = SECOND_NODE_UUID; this->build_pbft(); this->pbft->handle_failure(); // after handling the failure, the pbft must ignore all messages save for // checkpoint, view change and new view messages pbft_msg message; message.set_type(PBFT_MSG_PREPREPARE); EXPECT_FALSE(this->pbft->preliminary_filter_msg(message)); message.set_type(PBFT_MSG_PREPARE); EXPECT_FALSE(this->pbft->preliminary_filter_msg(message)); message.set_type(PBFT_MSG_COMMIT); EXPECT_FALSE(this->pbft->preliminary_filter_msg(message)); message.set_type(PBFT_MSG_VIEWCHANGE); EXPECT_TRUE(this->pbft->preliminary_filter_msg(message)); message.set_type(PBFT_MSG_NEWVIEW); EXPECT_TRUE(this->pbft->preliminary_filter_msg(message)); } TEST_F(pbft_viewchange_test, test_is_peer) { const bzn::peer_address_t NOT_PEER{"127.0.0.1", 9091, "not_a_peer", "uuid_nope"}; this->build_pbft(); for (const auto& peer : TEST_PEER_LIST) { EXPECT_TRUE(this->pbft->is_peer(peer.uuid)); } EXPECT_FALSE(this->pbft->is_peer(NOT_PEER.uuid)); } TEST_F(pbft_viewchange_test, validate_and_extract_checkpoint_hashes) { uint64_t current_sequence{0}; generate_checkpoint_at_sequence_100(current_sequence); this->run_transaction_through_primary_times(2, current_sequence); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(test::is_viewchange, Eq(true)))) .WillRepeatedly(Invoke([&](const auto & /*endpoint*/, const auto &viewchange_env) { pbft_msg viewchange; viewchange.ParseFromString(viewchange_env->pbft()); EXPECT_EQ(PBFT_MSG_VIEWCHANGE, viewchange.type()); std::map> checkpoints = this->pbft->validate_and_extract_checkpoint_hashes( viewchange); EXPECT_EQ(uint64_t(1), checkpoints.size()); for (const auto &p : checkpoints) { auto checkpoint = p.first; auto uuids = p.second; // there will be a checkpoint 100, with a hash value of "100" EXPECT_EQ(uint64_t(100), checkpoint.first); EXPECT_EQ("100", checkpoint.second); EXPECT_EQ(uint64_t(3), uuids.size()); for (const auto &uuid : uuids) { EXPECT_FALSE(TEST_PEER_LIST.end() == std::find_if(TEST_PEER_LIST.begin(), TEST_PEER_LIST.end() , [&](const auto &peer) { return peer.uuid == uuid; })); } } })); this->pbft->handle_failure(); } TEST_F(pbft_viewchange_test, test_is_valid_viewchange_message) { uint64_t current_sequence{0}; generate_checkpoint_at_sequence_100(current_sequence); this->run_transaction_through_primary_times(2, current_sequence); EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(test::is_viewchange, Eq(true)))) .WillRepeatedly(Invoke([&](const auto& /*endpoint*/, auto viewchange_env) { pbft_msg viewchange; EXPECT_TRUE(viewchange.ParseFromString(viewchange_env->pbft())); // this will be valid. viewchange_env->set_sender(this->pbft->get_uuid()); EXPECT_TRUE(this->pbft->is_valid_viewchange_message(viewchange, *viewchange_env)); })); this->pbft->handle_failure(); } TEST_F(pbft_viewchange_test, make_viewchange_makes_valid_message) { uint64_t current_sequence{0}; generate_checkpoint_at_sequence_100(current_sequence); this->run_transaction_through_primary_times(2, current_sequence); auto ops = this->operation_manager->prepared_operations_since(this->pbft->latest_stable_checkpoint().first); auto viewchange_env = this->pbft->make_viewchange(this->pbft->get_view() + uint64_t(1), current_sequence, this->pbft->checkpoint_manager->get_latest_stable_checkpoint_proof(), ops); pbft_msg viewchange; viewchange.ParseFromString(viewchange_env->pbft()); EXPECT_EQ(PBFT_MSG_VIEWCHANGE, viewchange.type()); EXPECT_EQ(current_sequence, viewchange.sequence()); EXPECT_EQ(3, viewchange.checkpoint_messages_size()); } TEST_F(pbft_viewchange_test, pbft_handle_failure_causes_invalid_view_state_and_starts_viewchange) { this->uuid = SECOND_NODE_UUID; this->build_pbft(); EXPECT_CALL(*mock_node, send_message_str(_, _)) .WillRepeatedly(Invoke([&](const auto& /*endpoint*/, const auto encoded_message) { bzn_envelope envelope; envelope.ParseFromString(*encoded_message); pbft_msg view_change; view_change.ParseFromString(envelope.pbft()); EXPECT_EQ(PBFT_MSG_VIEWCHANGE, view_change.type()); EXPECT_TRUE(2 == view_change.view()); EXPECT_TRUE(this->pbft->latest_stable_checkpoint().first == view_change.sequence()); })); this->pbft->handle_failure(); // Now the replica's view should be invalid EXPECT_FALSE(this->pbft->is_view_valid()); } TEST_F(pbft_viewchange_test, test_prepared_operations_since_last_checkpoint) { uint64_t current_sequence{0}; generate_checkpoint_at_sequence_100(current_sequence); EXPECT_EQ(size_t(0), this->operation_manager->prepared_operations_since(this->pbft->latest_stable_checkpoint().first).size()); run_transaction_through_primary(false); current_sequence++; EXPECT_EQ(size_t(1), this->operation_manager->prepared_operations_since(this->pbft->latest_stable_checkpoint().first).size()); run_transaction_through_primary(false); current_sequence++; EXPECT_EQ(size_t(2), this->operation_manager->prepared_operations_since(this->pbft->latest_stable_checkpoint().first).size()); auto operations = this->operation_manager->prepared_operations_since(this->pbft->latest_stable_checkpoint().first); for(const auto& operation : operations) { // TODO: what other tests? EXPECT_EQ(uint64_t(1), operation.second->get_view()); EXPECT_TRUE(operation.second->get_sequence() > 100 && operation.second->get_sequence() <= current_sequence); } } TEST_F(pbft_viewchange_test, test_save_checkpoint) { this->build_pbft(); pbft_msg msg; // add three checkpoint messages for (uint64_t i{1}; i<4; ++i) { bzn_envelope checkpoint; checkpoint.set_sender("a_nice_sender"); checkpoint.set_signature("signature_" + std::to_string(i)); checkpoint_msg checkpoint_msg; checkpoint_msg.set_sequence(i); checkpoint_msg.set_state_hash("a_state_hash_" + std::to_string(i)); checkpoint.set_checkpoint_msg(checkpoint_msg.SerializeAsString()); *(msg.add_checkpoint_messages()) = checkpoint; } this->pbft->save_checkpoint(msg); // expect that there should be 3 unstable checkpoint proofs after calling save_checkpoint. EXPECT_EQ(uint64_t(3), this->pbft->checkpoint_manager->partial_checkpoint_proofs_count()); } TEST_F(pbft_viewchange_test, test_handle_viewchange) { // get sut1 to generate viewchange message // catch message // send to sut2 handle_viewchange // sut2 should store viewchange // re-send from other nodes to handle_viewchange // sut2 should eventually send its own viewchange // once enough viewchange messages are sent, sut2 should send newview // capture newview and send to sut1 handle_newview // sut1 (this->pbft) is initial primary this->build_pbft(); // sut2 is new primary after view change auto mock_node2 = std::make_shared(); std::shared_ptr mock_io_context2 = std::make_shared>(); std::unique_ptr audit_heartbeat_timer2 = std::make_unique>(); std::unique_ptr new_config_timer2 = std::make_unique>(); std::unique_ptr join_retry_timer2 = std::make_unique>(); std::unique_ptr grace_timer2 = std::make_unique>(); std::shared_ptr mock_service2 = std::make_shared>(); EXPECT_CALL(*(mock_node2), register_error_handler(_)) .Times(Exactly(1)); EXPECT_CALL(*(mock_io_context2), make_unique_steady_timer()) .Times(AtMost(4)).WillOnce(Invoke([&]() { return std::move(audit_heartbeat_timer2); })) .WillOnce(Invoke([&]() { return std::move(new_config_timer2); })) .WillOnce(Invoke([&]() { return std::move(join_retry_timer2); })) .WillOnce(Invoke([&]() { return std::move(grace_timer2); })); auto mock_options = std::make_shared(); EXPECT_CALL(*(mock_options), get_peer_message_signing()).Times(AnyNumber()); EXPECT_CALL(*mock_options, get_uuid()).WillRepeatedly(Invoke([](){return "uuid2";})); EXPECT_CALL(*mock_options, get_swarm_id()).WillRepeatedly(Invoke([](){return "my_swarm";})); auto peers = static_peers_beacon_for(TEST_PEER_LIST); auto storage2 = std::make_shared(); auto manager2 = std::make_shared(peers, storage2); auto monitor = std::make_shared>(); auto pbft2 = std::make_shared(mock_node2, mock_io_context2, peers, mock_options, mock_service2 , this->crypto, manager2, storage2, monitor); pbft2->set_audit_enabled(false); pbft2->start(); // set up a stable checkpoint plus a couple of uncommitted transactions on sut1 for (size_t i = 0; i < 99; i++) { run_transaction_through_primary(); } prepare_for_checkpoint(100); run_transaction_through_primary(); this->stabilize_checkpoint(100); for (size_t i = 0; i < 20; i++) { run_transaction_through_primary(false); } for (auto const &p : TEST_PEER_LIST) { EXPECT_CALL(*(this->mock_node), send_maybe_signed_message(*bzn::make_endpoint(p), ResultOf(test::is_viewchange, Eq(true)))) .Times(Exactly(1)) .WillRepeatedly(Invoke([&](auto, auto wmsg) { pbft_msg msg; ASSERT_TRUE(msg.ParseFromString(wmsg->pbft())); wmsg->set_sender(p.uuid); for (const auto& peer : TEST_PEER_LIST) { checkpoint_msg cp; cp.set_sequence(pbft->latest_stable_checkpoint().first); cp.set_state_hash(pbft->latest_stable_checkpoint().second); bzn_envelope env; env.set_checkpoint_msg(cp.SerializeAsString()); env.set_sender(peer.uuid); pbft2->checkpoint_manager->handle_checkpoint_message(env); } pbft2->handle_viewchange(msg, *wmsg); })); } for (auto const &p : TEST_PEER_LIST) { EXPECT_CALL(*mock_node2, send_maybe_signed_message(*bzn::make_endpoint(p), ResultOf(test::is_newview, Eq(true)))) .Times(Exactly(1)) .WillRepeatedly(Invoke([&](auto, auto wmsg) { if (p.uuid == TEST_NODE_UUID) { EXPECT_CALL(*this->mock_node, send_maybe_signed_message(A(), ResultOf(test::is_prepare, Eq(true)))) .Times(Exactly(20 * TEST_PEER_LIST.size())); pbft_msg msg; ASSERT_TRUE(msg.ParseFromString(wmsg->pbft())); wmsg->set_sender("uuid2"); this->pbft->handle_newview(msg, *wmsg); } })); } EXPECT_CALL(*mock_node2, send_maybe_signed_message(A(), ResultOf(test::is_viewchange, Eq(true)))) .Times(Exactly(TEST_PEER_LIST.size())); // get sut1 to generate viewchange message this->pbft->handle_failure(); EXPECT_EQ(this->pbft->view.value(), 2U); mock_node2->clear(); } TEST_F(pbft_viewchange_test, is_valid_viewchange_does_not_throw_if_no_checkpoint_yet) { // This test was written for KEP-902: is_valid_viewchange throws if no checkpoint yet uint64_t current_sequence{0}; this->build_pbft(); bzn_envelope original_message; EXPECT_CALL(*mock_node, send_maybe_signed_message(A(), ResultOf(test::is_viewchange, Eq(true)))).WillRepeatedly(Invoke([&](const auto & /*endpoint*/, const auto &viewchange_env) { original_message = *viewchange_env; })); this->run_transaction_through_primary_times(1, current_sequence); this->pbft->handle_failure(); auto latest_checkpoint{this->pbft->checkpoint_manager->get_latest_local_checkpoint()}; EXPECT_EQ(0U, latest_checkpoint.first); EXPECT_EQ(INITIAL_CHECKPOINT_HASH, latest_checkpoint.second); pbft_msg viewchange_message; viewchange_message.ParseFromString(original_message.pbft()); // It was the dereferencing of an empty valid_checkpoint_hashes that was causing is_valid_viewchange_message to throw an exception auto valid_checkpoint_hashes{this->pbft->validate_and_extract_checkpoint_hashes(viewchange_message)}; // ensure that the valid_checkpoint_hashes is indeed empty EXPECT_TRUE(valid_checkpoint_hashes.empty()); try { // even though there is no checkpoint, it is still valid to request a view change, and thus possible to have a valid viewchange message original_message.set_sender(this->pbft->get_uuid()); EXPECT_TRUE(this->pbft->is_valid_viewchange_message(viewchange_message, original_message)); } catch(...) { FAIL() << "is_valid_viewchange_message must not throw and exception simply because there are no valid checkpoints"; } } } ================================================ FILE: peers_beacon/CMakeLists.txt ================================================ add_library(peers_beacon STATIC peer_address.hpp peers_beacon_base.hpp peers_beacon.cpp peers_beacon.hpp ) target_link_libraries(peers_beacon utils) target_include_directories(peers_beacon PRIVATE ${BLUZELLE_STD_INCLUDES}) add_dependencies(peers_beacon boost openssl) add_subdirectory(test) ================================================ FILE: peers_beacon/peer_address.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn { struct peer_address_t { peer_address_t(std::string host, uint16_t port, std::string name, std::string uuid) : host(std::move(host)) , port(port) , name(std::move(name)) , uuid(std::move(uuid)) { }; bool operator==(const peer_address_t& other) const { if (&other == this) { return true; } return this->host == other.host && this->port == other.port && this->uuid == other.uuid; } std::string host; uint16_t port; std::string name; std::string uuid; }; } namespace std { template<> struct hash { size_t operator()(const bzn::peer_address_t& x) const noexcept { return std::hash()(std::string{x.host} + std::to_string(x.port)); } }; } ================================================ FILE: peers_beacon/peers_beacon.cpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include using namespace bzn; peers_beacon::peers_beacon(std::shared_ptr io, std::shared_ptr utils, std::shared_ptr opt) : io(io) , options(opt) , utils(utils) , internal_current(std::make_shared()) , refresh_timer(io->make_unique_steady_timer()) {} void peers_beacon::start() { if (!this->refresh(true)) { throw std::runtime_error("could not construct initial peers list"); } this->run_timer(); } void peers_beacon::run_timer() { this->refresh_timer->cancel(); this->refresh_timer->expires_from_now( std::chrono::seconds{ this->options->get_simple_options().get(bzn::option_names::PEERS_REFRESH_INTERVAL_SECONDS) }); this->refresh_timer->async_wait([weak_self = weak_from_this()](auto /*reason*/) { auto self = weak_self.lock(); if (self) { self->refresh(); self->check_removal(); self->run_timer(); } }); } std::shared_ptr peers_beacon::current() const { std::shared_lock lock(this->lock); return this->internal_current; } std::shared_ptr peers_beacon::ordered() const { std::shared_lock lock(this->lock); return this->internal_current_ordered; } void peers_beacon::check_removal() { auto peers = this->current(); auto uuid = this->options->get_uuid(); bool in_swarm = peers->end() != std::find_if(peers->begin(), peers->end(), [&uuid](const auto& peer) { return peer.uuid == uuid; }); LOG(debug) << "We are " << (in_swarm ? "" : "not ") << "in this peers list"; this->ever_been_in_swarm = this->ever_been_in_swarm || in_swarm; if (!in_swarm && ever_been_in_swarm) { LOG(info) << "we seem to have been removed from the swarm; exiting"; this->io->stop(); } } bool peers_beacon::refresh(bool first_run) { bool has_esr = !this->options->get_swarm_id().empty() && !this->options->get_swarm_info_esr_address().empty() && !this->options->get_swarm_info_esr_url().empty() && !this->options->get_simple_options().get(bzn::option_names::IGNORE_ESR); bool has_file = !this->options->get_bootstrap_peers_file().empty(); bool has_url = !this->options->get_bootstrap_peers_url().empty(); bool has_cpr = !this->options->get_simple_options().get(bzn::option_names::CPR_URL).empty() && !this->options->get_swarm_id().empty() && !this->options->get_simple_options().get(bzn::option_names::IGNORE_CPR); /* Here we chose not to fall back on another method if the first priority from our config is unavailable. This is * chosen so that if, eg, a url based peers list is briefly unavailable, we do not abruptly switch to a very old * peers list from an unmaintained esr contract. */ if (has_cpr) { if(first_run) { LOG(info) << "CPR chosen as peers source"; } return this->fetch_from_cpr(); } if (has_esr) { if (first_run) { LOG(info) << "ESR chosen as peers source"; } return this->fetch_from_esr(); } if (has_url) { if (first_run) { LOG(info) << "URL chosen as peers source"; } return this->fetch_from_configured_url(); } if (has_file) { if (first_run) { LOG(info) << "file chosen as peers source"; } return this->fetch_from_file(); } throw std::runtime_error("no acceptable source for peers configured; must specify file or url or esr"); } bool peers_beacon::fetch_from_file() { auto filename = this->options->get_bootstrap_peers_file(); std::ifstream file(filename); if (file.fail()) { LOG(error) << "Failed to read bootstrap peers file " << filename; return false; } LOG(info) << "Reading peers from " << filename; return parse_and_save_peers(file); } bool peers_beacon::fetch_from_configured_url() { return this->fetch_from_url(this->options->get_bootstrap_peers_url()); } bool peers_beacon::fetch_from_cpr() { auto base_url = this->options->get_simple_options().get(bzn::option_names::CPR_URL); auto swarm_id = this->options->get_swarm_id(); boost::format fmt = boost::format("%1%/swarms/%2%") % base_url % swarm_id; return this->fetch_from_url(fmt.str()); } bool peers_beacon::fetch_from_url(const std::string& url) { std::string peers = this->utils->sync_req(url); LOG(info) << "Downloaded peer list from " << url; std::stringstream stream; stream << peers; return parse_and_save_peers(stream); } bool peers_beacon::fetch_from_esr() { auto swarm_id = this->options->get_swarm_id(); auto esr_address = this->options->get_swarm_info_esr_address(); auto esr_url = this->options->get_swarm_info_esr_url(); peers_list_t new_peers; auto peer_ids = this->utils->get_peer_ids(swarm_id, esr_address, esr_url); for (const auto& peer_id : peer_ids) { bzn::peer_address_t peer_info{this->utils->get_peer_info(swarm_id, peer_id, esr_address, esr_url)}; if (peer_info.host.empty() || peer_info.port == 0 //|| peer_info.name.empty() // is it important that a peer have a name? || peer_info.uuid.empty() ) { LOG(warning) << "Invalid peer information found in esr contract, ignoring info for peer: " << peer_id << " in swarm: " << swarm_id; } else { new_peers.emplace(peer_info); } } return this->switch_peers_list(new_peers); } bool peers_beacon::switch_peers_list(const peers_list_t& new_peers) { if (new_peers.size() == 0) { LOG(error) << "Failed to read any peers"; if (this->internal_current->size() > 0) { LOG(error) << "Keeping old peer list"; } else { LOG(error) << "Old peers list also empty"; } return false; } if(*(this->internal_current) != new_peers) { LOG(info) << "Switching to new peers list with " << new_peers.size() << " peers"; } auto new_ordered = std::make_shared(); std::for_each(new_peers.begin(), new_peers.end(), [&](const auto& peer) { new_ordered->push_back(peer); }); std::sort(new_ordered->begin(), new_ordered->end(), [](const auto& peer1, const auto& peer2) { return peer1.uuid.compare(peer2.uuid) < 0; }); std::unique_lock lock(this->lock); this->internal_current = std::make_shared(new_peers); this->internal_current_ordered = new_ordered; return true; } bool peers_beacon::parse_and_save_peers(std::istream& source) { Json::Value root; try { source >> root; } catch (const std::exception& e) { LOG(error) << "Failed to parse peer JSON (" << e.what() << ")"; LOG(error) << "Keeping old peer list"; return false; } auto new_peers = this->build_peers_list_from_json(root); return this->switch_peers_list(new_peers); } peers_list_t peers_beacon::build_peers_list_from_json(const Json::Value& root) { peers_list_t result; // Expect the read json to be an array of peer objects for (const auto& peer : root) { std::string host; std::string name; std::string uuid; uint16_t port; try { host = peer["host"].asString(); port = peer["port"].asUInt(); uuid = peer.isMember("uuid") ? peer["uuid"].asString() : "unknown"; name = peer.isMember("name") ? peer["name"].asString() : "unknown"; } catch(std::exception& e) { LOG(warning) << "Ignoring malformed peer specification " << peer; continue; } // port wasn't actually a 16 bit uint if (peer["port"].asUInt() != port) { LOG(warning) << "Ignoring peer with bad port " << peer; continue; } // peer didn't contain everything we need if (host.empty() || port == 0) { LOG(warning) << "Ignoring underspecified peer (needs host and port) " << peer; continue; } LOG(trace) << "Found peer " << host << ":" << port << " (" << name << ")"; result.emplace(host, port, name, uuid); } LOG(trace) << "Found " << result.size() << " well formed peers"; return result; } ================================================ FILE: peers_beacon/peers_beacon.hpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include namespace bzn { class peers_beacon : public peers_beacon_base, public std::enable_shared_from_this { public: peers_beacon(std::shared_ptr io, std::shared_ptr utils, std::shared_ptr opt); // do an initial pull and start any necessary timers void start() override; // get a pointer to the current peers list (which won't change, but can be replaced at any time) std::shared_ptr current() const override; std::shared_ptr ordered() const override; // refresh from whatever source we are using bool refresh(bool first_run = false) override; void check_removal(); private: bool fetch_from_esr(); bool fetch_from_file(); bool fetch_from_configured_url(); bool fetch_from_cpr(); bool fetch_from_url(const std::string& url); bool parse_and_save_peers(std::istream& source); peers_list_t build_peers_list_from_json(const Json::Value& root); bool switch_peers_list(const peers_list_t& new_peers); void run_timer(); bool ever_been_in_swarm = false; std::shared_ptr io; std::shared_ptr options; std::shared_ptr utils; // this is kept as a shared ptr to avoid issues when a reader reads while the peers list changes std::shared_ptr internal_current; std::shared_ptr internal_current_ordered; std::unique_ptr refresh_timer; mutable std::shared_mutex lock; }; } ================================================ FILE: peers_beacon/peers_beacon_base.hpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include namespace bzn { using peers_list_t = std::unordered_set; using ordered_peers_list_t = std::vector; class peers_beacon_base { public: virtual void start() = 0; // get a pointer to the current peers list (which won't change, but can be replaced at any time) virtual std::shared_ptr current() const = 0; virtual std::shared_ptr ordered() const = 0; // refresh from whatever source we are using; return success virtual bool refresh(bool first_run = false) = 0; virtual ~peers_beacon_base() = default; }; } ================================================ FILE: peers_beacon/test/CMakeLists.txt ================================================ set(test_srcs peers_beacon_tests.cpp) set(test_libs peers_beacon utils options smart_mocks) add_gmock_test(peers_beacon) ================================================ FILE: peers_beacon/test/peers_beacon_tests.cpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include namespace { const std::string invalid_json = "[{\"Some key\": 124}, }}[} oh noes I broke it"; const std::string no_peers = "[]"; const std::string valid_peers = "[{\"name\": \"peer1\", \"host\": \"peer1.com\", \"port\": 12345, \"http_port\" : 8080}, {\"host\": \"nonamepeer.com\", \"port\": 54321}]"; const std::string different_valid_peer = "[{\"name\": \"peer3\", \"host\": \"peer3.com\", \"port\": 12345, \"http_port\" : 8080}]"; const std::string duplicate_peers = "[{\"name\": \"peer1\", \"host\": \"peer1.com\", \"port\": 12345, \"http_port\" : 8080}, {\"name\": \"peer1\", \"host\": \"peer1.com\", \"port\": 12345}]"; const std::string underspecified_peer = "[{\"name\": \"peer1\", \"port\": 1024}]"; const std::string bad_port = "[{\"name\": \"peer1\", \"host\": \"127.0.0.1\", \"port\": 70000}]"; const std::string test_peers_filename = "peers.json"; const std::string our_uuid = "alice"; const std::string peers_with_us = "[{\"host\": \"peer1.com\", \"port\": 12345, \"uuid\" : \"alice\"}]"; const std::string peers_without_us = "[{\"host\": \"peer1.com\", \"port\": 12345, \"uuid\" : \"not alice\"}]"; const std::string sample_peers_url = "pastebin.com/raw/KvbcVhfZ"; const std::string sample_peers_url_with_protocol = "http://www.pastebin.com/raw/KvbcVhfZ"; } using namespace ::testing; class peers_beacon_test : public Test { public: std::shared_ptr opt = std::make_shared(); bzn::simple_options inner_opt; std::shared_ptr io = std::make_shared(); std::shared_ptr peers; std::shared_ptr utils = std::make_shared(); peers_beacon_test() { EXPECT_CALL(*opt, get_bootstrap_peers_file()).WillRepeatedly(Return(test_peers_filename)); EXPECT_CALL(*opt, get_bootstrap_peers_url()).WillRepeatedly(Return("")); EXPECT_CALL(*opt, get_swarm_id()).WillRepeatedly(Return("")); this->inner_opt.set(bzn::option_names::PEERS_REFRESH_INTERVAL_SECONDS, "60"); EXPECT_CALL(*opt, get_simple_options()).WillRepeatedly(ReturnRef(this->inner_opt)); EXPECT_CALL(*opt, get_uuid()).WillRepeatedly(Return(our_uuid)); this->peers = std::make_shared(this->io, this->utils, this->opt); } void set_peers_file(const std::string& peers_data) { std::ofstream ofile(test_peers_filename); ofile << peers_data; ofile.close(); } ~peers_beacon_test() { unlink(test_peers_filename.c_str()); } }; TEST_F(peers_beacon_test, test_invalid_json) { set_peers_file(invalid_json); ASSERT_FALSE(peers->refresh()); ASSERT_TRUE(peers->current()->empty()); } TEST_F(peers_beacon_test, test_no_peers) { set_peers_file(no_peers); ASSERT_FALSE(peers->refresh()); ASSERT_TRUE(peers->current()->empty()); } TEST_F(peers_beacon_test, test_underspecified_peer) { set_peers_file(underspecified_peer); ASSERT_FALSE(peers->refresh()); ASSERT_TRUE(peers->current()->empty()); } TEST_F(peers_beacon_test, test_bad_port) { set_peers_file(bad_port); ASSERT_FALSE(peers->refresh()); ASSERT_TRUE(peers->current()->empty()); } TEST_F(peers_beacon_test, test_valid_peers) { set_peers_file(valid_peers); ASSERT_TRUE(peers->refresh()); ASSERT_EQ(peers->current()->size(), 2U); bool seen_peer1 = false; bool seen_peer2 = false; for (const bzn::peer_address_t& p : *(peers->current())) { if (p.port == 12345) seen_peer1 = true; if (p.port == 54321) seen_peer2 = true; } ASSERT_TRUE(seen_peer1 && seen_peer2); } TEST_F(peers_beacon_test, test_unnamed_peers) { set_peers_file(valid_peers); ASSERT_TRUE(peers->refresh()); ASSERT_EQ(peers->current()->size(), 2U); bool seen_name1 = false; bool seen_name2 = false; for (const bzn::peer_address_t& p : *(peers->current())) { if (p.name == "peer1") seen_name1 = true; if (p.name == "unknown") seen_name2 = true; } ASSERT_TRUE(seen_name1 && seen_name2); } TEST_F(peers_beacon_test, test_duplicate_peers) { set_peers_file(duplicate_peers); ASSERT_TRUE(peers->refresh()); ASSERT_EQ(peers->current()->size(), 1U); } TEST_F(peers_beacon_test, test_changed_list) { set_peers_file(valid_peers); ASSERT_TRUE(peers->refresh()); ASSERT_EQ(peers->current()->size(), 2U); set_peers_file(different_valid_peer); ASSERT_TRUE(peers->refresh()); ASSERT_EQ(peers->current()->size(), 1U); } TEST_F(peers_beacon_test, test_automatic_refresh) { set_peers_file(valid_peers); peers->start(); ASSERT_EQ(peers->current()->size(), 2U); set_peers_file(different_valid_peer); this->io->trigger_timer(0); ASSERT_EQ(peers->current()->size(), 1U); } TEST_F(peers_beacon_test, test_url) { const std::string test_url = "some fake url"; EXPECT_CALL(*(this->opt), get_bootstrap_peers_url()).WillRepeatedly(Return(test_url)); EXPECT_CALL(*(this->opt), get_bootstrap_peers_file()).WillRepeatedly(Return("")); EXPECT_CALL(*(this->utils), sync_req(test_url, "")).WillRepeatedly(Return(valid_peers)); ASSERT_TRUE(peers->refresh()); ASSERT_EQ(peers->current()->size(), 2U); } TEST_F(peers_beacon_test, cpr_fetch_constructs_correct_endpoint) { const std::string test_url = "https://example.org"; const std::string test_swarm_id = "the_best_swarm_to_ever_swarm_this_side_of_the_mississippi"; const std::string correct_url = test_url + "/swarms/" + test_swarm_id; EXPECT_CALL(*(this->opt), get_swarm_id()).WillRepeatedly(Return(test_swarm_id)); this->inner_opt.set(bzn::option_names::CPR_URL, test_url); EXPECT_CALL(*(this->utils), sync_req(correct_url, "")).Times(Exactly(1)).WillOnce(Return(valid_peers)); ASSERT_TRUE(peers->refresh()); } TEST_F(peers_beacon_test, test_esr) { bzn::peer_address_t alice("alice.com", 8080, "alice", "alice's key"); bzn::uuid_t swarm_id = "foo"; std::string esr_address = "bar"; std::string esr_url = "example.tld"; this->inner_opt.set(bzn::option_names::IGNORE_CPR, "true"); EXPECT_CALL(*(this->opt), get_bootstrap_peers_url()).WillRepeatedly(Return("")); EXPECT_CALL(*(this->opt), get_bootstrap_peers_file()).WillRepeatedly(Return("")); EXPECT_CALL(*(this->opt), get_swarm_id()).WillRepeatedly(Return(swarm_id)); EXPECT_CALL(*(this->opt), get_swarm_info_esr_address()).WillRepeatedly(Return(esr_address)); EXPECT_CALL(*(this->opt), get_swarm_info_esr_url()).WillRepeatedly(Return(esr_url)); EXPECT_CALL(*(this->utils), get_peer_ids(swarm_id, esr_address, esr_url)).WillRepeatedly(Return(std::vector{"alice"})); EXPECT_CALL(*(this->utils), get_peer_info(swarm_id, "alice", esr_address, esr_url)).WillRepeatedly(Invoke( [&](auto, auto, auto, auto) { return alice; } )); ASSERT_TRUE(peers->refresh()); ASSERT_EQ(peers->current()->size(), 1U); ASSERT_EQ(peers->ordered()->front().name, "alice"); } TEST_F(peers_beacon_test, test_halt) { EXPECT_CALL(*(this->io), stop()).Times(Exactly(0)); set_peers_file(peers_without_us); ASSERT_TRUE(peers->refresh()); peers->check_removal(); set_peers_file(peers_with_us); ASSERT_TRUE(peers->refresh()); peers->check_removal(); set_peers_file(peers_without_us); EXPECT_CALL(*(this->io), stop()).Times(Exactly(1)); ASSERT_TRUE(peers->refresh()); peers->check_removal(); } ================================================ FILE: pkg/CMakeLists.txt ================================================ if (UNIX AND NOT APPLE) install(PROGRAMS "${PROJECT_BINARY_DIR}/output/swarm" DESTINATION "/usr/bin/") find_program(LSB_RELEASE lsb_release) execute_process(COMMAND ${LSB_RELEASE} -is OUTPUT_VARIABLE LSB_RELEASE_ID_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE ) if (${LSB_RELEASE_ID_SHORT} STREQUAL "Ubuntu") add_subdirectory(debian) endif() endif() ================================================ FILE: pkg/debian/CMakeLists.txt ================================================ message( "Building version: ${PROJECT_VERSION}..." ) set(BOOST_DEB_VERSION "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") set(CPACK_PACKAGE_VENDOR "Bluzelle") set(CPACK_PACKAGE_CONTACT "devops@bluzelle.com") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Bluzelle decentralized database node.") set(CPACK_PACKAGE_NAME "bluzelle-swarmdb") set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) set(CPACK_DEBIAN_PACKAGE_SECTION "database") set(CPACK_DEBIAN_COMPRESSION_TYPE "none") set(CPACK_SYSTEM_NAME "amd64") set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64") set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Bluzelle ") set(CPACK_GENERATOR "DEB") set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}_${PROJECT_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}) set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA ${PROJECT_SOURCE_DIR}/pkg/debian/postinst;${PROJECT_SOURCE_DIR}/pkg/debian/postrm) set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6, libsnappy1v5, libbz2-1.0") INCLUDE(CPack) set(DESTINATION_DIR /usr/bin/swarmdb) # for 16.04 execute_process(COMMAND chmod 755 ${PROJECT_SOURCE_DIR}/pkg/debian/postinst) execute_process(COMMAND chmod 755 ${PROJECT_SOURCE_DIR}/pkg/debian/postrm) ================================================ FILE: pkg/debian/postinst ================================================ #! /bin/sh set -e echo " _____ ____ ____" echo " / ___/ ______ __________ ___ / __ \/ __ )" echo " \\__ \\ | /| / / __ \`/ ___/ __ \`__ \\/ / / / __ |" echo " ___/ / |/ |/ / /_/ / / / / / / / / /_/ / /_/ /" echo "/____/|__/|__/\__,_/_/ /_/ /_/ /_/_____/_____/" echo "\n\n" echo "SwarmDB node successfully installed.\n\n" echo "You can find the SwarmDB docs at:" echo "https://github.com/swarmdb" ================================================ FILE: pkg/debian/postrm ================================================ #! /bin/sh set -e rm -f /usr/bin/swarm ================================================ FILE: policy/CMakeLists.txt ================================================ add_library(policy STATIC eviction_base.hpp random.cpp volatile_ttl.cpp ) add_dependencies(policy proto) target_include_directories(policy PRIVATE ${BLUZELLE_STD_INCLUDES}) add_subdirectory(test) ================================================ FILE: policy/eviction_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include namespace bzn::policy { class eviction_base { public: eviction_base(std::shared_ptr storage) : storage{std::move(storage)} {} virtual ~eviction_base() = default; virtual std::set keys_to_evict(const database_msg& request, size_t max_size) = 0; std::shared_ptr storage; }; } // namespace bzn::crud::eviction ================================================ FILE: policy/random.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include namespace bzn::policy { std::set random::keys_to_evict(const database_msg &request, size_t max_size) { const auto KEY_VALUE_SIZE{ request.has_update() ? request.update().value().size() : request.create().key().size() + request.create().value().size() }; const bzn::key_t IGNORE_KEY{ request.has_update() ? request.update().key() : "" }; const auto size{this->storage->get_size(request.header().db_uuid()).second}; size_t storage_to_free{KEY_VALUE_SIZE - (max_size - size)}; // We may need to remove one or more key/value pairs to make room for the new one std::hash hasher; boost::random::mt19937 mt(hasher(request.header().request_hash())); std::vector keys_to_evict; auto available_keys = this->storage->get_keys(request.header().db_uuid()); while (storage_to_free && !available_keys.empty()) { // As we randomly select a key from the keys in the user's database, we *move* them from the vector of keys // in the users' database to the vector of keys that need to be deleted. In the case of randomly selected // the key that is being updated, we simnply remove that key from the vector of users' keys without putting // it in the keys to delete. const boost::random::uniform_int_distribution<> dist(0, available_keys.size() - 1); const auto it = std::next(available_keys.begin(), dist(mt)); if (*it != IGNORE_KEY) { const auto evicted_size = this->storage->get_key_size(request.header().db_uuid(), *it); if (evicted_size.has_value()) { std::move(it, std::next(it,1), std::back_inserter(keys_to_evict)); storage_to_free -= *evicted_size < storage_to_free ? *evicted_size : storage_to_free; } else { LOG(warning) << "While searching for keys to evict, the key " << *it << " was not found in the database " << request.header().db_uuid(); } } available_keys.erase(it, std::next(it,1)); } // Did we free enough storage? if (!storage_to_free) { // It would have been nice to move the keys into the set directly, but std::move doesn't move from vector to set return std::set(keys_to_evict.begin(), keys_to_evict.end()); } return std::set{}; } } // namespace bzn::crud::eviction ================================================ FILE: policy/random.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn::policy { class random : public eviction_base { public: random(std::shared_ptr storage) : eviction_base{storage} { } std::set keys_to_evict(const database_msg& request, size_t max_size); }; } ================================================ FILE: policy/test/CMakeLists.txt ================================================ set(test_srcs eviction_test.cpp) set(test_libs policy proto storage ${Protobuf_LIBRARIES}) add_gmock_test(policy) ================================================ FILE: policy/test/eviction_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include using namespace ::testing; namespace { const char* DB_UUID{"e6d16cab-cd0f-4af1-b45d-16de9bc2af5d"}; //const char* CALLER_UUID{"9558fa26-ba03-4e24-98bc-1f2f562c4598"}; // 2b3c2de4-5c14-4842-8284-b67eb09ec61d // bf90f8d1-cb27-4217-a5c5-85c8e6565a25 // 557bab19-8df2-4731-b74e-c2516e1f580f const std::string TTL_UUID{"TTL"}; database_msg make_create_request(const bzn::uuid_t& db_uuid, const bzn::key_t key, const bzn::value_t& value) { database_msg request; auto header = new database_header(); header->set_db_uuid(db_uuid); auto create = new database_create(); create->set_key(key); create->set_value(value); request.set_allocated_create(create); request.set_allocated_header(header); return request; } database_msg make_update_request(const bzn::uuid_t& db_uuid, const bzn::key_t key, const bzn::value_t& value) { database_msg request; auto header = new database_header(); header->set_db_uuid(db_uuid); auto update = new database_update(); update->set_key(key); update->set_value(value); request.set_allocated_update(update); request.set_allocated_header(header); return request; } // TODO: This is duplication of private code in storage, it may be a good idea to find a way // to dry this up bzn::key_t generate_expire_key(const bzn::uuid_t& uuid, const bzn::key_t& key) { Json::Value value; value["uuid"] = uuid; value["key"] = key; return value.toStyledString(); } size_t insert_test_values(std::shared_ptr storage, const bzn::uuid_t& db_uuid, size_t number_of_items, size_t value_size=128) { for (size_t i{0}; icreate( db_uuid, key, std::string(value_size, 'B')); } return storage->get_size(db_uuid).second; } void insert_ttl_values(std::shared_ptr storage, const bzn::uuid_t& db_uuid, const std::vector keys) { size_t i{0}; for (const auto& key : keys) { const auto expires = boost::lexical_cast( std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count() + 1024 + i * 1024); ++i; storage->create(TTL_UUID, generate_expire_key(db_uuid,key), expires); } } } namespace bzn { TEST(policy_test, test_that_volatile_ttl_ignores_keys_with_no_ttl) { std::shared_ptr storage{std::make_shared()}; const auto MAX_DB_SIZE{insert_test_values(storage, DB_UUID, 10) + 5}; policy::volatile_ttl sut(storage); // performing a create on a db with no TTLs should return no keys to delete { const auto request{make_create_request(DB_UUID, "testvalue", std::string(256, 'C'))}; const auto keys_to_delete{sut.keys_to_evict(request, MAX_DB_SIZE)}; EXPECT_EQ(size_t(0), keys_to_delete.size()); } // Update should behave the same way { const auto request{make_update_request(DB_UUID, "testvalue", std::string(256,'C'))}; const auto keys_to_delete{sut.keys_to_evict(request, MAX_DB_SIZE)}; EXPECT_EQ( size_t(0), keys_to_delete.size()); } } TEST(policy_test, test_that_volatile_ttl_returns_only_keys_with_ttl) { std::shared_ptr storage{std::make_shared()}; const size_t NUMBER_OF_ITEMS{10}; const size_t VALUE_SIZE{128}; const auto MAX_STORAGE{insert_test_values(storage, DB_UUID, NUMBER_OF_ITEMS, VALUE_SIZE)}; const bzn::key_t TEST_KEY{"key1"}; std::vector keys{TEST_KEY}; insert_ttl_values(storage, DB_UUID, keys); policy::volatile_ttl sut(storage); const bzn::value_t TEST_VALUE{std::string(64, 'B')}; // evict the one ttl key to make room for the created key value pair { auto request{make_create_request(DB_UUID, "KEY_CREATE", TEST_VALUE)}; const auto keys_to_delete{sut.keys_to_evict(request, MAX_STORAGE)}; EXPECT_EQ(size_t(1), keys_to_delete.size()); EXPECT_EQ(TEST_KEY, *keys_to_delete.begin()); } // evict the one ttl key to make room for the updated key value pair { auto request{make_update_request(DB_UUID, "KEY_UPDATE", TEST_VALUE)}; const auto keys_to_delete{sut.keys_to_evict(request, MAX_STORAGE)}; EXPECT_EQ(size_t(1), keys_to_delete.size()); EXPECT_EQ(TEST_KEY, *keys_to_delete.begin()); } } TEST(policy_test, test_that_volatile_ttl_fails_if_there_are_not_enough_ttl_values_to_remove) { std::shared_ptr storage{std::make_shared()}; const size_t NUMBER_OF_ITEMS{10}; const size_t VALUE_SIZE{128}; const auto MAX_STORAGE{insert_test_values(storage, DB_UUID, NUMBER_OF_ITEMS, VALUE_SIZE) + 5}; // set only one TTL value const bzn::key_t TEST_KEY{"key1"}; std::vector keys{TEST_KEY}; insert_ttl_values(storage, DB_UUID, keys); policy::volatile_ttl sut(storage); // try creating a large value, this must fail as there is only one small key value pair with a TTL // (return no keys to evict) { auto request{make_create_request(DB_UUID, "KEY_CREATE", std::string(2 * VALUE_SIZE, 'B'))}; const auto keys_to_delete{sut.keys_to_evict(request, MAX_STORAGE)}; EXPECT_EQ(size_t(0), keys_to_delete.size()); } // try updating an existing value by doubling its size. This must fail (ibid) { auto request{make_update_request(DB_UUID, "KEY_CREATE", std::string(2 * VALUE_SIZE, 'B'))}; const auto keys_to_delete{sut.keys_to_evict(request, MAX_STORAGE)}; EXPECT_EQ(size_t(0), keys_to_delete.size()); } // try updating the key with a TTL, this must fail (the only key with a ttl is the key we are updating.) { auto request{make_update_request(DB_UUID, TEST_KEY, std::string(2 * VALUE_SIZE, 'B'))}; const auto keys_to_delete{sut.keys_to_evict(request, MAX_STORAGE)}; EXPECT_EQ(size_t(0), keys_to_delete.size()); } } } ================================================ FILE: policy/volatile_ttl.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include namespace { // TODO: This is a duplicate of code in crud, it would be a good idea to find a way to dry this up. const std::string TTL_UUID{"TTL"}; } namespace bzn::policy { struct ttl_item {bzn::key_t key; size_t value_size; size_t ttl;}; std::set volatile_ttl::keys_to_evict(const database_msg &request, size_t max_db_size) { const auto db_uuid{request.header().db_uuid()}; const auto key_to_ignore{request.has_update() ? request.update().key() : "" }; // get all the TTL's in storage auto all_ttls{this->storage->get_keys(TTL_UUID)}; // get the TTL's associated with our database // filter out the ones for this database, if update, ignore current key auto our_ttls{this->filter_ttls(all_ttls, db_uuid, key_to_ignore)}; if (our_ttls.empty()) { return {}; } // Create a vector of [key, value size, ttl] std::vector ttl_items{get_ttl_items(db_uuid, our_ttls)}; // 3: sort the keys in order of increasing ttl, secondarily sort on decreasing // key value size std::sort(ttl_items.begin(), ttl_items.end(), [](const auto& a, const auto& b) { return a.value_size > b.value_size; }); // 4: from the top of the list of keys pull out enough key value pairs // to make room for the new pair or update, const auto current_db_size{this->storage->get_size(request.header().db_uuid()).second}; const auto current_free = (max_db_size - current_db_size) - (request.has_update() ? request.update().value().size() : 0); const auto key_value_size { request.has_update() ? request.update().value().size() : request.create().key().size() + request.create().value().size() }; // how much room do we need to free? // enough for the new key value pair: key_value_size // How much room do we have? -> current_free // How much do we need to free? -> required_size std::set keys_to_evict; auto required_size = key_value_size - current_free; for (const auto ttl : ttl_items) { keys_to_evict.emplace(ttl.key); required_size -= (ttl.value_size < required_size ? ttl.value_size : required_size); if (!required_size) { break; } } // fail if we can't make enough room if (required_size) { keys_to_evict.clear(); } // 5: return the list of keys to delete return keys_to_evict; } std::vector volatile_ttl::get_ttl_items(const std::string &db_uuid, std::vector &our_ttls) const { std::vector ttl_items; std::unique_ptr char_reader{ Json::CharReaderBuilder().newCharReader() }; std::transform(our_ttls.begin(), our_ttls.end(), std::back_inserter(ttl_items), [&](const auto& ttl)->ttl_item { Json::Value root; std::string err; if (char_reader->parse(ttl.c_str(), ttl.c_str() + ttl.size(), &root, &err)) { const auto key{root["key"].asString()}; const auto expire_key{this->generate_expire_key(db_uuid, key)}; const auto opt_expire{storage->read(TTL_UUID, expire_key)}; const auto opt_value{storage->read(db_uuid, key)}; if (!opt_value.has_value()) { LOG (warning) << "item with key:[" << key << "] does not exist in db: [" << db_uuid << "]"; return ttl_item{"", 0 , 0}; } if (!opt_expire.has_value()) { LOG (warning) << "TTL item with key:[" << expire_key << "] does not exist"; return ttl_item{"", 0, 0}; } LOG (info) << "Found an item to evict: [" << key << "]" ; return ttl_item{ key , opt_value.value().size() , boost::lexical_cast(opt_expire.value()) }; } LOG(warning) << "Unable to parse TTL for Volatile TTL eviction: " << err; return ttl_item{"", 0 , 0}; }); return ttl_items; } std::vector volatile_ttl::filter_ttls(const std::vector& ttls, const bzn::uuid_t& db_uuid, const bzn::key_t& ignore_key) { std::vector filtered_ttls; std::unique_ptr char_reader{ Json::CharReaderBuilder().newCharReader()}; std::copy_if( ttls.begin(), ttls.end(), std::back_inserter(filtered_ttls) , [&char_reader, &db_uuid, &ignore_key](const auto& t) { Json::Value root; std::string err; if (char_reader->parse(t.c_str(), t.c_str() + t.size(), &root, &err)) { bool s{(root["key"] != ignore_key) && (root["uuid"].asString() == db_uuid)}; return s; } LOG(warning) << "Unable to parse TTL for Volatile TTL eviction: " << err; return false; }); return filtered_ttls; } } // namespace bzn::crud::eviction ================================================ FILE: policy/volatile_ttl.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn::policy { struct ttl_item; class volatile_ttl : public eviction_base { public: volatile_ttl(std::shared_ptr storage) : eviction_base(storage) { } std::set keys_to_evict(const database_msg& request, size_t max_size) override; private: std::vector filter_ttls(const std::vector& ttls, const bzn::uuid_t& db_uuid, const bzn::key_t& ignore_key); std::vector get_ttl_items(const std::string& db_uuid, std::vector& our_ttls) const; // TODO: This is a duplicate of a private crud method, it would be nice to find a way to dry this up, // maybe move this function into a utility module bzn::key_t generate_expire_key(const bzn::uuid_t& uuid, const bzn::key_t& key) const { Json::Value value; value["uuid"] = uuid; value["key"] = key; return value.toStyledString(); } }; } ================================================ FILE: proto/CMakeLists.txt ================================================ protobuf_generate_cpp(PROTO_SRC PROTO_HEADER bluzelle.proto database.proto pbft.proto audit.proto status.proto) add_library(proto ${PROTO_HEADER} ${PROTO_SRC}) set_target_properties(proto PROPERTIES COMPILE_FLAGS "-Wno-unused") set(PROTO_INCLUDE_DIR ${CMAKE_BINARY_DIR}/proto PARENT_SCOPE) ================================================ FILE: proto/audit.proto ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . syntax = "proto3"; message audit_message { oneof msg { pbft_commit_notification pbft_commit = 1; primary_status primary_status = 2; failure_detected failure_detected = 3; } } message leader_status { uint64 term = 1; string leader = 2; uint64 current_log_index = 3; uint64 current_commit_index = 4; } message primary_status { uint64 view = 1; string primary = 2; } message pbft_commit_notification { string sender_uuid = 1; uint64 sequence_number = 2; bytes operation = 3; } message failure_detected { string sender_uuid = 1; } ================================================ FILE: proto/bluzelle.proto ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . syntax = "proto3"; message swarm_error { string message = 1; bytes data = 2; bytes hash = 3; } message bzn_envelope { string swarm_id = 1; string sender = 2; bytes signature = 3; uint64 timestamp = 4; repeated bzn_envelope piggybacked_requests = 5; oneof payload { bytes database_msg = 10; bytes pbft_internal_request = 11; bytes database_response = 12; bytes json = 13; bytes audit = 14; bytes pbft = 15; bytes pbft_membership = 16; bytes status_request = 17; bytes status_response = 18; bytes checkpoint_msg = 19; bytes swarm_error = 20; } } ================================================ FILE: proto/database.proto ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . syntax = "proto3"; /////////////////////////////////////////////////////////////////////////////// // DATABASE message database_msg { database_header header = 1; oneof msg { database_create create = 2; database_read read = 3; database_update update = 4; database_delete delete = 5; database_has has = 6; database_request keys = 7; database_request size = 8; database_subscribe subscribe = 9; database_unsubscribe unsubscribe = 10; database_nullmsg nullmsg = 11; database_create_db create_db = 12; database_request delete_db = 13; database_create_db update_db = 14; database_has_db has_db = 15; database_request writers = 16; database_writers add_writers = 17; database_writers remove_writers = 18; database_read quick_read = 19; database_expire expire = 20; database_read persist = 21; database_read ttl = 22; } } message database_header { bytes db_uuid = 1; uint64 nonce = 2 [jstype = JS_STRING]; string point_of_contact = 3; bytes request_hash = 4; } message database_create_db { enum eviction_policy_type { NONE = 0; RANDOM = 1; VOLATILE_TTL = 2; } uint64 max_size = 1; eviction_policy_type eviction_policy = 2; } message database_create { bytes key = 1; bytes value = 2; uint64 expire = 3; } message database_read { bytes key = 1; } message database_update { bytes key = 1; bytes value = 2; uint64 expire = 3; } message database_expire { bytes key = 1; uint64 expire = 2; } message database_delete { bytes key = 1; } message database_subscribe { bytes key = 1; } message database_unsubscribe { bytes key = 1; uint64 nonce = 2; } message database_has { bytes key = 1; } message database_has_db {} message database_writers { repeated string writers = 1; } message database_subscription_update { enum operation_type { UPDATE = 0; DELETE = 1; } bytes key = 1; bytes value = 2; operation_type operation = 3; uint64 seq = 4; } /////////////////////////////////////////////////////////////////////////////// message database_redirect_response { string leader_id = 1; string leader_name = 2; string leader_host = 3; uint32 leader_port = 4; } message database_has_response { bytes key = 1; bool has = 2; } message database_has_db_response { bytes uuid = 1; bool has = 2; } message database_keys_response { repeated string keys = 1; } message database_read_response { bytes key = 1; bytes value = 2; } message database_quick_read_response { bytes key = 1; bytes value = 2; string error = 3; } message database_size_response { uint64 bytes = 1; uint32 keys = 2; uint64 remaining_bytes = 3; uint64 max_size = 4; } message database_request {} message database_writers_response { bytes owner = 1; repeated bytes writers = 2; } message database_ttl_response { bytes key = 1; uint64 ttl = 2; } message database_error { string message = 1; } message database_response { database_header header = 1; oneof response { database_redirect_response redirect = 2; database_subscription_update subscription_update = 3; database_read_response read = 4; database_quick_read_response quick_read = 5; database_has_response has = 6; database_keys_response keys = 7; database_size_response size = 8; database_error error = 9; database_has_db_response has_db = 10; database_writers_response writers = 11; database_ttl_response ttl = 12; } } message database_nullmsg {} ================================================ FILE: proto/pbft.proto ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . syntax = "proto3"; import "bluzelle.proto"; message pbft_msg { pbft_msg_type type = 1; // used for preprepare, prepare, commit, viewchange(v+1) uint64 view = 2; // used for preprepare, prepare, commit, checkpoint, viewchange (last valid checkpoint sequence) uint64 sequence = 3; // used for preprepare, prepare, commit bytes request_hash = 5; // most messages should only have the hash, not the original request bzn_envelope request = 4; // for join/leave requests pbft_peer_info peer_info = 7; // for viewchange repeated bzn_envelope checkpoint_messages = 8; // for viewchange, and newview (O) // P, p_m, O repeated prepared_proof prepared_proofs = 9; // for newview // V valid view change messages repeated bzn_envelope viewchange_messages = 11; repeated bzn_envelope pre_prepare_messages = 12; // for newview string config_hash = 13; // for newview string config = 14; pbft_request_type request_type = 15; } enum pbft_request_type { PBFT_REQUEST_PAYLOAD = 0; // this must be zero PBFT_REQUEST_INTERNAL = 1; } message checkpoint_msg { uint64 sequence = 1; string state_hash = 2; } message pbft_config_msg { // for new_config string configuration = 1; bytes join_request_hash = 2; } enum pbft_msg_type { PBFT_MSG_UNDEFINED = 0; PBFT_MSG_PREPREPARE = 2; PBFT_MSG_PREPARE = 3; PBFT_MSG_COMMIT = 4; PBFT_MSG_VIEWCHANGE = 8; PBFT_MSG_NEWVIEW = 9; } message pbft_membership_msg { pbft_membership_msg_type type = 1; // for join/leave requests pbft_peer_info peer_info = 2; // for get_state, set_state uint64 sequence = 3; string state_hash = 4; repeated bzn_envelope checkpoint_proof = 7; // for set_state bytes state_data = 5; bzn_envelope newview_msg = 6; bytes current_configuration = 8; } enum pbft_membership_msg_type { PBFT_MMSG_UNDEFINED = 0; PBFT_MMSG_JOIN = 1; PBFT_MMSG_JOIN_RESPONSE = 2; PBFT_MMSG_LEAVE = 3; PBFT_MMSG_GET_STATE = 4; PBFT_MMSG_SET_STATE = 5; } message pbft_peer_info { string host = 1; uint32 port = 2; string name = 3; string uuid = 4; } message prepared_proof { bzn_envelope pre_prepare = 1; // O repeated bzn_envelope prepare = 2; // P, P_m } ================================================ FILE: proto/status.proto ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . syntax = "proto3"; message status_request {} message status_response { string swarm_version = 1; string swarm_git_commit = 2; string swarm_id = 3; string uptime = 4; string module_status_json = 5; bool pbft_enabled = 6; } ================================================ FILE: qa/integration-tests.sh ================================================ #!/usr/bin/env bash cd ../.. git clone git@github.com:bluzelle/bluzelle-js.git cd bluzelle-js yarn if [ "$1" == "setup" ]; then printf "************************************* Copying template configuration files. Please add an Etherscan api key at minimum to the config files at swarmDB/build/*.json, and then run this script again with no arguments. *************************************\n" yarn setup-daemon else echo "**** Running tests with your configuration files. ****" yarn test-integration fi ================================================ FILE: scripts/crud ================================================ #!/usr/bin/env python2.7 # Copyright (C) 2018 Bluzelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # To generate Python bindings: # # cd proto # protoc --python_out=../scripts ./*.proto # import websocket import ssl import sys import random from argparse import ArgumentParser from argparse import RawDescriptionHelpFormatter try: import bluzelle_pb2 import database_pb2 import pbft_pb2 import status_pb2 except ImportError as e: raise ImportError("{}\n\nTo generate Bluzelle protobuf modules:\n" "\n" "$ cd proto\n" "$ protoc --python_out=../scripts ./*.proto\n".format(e.message)) nonce = 0 CRUD_SCRIPT_SWARM_ID = "" CRUD_SCRIPT_SENDER_ID = "crud-script" def handle_response(ws): print("-" * 60 + '\n') env = bluzelle_pb2.bzn_envelope() env.ParseFromString(ws.recv()) resp = database_pb2.database_response() resp.ParseFromString(env.database_response) if resp.WhichOneof('response') == 'redirect': redirect_node = "{}:{}".format(resp.redirect.leader_host, resp.redirect.leader_port) print("redirecting to leader at {}...\n".format(redirect_node).expandtabs(4)) resp = send_request(redirect_node, uuid, msg) else: print("Response: \n{}".format(resp).expandtabs(4)) print("-" * 60 + '\n') def send_request(node, uuid, msg, loop=False, ws=None): global nonce global CRUD_SCRIPT_SWARM_ID global CRUD_SCRIPT_SENDER_ID if not ws: ws = websocket.create_connection("wss://" + node) msg.header.db_uuid = uuid # hack! if nonce != 0: msg.header.nonce = nonce else: msg.header.nonce = random.randint(1,sys.maxint) msg_outer = bluzelle_pb2.bzn_envelope() msg_outer.database_msg = msg.SerializeToString() msg_outer.swarm_id = CRUD_SCRIPT_SWARM_ID msg_outer.sender = CRUD_SCRIPT_SENDER_ID ws.send_binary(msg_outer.SerializeToString()) resp = handle_response(ws) if loop: while 1: try: print("Waiting....\n") resp = bluzelle_pb2.bzn_envelope() resp.ParseFromString(ws.recv()) database_resp = database_pb2.database_response() database_resp.ParseFromString(resp.database_msg) print("Response: \n{}".format(database_resp).expandtabs(4)) print("-" * 60 + '\n') except KeyboardInterrupt: break return ws #ws.close() return resp def send_status_request(node): ws = websocket.create_connection("wss://" + args.node, sslopt={"cert_reqs": ssl.CERT_NONE}) msg_outer = bluzelle_pb2.bzn_envelope() msg_inner = status_pb2.status_request() msg_outer.swarm_id = CRUD_SCRIPT_SWARM_ID msg_outer.sender = CRUD_SCRIPT_SENDER_ID msg_outer.status_request = msg_inner.SerializeToString() print("Sending: \n{}".format(msg_outer).expandtabs(4)) ws.send_binary(msg_outer.SerializeToString()) env = bluzelle_pb2.bzn_envelope() env.ParseFromString(ws.recv()) resp = status_pb2.status_response() resp.ParseFromString(env.status_response) print("Response: \n{}".format(resp).expandtabs(4)) print("Response: \n{}".format(resp.module_status_json).expandtabs(4)) print("-" * 60 + '\n') return resp def create_db_request(max_size): msg = database_pb2.database_msg() msg.create_db.SetInParent() msg.create_db.max_size = max_size return msg def update_db_request(max_size): msg = database_pb2.database_msg() msg.update_db.SetInParent() msg.update_db.max_size = max_size return msg def delete_db_request(): msg = database_pb2.database_msg() msg.delete_db.SetInParent() return msg def has_db_request(): msg = database_pb2.database_msg() msg.has_db.SetInParent() return msg def writers_request(): msg = database_pb2.database_msg() msg.writers.SetInParent() return msg def add_writer_request(writer): msg = database_pb2.database_msg() msg.add_writers.SetInParent() msg.add_writers.writers.append(writer) return msg def remove_writer_request(writer): msg = database_pb2.database_msg() msg.remove_writers.SetInParent() msg.remove_writers.writers.append(writer) return msg def create_request(key, value, expire): msg = database_pb2.database_msg() msg.create.key = key msg.create.value = value msg.create.expire = expire return msg def read_request(key): msg = database_pb2.database_msg() msg.read.key = key return msg def quick_read_request(key): msg = database_pb2.database_msg() msg.quick_read.key = key return msg def update_request(key, value, expire): msg = database_pb2.database_msg() msg.update.key = key msg.update.value = value msg.update.expire = expire; return msg def delete_request(key): msg = database_pb2.database_msg() msg.delete.key = key return msg def has_request(key): msg = database_pb2.database_msg() msg.has.key = key return msg def ttl_request(key): msg = database_pb2.database_msg() msg.ttl.key = key return msg def persist_request(key): msg = database_pb2.database_msg() msg.persist.key = key return msg def expire_request(key, expire): msg = database_pb2.database_msg() msg.expire.key = key msg.expire.expire = expire return msg def keys_request(): msg = database_pb2.database_msg() msg.keys.SetInParent() return msg def size_request(): msg = database_pb2.database_msg() msg.size.SetInParent() return msg def subscribe_request(key): msg = database_pb2.database_msg() msg.subscribe.key = key return msg def unsubscribe_request(key): global nonce msg = database_pb2.database_msg() msg.unsubscribe.key = key msg.unsubscribe.nonce = nonce return msg def status_handler(args): return send_status_request(args.node) def create_db_handler(args): return send_request(args.node, args.uuid, create_db_request(args.max_size)) def update_db_handler(args): return send_request(args.node, args.uuid, update_db_request(args.max_size)) def delete_db_handler(args): return send_request(args.node, args.uuid, delete_db_request()) def has_db_handler(args): return send_request(args.node, args.uuid, has_db_request()) def writers_handler(args): return send_request(args.node, args.uuid, writers_request()) def add_writer_handler(args): return send_request(args.node, args.uuid, add_writer_request(args.writer)) def remove_writer_handler(args): return send_request(args.node, args.uuid, remove_writer_request(args.writer)) def create_handler(args): return send_request(args.node, args.uuid, create_request(args.key, args.value, args.expire)) def update_handler(args): return send_request(args.node, args.uuid, update_request(args.key, args.value, args.expire)) def read_handler(args): return send_request(args.node, args.uuid, read_request(args.key)) def qread_handler(args): return send_request(args.node, args.uuid, quick_read_request(args.key)) def delete_handler(args): return send_request(args.node, args.uuid, delete_request(args.key)) def has_handler(args): return send_request(args.node, args.uuid, has_request(args.key)) def ttl_handler(args): return send_request(args.node, args.uuid, ttl_request(args.key)) def persist_handler(args): return send_request(args.node, args.uuid, persist_request(args.key)) def expire_handler(args): return send_request(args.node, args.uuid, expire_request(args.key, args.expire)) def keys_handler(args): return send_request(args.node, args.uuid, keys_request()) def size_handler(args): return send_request(args.node, args.uuid, size_request()) def subscribe_handler(args): global nonce nonce = random.randint(1,sys.maxint) return send_request(args.node, args.uuid, unsubscribe_request(args.key), ws=send_request(args.node, args.uuid, subscribe_request(args.key), True)) if __name__ == "__main__": parser = ArgumentParser(description="crud", formatter_class=RawDescriptionHelpFormatter) parser.add_argument("-s", "--swarm_id", type=str, default="0", help="Target swarm id (default 0)", required=False) parser.add_argument("-i", "--id", type=str, default="0", help="Crud script sender id (default 0)", required=False) required = parser.add_argument_group('required arguments') required.add_argument("-n", "--node", type=str, default=None, help="node's address (ex. 127.0.0.1:51010)", required=True) subparsers = parser.add_subparsers() # Status status_parser = subparsers.add_parser('status', help="Status") status_parser.set_defaults(func=status_handler) # Create db create_db_parser = subparsers.add_parser('create-db', help="Create database") create_db_group = create_db_parser.add_argument_group('required arguments') create_db_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) create_db_group.add_argument("-s", "--max-size", type=int, default=0, help="max-size", required=False) create_db_parser.set_defaults(func=create_db_handler) # Update db update_db_parser = subparsers.add_parser('update-db', help="Update database max size") update_db_group = update_db_parser.add_argument_group('required arguments') update_db_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) update_db_group.add_argument("-s", "--max-size", type=int, default=0, help="max-size", required=False) update_db_parser.set_defaults(func=update_db_handler) # Delete db delete_db_parser = subparsers.add_parser('delete-db', help="Delete database") delete_db_group = delete_db_parser.add_argument_group('required arguments') delete_db_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) delete_db_parser.set_defaults(func=delete_db_handler) # Has db has_db_parser = subparsers.add_parser('has-db', help="Has database") has_db_group = has_db_parser.add_argument_group('required arguments') has_db_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) has_db_parser.set_defaults(func=has_db_handler) # Writers writers_parser = subparsers.add_parser('writers', help="Database writers") writers_group = writers_parser.add_argument_group('required arguments') writers_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) writers_parser.set_defaults(func=writers_handler) # Add writer add_writers_parser = subparsers.add_parser('add-writer', help="Add database writers") add_writers_group = add_writers_parser.add_argument_group('required arguments') add_writers_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) add_writers_group.add_argument("-w", "--writer", type=str, default=None, help="uuid", required=True) add_writers_parser.set_defaults(func=add_writer_handler) # Remove writer remove_writers_parser = subparsers.add_parser('remove-writer', help="Remove database writers") remove_writers_group = remove_writers_parser.add_argument_group('required arguments') remove_writers_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) remove_writers_group.add_argument("-w", "--writer", type=str, default=None, help="uuid", required=True) remove_writers_parser.set_defaults(func=remove_writer_handler) # Create create_parser = subparsers.add_parser('create', help="Create k/v") create_group = create_parser.add_argument_group('required arguments') create_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) create_group.add_argument("-k", "--key", type=str, default=None, help="key", required=True) create_group.add_argument("-ex", "--expire", type=int, default=0, help="key", required=False) group = create_group.add_mutually_exclusive_group() group.add_argument("-v", "--value", type=str, default="", help="value") group.add_argument("-f", "--file", type=str, default=None, help="file to upload") create_parser.set_defaults(func=create_handler) # Read read_parser = subparsers.add_parser('read', help="Read k/v") read_group = read_parser.add_argument_group('required arguments') read_group.add_argument("-k", "--key", type=str, default=None, help="key", required=True) read_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) read_parser.add_argument("-s", "--save", type=str, default=None, help="save to file") read_parser.set_defaults(func=read_handler) # Quick read qread_parser = subparsers.add_parser('qread', help="Quick read k/v") qread_group = qread_parser.add_argument_group('required arguments') qread_group.add_argument("-k", "--key", type=str, default=None, help="key", required=True) qread_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) qread_parser.add_argument("-s", "--save", type=str, default=None, help="save to file") qread_parser.set_defaults(func=qread_handler) # Update update_parser = subparsers.add_parser('update', help="Update k/v") update_group = update_parser.add_argument_group('required arguments') update_group.add_argument("-k", "--key", type=str, default=None, help="key", required=True) update_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) update_group.add_argument("-ex", "--expire", type=int, default=0, help="expire in seconds") update = update_group.add_mutually_exclusive_group() update.add_argument("-v", "--value", type=str, default=None, help="value") update.add_argument("-f", "--file", type=str, default=None, help="file to upload") update_parser.set_defaults(func=update_handler) # delete delete_parser = subparsers.add_parser('delete', help="Delete k/v") delete_group = delete_parser.add_argument_group('required arguments') delete_group.add_argument("-k", "--key", type=str, default=None, help="key", required=True) delete_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) delete_parser.set_defaults(func=delete_handler) # has has_parser = subparsers.add_parser('has', help="Determine whether a key exists within a DB by UUID") has_group = has_parser.add_argument_group('requred arguments') has_group.add_argument("-k", "--key", type=str, default=None, help="key", required=True) has_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) has_parser.set_defaults(func=has_handler) # ttl ttl_parser = subparsers.add_parser('ttl', help="Get ttl for a key within a DB by UUID") ttl_group = ttl_parser.add_argument_group('required arguments') ttl_group.add_argument("-k", "--key", type=str, default=None, help="key", required=True) ttl_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) ttl_parser.set_defaults(func=ttl_handler) # persist persist_parser = subparsers.add_parser('persist', help="Remove expiration for a key within a DB by UUID") persist_group = persist_parser.add_argument_group('required arguments') persist_group.add_argument("-k", "--key", type=str, default=None, help="key", required=True) persist_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) persist_parser.set_defaults(func=persist_handler) # expire expire_parser = subparsers.add_parser('expire', help="Set expire for a key within a DB by UUID") expire_group = expire_parser.add_argument_group('required arguments') expire_group.add_argument("-k", "--key", type=str, default=None, help="key", required=True) expire_group.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) expire_group.add_argument("-ex", "--expire", type=int, default=0, help="expire in seconds") expire_parser.set_defaults(func=expire_handler) # keys keys_parser = subparsers.add_parser('keys', help="Get all keys for a DB by UUID") keys_parser.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) keys_parser.set_defaults(func=keys_handler) # size size_parser = subparsers.add_parser('size', help="Determine the size of the DB by UUID") size_parser.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) size_parser.set_defaults(func=size_handler) # subscribe subscribe_parser = subparsers.add_parser('subscribe', help="Subscribe and monitor changes for a key") subscribe_parser.add_argument("-u", "--uuid", type=str, default=None, help="uuid", required=True) subscribe_parser.add_argument("-k", "--key", type=str, default=None, help="key", required=True) subscribe_parser.set_defaults(func=subscribe_handler) args = parser.parse_args() try: if args.file: # if user gave us a file we need to read it as our value args.value = open(args.file).read() except IOError as e: print("failed to read value from file: {}".format(e.strerror)) exit(1) except AttributeError: # no input file specified. Value was passed via command line pass CRUD_SCRIPT_SWARM_ID = args.swarm_id CRUD_SCRIPT_SENDER_ID += "-" + args.id print("\nClient: " + CRUD_SCRIPT_SENDER_ID) resp = args.func(args) try: # save to a file... if args.save: with open(args.save, "w") as outfile: outfile.write(str(resp.resp.value)) except AttributeError: # no output file specified. Result will be printed to console pass exit(0) ================================================ FILE: scripts/generate-key ================================================ #!/bin/bash set -e prefix=${1:-`pwd`/.state} mkdir -p $prefix # This is a very popular curve, which openssl has special optimizations for openssl ecparam -name secp256r1 -genkey -noout -out $prefix/private-key.pem echo "Private key written to "$prefix"/private-key.pem" openssl ec -in $prefix/private-key.pem -pubout -out $prefix/public-key.pem > /dev/null 2>&1 echo "Public key written to "$prefix"/public-key.pem" echo cat $prefix/public-key.pem ================================================ FILE: scripts/sign_uuid.sh ================================================ #!/usr/bin/env bash usage() { echo "usage: sign_uuid -k path/to/private.pem -u " echo "The output will be signature.txt which can be provided to the node owner." } write_uuid_to_file() { uuid_text=$1 uuid_file_name=$2 echo "Writing UUID($uuid_text) to $uuid_file_name" echo $uuid_text > ${uuid_file_name} } verify_input_files() { private_key_file_name=$1 uuid_file_name=$2 if [ -f $private_key_file_name ]; then echo "Found the private key file: $private_key_file_name" else echo "Exiting - Could not find the private key file: $private_key_file_name" exit fi if [ -f $uuid_file_name ]; then echo "Found the UUID file: $uuid_file_name" else echo "Exiting - Could not find the UUID file: $uuid_file_name" exit fi } use_private_pem_to_sign_uuid() { private_key_file_name=$1 uuid_file_name=$2 temp_sha256_binary_file=/tmp/sign.sha256 openssl dgst -sha256 -sign ${private_key_file_name} -out ${temp_sha256_binary_file} ${uuid_file_name} if [ $? -ne 0 ]; then echo "*** Exiting - Unable to create the binary signature file" exit else echo "Successfully created binary signature file.." fi openssl base64 -in ${temp_sha256_binary_file} -out signature.txt if [ $? -ne 0 ]; then echo "*** Exiting - Unable to base64 encode the binary signature file" exit else echo "The signature has been written to signature.txt" fi } ############ ### MAIN ### private_key_file_name= uuid_file_name=/tmp/uuid.txt # TODO Move the while block into it's own function while [ "$1" != "" ]; do case $1 in -k | --key ) shift private_key_file_name=$1 ;; -u | --uuid ) shift write_uuid_to_file $1 $uuid_file_name ;; -h | --help ) usage exit ;; * ) usage exit 1 esac shift done verify_input_files $private_key_file_name $uuid_file_name use_private_pem_to_sign_uuid $private_key_file_name $uuid_file_name exit 0 ================================================ FILE: scripts-1.md ================================================ # Python CRUD Test App Steps to run the Bluzelle SwarmDB test application in a Python Virtual Environment. **Ensure that you activate your virtualenv each time you want to run the application**. ## Install Virtual Environment ```text $ sudo pip install virtualenv $ cd workspace $ virtualenv crud-app ``` ## Activate Virtual Environment ```text $ . ~/workspace/crud-app/bin/activate ``` ## Install Dependencies ```text (crud-app)$ pip install websocket-client protobuf ``` ## Generate Protobuf Code ```text (crud-app)$ cd ../workspace/swarmdb/scripts (crud-app)$ protoc --python_out=../scripts *.proto ``` ## Run Script ```text (crud-app)$ crud -h ``` ================================================ FILE: status/CMakeLists.txt ================================================ add_library(status STATIC status.cpp status.hpp ) target_link_libraries(status proto) add_dependencies(status boost jsoncpp proto openssl) target_include_directories(status PRIVATE ${BLUZELLE_STD_INCLUDES}) add_subdirectory(test) ================================================ FILE: status/status.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include using namespace bzn; namespace { const std::string NAME_KEY{"name"}; const std::string STATUS_KEY{"status"}; const std::string MODULE_KEY{"module"}; std::string get_uptime(const std::chrono::steady_clock::time_point& start_time) { using namespace std::chrono; auto uptime = duration_cast(steady_clock::now() - start_time); auto d = duration_cast>>(uptime); auto h = duration_cast(uptime -= d); auto m = duration_cast(uptime -= h); std::stringstream ss; ss << d.count() << " days, " << h.count() << " hours, " << m.count() << " minutes"; return ss.str(); } } status::status(std::shared_ptr node, bzn::status::status_provider_list_t&& status_providers, const std::string& swarm_id) : node(std::move(node)) , status_providers(std::move(status_providers)) , swarm_id(swarm_id) , start_time(std::chrono::steady_clock::now()) { } void status::start() { std::call_once(this->start_once, [this]() { if (!this->node->register_for_message(bzn_envelope::kStatusRequest, std::bind(&status::handle_status_request_message, shared_from_this(), std::placeholders::_1, std::placeholders::_2))) { throw std::runtime_error("Unable to register for STATUS REQUEST messages!"); } }); } bzn::json_message status::query_modules() { Json::Value module_status; for (const auto& provider : this->status_providers) { if (auto provider_shared_ptr = provider.lock()) { bzn::json_message entry; entry[NAME_KEY] = provider_shared_ptr->get_name(); entry[STATUS_KEY] = provider_shared_ptr->get_status(); module_status.append(entry); } } return module_status; } void status::handle_status_request_message(const bzn_envelope& /*msg*/, std::shared_ptr session) { status_response srm; srm.set_swarm_version(SWARM_VERSION); srm.set_swarm_git_commit(SWARM_GIT_COMMIT); srm.set_swarm_id(this->swarm_id); srm.set_uptime(get_uptime(this->start_time)); srm.set_pbft_enabled(true); Json::Value module_status; module_status[MODULE_KEY] = this->query_modules(); srm.set_module_status_json(module_status.toStyledString()); LOG(debug) << srm.DebugString().substr(0, MAX_MESSAGE_SIZE); bzn_envelope env; env.set_status_response(srm.SerializeAsString()); session->send_signed_message(std::make_shared(env)); } ================================================ FILE: status/status.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include #include namespace bzn { class status final : public std::enable_shared_from_this { public: using status_provider_list_t = std::vector>; status(std::shared_ptr node, status_provider_list_t&& status_providers, const std::string& swarm_id); void start(); private: void handle_status_request_message(const bzn_envelope& msg, std::shared_ptr session); bzn::json_message query_modules(); std::shared_ptr node; status_provider_list_t status_providers; const std::string swarm_id; std::once_flag start_once; const std::chrono::steady_clock::time_point start_time; }; } // namespace bzn ================================================ FILE: status/status_provider_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn { class status_provider_base { public: virtual ~status_provider_base() = default; /** * get name * @return name */ virtual std::string get_name() = 0; /** * get status * @return status in a json message */ virtual bzn::json_message get_status() = 0; }; } // namespace bzn ================================================ FILE: status/test/CMakeLists.txt ================================================ set(test_srcs status_test.cpp) set(test_libs status ${Protobuf_LIBRARIES}) add_gmock_test(status) ================================================ FILE: status/test/status_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include using namespace bzn; using namespace testing; TEST(status_test, test_that_status_registers_and_responses_to_requests) { auto mock_node = std::make_shared(); // success { auto status = std::make_shared(mock_node, bzn::status::status_provider_list_t{}, "1234"); EXPECT_CALL(*mock_node, register_for_message(bzn_envelope::kStatusRequest, _)).WillOnce(Return(true)); status->start(); } // failure { auto status = std::make_shared(mock_node, bzn::status::status_provider_list_t{}, "1234"); EXPECT_CALL(*mock_node, register_for_message(bzn_envelope::kStatusRequest, _)).WillOnce(Return(false)); EXPECT_THROW(status->start(), std::runtime_error); } } TEST(status_test, test_that_status_request_queries_status_providers) { const std::string SWARM_ID{"utest"}; auto mock_node = std::make_shared(); auto mock_session = std::make_shared(); auto mock_status_provider = std::make_shared(); auto status = std::make_shared(mock_node, bzn::status::status_provider_list_t{mock_status_provider, mock_status_provider}, SWARM_ID); bzn::protobuf_handler pbh; EXPECT_CALL(*mock_node, register_for_message(bzn_envelope::kStatusRequest, _)).WillOnce(Invoke( [&](auto, auto handler) { pbh = handler; return true; })); status->start(); // make protobuf request... EXPECT_CALL(*mock_status_provider, get_name()).WillOnce(Invoke( [](){ return "mock1";})).WillOnce(Invoke([](){return "mock2";})); EXPECT_CALL(*mock_status_provider, get_status()).WillRepeatedly(Invoke( []() { bzn::json_message status; status["line"] = __LINE__; status["file"] = __FILE__; return status; })); EXPECT_CALL(*mock_session, send_signed_message(_)).WillOnce(Invoke( [&](auto env) { ASSERT_EQ(env->payload_case(), bzn_envelope::kStatusResponse); status_response sr; ASSERT_TRUE(sr.ParseFromString(env->status_response())); ASSERT_TRUE(sr.pbft_enabled()); ASSERT_EQ(sr.swarm_version(), SWARM_VERSION); ASSERT_EQ(sr.swarm_id(), SWARM_ID); ASSERT_EQ(sr.swarm_git_commit(), SWARM_GIT_COMMIT); ASSERT_EQ(sr.uptime(), "0 days, 0 hours, 0 minutes"); Json::CharReaderBuilder builder; Json::CharReader* reader = builder.newCharReader(); bzn::json_message ms; std::string error; ASSERT_TRUE(reader->parse(sr.module_status_json().c_str(), sr.module_status_json().c_str() + sr.module_status_json().size(), &ms, &error)); ASSERT_EQ(ms["module"].size(), size_t(2)); ASSERT_EQ(ms["module"][0]["name"].asString(), "mock1"); ASSERT_EQ(ms["module"][1]["name"].asString(), "mock2"); delete reader; })); pbh(bzn_envelope(), mock_session); } ================================================ FILE: storage/CMakeLists.txt ================================================ add_library(storage STATIC mem_storage.cpp mem_storage.hpp storage_base.hpp rocksdb_storage.hpp rocksdb_storage.cpp) target_link_libraries(storage) add_dependencies(storage boost jsoncpp rocksdb) target_include_directories(storage PRIVATE ${BLUZELLE_STD_INCLUDES}) add_subdirectory(test) ================================================ FILE: storage/mem_storage.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include using namespace bzn; bzn::storage_result mem_storage::create(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) { std::lock_guard lock(this->kv_store_lock); // lock for write access if (value.size() > bzn::MAX_VALUE_SIZE) { return bzn::storage_result::value_too_large; } if (key.size() > bzn::MAX_KEY_SIZE) { return bzn::storage_result::key_too_large; } if (auto search = this->kv_store.find(uuid); search != this->kv_store.end()) { if (search->second.second.find(key)!= search->second.second.end() ) { return bzn::storage_result::exists; } } auto& inner_db = this->kv_store[uuid]; if (inner_db.second.find(key) == inner_db.second.end()) { inner_db.first += value.size() + key.size(); inner_db.second.insert(std::make_pair(key,value)); } else { return bzn::storage_result::exists; } return bzn::storage_result::ok; } std::optional mem_storage::read(const bzn::uuid_t& uuid, const bzn::key_t& key) { std::shared_lock lock(this->kv_store_lock); // lock for read access auto search = this->kv_store.find(uuid); if (search == this->kv_store.end()) { return std::nullopt; } // we have the db, let's see if the key exists auto& inner_db = search->second; auto inner_search = inner_db.second.find(key); if (inner_search == inner_db.second.end()) { return std::nullopt; } return inner_search->second; } bzn::storage_result mem_storage::update(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) { std::lock_guard lock(this->kv_store_lock); // lock for write access if (value.size() > bzn::MAX_VALUE_SIZE) { return bzn::storage_result::value_too_large; } auto search = this->kv_store.find(uuid); if (search == this->kv_store.end()) { return bzn::storage_result::not_found; } // we have the db, let's see if the key exists auto& inner_db = search->second; auto inner_search = inner_db.second.find(key); if (inner_search == inner_db.second.end()) { return bzn::storage_result::not_found; } inner_db.first -= inner_search->second.size(); inner_search->second = value; inner_db.first += inner_search->second.size(); return bzn::storage_result::ok; } bzn::storage_result mem_storage::remove(const bzn::uuid_t& uuid, const bzn::key_t& key) { std::lock_guard lock(this->kv_store_lock); // lock for write access auto search = this->kv_store.find(uuid); if (search == this->kv_store.end()) { return bzn::storage_result::not_found; } auto record = search->second.second.find(key); if (record == search->second.second.end()) { return bzn::storage_result::not_found; } search->second.first -= (record->second.size() + key.size()); search->second.second.erase(record); return bzn::storage_result::ok; } std::vector mem_storage::get_keys(const bzn::uuid_t& uuid) { std::shared_lock lock(this->kv_store_lock); // lock for read access auto inner_db = this->kv_store.find(uuid); if (inner_db == this->kv_store.end()) { return {}; } std::vector keys; for (const auto& p : inner_db->second.second) { keys.emplace_back(p.first); } return keys; } bool mem_storage::has(const bzn::uuid_t& uuid, const bzn::key_t& key) { const auto v = this->get_keys(uuid); return std::find(v.begin(), v.end(), key) != v.end(); } std::pair mem_storage::get_size(const bzn::uuid_t& uuid) { std::shared_lock lock(this->kv_store_lock); // lock for read access auto it = this->kv_store.find(uuid); if (it == this->kv_store.end()) { // database not found... return std::make_pair(0,0); } return std::make_pair(it->second.second.size(), it->second.first); } std::optional mem_storage::get_key_size(const bzn::uuid_t& uuid, const bzn::key_t& key) { std::shared_lock lock(this->kv_store_lock); // lock for read access auto search = this->kv_store.find(uuid); if (search == this->kv_store.end()) { return std::nullopt; } // we have the db, let's see if the key exists auto& inner_db = search->second; auto inner_search = inner_db.second.find(key); if (inner_search == inner_db.second.end()) { return std::nullopt; } return inner_search->first.size() + inner_search->second.size(); } bzn::storage_result mem_storage::remove(const bzn::uuid_t& uuid) { std::lock_guard lock(this->kv_store_lock); // lock for write access if (auto it = this->kv_store.find(uuid); it != this->kv_store.end()) { this->kv_store.erase(it); return bzn::storage_result::ok; } return bzn::storage_result::not_found; } bool mem_storage::create_snapshot() { std::shared_lock lock(this->kv_store_lock); // lock for read access try { std::stringstream strm; boost::archive::text_oarchive archive(strm); archive << this->kv_store; this->latest_snapshot = std::make_shared(strm.str()); return true; } catch (std::exception& ex) { LOG(error) << "Exception creating snapshot: " << ex.what(); } return false; } std::shared_ptr mem_storage::get_snapshot() { std::shared_lock lock(this->kv_store_lock); // lock for read access return this->latest_snapshot; } bool mem_storage::load_snapshot(const std::string& data) { std::shared_lock lock(this->kv_store_lock); // lock for write access try { std::stringstream strm(data); boost::archive::text_iarchive archive(strm); archive >> this->kv_store; this->latest_snapshot = std::make_shared(data); return true; } catch (std::exception& ex) { LOG(error) << "Exception loading snapshot: " << ex.what(); } return false; } void mem_storage::remove_range(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last) { std::lock_guard lock(this->kv_store_lock); // lock for write access auto inner_db = this->kv_store.find(uuid); if (inner_db != this->kv_store.end()) { auto match = inner_db->second.second.lower_bound(first); auto end = inner_db->second.second.lower_bound(last); while (match != end) { inner_db->second.first -= (match->second.size() + match->first.size()); match = inner_db->second.second.erase(match); } } } void mem_storage::do_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate, std::function action) { if (!last.empty() && last <= first) { return; } std::shared_lock lock(this->kv_store_lock); // lock for read access auto inner_db = this->kv_store.find(uuid); if (inner_db != this->kv_store.end()) { auto end_it = last.empty() ? inner_db->second.second.end() : inner_db->second.second.lower_bound(last); for (auto it = inner_db->second.second.lower_bound(first); it != inner_db->second.second.end() && it != end_it; it++) { if (!predicate || (*predicate)(it->first, it->second)) { action(it->first, it->second); } } } } std::vector> mem_storage::read_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate) { std::vector> matches; this->do_if(uuid, first, last, predicate, [&](auto key, auto value) { matches.emplace_back(std::make_pair(key, value)); }); return matches; } std::vector mem_storage::get_keys_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last , std::optional> predicate) { std::vector keys; this->do_if(uuid, first, last, predicate, [&](auto key, auto /*value*/) { keys.emplace_back(key); }); return keys; } ================================================ FILE: storage/mem_storage.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include namespace bzn { class mem_storage : public bzn::storage_base { public: bzn::storage_result create(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) override; std::optional read(const bzn::uuid_t& uuid, const bzn::key_t& key) override; bzn::storage_result update(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) override; bzn::storage_result remove(const bzn::uuid_t& uuid, const bzn::key_t& key) override; std::vector get_keys(const bzn::uuid_t& uuid) override; bool has(const bzn::uuid_t& uuid, const bzn::key_t& key) override; std::pair get_size(const bzn::uuid_t& uuid) override; std::optional get_key_size(const bzn::uuid_t& uuid, const bzn::key_t& key) override; bzn::storage_result remove(const bzn::uuid_t& uuid) override; bool create_snapshot() override; std::shared_ptr get_snapshot() override; bool load_snapshot(const std::string& data) override; void remove_range(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last) override; std::vector> read_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate = std::nullopt) override; std::vector get_keys_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate = std::nullopt) override; private: std::unordered_map>> kv_store; std::shared_mutex kv_store_lock; // for multi-reader and single writer access std::shared_ptr latest_snapshot; void do_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate, std::function action); }; } // bzn ================================================ FILE: storage/rocksdb_storage.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include using namespace bzn; namespace { const bzn::key_t METADATA_UUID{"METADATA"}; const bzn::key_t NAMESPACE_KEY{"NAMESPACE"}; const bzn::key_t SIZE_KEY{"SIZE"}; inline bzn::key_t generate_key(const bzn::uuid_t& uuid, const bzn::key_t& key) { return uuid+key; } } rocksdb_storage::rocksdb_storage(const std::string& state_dir, const std::string& db_name, const bzn::uuid_t& uuid) : db_path(boost::filesystem::path(state_dir).append(uuid).append(db_name).string()) , snapshot_file(boost::filesystem::path(state_dir).append(uuid).append("SNAPSHOT." + db_name).string()) { this->open(); } void rocksdb_storage::open() { rocksdb::Options options; options.IncreaseParallelism(std::thread::hardware_concurrency()); options.OptimizeLevelStyleCompaction(); options.create_if_missing = true; rocksdb::DB* rocksdb; boost::filesystem::create_directories(db_path); LOG(info) << "database path: " << db_path; rocksdb::Status s = rocksdb::DB::Open(options, db_path, &rocksdb); if (!s.ok()) { throw std::runtime_error("Could not open database: " + s.ToString()); } this->db.reset(rocksdb); } bzn::storage_result rocksdb_storage::create(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) { if (value.size() > bzn::MAX_VALUE_SIZE) { return bzn::storage_result::value_too_large; } if (key.size() > bzn::MAX_KEY_SIZE) { return bzn::storage_result::key_too_large; } rocksdb::WriteOptions write_options; write_options.sync = true; std::lock_guard lock(this->lock); // lock for write access if (!this->has_priv(uuid, key)) { const uint32_t ns_prev_size = this->get_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY); auto s = this->db->Put(write_options, generate_key(uuid, key), value); if (!s.ok()) { LOG(error) << "save failed: " << uuid << ":" << key << ":" << value.substr(0,MAX_MESSAGE_SIZE) << "... - " << s.ToString(); return bzn::storage_result::not_saved; } // update metadata... this->update_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY, ns_prev_size + value.size() + key.size()); this->update_metadata_size(uuid, SIZE_KEY, key, value.size() + key.size()); #ifdef __APPLE__ this->db_flush(); #endif return bzn::storage_result::ok; } return bzn::storage_result::exists; } void rocksdb_storage::db_flush() const { rocksdb::FlushOptions flush_options; flush_options.wait = false; db->Flush(flush_options); } std::optional rocksdb_storage::read(const bzn::uuid_t& uuid, const bzn::key_t& key) { std::shared_lock lock(this->lock); // lock for read access bzn::value_t value; auto s = this->db->Get(rocksdb::ReadOptions(), generate_key(uuid, key), &value); if (!s.ok()) { return std::nullopt; } return value; } bzn::storage_result rocksdb_storage::update(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) { if (value.size() > bzn::MAX_VALUE_SIZE) { return bzn::storage_result::value_too_large; } std::lock_guard lock(this->lock); // lock for write access if (this->has_priv(uuid, key)) { const uint32_t prev_size = this->get_metadata_size(uuid, SIZE_KEY, key); const uint32_t ns_prev_size = this->get_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY); rocksdb::WriteOptions write_options; write_options.sync = true; auto s = this->db->Put(write_options, generate_key(uuid, key), value); if (!s.ok()) { LOG(error) << "update failed: " << uuid << ":" << key << ":" << value.substr(0,MAX_MESSAGE_SIZE) << "... - " << s.ToString(); return bzn::storage_result::not_saved; } // update metadata... this->update_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY, ns_prev_size - prev_size + value.size() + key.size()); this->update_metadata_size(uuid, SIZE_KEY, key, value.size() + key.size()); #ifdef __APPLE__ this->db_flush(); #endif return bzn::storage_result::ok; } return bzn::storage_result::not_found; } bzn::storage_result rocksdb_storage::remove(const bzn::uuid_t& uuid, const bzn::key_t& key) { rocksdb::WriteOptions write_options; write_options.sync = true; std::lock_guard lock(this->lock); // lock for write access if (this->has_priv(uuid, key)) { const uint32_t prev_size = this->get_metadata_size(uuid, SIZE_KEY, key); const uint32_t ns_prev_size = this->get_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY); auto s = this->db->Delete(write_options, generate_key(uuid, key)); if (!s.ok()) { return bzn::storage_result::not_found; } // update metadata... this->update_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY, ns_prev_size - prev_size); this->delete_metadata_size(uuid, SIZE_KEY, key); return bzn::storage_result::ok; } return bzn::storage_result::not_found; } std::vector rocksdb_storage::get_keys(const bzn::uuid_t& uuid) { std::shared_lock lock(this->lock); // lock for read access std::unique_ptr iter(this->db->NewIterator(rocksdb::ReadOptions())); std::vector v; for (iter->Seek(uuid); iter->Valid() && iter->key().starts_with(uuid); iter->Next()) { v.emplace_back(iter->key().ToString().substr(uuid.size())); } return v; } bool rocksdb_storage::has(const bzn::uuid_t& uuid, const bzn::key_t& key) { std::shared_lock lock(this->lock); // lock for read access return this->has_priv(uuid, key); } std::pair rocksdb_storage::get_size(const bzn::uuid_t& uuid) { std::unique_ptr iter(this->db->NewIterator(rocksdb::ReadOptions())); std::size_t keys{}; std::shared_lock lock(this->lock); // lock for read access for (iter->Seek(uuid); iter->Valid() && iter->key().starts_with(uuid); iter->Next()) { ++keys; } return std::make_pair(keys, this->get_metadata_size(uuid, NAMESPACE_KEY, SIZE_KEY)); } std::optional rocksdb_storage::get_key_size(const bzn::uuid_t& uuid, const bzn::key_t& key) { std::shared_lock lock(this->lock); // lock for read access if (this->has_priv(uuid, key)) { return this->get_metadata_size(uuid, SIZE_KEY, key); } return std::nullopt; } bzn::storage_result rocksdb_storage::remove(const bzn::uuid_t& uuid) { rocksdb::WriteOptions write_options; write_options.sync = true; std::unique_ptr iter(this->db->NewIterator(rocksdb::ReadOptions())); std::lock_guard lock(this->lock); // lock for write access std::size_t keys_removed{}; for (iter->Seek(uuid); iter->Valid() && iter->key().starts_with(uuid); iter->Next()) { auto s = this->db->Delete(write_options, iter->key()); if (!s.ok()) { LOG(error) << "delete failed: " << uuid << ":" << s.ToString(); } ++keys_removed; } for (iter->Seek(METADATA_UUID+uuid); iter->Valid() && iter->key().starts_with(METADATA_UUID+uuid); iter->Next()) { auto s = this->db->Delete(write_options, iter->key()); if (!s.ok()) { LOG(error) << "metadata delete failed: " << uuid << ":" << s.ToString(); } } return (keys_removed) ? bzn::storage_result::ok : bzn::storage_result::not_found; } bool rocksdb_storage::has_priv(const bzn::uuid_t& uuid, const bzn::key_t& key) { const bzn::key_t has_key = generate_key(uuid, key); std::unique_ptr iter(this->db->NewIterator(rocksdb::ReadOptions())); for (iter->Seek(uuid); iter->Valid() && iter->key().starts_with(uuid); iter->Next()) { if (iter->key() == has_key) { return true; } } return false; } bool rocksdb_storage::create_snapshot() { rocksdb::DumpOptions dump_options; dump_options.db_path = this->db_path; dump_options.dump_location = this->snapshot_file; dump_options.anonymous = true; std::shared_lock lock(this->lock); // lock for read access return rocksdb::DbDumpTool().Run(dump_options); } std::shared_ptr rocksdb_storage::get_snapshot() { std::shared_lock lock(this->lock); // lock for read access std::stringstream snapshot; // check if file exists... try { std::ifstream s(this->snapshot_file); snapshot << s.rdbuf(); } catch (std::exception& ex) { LOG(error) << "Exception reading snapshot: " << ex.what(); return {}; } return std::make_shared(snapshot.str()); } bool rocksdb_storage::load_snapshot(const std::string& data) { std::lock_guard lock(this->lock); // lock for write access const std::string tmp_snapshot(this->snapshot_file + ".tmp"); try { std::ofstream snapshot(tmp_snapshot); snapshot << data; } catch (std::exception& ex) { LOG(error) << "saving snapshot failed: " << ex.what(); return false; } // bring down the database... this->db.reset(); // move current database out of the way... const std::string tmp_path(this->db_path + ".tmp"); boost::system::error_code ec; boost::filesystem::rename(this->db_path, tmp_path, ec); if (ec) { LOG(error) << "creating temporary db backup failed: " << ec.message(); // bring db back online... this->open(); return false; } rocksdb::UndumpOptions undump_options; undump_options.db_path = this->db_path; undump_options.dump_location = tmp_snapshot; undump_options.compact_db = true; if (rocksdb::DbUndumpTool().Run(undump_options)) { boost::system::error_code ec; boost::filesystem::remove_all(tmp_path, ec); boost::filesystem::remove(this->snapshot_file); boost::filesystem::rename(tmp_snapshot, this->snapshot_file); if (ec) { LOG(error) << "failed to remove temporary db backup: " << ec.message(); } // bring db back online... this->open(); return true; } LOG(error) << "failed to load snapshot"; // any exceptions will be fatal... boost::filesystem::remove_all(this->db_path); boost::filesystem::rename(tmp_path, this->db_path); boost::filesystem::remove(tmp_snapshot); // bring db back online... this->open(); return false; } void rocksdb_storage::remove_range(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last) { std::lock_guard lock(this->lock); // lock for write access std::vector v; auto begin_str = generate_key(uuid, first); rocksdb::Slice begin(begin_str); auto end_str = generate_key(uuid, last); rocksdb::Slice end(end_str); rocksdb::WriteOptions write_options; write_options.sync = true; // TODO: Normal db usage does not use delete range. // If it ever does then namespace metadata will need to know each key // removed so that it can account for it. this->db->DeleteRange(write_options, nullptr, begin, end); } void rocksdb_storage::do_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate, std::function action) { const auto start_key = uuid + first; const auto end_key = last.empty() ? "" : uuid + last; std::shared_lock lock(this->lock); // lock for read access std::unique_ptr iter(this->db->NewIterator(rocksdb::ReadOptions())); for (iter->Seek(start_key); iter->Valid() && iter->key().starts_with(uuid) && iter->key().ToString() >= start_key && (end_key.empty() || iter->key().ToString() < end_key); iter->Next()) { if (!predicate || (*predicate)(iter->key().ToString().substr(uuid.size()), iter->value().ToString())) { action(iter->key().ToString().substr(uuid.size()), iter->value().ToString()); } } } std::vector> rocksdb_storage::read_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate) { std::vector> matches; this->do_if(uuid, first, last, predicate, [&](auto key, auto value) { matches.emplace_back(std::make_pair(key, value)); }); return matches; } std::vector rocksdb_storage::get_keys_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate) { std::vector keys; this->do_if(uuid, first, last, predicate, [&](auto key, auto /*value*/) { keys.emplace_back(key); }); return keys; } void rocksdb_storage::update_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& metadata_key, const bzn::key_t& key, uint32_t size) { rocksdb::WriteOptions write_options; write_options.sync = true; if (!this->db->Put(write_options, generate_key(METADATA_UUID + uuid + metadata_key, key), std::to_string(size)).ok()) { LOG(error) << "update namespace metadata key size failed: " << uuid << ":" << key.substr(0, MAX_MESSAGE_SIZE); } } void rocksdb_storage::delete_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& metadata_key, const bzn::key_t& key) { rocksdb::WriteOptions write_options; write_options.sync = true; if (!this->db->Delete(write_options, generate_key(METADATA_UUID + uuid + metadata_key, key)).ok()) { LOG(error) << "delete namespace metadata key size failed: " << uuid << ":" << key.substr(0, MAX_MESSAGE_SIZE); } } uint32_t rocksdb_storage::get_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& metadata_key, const bzn::key_t& key) { bzn::value_t value; if (!this->db->Get(rocksdb::ReadOptions(), generate_key(METADATA_UUID + uuid + metadata_key, key), &value).ok()) { LOG(error) << "reading of namespace metadata key size failed: " << uuid << ":" << key.substr(0, MAX_MESSAGE_SIZE); return 0; } return boost::lexical_cast(value); } ================================================ FILE: storage/rocksdb_storage.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include #include namespace bzn { class rocksdb_storage : public bzn::storage_base { public: rocksdb_storage(const std::string& state_dir, const std::string& db_name, const bzn::uuid_t& uuid); bzn::storage_result create(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) override; std::optional read(const bzn::uuid_t& uuid, const bzn::key_t& key) override; bzn::storage_result update(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) override; bzn::storage_result remove(const bzn::uuid_t& uuid, const bzn::key_t& key) override; std::vector get_keys(const bzn::uuid_t& uuid) override; bool has(const bzn::uuid_t& uuid, const bzn::key_t& key) override; std::pair get_size(const bzn::uuid_t& uuid) override; std::optional get_key_size(const bzn::uuid_t& uuid, const bzn::key_t& key) override; bzn::storage_result remove(const bzn::uuid_t& uuid) override; bool create_snapshot() override; std::shared_ptr get_snapshot() override; bool load_snapshot(const std::string& data) override; void remove_range(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last) override; std::vector> read_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate = std::nullopt) override; std::vector get_keys_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate = std::nullopt) override; private: void open(); // metadata.... void update_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& metadata_key, const bzn::key_t& key,uint32_t size); void delete_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& meta_key, const bzn::key_t& key); uint32_t get_metadata_size(const bzn::uuid_t& uuid, const bzn::key_t& meta_key, const bzn::key_t& key); const std::string db_path; const std::string snapshot_file; std::unique_ptr db; bool has_priv(const bzn::uuid_t& uuid, const bzn::key_t& key); std::shared_mutex lock; // for multi-reader and single writer access void do_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate, std::function action); void db_flush() const; }; } // bzn ================================================ FILE: storage/storage_base.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include namespace bzn { const size_t MAX_KEY_SIZE = 4096; const size_t MAX_VALUE_SIZE = 256000; enum class storage_result : uint8_t { ok=0, not_found, exists, ttl_not_found, not_saved, value_too_large, key_too_large, db_not_found, db_exists, db_full, access_denied, delete_pending, invalid_argument, invalid_size }; const std::unordered_map storage_result_msg{ {storage_result::ok, "OK"}, {storage_result::not_found, "RECORD_NOT_FOUND"}, {storage_result::exists, "RECORD_EXISTS"}, {storage_result::ttl_not_found, "TTL_RECORD_NOT_FOUND"}, {storage_result::not_saved, "NOT_SAVED"}, {storage_result::value_too_large, "VALUE_SIZE_TOO_LARGE"}, {storage_result::key_too_large, "KEY_SIZE_TOO_LARGE"}, {storage_result::db_not_found, "DATABASE_NOT_FOUND"}, {storage_result::db_exists, "DATABASE_EXISTS"}, {storage_result::db_full, "INSUFFICIENT_SPACE"}, {storage_result::access_denied, "ACCESS_DENIED"}, {storage_result::delete_pending, "DELETE_PENDING"}, {storage_result::invalid_argument,"INVALID_ARGUMENT"}, {storage_result::invalid_size, "INVALID_SIZE_LIMITS_SET"}}; class storage_base { public: virtual ~storage_base() = default; virtual bzn::storage_result create(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) = 0; virtual std::optional read(const bzn::uuid_t& uuid, const bzn::key_t& key) = 0; virtual bzn::storage_result update(const bzn::uuid_t& uuid, const bzn::key_t& key, const bzn::value_t& value) = 0; virtual bzn::storage_result remove(const bzn::uuid_t& uuid, const bzn::key_t& key) = 0; virtual std::vector get_keys(const bzn::uuid_t& uuid) = 0; virtual bool has(const bzn::uuid_t& uuid, const bzn::key_t& key) = 0; virtual std::pair get_size(const bzn::uuid_t& uuid) = 0; virtual std::optional get_key_size(const bzn::uuid_t& uuid, const bzn::key_t& key) = 0; virtual bzn::storage_result remove(const bzn::uuid_t& uuid) = 0; virtual bool create_snapshot() = 0; virtual std::shared_ptr get_snapshot() = 0; virtual bool load_snapshot(const std::string& data) = 0; virtual void remove_range(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last) = 0; virtual std::vector> read_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate = std::nullopt) = 0; virtual std::vector get_keys_if(const bzn::uuid_t& uuid, const bzn::key_t& first, const bzn::key_t& last, std::optional> predicate = std::nullopt) = 0; }; } // bzn ================================================ FILE: storage/test/CMakeLists.txt ================================================ set(test_srcs storage_test.cpp) set(test_libs storage node) set(test_deps rocksdb) set(test_link pbft pbft_operations proto ${Protobuf_LIBRARIES} ${ROCKSDB_LIBRARIES}) add_gmock_test(storage) ================================================ FILE: storage/test/storage_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include using namespace ::testing; namespace { const bzn::uuid_t NODE_UUID = "d1e04722-41f0-4c43-a6c0-86a9e62a88e3"; const bzn::uuid_t USER_UUID = "4bba2aeb-44fe-441e-bb6b-8817561eb716"; const std::string KEY = "bluzelle.json"; std::string value = "ewogICJsaXN0ZW5lcl9hZGRyZXNzIiA6ICIxMjcuMC4wLjEiLAogICJsaXN0ZW5lcl9wb3J0IiA6" "IDQ5MTUyLAogICJldGhlcmV1bSIgOiAiMHgwMDZlYWU3MjA3NzQ0OWNhY2E5MTA3OGVmNzg1NTJj" "MGNkOWJjZThmIgp9Cg=="; boost::random::mt19937 gen; std::string generate_test_string(int n = 100) { std::string test_data; test_data.resize(n); boost::random::uniform_int_distribution<> dist('a', 'z'); for (auto& c : test_data) { c = (char) dist(gen); } return test_data; } // factory functions... template std::shared_ptr create_storage(); template<> std::shared_ptr create_storage() { return std::make_shared(); } template<> std::shared_ptr create_storage() { return std::make_shared("./", "utest", NODE_UUID); } } template class storageTest : public Test { public: storageTest() { // just to be safe... if (system(std::string("rm -r -f " + NODE_UUID).c_str())) {} this->storage = create_storage(); } ~storageTest() { // For each run, the database has to be cleared out... this->storage.reset(); if (system(std::string("rm -r -f " + NODE_UUID).c_str())) {} } std::shared_ptr storage; }; using Implementations = Types; TYPED_TEST_CASE(storageTest, Implementations); TYPED_TEST(storageTest, test_that_storage_can_create_a_record_and_read_the_same_record) { EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, value)); const auto returned_record = this->storage->read(USER_UUID, KEY); EXPECT_EQ((*returned_record).size() + KEY.size(), this->storage->get_size(USER_UUID).second); EXPECT_EQ(size_t(1), this->storage->get_size(USER_UUID).first); // add another one... EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, "another_key", value)); EXPECT_EQ(value.size()*2 + KEY.size()+std::string("another_key").size(), this->storage->get_size(USER_UUID).second); EXPECT_EQ(size_t(2), this->storage->get_size(USER_UUID).first); EXPECT_EQ(*returned_record, value); // remove first key size_t size = this->storage->get_size(USER_UUID).second; this->storage->remove(USER_UUID, KEY); EXPECT_EQ(size-(KEY.size()+value.size()), this->storage->get_size(USER_UUID).second); } TYPED_TEST(storageTest, test_that_storage_can_retieve_a_key_size) { EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, value)); const auto key_size = this->storage->get_key_size(USER_UUID, KEY); EXPECT_EQ(key_size, KEY.size() + value.size()); } TYPED_TEST(storageTest, test_that_storage_fails_to_create_a_record_that_already_exists) { EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, value)); EXPECT_EQ(bzn::storage_result::exists, this->storage->create(USER_UUID, KEY, value)); } TYPED_TEST(storageTest, test_that_attempting_to_read_a_record_from_storage_that_does_not_exist_returns_null) { EXPECT_EQ(std::nullopt, this->storage->read(USER_UUID, "nokey")); } TYPED_TEST(storageTest, test_that_storage_can_update_an_existing_record) { const std::string updated_value = "I have changed the value of the text"; // try updating a record that does not exist EXPECT_EQ(bzn::storage_result::not_found, this->storage->update(USER_UUID, KEY, updated_value)); EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, value)); EXPECT_EQ(bzn::storage_result::ok, this->storage->update(USER_UUID, KEY, updated_value)); const auto returned_record = this->storage->read(USER_UUID, KEY); EXPECT_EQ(*returned_record, updated_value); } TYPED_TEST(storageTest, test_that_storage_can_delete_a_record) { EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, value)); const auto returned_record = this->storage->read(USER_UUID, KEY); EXPECT_EQ(*returned_record, value); EXPECT_EQ(bzn::storage_result::ok, this->storage->remove(USER_UUID, KEY)); EXPECT_EQ(this->storage->read(USER_UUID, KEY), std::nullopt); EXPECT_EQ(bzn::storage_result::not_found, this->storage->remove(USER_UUID, KEY)); } TYPED_TEST(storageTest, test_get_keys_returns_all_keys) { const bzn::uuid_t user_0{"b9dc2595-15ee-435a-8af7-7cafc132f527"}; const bzn::uuid_t user_1{"fa82925e-4657-11e8-842f-0ed5f89f718b"}; const bzn::uuid_t user_2{"f3f72dd5-efcb-4db9-b0a1-47f7891ffdef"}; std::vector user_keys; std::string key; for(int i=0; i<100; ++i) { key = "key"; key.append(std::to_string(i)); user_keys.emplace_back(key); this->storage->create(user_0, key, generate_test_string()); this->storage->create(user_1, key, generate_test_string()); this->storage->create(user_2, key, generate_test_string()); } std::vector user_0_keys = this->storage->get_keys(user_0); std::vector user_1_keys = this->storage->get_keys(user_1); std::vector user_2_keys = this->storage->get_keys(user_2); EXPECT_EQ(user_0_keys.size(), user_keys.size()); EXPECT_EQ(user_1_keys.size(), user_keys.size()); EXPECT_EQ(user_2_keys.size(), user_keys.size()); std::sort(user_keys.begin(), user_keys.end()); std::sort(user_0_keys.begin(), user_0_keys.end()); std::sort(user_1_keys.begin(), user_1_keys.end()); std::sort(user_2_keys.begin(), user_2_keys.end()); if (user_0_keys.size() >0) { EXPECT_TRUE(std::equal(user_keys.begin(), user_keys.end(), user_0_keys.begin() )); EXPECT_TRUE(std::equal(user_keys.begin(), user_keys.end(), user_1_keys.begin() )); EXPECT_TRUE(std::equal(user_keys.begin(), user_keys.end(), user_2_keys.begin() )); } } TYPED_TEST(storageTest, test_has_returns_true_if_key_exists_false_otherwise) { const bzn::uuid_t user_0{"b9dc2595-15ee-435a-8af7-7cafc132f527"}; const bzn::uuid_t user_1{"fa82925e-4657-11e8-842f-0ed5f89f718b"}; const bzn::uuid_t user_2{"f3f72dd5-efcb-4db9-b0a1-47f7891ffdef"}; std::vector user_keys; std::string key; for(int i=0; i<100; ++i) { key = "key"; key.append(std::to_string(i)); user_keys.emplace_back(key); this->storage->create(user_0, key, generate_test_string()); this->storage->create(user_1, key, generate_test_string()); this->storage->create(user_2, key, generate_test_string()); } EXPECT_TRUE(this->storage->has(user_0, "key0")); EXPECT_FALSE(this->storage->has(user_0, "notkey0")); EXPECT_TRUE(this->storage->has(user_1, "key1")); EXPECT_FALSE(this->storage->has(user_1, "notkey")); EXPECT_TRUE(this->storage->has(user_2, "key2")); EXPECT_FALSE(this->storage->has(user_2, "notkey")); } TYPED_TEST(storageTest, test_that_storage_fails_to_create_a_value_that_exceeds_the_size_limit) { std::string value{""}; value.resize(bzn::MAX_VALUE_SIZE+1, 'c'); EXPECT_EQ(bzn::storage_result::value_too_large, this->storage->create(USER_UUID, KEY, value)); EXPECT_EQ(std::nullopt, this->storage->read(USER_UUID, KEY)); } TYPED_TEST(storageTest, test_that_storage_fails_to_update_with_a_value_that_exceeds_the_size_limit) { std::string expected_value{"gooddata"}; EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, KEY, expected_value)); auto actual_record = this->storage->read(USER_UUID, KEY); EXPECT_EQ(expected_value, actual_record); std::string bad_value{""}; bad_value.resize(bzn::MAX_VALUE_SIZE+1, 'c'); EXPECT_EQ(bzn::storage_result::value_too_large, this->storage->update(USER_UUID, KEY, bad_value)); EXPECT_EQ(expected_value, *this->storage->read(USER_UUID, KEY)); } TYPED_TEST(storageTest, test_that_storage_can_remove_all_keys_values_associated_with_a_uuid) { EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, "key1", "")); EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, "key2", "")); EXPECT_EQ(bzn::storage_result::ok, this->storage->create(USER_UUID, "key3", "")); EXPECT_EQ(bzn::storage_result::ok, this->storage->remove(USER_UUID)); EXPECT_EQ(std::nullopt, this->storage->read(USER_UUID, KEY)); } TYPED_TEST(storageTest, test_snapshot) { const bzn::uuid_t user_0{"b9dc2595-15ee-435a-8af7-7cafc132f527"}; this->storage->create(user_0, "key1", "value1"); EXPECT_TRUE(this->storage->has(user_0, "key1")); EXPECT_TRUE(this->storage->create_snapshot()); this->storage->create(user_0, "key2", "value2"); this->storage->create(user_0, "key3", "value3"); EXPECT_TRUE(this->storage->has(user_0, "key2")); EXPECT_TRUE(this->storage->has(user_0, "key3")); auto state = this->storage->get_snapshot(); EXPECT_NE(state, nullptr); EXPECT_FALSE(this->storage->load_snapshot("aslkdfkslfdk")); EXPECT_TRUE(this->storage->load_snapshot(*state)); EXPECT_TRUE(this->storage->has(user_0, "key1")); EXPECT_FALSE(this->storage->has(user_0, "key2")); EXPECT_FALSE(this->storage->has(user_0, "key3")); } TYPED_TEST(storageTest, test_range_queries) { const bzn::uuid_t user_0{"b9dc2595-15ee-435a-8af7-7cafc132f527"}; this->storage->create(user_0, "aaa", "value"); this->storage->create(user_0, "aab", "value"); this->storage->create(user_0, "abb", "value"); this->storage->create(user_0, "abc", "value"); this->storage->create(user_0, "bbc", "value"); this->storage->create(user_0, "bcc", "value"); this->storage->create(user_0, "bcd", "value"); this->storage->create(user_0, "bdd", "value"); this->storage->create(user_0, "bde", "value"); EXPECT_EQ(this->storage->get_size(user_0).first, 9u); EXPECT_EQ(this->storage->get_keys_if(user_0, "a", "b").size(), 4u); EXPECT_EQ(this->storage->read_if(user_0, "b", "c").size(), 5u); EXPECT_EQ(this->storage->get_keys_if(user_0, "c", "d").size(), 0u); EXPECT_EQ(this->storage->read_if(user_0, "ab", "ac").size(), 2u); this->storage->remove_range(user_0, "a", "abb"); EXPECT_EQ(this->storage->get_size(user_0).first, 7u); this->storage->remove_range(user_0, "aa", "bdd"); EXPECT_EQ(this->storage->get_size(user_0).first, 2u); this->storage->remove_range(user_0, "be", "z"); EXPECT_EQ(this->storage->get_size(user_0).first, 2u); } TYPED_TEST(storageTest, test_predicate_queries) { const bzn::uuid_t user_0{"b9dc2595-15ee-435a-8af7-7cafc132f527"}; for (auto i : boost::irange(0, 100)) { // this line, for some unknown reason, causes the following build error: // in function `bzn::pbft_persistent_operation::is_committed() const': // undefined reference to `bzn::pbft::honest_majority_size(unsigned long)' //auto suffix = (boost::format("%04u") % i).str(); auto suffix = i < 10 ? std::string{"000"} + std::to_string(i) : std::string{"00"} + std::to_string(i); this->storage->create(user_0, "key_" + suffix, "value_" + suffix); } for (auto i : boost::irange(1, 10)) { size_t count{}; auto res = this->storage->read_if(user_0, "", "", [&](const std::string& /*key*/, const std::string& /*value*/) -> bool { return ++count % i == 0; }); EXPECT_EQ(res.size(), count / i); } for (auto i : boost::irange(1, 10)) { size_t count{}; auto res = this->storage->get_keys_if(user_0, "", "", [&](const std::string& /*key*/, const std::string& /*value*/) -> bool { return ++count % i == 0; }); EXPECT_EQ(res.size(), count / i); } } TYPED_TEST(storageTest, test_regex_match_queries) { const bzn::uuid_t user_0{"b9dc2595-15ee-435a-8af7-7cafc132f527"}; this->storage->create(user_0, "0001_somehash_1_0", "value"); this->storage->create(user_0, "0001_somehash_1_1", "value"); this->storage->create(user_0, "0001_somehash_1_2", "value"); this->storage->create(user_0, "0002_somehash_1_0", "value"); this->storage->create(user_0, "0002_somehash_1_1", "value"); this->storage->create(user_0, "0003_otherhash_1_0", "value"); this->storage->create(user_0, "0003_somehash_1_11", "value"); this->storage->create(user_0, "0003_somehash_1_2", "value"); this->storage->create(user_0, "0004_somehash_2_0", "value"); this->storage->create(user_0, "0005_otherhash_2_0", "value"); this->storage->create(user_0, "0005_another_hash_2_1", "value"); this->storage->create(user_0, "0005_somehash_2_2", "value"); this->storage->create(user_0, "0006_somehash_1_0", "value"); this->storage->create(user_0, "0006_somehash_1_1", "value"); this->storage->create(user_0, "0006_another_hash_1_2", "value"); EXPECT_EQ(this->storage->read_if(user_0, "", "").size(), 15u); EXPECT_EQ(this->storage->read_if(user_0, "0003", "0004").size(), 3u); EXPECT_EQ(this->storage->read_if(user_0, "0003", "").size(), 10u); EXPECT_EQ(this->storage->read_if(user_0, "0003", "0003").size(), 0u); EXPECT_EQ(this->storage->read_if(user_0, "0003", "0002").size(), 0u); std::regex exp1(".*_.*_1_.*"); auto match_key1 = [&](const std::string& key, const std::string& /*value*/)->bool { return std::regex_search(key, exp1, std::regex_constants::match_continuous); }; EXPECT_EQ(this->storage->read_if(user_0, "", "", match_key1).size(), 11u); EXPECT_EQ(this->storage->read_if(user_0, "0002", "", match_key1).size(), 8u); EXPECT_EQ(this->storage->read_if(user_0, "0002", "0006", match_key1).size(), 5u); std::regex exp2(".*_.*_.*_1$"); auto match_key2 = [&](const std::string& key, const std::string& /*value*/)->bool { return std::regex_search(key, exp2, std::regex_constants::match_continuous); }; EXPECT_EQ(this->storage->read_if(user_0, "", "", match_key2).size(), 4u); EXPECT_EQ(this->storage->read_if(user_0, "0002", "", match_key2).size(), 3u); EXPECT_EQ(this->storage->read_if(user_0, "0002", "0006", match_key2).size(), 2u); std::regex exp3(".*_.*_.*_[1-2]$"); auto match_key3 = [&](const std::string& key, const std::string& /*value*/)->bool { return std::regex_search(key, exp3, std::regex_constants::match_continuous); }; EXPECT_EQ(this->storage->read_if(user_0, "", "", match_key3).size(), 8u); EXPECT_EQ(this->storage->read_if(user_0, "0002", "", match_key3).size(), 6u); EXPECT_EQ(this->storage->read_if(user_0, "0002", "0006", match_key3).size(), 4u); } ================================================ FILE: swarm/CMakeLists.txt ================================================ add_executable(swarm main.cpp) add_dependencies(swarm boost jsoncpp rocksdb) target_include_directories(swarm PRIVATE ${BLUZELLE_STD_INCLUDES}) target_link_libraries(swarm node pbft audit crud chaos options utils peers_beacon storage crypto monitor proto ${Protobuf_LIBRARIES} status ${ROCKSDB_LIBRARIES} ${Boost_LIBRARIES} ${JSONCPP_LIBRARIES} pthread) ================================================ FILE: swarm/main.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __APPLE__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #endif #include #ifdef __APPLE__ #pragma GCC diagnostic pop #endif #include #include #include #include #include #include #include void init_logging(const bzn::options& options) { namespace keywords = boost::log::keywords; const auto format = boost::log::expressions::stream << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "[%Y-%m-%d %H:%M:%S.%f UTC]") << " [" << boost::log::expressions::attr< boost::log::attributes::current_thread_id::value_type >("ThreadID") << "] [" << std::setw(5) << std::left << boost::log::trivial::severity << "] " << boost::log::expressions::smessage; auto sink = boost::log::add_file_log ( keywords::file_name = options.get_logfile_dir() + "/bluzelle-%5N.log", keywords::rotation_size = options.get_logfile_rotation_size(), keywords::open_mode = std::ios_base::app, keywords::auto_flush = true, keywords::format = format ); boost::log::core::get()->add_global_attribute("TimeStamp", boost::log::attributes::utc_clock()); if (options.get_log_to_stdout()) { boost::log::add_console_log(std::cout, keywords::format = format, keywords::auto_flush = true); } boost::log::add_common_attributes(); sink->locked_backend()->set_file_collector(boost::log::sinks::file::make_collector ( keywords::target = options.get_logfile_dir(), keywords::max_size = options.get_logfile_max_size() )); sink->locked_backend()->scan_for_files(); boost::log::core::get()->add_sink(sink); if (options.get_debug_logging()) { LOG(info) << "debug logging enabled"; boost::log::core::get()->set_filter(boost::log::trivial::severity >= boost::log::trivial::debug); } else { LOG(info) << "debug logging disabled"; boost::log::core::get()->set_filter(boost::log::trivial::severity > boost::log::trivial::debug); } } boost::uintmax_t get_dir_size(const boost::filesystem::path& dir) { namespace fs = boost::filesystem; if (fs::is_directory(dir)) { boost::uintmax_t size{}; fs::directory_iterator dir_it(dir); for (dir_it = fs::begin(dir_it); dir_it != fs::end(dir_it); ++dir_it) { const fs::directory_entry& dir_entry = *dir_it; if (fs::is_regular_file(dir_entry.path())) { size += fs::file_size(dir_entry.path()); } else { if (fs::is_directory(dir_entry.path())) { size += get_dir_size(dir_entry.path()); } } } return size; } return 0; } void print_banner(const bzn::options& options) { std::stringstream ss; ss << '\n'; ss << " Swarm ID: " << options.get_swarm_id() << "\n" << " Running node with ID: " << options.get_uuid() << "\n" << " Local IP Address: " << options.get_listener().address().to_string() << "\n" << " On port: " << options.get_listener().port() << "\n" << " Maximum Swarm Storage: " << options.get_max_swarm_storage() << " Bytes" << "\n" << " Stack: " << options.get_stack() << "\n" << '\n'; LOG(info) << ss.str(); if (!options.get_log_to_stdout()) { std::cout << ss.str(); } } void start_worker_threads_and_wait(std::shared_ptr io_context, std::shared_ptr options) { std::vector workers; size_t thread_count; if (options->get_simple_options().has(bzn::option_names::OVERRIDE_NUM_THREADS)) { thread_count = options->get_simple_options().get(bzn::option_names::OVERRIDE_NUM_THREADS); } else { thread_count = std::thread::hardware_concurrency(); } LOG(info) << "starting " << thread_count << " worker threads"; for (size_t i = 0; i < thread_count; ++i) { workers.emplace_back(std::thread([io_context] { io_context->run(); })); } // wait for shutdown... for (auto& t : workers) { t.join(); } } int main(int argc, const char* argv[]) { try { auto options = std::make_shared(); if (!options->parse_command_line(argc, argv)) { return 1; } init_logging(*options); auto io_context = std::make_shared(); auto utils = std::make_shared(); auto peers = std::make_shared(io_context, utils, options); peers->start(); // setup signal handler... boost::asio::signal_set signals(io_context->get_io_context(), SIGINT, SIGTERM); signals.async_wait([io_context](const boost::system::error_code& error, int signal_number) { if (!error) { LOG(info) << "signal received -- shutting down (" << signal_number << ")"; io_context->stop(); } }); // startup... auto monitor = std::make_shared(options, io_context, std::make_shared()); auto crypto = std::make_shared(options, monitor); auto chaos = std::make_shared(io_context, options); auto websocket = std::make_shared(); auto node = std::make_shared(io_context, websocket, chaos, boost::asio::ip::tcp::endpoint{options->get_listener()}, crypto, options, monitor); auto audit = std::make_shared(io_context, node, options->get_audit_mem_size(), monitor); // which type of storage? std::shared_ptr stable_storage; std::shared_ptr unstable_storage; if (options->get_mem_storage()) { LOG(info) << "Using in-memory testing storage"; stable_storage = std::make_shared(); unstable_storage = std::make_shared(); } else { LOG(info) << "Using RocksDB storage"; stable_storage = std::make_shared(options->get_state_dir(), "db", options->get_uuid()); unstable_storage = std::make_shared(options->get_state_dir(), "pbft", options->get_uuid()); } auto crud = std::make_shared(io_context, stable_storage, std::make_shared(io_context), node, options->get_owner_public_key()); auto operation_manager = std::make_shared(peers, unstable_storage); auto pbft = std::make_shared(node, io_context, peers, options, std::make_shared(io_context, unstable_storage, crud, monitor, options->get_uuid()) , crypto, operation_manager, unstable_storage, monitor); pbft->set_audit_enabled(options->get_simple_options().get(bzn::option_names::AUDIT_ENABLED)); auto status = std::make_shared(node, bzn::status::status_provider_list_t{pbft,crud}, options->get_swarm_id()); node->start(pbft); chaos->start(); crud->start(pbft, options->get_max_swarm_storage()); pbft->start(); status->start(); chaos->start(); if (options->get_simple_options().get(bzn::option_names::AUDIT_ENABLED)) { audit->start(); } print_banner(*options); start_worker_threads_and_wait(io_context, options); } catch(std::exception& ex) { LOG(fatal) << ex.what(); std::cerr << '\n' << ex.what() << '\n'; return 1; } return 0; } ================================================ FILE: utils/CMakeLists.txt ================================================ add_library(utils STATIC blacklist.cpp blacklist.hpp make_endpoint.hpp make_endpoint.cpp bytes_to_debug_string.cpp bytes_to_debug_string.hpp crypto.cpp crypto.hpp utils_interface_base.hpp utils_interface.hpp esr_peer_info.cpp http_req.cpp test/make_endpoint_test.cpp) target_link_libraries(utils ${JSONCPP_LIBRARIES} ${OPENSSL_LIBRARIES}) add_dependencies(utils boost jsoncpp openssl) target_include_directories(utils PRIVATE ${BLUZELLE_STD_INCLUDES}) add_subdirectory(test) ================================================ FILE: utils/blacklist.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include namespace { const std::string ROPSTEN_REQUEST_DATA{R"({"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x58261EEc3fCD83DACB5E0532277c27f1cA58270E","data": "0x3a4e44a0%s" },"latest"],"id":1})"}; const std::string ERR_INVALID_RESPONSE{"Invalid response from Bluzelle blacklist server: "}; bzn::uuid_t clean_uuid(const bzn::uuid_t& uuid) { bzn::uuid_t cleaned_uuid; std::copy_if(uuid.begin(), uuid.end(), std::back_inserter(cleaned_uuid), [](auto c) { return c != '-'; }); return cleaned_uuid; } } namespace bzn::utils::blacklist { bool is_blacklisted(const bzn::uuid_t& raw_uuid, const std::string& url) { // We get the uuid in the following format: "9dc2f619-2e77-49f7-9b20-5b55fd87ea44", the contract expects a // string of 32 hex values, so let's at least remove the dashes. const std::string post_fields{boost::str(boost::format(ROPSTEN_REQUEST_DATA) % clean_uuid(raw_uuid))}; bzn::json_message response; Json::CharReaderBuilder rbuilder; std::unique_ptr const reader(rbuilder.newCharReader()); std::string parse_errors; bzn::utils_interface utils_object; auto res = utils_object.sync_req(url, post_fields); if (!reader->parse(res.c_str(), res.c_str() + res.size(), &response, &parse_errors)) { LOG(error) << "Unable to parse response from Ropsten - could not validate peer (" << parse_errors << ")"; return false; } try { // The result must be "0x0000000000000000000000000000000000000000000000000000000000000000" or // "0x0000000000000000000000000000000000000000000000000000000000000001" we will only accept a value of 1 as // true. return (std::stoul(response["result"].asString().c_str(), nullptr, 16) == 1); } catch(std::exception& ex) { LOG(error) << ERR_INVALID_RESPONSE << ex.what(); } return false; } } ================================================ FILE: utils/blacklist.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn::utils::blacklist { bool is_blacklisted(const bzn::uuid_t& uuid, const std::string& url = bzn::utils::ROPSTEN_URL); } ================================================ FILE: utils/bytes_to_debug_string.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include std::string bzn::bytes_to_debug_string(const std::string& input, bool preserve_full) { std::stringstream ss; ss << std::hex; for(const char& c : input) { // This is not a remotely rigorous way to do this, but as long as the goal is just to make // hashes distinguishable in logs it will suffice. ss << std::hex << (0x00ff & static_cast(c)); } auto result = ss.str(); if (result.size() > MAX_SHORT_MESSAGE_SIZE && !preserve_full) { result.erase(MAX_SHORT_MESSAGE_SIZE/2, result.size() - MAX_SHORT_MESSAGE_SIZE); result.insert(MAX_SHORT_MESSAGE_SIZE/2, "..."); } return result; } ================================================ FILE: utils/bytes_to_debug_string.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn { std::string bytes_to_debug_string(const std::string& input, bool preserve_full = false); } ================================================ FILE: utils/crypto.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . /** * The uuid/public key/signature validation code for this module was taken * with modification from * * https://eclipsesource.com/blogs/2016/09/07/tutorial-code-signing-and-verification-with-openssl/ * * This module duplicates the following functionality that can be performed * on the command line: convert base64 encoded signature to binary * * openssl base64 -d -in signature.txt -out /tmp/sign.sha256 * verify the uuid * openssl dgst -sha256 -verify public.pem -signature /tmp/sign.sha256 uuid.txt */ #include #include "crypto.hpp" #include #include #include #include #include #include #include #include #include namespace { const std::string ROPSTEN_URL {"https://ropsten.infura.io"}; const std::string MSG_ERROR_CURL {"curl_easy_perform() failed: "}; /** * This function is used by base_64_decode to determine the amount of memory required * for the binary buffer represented by the base64 encoded string. * * @param base_64_input base64 encoded string * @return a size_t containing the number of bytes expected in the decoded string. */ size_t calculate_decode_length(const std::string& base_64_input) { if (base_64_input.empty()) { return 0; } const size_t len{base_64_input.size()}; const size_t padding = (base_64_input[len - 1] == '=' && base_64_input[len - 2] == '=') ? 2 : 1; return (len * 3) / 4 - padding; } void compose_and_log_OpenSSL_error(const std::string& failing_function_name) { char buffer[126]{0}; ERR_error_string_n(ERR_get_error(), buffer, sizeof(buffer)); LOG(error) << "While verifiying a node uuid " << failing_function_name << " failed with error " << buffer; } /** * Given the public key string in PEM format, this function will return the * RSA public key structure that OpenSSL functions use. * * @param key a const std::string reference containing the public key in PEM format * @return a pointer to the RSA structure contqining the public key */ RSA* create_public_RSA(const std::string& key) { std::unique_ptr> keybio(BIO_new_mem_buf((void*)(key.c_str()), -1), BIO_free); if (!keybio) { return 0; } // Note that calling RSA_free on rsa will cause a segfault at it is not allocated in the PEM function. So I am // not going to create a unique_ptr in this case. RSA* rsa{nullptr}; PEM_read_bio_RSA_PUBKEY(keybio.get(), &rsa, nullptr, nullptr); return rsa; } /** * Given the RSA structure containing the Bluzelle public key, the * signature of the node's uuid, and the node's uuid, this method verifies * that the signature is valid. * * @param rsa a pointer to the public key structure * @param signature a const vector reference to the signature associated with the uuid * @param uuid a const string reference to the nodes' uuid * @param is_authentic an reference to a bool that will be set to true if the signature is valid, false otherwise. * @return a bool that returns true if the validation process was successful. */ bool RSA_verify_signature(const RSA* rsa, const std::vector& signature, const std::string& uuid, bool& is_authentic) { std::unique_ptr> public_key{EVP_PKEY_new(), EVP_PKEY_free}; std::unique_ptr> RSA_verification_context{EVP_MD_CTX_new(), EVP_MD_CTX_free}; // I could find no guidance in the OpenSSL documentation that suggests that the EVP_MD // pointer needs to be released after use, though in the same page the documentation // points out that EVP_MD_CTX pointers *do* need to be released. For now I will leave // the following as a raw pointer. const EVP_MD* sha256_message_digest = EVP_sha256(); is_authentic = false; EVP_PKEY_assign_RSA(public_key.get(), rsa); EVP_DigestInit_ex( RSA_verification_context.get(), sha256_message_digest, nullptr); if (1 != EVP_DigestVerifyInit(RSA_verification_context.get(), nullptr, sha256_message_digest, nullptr, public_key.get())) { compose_and_log_OpenSSL_error("EVP_DigestVerifyInit"); return false; } if (1 != EVP_DigestVerifyUpdate(RSA_verification_context.get(), uuid.c_str(), uuid.size())) { compose_and_log_OpenSSL_error("EVP_DigestVerifyUpdate"); return false; } // The const cast is for the unix gcc c++ compiler const int auth_status = EVP_DigestVerifyFinal(RSA_verification_context.get(), const_cast(signature.data()), signature.size()); // There are a couple of options here, the signature was successfully // validated or invalidated, or something went wrong during the // validation process. if ( auth_status==0 || auth_status==1) { is_authentic = (auth_status==1); return true; } else { compose_and_log_OpenSSL_error("EVP_DigestVerifyUpdate"); return false; } } } namespace bzn::utils::crypto { int base64_decode(const std::string& base64_message, std::vector& decoded_message) { if (base64_message.empty()) { LOG(error) << "Input string to base64_decode must not be empty"; return 1; } const size_t decoded_length = calculate_decode_length(base64_message); decoded_message.resize(decoded_length); // I have chosen to *not* use unique pointers for bio and b64 here, as the memory handling // is completely self contained within this function. // new_mem_buf requires a non const void*, I needed to copy the const base64_message into a // non const string so that gcc C++ wouldn't complain. The alternative, using const_cast // didn't seem right as I am not completely sure that new_mem_buf doesn't modify the input, // it probably doesn't. std::string nonconst{base64_message}; BIO* bio = BIO_new_mem_buf(nonconst.data(), -1); BIO* b64 = BIO_new(BIO_f_base64()); bio = BIO_push(b64, bio); BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); //Do not use newlines to flush buffer const int length = BIO_read(bio, decoded_message.data(), static_cast(base64_message.size())); // free all is used here as b64 was pushed onto bio making it a BIO chain. BIO_free_all(bio); if (static_cast(length) != decoded_length) //length should equal decoded_length, else something went horribly wrong { LOG(error) << "base64_decode failed to decode a base64 encoded string"; return (1); // failure } return (0); //success } bool verify_signature(const std::string& public_key, const std::string& signature, const std::string& uuid) { if (public_key.empty() || signature.empty() || uuid.empty()) { LOG(error) << "Unable to verify the signature as one or more of the public key, signature or uuid strings were empty"; return false; } auto public_rsa = create_public_RSA(public_key); if (nullptr==public_rsa) { LOG(error) << "Unable to create RSA from public key while validating the node."; return false; } std::vector binary_signature; base64_decode(signature, binary_signature); bool authentic{false}; bool ret_val = RSA_verify_signature( public_rsa, binary_signature, uuid, authentic); return ret_val & authentic; } std::string read_pem_file(const std::string& filename, const std::string& expected_type) { char* name; char* headers; unsigned char* data; long len; ::FILE* fp = fopen(filename.c_str(), "r"); if (!fp) { throw std::runtime_error("Failed to read pem file: " + filename); } PEM_read(fp, &name, &headers, &data, &len); ::fclose(fp); if (std::string(name) != expected_type) { throw std::runtime_error("Expected to find a " + expected_type + " in " + filename + ", but found a " + std::string(name)); } std::string result(reinterpret_cast(data), len); OPENSSL_free(name); OPENSSL_free(data); OPENSSL_free(headers); return result; } } ================================================ FILE: utils/crypto.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn::utils::crypto { /** * base64_decode is used by verify_signature to decode the "human readable" * signature text into it's original binary format. We could not use the * base64 decoder in boost::beast::core::detail as those functions take stl * strings as input and output, so binary output with embedded '\0' are not * handled correctly. * * @param base64_message pointer to a character buffer containing the base64 encoded string * @param in/out vector of unsigned chars that will contain the decoded data * @return integer value of 0 on success */ int base64_decode(const std::string& base64_message, std::vector& decoded_message); /** * verify_signature is a C++ wrapper for the C style OpenSSL signature * verification code. It provides an interface that uses STL strings * instead of raw pointers to buffers. * * @param public_key the PEM formatted public key provided by the Bluzelle rep * @param signature the base 64 encocoded signature file created from the node uuid and the Bluzelle private key * @param uuid the uuid of the node that is to be added to the swarm * @return true if the signature is valid, false otherwise. * @throws runtime_error if the public key is invalid, the signature could not be decoded or the validation * failed before finishing due to some error. */ bool verify_signature(const std::string& public_key, const std::string& signature, const std::string& uuid); /** * Read the contents of a .pem file, returning the payload as a base64 string. * Any headers are ignored. * * @param filename path of pem file to read * @param expected_type what the file is supposed to contain, such as "PRIVATE KEY". * @throws runtime_error if the file does not indicate that it contains expected_type */ std::string read_pem_file(const std::string& filename, const std::string& expected_type); } ================================================ FILE: utils/esr_peer_info.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include namespace { const std::string ERR_UNABLE_TO_PARSE_JSON_RESPONSE{"Unable to parse JSON response: "}; const size_t ESR_RESPONSE_LINE_LENGTH{64}; const size_t REQUIRED_SIZE_MULTIPLE{64}; const off_t PARAMETER_OFFSET{64}; const std::string GET_PEERS_ADDRESS{"46e76d8b"}; // TODO: refactor to put the 0x back const std::string GET_PEER_INFO_SIGNATURE{"0xcc8575cb"}; void trim_right_nulls(std::string& s) { boost::algorithm::trim_right_if(s, [](auto &c){return c=='\0';}); } bzn::json_message str_to_json(const std::string &json_str) { bzn::json_message json_msg; std::unique_ptr reader{ Json::CharReaderBuilder().newCharReader() }; std::string errors; if(!reader->parse( json_str.c_str() , json_str.c_str() + json_str.size() , &json_msg , &errors)) { throw (std::runtime_error(ERR_UNABLE_TO_PARSE_JSON_RESPONSE + errors)); } return json_msg; } bzn::json_message make_params(const std::string& to_hex, const std::string& data_hex) { bzn::json_message params; bzn::json_message param; param["to"] = (to_hex.substr(0,2) == "0x" ? "" : "0x") + to_hex; param["data"] = data_hex; params.append(param); params.append("latest"); return params; } std::string make_request(const std::string& to_hex, const std::string& data_hex) { bzn::json_message request; request["jsonrpc"] = "2.0"; request["method"] = "eth_call"; request["params"] = make_params(to_hex, data_hex); request["id"] = 1; Json::StreamWriterBuilder wbuilder; wbuilder["indentation"] = ""; return Json::writeString(wbuilder, request); } std::string hex_to_char_string(const std::string &hex) { std::stringstream strm; boost::algorithm::unhex(hex, std::ostream_iterator{strm, ""}); return strm.str(); } // TODO: replace this with a function that uses the ABI to parse the response std::vector parse_get_peers_result_to_vector(const std::string_view &result) { std::vector results; std::vector lines; size_t node_count{0}; enum states {HEADER, HEADER_SWARM_SIZE, HEADER_INFO, PEER_ID_SIZE, PEER_ID } state{HEADER}; // NOTE: I needed to add the extra null character to "line" so that any 64 length buffer read from the result // will be correctly null terminated for the boost::algorithm::unhex function char line[ESR_RESPONSE_LINE_LENGTH + 1]{0}; size_t index{0}; std::string peer_id; std::istringstream stm(result.begin()); size_t peer_id_length{0}; while (stm.read(line, ESR_RESPONSE_LINE_LENGTH)) { switch (state) { case HEADER: { state = HEADER_SWARM_SIZE; } break; case HEADER_SWARM_SIZE: { state = HEADER_INFO; node_count = std::strtoul(line, nullptr, 16); if (node_count == 0) { LOG(error) << "Requested swarm may not exist or has no nodes"; return results; } } break; case HEADER_INFO: { state = (index == node_count + 1 ? PEER_ID_SIZE : state) ; } break; case PEER_ID_SIZE: { // the first line of data is the size of the string peer_id_length = std::strtoul(line, nullptr, 16); if (peer_id_length) { state = PEER_ID; } else { --node_count; state = PEER_ID_SIZE; } } break; case PEER_ID: { peer_id.append(hex_to_char_string(std::string{line})); if (peer_id.size() >= peer_id_length) { trim_right_nulls(peer_id); results.emplace_back(peer_id); peer_id = ""; state = PEER_ID_SIZE; } } break; default: { LOG(warning) << "Failed to correctly parse peer peers from esr"; return results; } break; } ++index; } // TODO: rhn - reconsider if we need to keep node_count and this check. if (results.size() != node_count) { LOG(warning) << "Actual size of the peers list [" << results.size() << "] does not agree with the expected size [" << node_count << "]"; } return results; } // TODO: replace this with a function that uses the ABI to parse the response bzn::peer_address_t parse_get_peer_info_result_to_peer_address(const std::string &peer_id, const std::string_view &result) { size_t text_size{0}; uint16_t port{0}; std::string host; std::string name; enum {NODE_COUNT, NA_0, NA_1, NODE_PORT, NODE_HOST_SIZE, NODE_HOST, NODE_NAME_SIZE, NODE_NAME, FINISHED} state {NODE_COUNT}; // NOTE: I needed to add the extra null character to "line" so that any 64 length buffer read from the result // will be correctly null terminated for the boost::algorithm::unhex function char line[ESR_RESPONSE_LINE_LENGTH + 1]{0}; std::istringstream stream{result.begin()}; while(stream.read(line, ESR_RESPONSE_LINE_LENGTH)) { // TODO: replace this switch/case with the strategy pattern - Rich switch (state) { case NODE_COUNT: { state = NA_0; } break; case NA_0: { state = NA_1; } break; case NA_1: { state = NODE_PORT; } break; case NODE_PORT: { port = std::strtoul(line, nullptr, 16); if (!port) { LOG(warning) << "Invalid value for port:[" << port << "], node may not exist"; } state = NODE_HOST_SIZE; } break; case NODE_HOST_SIZE: { text_size = std::strtoul(line, nullptr, 16); if (!text_size) { LOG(warning) << "Invalid value for host string length:[" << text_size << "]"; } state = NODE_HOST; } break; case NODE_HOST: { host = hex_to_char_string(line); trim_right_nulls(host); if (text_size != host.size()) { LOG(warning) << "Parsed host string size does not match expected size"; } state = NODE_NAME_SIZE; } break; case NODE_NAME_SIZE: { text_size = std::strtoul(line, nullptr, 16); if (!text_size) { LOG(warning) << "Invalid value for node name string length:[" << text_size << "]"; } state = NODE_NAME; name.clear(); } break; case NODE_NAME: { name.append(hex_to_char_string(line)); trim_right_nulls(name); if (text_size == name.size()) { state = FINISHED; } } break; case FINISHED: { LOG(warning) << "Peer Info result contains too many lines"; } break; default: { LOG(error) << "Failed to correctly parse peer info from esr"; return bzn::peer_address_t(host, port, name, peer_id); } break; } } return bzn::peer_address_t(host, port, name, peer_id); } std::string pad_str_to_mod_64(std::string parameter) { const size_t REMAINDER{parameter.size() % REQUIRED_SIZE_MULTIPLE}; if (REMAINDER) { const size_t padding_required = REQUIRED_SIZE_MULTIPLE - REMAINDER; parameter.insert(parameter.size(), padding_required, '0'); } return parameter; } std::string size_type_to_hex(size_t i, size_t width = 8) { std::stringbuf buf; std::ostream os(&buf); os << std::setfill('0') << std::setw(width) << std::hex << (int)i; return buf.str().c_str(); } std::string string_to_hex(const std::string& value) { std::stringstream hexstream; boost::algorithm::hex(value, std::ostream_iterator{hexstream, ""}); return hexstream.str(); } // TODO: replace this with a function that uses the ABI to create the request data const std::string data_string_for_get_peers(const std::string &swarm_id) { return std::string{"0x" + pad_str_to_mod_64(GET_PEERS_ADDRESS) + pad_str_to_mod_64("00000020") // input parameter type? (no) + size_type_to_hex(swarm_id.size()) // size of the swarm id (pre hexification) + pad_str_to_mod_64(string_to_hex(swarm_id))// hexified swarm id }; } } // TODO: replace this with a function that uses the ABI to create the request data // data_string_for_get_peer_info has been moved out of the anonymous namespace to make it possible to // unit test directly. namespace bzn::utils::esr { const std::string data_string_for_get_peer_info(const std::string& swarm_id, const std::string& peer_id) { const std::string SWARM_ID_PARAMETER { size_type_to_hex(swarm_id.size(), 64) // size of variable parameter + pad_str_to_mod_64(string_to_hex(swarm_id)) // swarm id parameter }; const std::string PEER_ID_PARAMETER { size_type_to_hex(peer_id.size(), 64) + pad_str_to_mod_64(string_to_hex(peer_id)) }; const std::string PREAMBLE { GET_PEER_INFO_SIGNATURE + size_type_to_hex( PARAMETER_OFFSET, 64) + size_type_to_hex( PARAMETER_OFFSET + SWARM_ID_PARAMETER.size() / 2, 64) }; return std::string{ PREAMBLE + SWARM_ID_PARAMETER + PEER_ID_PARAMETER }; } } using namespace bzn; std::vector utils_interface::get_peer_ids(const bzn::uuid_t& swarm_id, const std::string& esr_address, const std::string& url) const { const auto DATA{data_string_for_get_peers(swarm_id)}; const auto REQUEST{make_request( esr_address, DATA)}; const auto response{this->sync_req(url, REQUEST)}; const auto json_response{str_to_json(response)}; const auto result{json_response["result"].asCString() + 2}; // + 2 skips the '0x' return parse_get_peers_result_to_vector(result); } bzn::peer_address_t utils_interface::get_peer_info(const bzn::uuid_t& swarm_id, const std::string& peer_id, const std::string& esr_address, const std::string& url) const { const auto DATA{utils::esr::data_string_for_get_peer_info(swarm_id, peer_id)}; const auto REQUEST{make_request( esr_address, DATA)}; const auto response{this->sync_req(url, REQUEST)}; const auto json_response{str_to_json(response)}; const auto result{json_response["result"].asCString() + 2}; return parse_get_peer_info_result_to_peer_address(peer_id, result); } ================================================ FILE: utils/http_req.cpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { const std::regex URL_REGEX("(http|https)://([^/ :]+):?([^/ ]*)(/.*)?"); const std::string CERT_DIRS[] = { "/system/etc/security/cacerts", // Android "/usr/local/share/certs", // FreeBSD "/etc/pki/tls/certs", // Fedora/RHEL "/etc/ssl/certs", // Ubuntu "/etc/openssl/certs", // NetBSD "/var/ssl/certs", // AIX }; } namespace bzn { // Performs an HTTP GET or POST and returns the body of the HTTP response... std::string utils_interface::sync_req(const std::string& url, const std::string& post) const { using tcp = boost::asio::ip::tcp; namespace ssl = boost::asio::ssl; namespace http = boost::beast::http; boost::asio::io_context ioc; tcp::resolver resolver{ioc}; std::smatch what; if (!std::regex_match(url, what, URL_REGEX)) { LOG(error) << "could not parse url " << url; throw std::runtime_error("could not parse url " + url); } const std::string protocol{what[1]}; const std::string host{what[2]}; const std::string path{what[4]}; std::string port{what[3]}; // secure connection? const bool secure = (protocol == "https"); // if no port is specified then default to 80 or 443... if (port.empty()) { port = protocol; } auto const endpoint_iterator = resolver.resolve(host, port); LOG(info) << "Connecting to: " << host << "..."; ssl::context ctx(boost::asio::ssl::context::sslv23_client); ssl::stream ssl_stream(ioc, ctx); tcp::socket socket{ioc}; http::request req{http::verb::get, (!path.empty()) ? path : "/", 11}; req.set(http::field::host, host); req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING); // post or get? if (!post.empty()) { req.method(http::verb::post); req.body() = post; req.prepare_payload(); } if (secure) { // set default paths for finding CA certificates... ctx.set_default_verify_paths(); // other possible locations... for(const auto& cert_path : CERT_DIRS) { ctx.add_verify_path(cert_path); } // Set SNI Hostname (many hosts need this to handshake successfully) if (!SSL_set_tlsext_host_name(ssl_stream.native_handle(), host.c_str())) { boost::beast::error_code ec{static_cast(::ERR_get_error()), boost::beast::net::error::get_ssl_category()}; throw boost::beast::system_error{ec}; } boost::asio::connect(ssl_stream.next_layer(), endpoint_iterator); ssl_stream.set_verify_mode(ssl::verify_peer); ssl_stream.set_verify_callback(ssl::rfc2818_verification(host)); ssl_stream.handshake(ssl::stream_base::client); http::write(ssl_stream, req); } else { boost::asio::connect(socket, endpoint_iterator); http::write(socket, req); } boost::beast::flat_buffer buffer; http::response res; if (secure) { http::read(ssl_stream, buffer, res); boost::system::error_code ec; ssl_stream.shutdown(ec); } else { http::read(socket, buffer, res); socket.shutdown(tcp::socket::shutdown_both); } return res.body(); } } // namespace bzn::utils::http ================================================ FILE: utils/make_endpoint.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include std::optional bzn::make_endpoint(const std::string& host, const std::string& port) { using namespace boost::asio; io_context ioc; ip::tcp::resolver resolver{ioc}; try { ip::tcp::resolver::query query(ip::tcp::v4(), host, port); auto endpoint_iterator = resolver.resolve(query); if (!endpoint_iterator.empty()) { return *endpoint_iterator; } } catch(std::exception& ex) { LOG(error) << ex.what(); } LOG(error) << "Could not resolve: " << host; return std::nullopt; } std::optional bzn::make_endpoint(const bzn::peer_address_t& peer) { return bzn::make_endpoint(peer.host, std::to_string(peer.port)); } ================================================ FILE: utils/make_endpoint.hpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include namespace bzn { std::optional make_endpoint(const bzn::peer_address_t& peer); std::optional make_endpoint(const std::string& host, const std::string& port); } ================================================ FILE: utils/test/CMakeLists.txt ================================================ set(test_srcs utils_test.cpp make_endpoint_test.cpp) set(test_libs utils) set(test_deps proto) add_gmock_test(utils) ================================================ FILE: utils/test/make_endpoint_test.cpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include using namespace::testing; TEST(make_endpoint, test_test_valid_host_name_returns_correct_address) { bzn::peer_address_t peer{"localhost", 80, "name", "uuid"}; auto ep = bzn::make_endpoint(peer); ASSERT_TRUE(ep.has_value()); EXPECT_EQ((*ep).address().to_string(), "127.0.0.1"); } TEST(make_endpoint, test_test_invalid_host_name_returns_nothing) { bzn::peer_address_t peer{"localhost-asdf", 80, "name", "uuid"}; auto ep = bzn::make_endpoint(peer); ASSERT_FALSE(ep.has_value()); } TEST(make_endpoint, test_test_dotted_v4_address_returns_address) { bzn::peer_address_t peer{"192.168.0.1", 80, "name", "uuid"}; auto ep = bzn::make_endpoint(peer); ASSERT_TRUE(ep.has_value()); EXPECT_EQ((*ep).address().to_string(), "192.168.0.1"); } ================================================ FILE: utils/test/utils_test.cpp ================================================ // Copyright (C) 2018 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include #include #include #include #include #include #include using namespace::testing; namespace { const char* BLACKLISTED_UUID {"12345678-0900-0000-0000-000000000000"}; const char* NOT_BLACKLISTED_UUID{"e81ca538-a222-4add-8cb8-065c8b65a391"}; // NOTE - not constant as the test shuffles the list before use to get five // random uuids. std::vector blacklisted_uuids { "9dc2f619-2e77-49f7-9b20-5b55fd87ea44", "51bfd541-ab3e-4f02-93c7-8c3328daccfa", "f06ab617-7ccc-45fe-aee2-d4f5d175891b", "507b8661-167c-433c-bc68-0f4b117c5307", "7a80b4c1-2d99-471a-a1c3-9978759a00e3", "f9739b52-c0c6-4b4e-8132-1f96f896f7a6", "acf863ae-9c65-4749-8d4f-f9067966ef7a", "694cad9f-a08b-45a8-ac40-1ef71672b570", "f51d4e1e-f84d-47a9-9b29-645ecef856b2", "0957e369-d794-4b51-abaf-669e50e13e4f", "51da6250-5d12-4eea-ae2f-2968039f3445", "8eee8cff-1bfe-4714-a418-780cc369bd83", "af0a1a67-07a1-45ea-a529-48f5a26bd3ef", "ddaa5bea-3380-482b-96b8-cb7e2cbdb805", "931731eb-288d-4643-8e11-a7e999169bce", "54723428-2f0a-48c5-9b8c-d79df82e4434", "adc563fa-4de2-4044-b270-829289c18ba9", "112d5c33-5c53-4b59-a177-dfc4ada7be20", "e44a220b-f005-4d84-87c4-cd799f29df20", "c5e09ed0-d520-4b70-8b6e-94aca1ca8eef", "d70749b6-8032-4d96-9c9c-98a288c9963f", "8681fe91-f5a1-41b3-bc86-c3ee9fd8cbd0", "9db3cc1f-d778-4535-afec-342566b51291", "22d60214-8dc8-4e98-ab71-096651694a71", "86695947-ae33-4838-99a1-8e46ec7b58f2", "ab0bf354-114c-437b-add7-c43c784f05e1", "752c39f4-6c60-435f-a64e-37c953f713d3", "3694f8a2-d1cc-46fe-86a6-471e5bebbda8", "4b00901b-959b-4716-ba10-0bd4ec9370d4", "90df5baa-c7eb-45f7-aaf7-7b8f5cdd43a0", "ab7a83fc-970a-4bf5-a10d-f50b91caece6", "78b6055c-db92-4730-89cf-dc3be293fe24", "6ea74f15-167e-4636-a40b-17c7e80ae16c", "2b710417-7229-4003-820d-512a71858b4a", "059b9c82-a85e-4fe7-804c-a273359c6d2e", "5c7181b5-2223-447c-a5c1-1b353b06f347", "d5d8ca77-965d-4e45-b86a-d6bcd17fe5ca", "064d6286-04b7-42a8-8390-caa3dfa8f5f1", "d442c865-a3c2-44a3-8327-654f3c957ef3", "94a5a516-4164-4a20-b539-67b5307122d5", "0d1866ca-d098-4f5a-8b57-2f39a71ee6ff", "5d14a2c9-7ea8-4110-9cda-d274b2029447", "ffd88060-0188-4520-a2b9-b2fdc964ad2c", "f2956275-49db-438b-a1ba-b59e834b5ded", "afd1420e-ea14-453d-bef3-3c8aa1538668", "8fbf7f02-7eb5-4af6-bcd8-fee9c80d0674", "d2d87576-e1e8-4075-ab7e-c4524184ccbf", "61013162-b24e-4d81-a94e-1f7a04541682", "8cca1307-47b7-4187-966d-b69f37adca3d", "621384ff-b3a3-47ec-b678-12e67f7996b4", "1b7ec08b-293f-4d6e-ba6d-53c4e591e50c", "e4884015-ce37-4500-9979-ccee97a074dc", "e0f82155-5b3e-4b7a-bbbd-c7a99464cdd7", "fea17fe7-f476-4745-adcf-5a0c30a8647f", "22ead2c4-2515-4dd3-84a8-dec18470b865", "13b2a577-974e-4c3a-be99-9944726a8394", "079221c5-3f39-4600-abe6-eef2451bc3f7", "f310f466-5a41-448a-8c24-34a483fac06e", "8571dea6-e3ad-487f-8fd9-14e458b3d573", "ae272542-438e-470a-a27e-5042c64f63f3", "fca4fbba-b303-4fcc-bbe6-c217e1d7f53d", "31bda844-9273-4a22-a4d2-021de9c77d55", "a0f833fe-94f2-48a5-92e4-9345cc3fbdb3", "cbe0d517-0c75-4126-9c2b-5f59a362b692", "b9c765c6-35fd-4382-900d-8ab4099605da", "573809ca-c33f-477c-a3c3-4e74e9c1e8ec", "df8c6874-f53a-4a84-ad49-9bf741c6e246", "920a0d3e-3b8e-4143-87be-c33eb0c68e9e", "362ba25d-2a22-40c0-b02d-ad5c771313e2", "e01a12b9-62b8-46c3-8fbe-dd1f9440afb0", "4bf177b4-dc37-4296-a584-9000756c8232", "39d73697-7f04-4234-a0e2-f36ee07da8bd", "11f9dab3-0867-4ea2-9424-14c3129d5e38", "8e981c03-f1b9-4ad9-ab5e-f8202b8a8e12", "62fc6f91-d60b-4ec4-b1a6-5d6dd4d730c3", "db551dd6-598f-46b1-8218-e0ea224674b9", "acdde094-85c8-4b11-b763-8e73c946744a", "15367d6c-b583-4508-a8d8-ecfcdbfc5e57", "c5340634-1ef0-4782-bf48-9ca6107ba645", "8243eee3-a6f7-475c-8a3f-377f5b47bdf7", "4b92c0d3-a409-4779-97e2-d73aa3bc089e", "5c916c69-18b4-4968-b943-14ad2e022c51", "9bc37129-fcf1-47a2-80c2-bc1ba655dd4c", "9a976ea7-677a-47fd-932d-4bf416d8ba8d", "71276e61-2c09-4991-8082-6a4361a53ac6", "8188585a-6524-45d5-9fce-4b9cc4af9b99", "9f5d7454-2cf1-4dbc-9846-5c9ac4feae9d", "e083b70b-fa91-4d0e-b0f9-f794ec899653", "04a72608-9620-4057-94b1-4982a49af76f", "b1a857c8-554f-444f-b289-87a1bcf3d26d", "8abbe344-00b3-4258-85f2-684bcf5913f1", "eaba2810-3b89-4b75-a694-482c270c098e", "8e207267-f10f-4470-ae35-ac35cf8e116c", "e42f025b-bb10-48ec-89fe-294ec73b7eae", "a25cb4d6-6f90-40f3-a791-1d4128a57fd2", "152b3892-c1d0-4c2a-b860-e15414cd3aec", "a4c1738f-2b28-436d-ae06-2b290630a2cf", "6fc878eb-2341-4485-93a6-5b84e68f2250", "63291098-96fb-4b83-8427-f0dc7c921151", "0d56fcb3-ae1e-4b3e-b794-be3270cc9d43" }; auto random_engine {std::default_random_engine {static_cast(std::chrono::system_clock::now().time_since_epoch().count())}}; const std::string password {"6Y4qTvHbQcyNccKW"}; const std::string private_pem { "-----BEGIN RSA PRIVATE KEY-----\n" "Proc-Type: 4,ENCRYPTED\n" "DEK-Info: AES-256-CBC,4C0EA37BB36FBF5E9799A14A3EC78A70\n" "\n" "srl0+9zecwEzGrWkZXMexv6JaxL+O1B2N2xwXrFcDpcish/2MiRWybj1vT+U3mEq\n" "B5AweV7OCeDBpoqxM6cN9mYOVSmBdHxf2Ek/RGi2/o2r1nf18s4BTxupReauaJOu\n" "yJiNgOMcRE7a30SGwguJmNf8XkPIjitrPNLcgQv3q4GTcXV4vrnElnyuINBWrg2F\n" "wl/24/Pxdw4OEGik5FN1IjY1GhhnwBLn36H9FToRaj/id/vBpZ0cFIP/AbHJto2H\n" "OoIdvG6xIt6pXuk9WhPAOVbxeYy0Q5C1vLdH22OSTDe+3wiZpRIkllZBMjdLHl5X\n" "pdxmG4YwPjZIgM5jTZRBRrYDyZHroJqlJFEGnvDLuPiy7TlVA47oZGKKLsga+aFQ\n" "uZKJ2duANgMiM6re3WFePw6+O9YjRnhNjj70S3YM8l5cCRUFkOeLjFxGEDtjndV5\n" "903du5LdzPpneAbehPFMafR2T8WeKKp2b4Ulpxw+x4klDpMRL1n0ow4rRRcFsIm1\n" "wh/p7Mr8DvDqChelhSkksqfrXfkGg1kFRGMmS1ftQ8tcL7pZM/ZDXhpxYXzSfY7p\n" "ZqlWd3e9NRybT25upQOkkW5IFM8qBri0tQ+hcI0ZV7yFiCdyN0K3r+dlZCHso8BX\n" "4d99LWPKW7Y0vt2za6OnD/nKLfRHEUIL588eLRQskID9jhPyLlPjRGHOmDK2BF1m\n" "/dcuHvBWdwxPXKeDWvAGrygrMTVs0Lz9Gn2gMO6XFqVSlLhCEueggksfSjjgRvPN\n" "1nGIWeHHyF4LKRXNV0Fstt26H8O1I9WTBozFC7MtsdIORC3OinftbTuc7dZeb110\n" "NJpCLWePFT5mIzEqAKYwxkMPLGLHfH5CzJpmNFaN+4UmQiOwwNiigjFLLykjli1C\n" "g/3Tk32E4uADff1xzIb5+hV28Yh2I45np7YXJX5FowWoGQKL8/qCs/BhwA6rHTkw\n" "w7W/G/BLjwEti9jwWO4XnI9PIRm3rzRmr34J4+x2qSKYi41LajiEdk00sMxcHupx\n" "SteCY0IHsSL0P7DVHfkjUV/rx8GLh7ugb/TMoiS3Dvh6Tk4Dj6cW7nRSYvFALu0v\n" "iofcr89K/gbkyOms4rHdd1/124zMRzh3KZs4O6ZnEFgTTEVMMGYrSS6gpvKHyp6G\n" "CCEZHDe2mZHuOI64iEDXyX0qvCLBBrMUBu/zeQ44zf0AtI4vkROSNR9TIY59p93s\n" "+a51iW50gTuv9Vojd6jHzKPMqe2PrKGekFZBTpROQsUBiPepTDT00lkb+u7t4sYp\n" "wbWwQlvEm7JVrK7HxP8/dvz19CVs41rEM9op2AT3Pg18jG+LXZfbVDX/Yv4P8077\n" "IB4XMAKh/CazkTp5H3lIujcs9LKS/jtCsnSUGu5myS4rr3XH9NSYN2LUmHfHOInW\n" "YMHGRkNkBT7Znt/khVpwENeC0x1nT6c7V/bgQ3mV/xsvE3utKsNi78P2VOippehA\n" "npG41/cfUSI8yFWMQpmAezgFeLAojM0j71l0ZQqdcpvnUl8+wBnOSzEtsx7XU6of\n" "UXvsuDyWJkyYe9bHchyKYlstYlnmaIGQu1uzpjix5m2WHhdHHrgTsF7YJ19UU/TP\n" "gE5cuuMpmuRTQRCii2kh6YghsOEKF0+C/zg2wAHLuLXOZzGLBcEvxHL/0U/5s6Yg\n" "5HiUeW5FtnfNO8TvvVFT0odTK5lfIqqRn2td1w9Q7q7sVPgGu35P6Lb7tP31Se8N\n" "CjOmcnjMtFH/PV9yzq9mmhsroHDmWeF0YIl0ghdYh3fDFo6StDl7WzTNzrqQdvTn\n" "aetSA5odZ8m+Us7PFXWGijedwBfdvWdljQlw39vQ6voQiCZY+drcyeXEm3YAUtgD\n" "3m6qMiZ2D86O3SLBm2AJaVlQZH2nIQm1UJZdjZNYW5y3fvTjIBjw6Q2WfhXub5M2\n" "OJq40X+7AkKunKj0zmsn9TRaoRnasmxh542Fy1pwTpll9pR7DZVSC6mtMffOSKz4\n" "XJr3CX5j8wUMnVSuISYuW5innPoZIOQ5gKFtpdGUTpaxD7ZFxU1wyzycmFZ9ZGGJ\n" "9f72DfAYHFNMMM4ymh2VZ474OFmx9ewPIWxNm4svV3OiPOaAVMnw4+3Jdxp92ivb\n" "YK3j3vnyP7fN02CrujAR2RufIUiPOM5NKgJe6mzrOANr/i77Q3A3hiD4tAEWRRNF\n" "W+3SuoAqeS4AtTBv2WhQmBXh7PlsfZyjKex/VbyOdNjinvoIMirdSuluirTo0Crp\n" "ySZEllKFniZwo/wVJfqhrn3KRYdjO1G8ZkW67MhweHSSbZtqyvzR8OntMkWH4Kv2\n" "m+g2vq/OIm4ScjCUUGwm5Kd+f056ec5/78Cxre2VVDu7JHt2kVkAHDOdXvPQHWvq\n" "tel83ImadoOhjCZW4aV8xTzvFuRlBNdqEjlygQca5obUdMYB9KAxIUEyyZ2R2L1W\n" "of+b3iejYF6h30pVrez3sYdELj5vjAO3wIRlFLtSw7JQgU6m5y0koQTs3KuFQO5n\n" "3pFZsld6JAHsLuZ5kh3fwUAxwLaCjfOX7KiFsnBEathEVD8ATvrbDomtkJWOSfYO\n" "s4pKrnA1opoSJ7vPt+PsEZwLi4Yki/AqDHAXRnpdKCU1EyumgklGZXwI0scc7Dit\n" "MJR5MqWAF46TmsOpowB+rBXXdQi2UgNjBzFjxYa9YRf5sRwvyo0JUcMATwy75g2P\n" "yNp9cvNNltRXv3VE1oYxRbeJ9uG0Nf4osq+d/cFUhHVaC610oHTXPou0llpAWefJ\n" "lP92HmPyTwIfXtOfYt5Vbv6NOTc2m+xn1w+H8MVniQUbo7JhYs5BBUadc0VScaOA\n" "ScBTDWQb/wFqzMQhsaYVNpzMTYyDKxbb63poz7EbbgUb9IBSNvmnIJI6C3ItVDqn\n" "xWnTDQ3pk5vdGqgRE0MCrSkzQ3PEK5mlp9wUkqK5Kiq5loIrB19IwXH140dCOd1M\n" "vo4o5Ed85CfBl3xFQArFQm+0pQ2oQnU1NHjORHoN1MklAmtmYaFo5JEGHbxQnurt\n" "b+XI03vg1Bro8wuaGlSmnktZnKfTBT1FZTJIkFGViY4fFXyM9GL6scEN8nJFgBn0\n" "2eeaax2ZXB0ptbay79gkVVVshW02lStYtbyaMC1U/ns48DaUtHknqR72WDt9D1bC\n" "-----END RSA PRIVATE KEY-----\n" }; const std::string public_pem { "-----BEGIN PUBLIC KEY-----\n" "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3Delbh36s+NJCCOYi1ql\n" "NGp+R5EoKWtcazi+Kh/t2V4kN4QCEQdxi3nlhbHdiWWNi8puwwJYFDRdjZvEO+2H\n" "yEyFui4v9Rl/RoGdDQeXEeQ+QxMVvT6Ya7+unRDjlIuNmQNNe4HKlcA4fqhRqi07\n" "bF2b1kceuPsxIXcBnrsVVqxvSvqjiVkaSnk+HACm8fjiTwGSFE3ZhooMgxENEWrw\n" "Ltcr80UdWpMvCrlBCWtlxiLl8VgoPCDZ/R2iXvJaQAOwepfdFGmcPomcO9BOEJfn\n" "Jg4sBQNu4CqN5KRCS8CN39E705s4upFMRleU6nKHa0kSb9OsqJP/0i0fBVFLsxpX\n" "WbR2iLwpCy3YqJqwoS8PFz9rr4V9ESqRJlczjkRt6bfx4/fSskxsXWRl+Dlv1V/P\n" "Sl0zlJXMoxpPuLANxEVsnR9fT07h0XuQ58dsjbMImTL8Hmomfl3n2WK35TesAAaO\n" "WNa4+2LFYzKwLUL9cRv696544eo8TCi+bXEKSCmUzpLsLIeHVmeHy3CiUUq13ktE\n" "ykQD9vdtoyJkWJ4n5QMQVaV1k1hJ0V8EMfpV9mMEpItfQQRqDW1QG2fHbZgrUV1m\n" "5PdnWwf3L9nMNxja7nX0vk5QVw1r8Kl4KqP4sid4djBYz4SBLeSfimUDw/USsKik\n" "MwoaYGgrejBmlvZ5UiFw+xMCAwEAAQ==\n" "-----END PUBLIC KEY-----" }; // note the \x0a appended to the end of the uuid's. Since the OpenSSL signing // is done on the command line with text files, the \x0a is the new line // marker and may need to be appended for the signing to work. const std::string valid_uuid {"81ca538-a222-4add-8cb8-065c8b65a391\x0a"}; const std::string invalid_uuid {"71da427-a222-4add-8cb8-065c8b65a391\x0a"}; const unsigned char signature_sha256[] = { 0x3a, 0x8f, 0x19, 0x94, 0x34, 0x1c, 0x32, 0x56, 0x45, 0xe2, 0x1a, 0xa7, 0x84, 0xdf, 0xf6, 0x0f, 0x3d, 0xc5, 0x61, 0xaa, 0xd9, 0x1e, 0xb1, 0x9f, 0xfb, 0xce, 0xe2, 0xf8, 0x95, 0x12, 0xc4, 0x1b, 0xb6, 0x18, 0xa1, 0x64, 0xf1, 0x26, 0x1c, 0x0e, 0xbc, 0x23, 0x73, 0x40, 0xee, 0x85, 0x40, 0xb1, 0xa5, 0x15, 0x50, 0xa6, 0x93, 0x24, 0xe5, 0xf8, 0xd9, 0xb4, 0x9d, 0xeb, 0xe8, 0x8f, 0x74, 0xeb, 0xa8, 0xdc, 0x12, 0x92, 0x4f, 0x96, 0x35, 0x35, 0x48, 0x2d, 0x53, 0x86, 0x9c, 0xbe, 0x01, 0x41, 0x18, 0xc7, 0x4a, 0xfa, 0xe3, 0x44, 0x8a, 0x47, 0x02, 0xb0, 0x98, 0x93, 0x1e, 0xea, 0x64, 0x5d, 0x48, 0x9e, 0xf9, 0xad, 0xc6, 0x07, 0xbb, 0x9f, 0x9e, 0xb5, 0xa8, 0xce, 0x59, 0x68, 0xcc, 0xb3, 0x8b, 0xd8, 0x42, 0xd7, 0x30, 0x7d, 0x51, 0x77, 0xa0, 0x47, 0x7d, 0xfe, 0x96, 0x63, 0x79, 0xaf, 0x31, 0xe8, 0xfb, 0xa1, 0x9c, 0xce, 0x74, 0xf8, 0x53, 0xe9, 0x9e, 0xf8, 0x2e, 0xe7, 0xb2, 0xfc, 0xbc, 0x77, 0x5e, 0x5a, 0x30, 0xaa, 0x02, 0x23, 0xf2, 0xa2, 0x64, 0x12, 0x2e, 0x02, 0x09, 0x3e, 0x3b, 0xcc, 0x27, 0x0e, 0x1a, 0x1d, 0x45, 0x04, 0xde, 0xd1, 0xd7, 0xd5, 0x63, 0x81, 0xf1, 0x70, 0xc7, 0x76, 0xfb, 0xa1, 0x8b, 0xd8, 0x19, 0x38, 0x3c, 0xd9, 0x59, 0xb7, 0x48, 0xf7, 0x62, 0x4d, 0x86, 0x82, 0xdb, 0xc2, 0xf8, 0xe6, 0x84, 0xa4, 0xde, 0x4c, 0xdf, 0x85, 0x6c, 0x1b, 0x5d, 0x24, 0x88, 0xc2, 0xd3, 0xe5, 0x74, 0xb0, 0xc1, 0x66, 0x18, 0xd2, 0x50, 0xf1, 0x62, 0x24, 0x26, 0xc7, 0x0d, 0xd2, 0x1c, 0xd1, 0x92, 0x67, 0x65, 0x53, 0xde, 0xb9, 0x94, 0x77, 0xb8, 0x86, 0xa9, 0x5c, 0x33, 0x21, 0x1d, 0x4d, 0x29, 0xd8, 0x4a, 0x70, 0xbb, 0x34, 0x81, 0xc5, 0x7e, 0xf2, 0x45, 0x04, 0x16, 0x22, 0xf6, 0x47, 0x00, 0x54, 0x1c, 0x24, 0x63, 0x20, 0x0b, 0x40, 0x3b, 0xfa, 0x89, 0x31, 0x8c, 0x48, 0x8d, 0x75, 0xfe, 0x77, 0x30, 0x75, 0x3c, 0xf8, 0xfc, 0x61, 0x8f, 0xa1, 0xd6, 0x94, 0x3c, 0x5c, 0x5f, 0xfd, 0x65, 0x47, 0x53, 0x3e, 0xab, 0x04, 0x0b, 0x53, 0x2a, 0xf9, 0xfc, 0x2a, 0x0e, 0xb5, 0x17, 0xa7, 0x15, 0x85, 0xc1, 0x52, 0x0a, 0x38, 0xb0, 0xd9, 0xb5, 0x86, 0xa5, 0xe5, 0x9c, 0x59, 0x32, 0xfe, 0x08, 0x66, 0xdf, 0x60, 0x2b, 0xd9, 0x36, 0x20, 0x15, 0xc8, 0xee, 0xd0, 0x76, 0x67, 0xe3, 0xe6, 0x1a, 0x0b, 0xbb, 0xb2, 0x86, 0xfa, 0x7c, 0x41, 0x2c, 0x5f, 0x2e, 0xa1, 0x49, 0x7a, 0xb7, 0x70, 0x5d, 0x2b, 0x3f, 0x43, 0xaa, 0x0f, 0x55, 0x7f, 0xe4, 0x15, 0xb5, 0xa5, 0x63, 0xfc, 0x23, 0x83, 0xd6, 0x75, 0x32, 0x91, 0x75, 0xd1, 0x57, 0x17, 0xcb, 0xa3, 0x87, 0x4d, 0x05, 0x2f, 0x9a, 0x56, 0xc9, 0x8e, 0x16, 0x3a, 0x69, 0x29, 0xa1, 0x2f, 0x99, 0xe4, 0xf9, 0x4b, 0x05, 0x8e, 0x49, 0x5a, 0xca, 0x67, 0x03, 0xee, 0x4e, 0x29, 0x55, 0xf6, 0x30, 0x9e, 0x84, 0x56, 0xc5, 0x64, 0x5e, 0x8c, 0x3f, 0x28, 0x96, 0xe6, 0x67, 0x29, 0xf6, 0xde, 0x03, 0xdb, 0xb8, 0x4c, 0xa3, 0x3f, 0xd2, 0x88, 0xa8, 0xc2, 0xa9, 0xd3, 0x7d, 0xdd, 0x87, 0x41, 0x3b, 0x81, 0x41, 0x17, 0xf7, 0x16, 0x0f, 0x95, 0x87, 0x98, 0x3e, 0xca, 0x69, 0xa2, 0x58, 0x9a, 0x7c, 0xed, 0xcf, 0x75, 0xbe, 0xc5, 0x2e, 0xdb, 0xfe, 0xa9, 0x36, 0x3d, 0xc3, 0x7e, 0xaa, 0x96, 0x44, 0x5e, 0xc7, 0xeb, 0x5a, 0x27, 0xb8, 0xa6, 0xb0, 0x75, 0xba, 0x61, 0x12, 0x6a, 0xf6, 0x0b, 0x0b, 0x5a, 0x4b, 0x86, 0x81, 0x20, 0x73, 0x48, 0xd1, 0x52, 0x5d, 0x5b, 0xf6, 0x61, 0xd2, 0x63, 0xb1, 0x38, 0xa6, 0xe9 }; const unsigned int signature_sha256_len = 512; const std::string signature { "Oo8ZlDQcMlZF4hqnhN/2Dz3FYarZHrGf+87i+JUSxBu2GKFk8SYcDrwjc0DuhUCx" "pRVQppMk5fjZtJ3r6I9066jcEpJPljU1SC1Thpy+AUEYx0r640SKRwKwmJMe6mRd" "SJ75rcYHu5+etajOWWjMs4vYQtcwfVF3oEd9/pZjea8x6PuhnM50+FPpnvgu57L8" "vHdeWjCqAiPyomQSLgIJPjvMJw4aHUUE3tHX1WOB8XDHdvuhi9gZODzZWbdI92JN" "hoLbwvjmhKTeTN+FbBtdJIjC0+V0sMFmGNJQ8WIkJscN0hzRkmdlU965lHe4hqlc" "MyEdTSnYSnC7NIHFfvJFBBYi9kcAVBwkYyALQDv6iTGMSI11/ncwdTz4/GGPodaU" "PFxf/WVHUz6rBAtTKvn8Kg61F6cVhcFSCjiw2bWGpeWcWTL+CGbfYCvZNiAVyO7Q" "dmfj5hoLu7KG+nxBLF8uoUl6t3BdKz9Dqg9Vf+QVtaVj/COD1nUykXXRVxfLo4dN" "BS+aVsmOFjppKaEvmeT5SwWOSVrKZwPuTilV9jCehFbFZF6MPyiW5mcp9t4D27hM" "oz/SiKjCqdN93YdBO4FBF/cWD5WHmD7KaaJYmnztz3W+xS7b/qk2PcN+qpZEXsfr" "Wie4prB1umESavYLC1pLhoEgc0jRUl1b9mHSY7E4puk=" }; const std::string temporary_public_pem { "-----BEGIN PUBLIC KEY-----\n" "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3Delbh36s+NJCCOYi1ql\n" "NGp+R5EoKWtcazi+Kh/t2V4kN4QCEQdxi3nlhbHdiWWNi8puwwJYFDRdjZvEO+2H\n" "yEyFui4v9Rl/RoGdDQeXEeQ+QxMVvT6Ya7+unRDjlIuNmQNNe4HKlcA4fqhRqi07\n" "bF2b1kceuPsxIXcBnrsVVqxvSvqjiVkaSnk+HACm8fjiTwGSFE3ZhooMgxENEWrw\n" "Ltcr80UdWpMvCrlBCWtlxiLl8VgoPCDZ/R2iXvJaQAOwepfdFGmcPomcO9BOEJfn\n" "Jg4sBQNu4CqN5KRCS8CN39E705s4upFMRleU6nKHa0kSb9OsqJP/0i0fBVFLsxpX\n" "WbR2iLwpCy3YqJqwoS8PFz9rr4V9ESqRJlczjkRt6bfx4/fSskxsXWRl+Dlv1V/P\n" "Sl0zlJXMoxpPuLANxEVsnR9fT07h0XuQ58dsjbMImTL8Hmomfl3n2WK35TesAAaO\n" "WNa4+2LFYzKwLUL9cRv696544eo8TCi+bXEKSCmUzpLsLIeHVmeHy3CiUUq13ktE\n" "ykQD9vdtoyJkWJ4n5QMQVaV1k1hJ0V8EMfpV9mMEpItfQQRqDW1QG2fHbZgrUV1m\n" "5PdnWwf3L9nMNxja7nX0vk5QVw1r8Kl4KqP4sid4djBYz4SBLeSfimUDw/USsKik\n" "MwoaYGgrejBmlvZ5UiFw+xMCAwEAAQ==\n" "-----END PUBLIC KEY-----" }; const std::map> SWARMS { { {"BluzelleSwarm", { bzn::peer_address_t("209.50.61.87", 51010, "node_0", "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEysScFkwI4d8I65aJnr8UAohqjYCYuBXgMb73Aa0SlQF62+ql4XGuTRoYZVX8L9WrzSlg3m4UY7KrIBJPYS++pA=="), bzn::peer_address_t("212.2.189.19", 51010, "node_1", "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEqWDJpK28T/9wHAVLrgTQFgBToHEF9W1WNv1ot7mqyNODHyQL+m8gt3CoMSJZc2Op0pF7PuYDex87koGbKVo9KA=="), bzn::peer_address_t("62.134.146.33", 51010,"node_2", "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmuAiBMszxYT8GM9RzoBHHHmo5Y6Hs+KO+ny48iF8UtSy55LcOfj4P8v4s9TUx3VdLxtCBAKk6ZHqBcHDQrZl4Q=="), bzn::peer_address_t("75.96.163.85", 51010, "node_3", "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE73T48e2Go71nvycBVHvTxKJ27qFdQBJ4Fcp6n9V9NhjrCAmfz3rn86XOMiCKzsSXc3qDr/C8LhTB5KfHhCoLKg=="), bzn::peer_address_t("152.44.45.81", 51010, "node_4", "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEyCa3KWa9/jMtlZ7+mMgX2Qih6JkKE2x8l5Y3aErf7e22d77fY51zidS+9d26Fm5TPC6dOZ4M7i9BIhVsIodLtA=="), bzn::peer_address_t("152.44.45.82", 51010, "node_5", "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEERq5ucX48gQwTdtc2JFIDjySD0gA9VFppTZaXM4RuOxwuBJ3NVpPl6HjG5hDDLU6wVNCZQMTzLsvOzm9bFwJw=="), bzn::peer_address_t("75.96.165.79", 51010, "node_6", "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE5ZG9N2xBiAbl2BVXmw6QCvTgpnZ58RYJ9du4C42QVAyBw5ok+7xvytZ1WBVLYfACK8SP7Q1neKNVK6UvAReVAA==") }}, {"BluzelleSwarm2", { bzn::peer_address_t("127.0.0.1", 51010, "TestNodeBZ", "nodeuuid1"), bzn::peer_address_t("127.0.0.1", 51011, "TestNodeBZ1", "nodeuuid2"), bzn::peer_address_t("127.0.0.1", 51012, "TestNodeBZ2", "nodeuuid3"), bzn::peer_address_t("127.0.0.1", 51013, "TestNodeBZ3", "nodeuuid4") }}, {"BluzelleSwarm3", { bzn::peer_address_t("10.0.0.60", 51010, "NodeBZ1", "uuid1"), bzn::peer_address_t("10.0.0.60", 51011, "NodeBZ2", "uuid2"), bzn::peer_address_t("10.0.0.60", 51012, "NodeBZ3", "uuid3"), bzn::peer_address_t("10.0.0.60", 51013, "NodeBZ4", "uuid4"), bzn::peer_address_t("10.0.0.60", 51014, "NodeBZ5", "uuid5"), bzn::peer_address_t("10.0.0.60", 51015, "NodeBZ6", "uuid6"), bzn::peer_address_t("10.0.0.60", 51016, "NodeBZ7", "uuid7"), bzn::peer_address_t("10.0.0.60", 51017, "NodeBZ8", "uuid8"), bzn::peer_address_t("10.0.0.60", 51018, "NodeBZ9", "uuid9"), bzn::peer_address_t("10.0.0.60", 51019, "NodeBZ10", "uuid10") }} }}; } TEST(util_test, test_that_is_blacklisted_member_returns_TRUE_if_uuid_IS_found_in_blacklist) { EXPECT_TRUE(bzn::utils::blacklist::is_blacklisted(BLACKLISTED_UUID)); std::shuffle(blacklisted_uuids.begin(), blacklisted_uuids.end(), random_engine ); std::for_each(blacklisted_uuids.begin(), blacklisted_uuids.begin()+5,[](const auto& uuid) { EXPECT_TRUE(bzn::utils::blacklist::is_blacklisted(uuid)); }); } TEST(util_test, test_that_is_whitelist_member_returns_FALSE_if_uuid_is_NOT_found_in_whitelist) { EXPECT_FALSE(bzn::utils::blacklist::is_blacklisted(NOT_BLACKLISTED_UUID)); } TEST(util_test, test_that_a_poorly_formed_uuid_fails) { EXPECT_THROW(bzn::utils::blacklist::is_blacklisted("0}56fcb3-ae1e-4b3e-b794-be3270cc9d43", "http://localhost:74858"), std::runtime_error); } TEST(util_test, test_that_openssl_based_base64_encoding_works_correctly) { std::vector base64_decoded_output; // TODO: return value for success is 0, in this case. We should standardize this across the rest of the application EXPECT_EQ( 0, bzn::utils::crypto::base64_decode((char*)signature.c_str(), base64_decoded_output)); EXPECT_EQ( signature_sha256_len, base64_decoded_output.size()); EXPECT_EQ( 0, std::memcmp( signature_sha256, base64_decoded_output.data(), base64_decoded_output.size() )); } TEST(util_test, test_that_a_uuid_can_be_validated) { EXPECT_TRUE(bzn::utils::crypto::verify_signature( public_pem, signature, valid_uuid)); EXPECT_FALSE(bzn::utils::crypto::verify_signature( public_pem, signature, invalid_uuid)); } TEST(util_test, test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully) { EXPECT_FALSE(bzn::utils::crypto::verify_signature( "", signature, valid_uuid)); EXPECT_FALSE(bzn::utils::crypto::verify_signature( public_pem, "", valid_uuid)); EXPECT_FALSE(bzn::utils::crypto::verify_signature( public_pem, signature, "")); } TEST(util_test, test_that_esr_returns_peers_list) { bzn::utils_interface iface; // Check for swarm that doesn't exist, must return empty vector. { const std::pair BAD_SWARM{"NonExistentBluzelleSwarm", 0}; bzn::utils_interface iface; const auto peer_ids = iface.get_peer_ids(BAD_SWARM.first, bzn::utils::DEFAULT_SWARM_INFO_ESR_ADDRESS, bzn::utils::ROPSTEN_URL); EXPECT_EQ( BAD_SWARM.second, peer_ids.size()); } for (const auto& swarm : SWARMS) { std::vector accepted_ids(swarm.second.size()); std::transform(swarm.second.begin(), swarm.second.end(), accepted_ids.begin(), [](const auto &pinfo){return pinfo.uuid;}); const auto peer_ids = iface.get_peer_ids(swarm.first, bzn::utils::DEFAULT_SWARM_INFO_ESR_ADDRESS, bzn::utils::ROPSTEN_URL); EXPECT_EQ(swarm.second.size(), peer_ids.size()); EXPECT_EQ(accepted_ids, peer_ids); } } TEST(util_test, test_that_esr_returns_peers_list_with_deletions) { bzn::utils_interface iface; // There is a swarm in the ESR called BluzelleSwarm4. It contins 2 nodes, there were originally 4, the 2nd and 4th // node have been deleted which will leave two 0 length strings. const std::string CONTRACT{"D5B3d7C061F817ab05aF9Fab3b61EEe036e4f4fc"}; const std::string SWARM_ID{"BluzelleSwarm4"}; const std::vector ACCEPTED_IDS{"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvsJhAghU+bWyVjiSg5VMHJKLqs2NGKGNmWTkl3zU8syKIPo+CEuXey7YAAS7pMOFErkjpMyi4FEWnG2ysuN1Pg==", "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbrgU0EQ2UHRG5UFFfcDIaqfarezPvT1uRJAA++8mRc3FgK3DYeTrOdVVopCBLA+EaNiJdkLDObvRkkFny6185g=="}; const auto peer_ids = iface.get_peer_ids( SWARM_ID, CONTRACT, bzn::utils::ROPSTEN_URL); EXPECT_EQ(ACCEPTED_IDS.size(), peer_ids.size()); EXPECT_EQ(ACCEPTED_IDS, peer_ids); } TEST(util_test, test_that_esr_fails_nicely) { bzn::utils_interface iface; const std::string ESR_CONTRACT{"3a38a7ed11431975fa4a5403a246850479e7b930"}; const std::string ESR_URL{bzn::utils::ROPSTEN_URL+ "/uvek7IebbbHoP8Bb9NkV"}; // testing non existant node const std::string SWARM_ID{"testswarm-333333333333333333333333"}; const auto peer_info = iface.get_peer_info(SWARM_ID, "NOPE", ESR_CONTRACT, ESR_URL); EXPECT_EQ(peer_info.uuid, "NOPE"); EXPECT_TRUE(peer_info.host.empty()); EXPECT_EQ(peer_info.port, 0); EXPECT_TRUE(peer_info.name.empty()); } TEST(util_test, test_that_esr_works_with_large_swarm_id) { bzn::utils_interface iface; const std::string ESR_CONTRACT{"3a38a7ed11431975fa4a5403a246850479e7b930"}; const std::string ESR_URL{bzn::utils::ROPSTEN_URL+ "/uvek7IebbbHoP8Bb9NkV"}; const std::string SWARM_ID{"testswarm-444444444444444444444444444444444444444444444444444444444444"}; const auto peer_info = iface.get_peer_info(SWARM_ID, "TestUUID1", ESR_CONTRACT, ESR_URL); EXPECT_EQ(peer_info.uuid, "TestUUID1"); EXPECT_EQ(peer_info.host, "127.0.0.1"); EXPECT_EQ(peer_info.port, 51010); EXPECT_EQ(peer_info.name, "node_1"); } TEST(util_test, test_that_esr_returns_peer_info_with_large_node_name) { bzn::utils_interface iface; const std::string ESR_CONTRACT{"3a38a7ed11431975fa4a5403a246850479e7b930"}; const std::string ESR_URL{bzn::utils::ROPSTEN_URL+ "/uvek7IebbbHoP8Bb9NkV"}; // testing esr get peer info parser with a node name larger than 32 characters const std::string SWARM_ID{"testswarm-333333333333333333333333"}; const auto peer_info = iface.get_peer_info(SWARM_ID, "TestUUID2", ESR_CONTRACT, ESR_URL); EXPECT_EQ(peer_info.uuid, "TestUUID2"); EXPECT_EQ(peer_info.host, "127.0.0.1"); EXPECT_EQ(peer_info.port, 51010); EXPECT_EQ(peer_info.name, "node_name111111111111111111111111111111111111111111111111111"); } TEST(util_test, test_that_live_esr_returns_peer_info) { bzn::utils_interface iface; const std::string ESR_CONTRACT{"3a38a7ed11431975fa4a5403a246850479e7b930"}; const std::string ESR_URL{bzn::utils::ROPSTEN_URL+ "/uvek7IebbbHoP8Bb9NkV"}; { const std::string SWARM_ID{"debug-swarm"}; const std::string NODE_ID{"nodeuuid111111111111111111111111"}; const auto peer_info = iface.get_peer_info(SWARM_ID, NODE_ID, ESR_CONTRACT, ESR_URL); EXPECT_EQ(peer_info.uuid, NODE_ID); EXPECT_EQ(peer_info.host, "127.0.0.1"); EXPECT_EQ(peer_info.port, 51010); EXPECT_EQ(peer_info.name, "node_1"); } { // testing that the ESR_CONTRACT can be given with the 0x prepended. const std::string SWARM_ID{"debug-swarm"}; const std::string NODE_ID{"nodeuuid111111111111111111111111"}; const auto peer_info = iface.get_peer_info(SWARM_ID, NODE_ID, "0x" + ESR_CONTRACT, ESR_URL); EXPECT_EQ(peer_info.uuid, NODE_ID); EXPECT_EQ(peer_info.host, "127.0.0.1"); EXPECT_EQ(peer_info.port, 51010); EXPECT_EQ(peer_info.name, "node_1"); } } namespace bzn::utils::esr { const std::string data_string_for_get_peer_info(const std::string &swarm_id, const std::string &peer_id); } TEST(util_test, test_request_data_validity) { std::map,std::string> accepted_data { {{"debug-swarm","nodeuuid111111111111111111111111"}, "0xcc8575cb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b64656275672d737761726d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206e6f646575756964313131313131313131313131313131313131313131313131"}, {{"debug-swarm", "nodeuuid1111111111111111111111111"}, "0xcc8575cb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b64656275672d737761726d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216e6f6465757569643131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, {{"debug-swarm", "nodeuuid111111111111111111111111111111111111111111111111111111111"},"0xcc8575cb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b64656275672d737761726d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416e6f64657575696431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, {{"debug-swarm","nodeuuid11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"},"0xcc8575cb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b64656275672d737761726d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616e6f646575756964313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, {{"debug-swarm1111111111111111111111","nodeuuid111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002164656275672d737761726d313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206e6f646575756964313131313131313131313131313131313131313131313131"}, {{"debug-swarm1111111111111111111111","nodeuuid1111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002164656275672d737761726d313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216e6f6465757569643131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, {{"debug-swarm1111111111111111111111","nodeuuid111111111111111111111111111111111111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002164656275672d737761726d313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416e6f64657575696431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, {{"debug-swarm1111111111111111111111","nodeuuid11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002164656275672d737761726d313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616e6f646575756964313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, {{"debug-swarm111111111111111111111111111111111111111111111111111111","nodeuuid111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004164656275672d737761726d3131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206e6f646575756964313131313131313131313131313131313131313131313131"}, {{"debug-swarm111111111111111111111111111111111111111111111111111111","nodeuuid1111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004164656275672d737761726d3131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216e6f6465757569643131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, {{"debug-swarm111111111111111111111111111111111111111111111111111111","nodeuuid111111111111111111111111111111111111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004164656275672d737761726d3131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416e6f64657575696431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, {{"debug-swarm11111111111111111111111111111111111111111111111111111111111111111111111111111111111111","nodeuuid111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006164656275672d737761726d31313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206e6f646575756964313131313131313131313131313131313131313131313131"}, {{"debug-swarm11111111111111111111111111111111111111111111111111111111111111111111111111111111111111","nodeuuid1111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006164656275672d737761726d31313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000216e6f6465757569643131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, {{"debug-swarm11111111111111111111111111111111111111111111111111111111111111111111111111111111111111","nodeuuid111111111111111111111111111111111111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006164656275672d737761726d31313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416e6f64657575696431313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, {{"debug-swarm11111111111111111111111111111111111111111111111111111111111111111111111111111111111111","nodeuuid11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"},"0xcc8575cb000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006164656275672d737761726d31313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616e6f646575756964313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313100000000000000000000000000000000000000000000000000000000000000"}, }; for(const auto& info : accepted_data) { const auto& SWARM_ID{info.first.first}; const auto& PEER_ID{info.first.second}; const auto& ACCEPTED_REQUEST{info.second}; const auto& ACTUAL_REQUEST{bzn::utils::esr::data_string_for_get_peer_info(SWARM_ID,PEER_ID)}; EXPECT_EQ(ACCEPTED_REQUEST.size(), ACTUAL_REQUEST.size()); EXPECT_STRCASEEQ(ACCEPTED_REQUEST.c_str(), ACTUAL_REQUEST.c_str()); } } ================================================ FILE: utils/utils_interface.hpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include namespace bzn { class utils_interface : public utils_interface_base { public: std::vector get_peer_ids(const bzn::uuid_t& swarm_id, const std::string& esr_address, const std::string& url) const; bzn::peer_address_t get_peer_info(const bzn::uuid_t& swarm_id, const std::string& peer_id, const std::string& esr_address, const std::string& url) const; // Performs an HTTP GET or POST and returns the body of the HTTP response std::string sync_req(const std::string& url, const std::string& post = "") const; }; } ================================================ FILE: utils/utils_interface_base.hpp ================================================ // Copyright (C) 2019 Bluzelle // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License, version 3, // as published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #pragma once #include #include #include #include namespace bzn { class utils_interface_base { public: virtual std::vector get_peer_ids(const bzn::uuid_t& swarm_id, const std::string& esr_address, const std::string& url) const = 0; virtual bzn::peer_address_t get_peer_info(const bzn::uuid_t& swarm_id, const std::string& peer_id, const std::string& esr_address, const std::string& url) const = 0; // Performs an HTTP GET or POST and returns the body of the HTTP response virtual std::string sync_req(const std::string& url, const std::string& post = "") const = 0; virtual ~utils_interface_base() = default; }; } ================================================ FILE: valgrind/bluzelle.supp ================================================ { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZZN3bzn5audit5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5audit5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIZN3bzn5audit5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_ fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZZN3bzn5audit5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5audit5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZZN3bzn5audit5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5audit5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIZN3bzn5audit5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_ fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZZN3bzn5audit5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5audit5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIZN3bzn5audit5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_ fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIZN3bzn5audit5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf6StructC1Ev obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZZN3bzn5audit5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5audit5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto12InitDefaultsEv fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn15bootstrap_peers21fetch_peers_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN42bootstrap_file_test_test_invalid_json_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn15bootstrap_peers21fetch_peers_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN42bootstrap_file_test_test_invalid_json_Test8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn15bootstrap_peers21fetch_peers_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN42bootstrap_file_test_test_invalid_json_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn15bootstrap_peers21fetch_peers_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN42bootstrap_file_test_test_invalid_json_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn15bootstrap_peers21fetch_peers_from_fileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN42bootstrap_file_test_test_invalid_json_Test8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:re_node_set_alloc fun:register_state fun:create_cd_newstate fun:re_acquire_state_context fun:create_initial_state fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:strdup fun:_ZN7testing8internal5posix6StrDupEPKc fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIiEE8allocateERS0_m fun:_ZNSt12_Vector_baseIiSaIiEE11_M_allocateEm fun:_ZNSt6vectorIiSaIiEE17_M_realloc_insertIJiEEEvN9__gnu_cxx17__normal_iteratorIPiS1_EEDpOT_ fun:_ZNSt6vectorIiSaIiEE12emplace_backIJiEEEvDpOT_ fun:_ZNSt6vectorIiSaIiEE9push_backEOi fun:_ZN7testing8TestCase11AddTestInfoEPNS_8TestInfoE fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:re_node_set_alloc fun:calc_eclosure_iter fun:calc_eclosure fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:re_node_set_alloc fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:re_node_set_alloc fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal12UnitTestImplC1EPNS_8UnitTestE fun:_ZN7testing8UnitTestC1Ev fun:_ZN7testing8UnitTest11GetInstanceEv fun:_ZN7testing8internal15GetUnitTestImplEv fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal11ThreadLocalISt6vectorINS0_9TraceInfoESaIS3_EEEC1Ev fun:_ZN7testing8internal12UnitTestImplC1EPNS_8UnitTestE fun:_ZN7testing8UnitTestC1Ev fun:_ZN7testing8UnitTest11GetInstanceEv fun:_ZN7testing8internal15GetUnitTestImplEv fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIPN7testing17TestEventListenerEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIPN7testing17TestEventListenerEEE8allocateERS3_m fun:_ZNSt12_Vector_baseIPN7testing17TestEventListenerESaIS2_EE11_M_allocateEm fun:_ZNSt6vectorIPN7testing17TestEventListenerESaIS2_EE17_M_realloc_insertIJRKS2_EEEvN9__gnu_cxx17__normal_iteratorIPS2_S4_EEDpOT_ fun:_ZNSt6vectorIPN7testing17TestEventListenerESaIS2_EE9push_backERKS2_ fun:_ZN7testing8internal17TestEventRepeater6AppendEPNS_17TestEventListenerE fun:_ZN7testing18TestEventListeners6AppendEPNS_17TestEventListenerE fun:_ZN7testing18TestEventListeners23SetDefaultResultPrinterEPNS_17TestEventListenerE fun:_ZN7testing8internal12UnitTestImplC1EPNS_8UnitTestE fun:_ZN7testing8UnitTestC1Ev fun:_ZN7testing8UnitTest11GetInstanceEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIPN7testing8TestInfoEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIPN7testing8TestInfoEEE8allocateERS3_m fun:_ZNSt12_Vector_baseIPN7testing8TestInfoESaIS2_EE11_M_allocateEm fun:_ZNSt6vectorIPN7testing8TestInfoESaIS2_EE17_M_realloc_insertIJRKS2_EEEvN9__gnu_cxx17__normal_iteratorIPS2_S4_EEDpOT_ fun:_ZNSt6vectorIPN7testing8TestInfoESaIS2_EE9push_backERKS2_ fun:_ZN7testing8TestCase11AddTestInfoEPNS_8TestInfoE fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIiE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIiEE8allocateERS0_m fun:_ZNSt12_Vector_baseIiSaIiEE11_M_allocateEm fun:_ZNSt6vectorIiSaIiEE17_M_realloc_insertIJiEEEvN9__gnu_cxx17__normal_iteratorIPiS1_EEDpOT_ fun:_ZNSt6vectorIiSaIiEE12emplace_backIJiEEEvDpOT_ fun:_ZNSt6vectorIiSaIiEE9push_backEOi fun:_ZN7testing8internal12UnitTestImpl11GetTestCaseEPKcS3_PFvvES5_ fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal11ThreadLocalIPNS_8SequenceEEC1Ev fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN7testing11Cardinality25DescribeActualCallCountToEiPSo fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal12UnitTestImpl21os_stack_trace_getterEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv fun:_Z13RUN_ALL_TESTSv fun:main } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing1AIRKSt5tupleIJEEEENS_7MatcherIT_EEv fun:_ZN7testing8internal16TypedExpectationIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEEC1EPNS0_18FunctionMockerBaseIS9_EEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing1AISt8functionIFvRKN5boost6system10error_codeEEEEENS_7MatcherIT_EEv fun:_ZNK7testing8internal15AnythingMatchercvNS_7MatcherIT_EEISt8functionIFvRKN5boost6system10error_codeEEEEEv fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing1AIRKSt5tupleIJSt8functionIFvRKN5boost6system10error_codeEEEEEEENS_7MatcherIT_EEv fun:_ZN7testing8internal16TypedExpectationIFvSt8functionIFvRKN5boost6system10error_codeEEEEEC1EPNS0_18FunctionMockerBaseISA_EEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorImE8allocateEmPKv fun:_ZNSt16allocator_traitsISaImEE8allocateERS0_m fun:_ZNSt13_Bvector_baseISaIbEE11_M_allocateEm fun:_ZNSt6vectorIbSaIbEE13_M_initializeEm fun:_ZNSt6vectorIbSaIbEEC1ERKS1_ fun:_ZN5boost15program_options19options_descriptionC1ERKS1_ fun:_ZN5boost15program_options19options_description3addERKS1_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorImE8allocateEmPKv fun:_ZNSt16allocator_traitsISaImEE8allocateERS0_m fun:_ZNSt13_Bvector_baseISaIbEE11_M_allocateEm fun:_ZNSt6vectorIbSaIbEE13_M_insert_auxESt13_Bit_iteratorb fun:_ZNSt6vectorIbSaIbEE9push_backEb fun:_ZN5boost15program_options19options_description3addENS_10shared_ptrINS0_18option_descriptionEEE fun:_ZN5boost15program_options19options_description3addERKS1_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix4core3getEv fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE13init_instanceEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5chaos17start_crash_timerEv fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_ fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5chaos17start_crash_timerEv fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux12_GLOBAL__N_120stream_compound_poolIcE3getEv fun:_ZN5boost3log12v2s_mt_posix3aux15stream_providerIcE17allocate_compoundERNS1_6recordE fun:_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC1ERS8_RNS1_6recordE fun:make_record_pump > fun:_ZN3bzn5chaos17start_crash_timerEv fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_ fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:re_node_set_alloc fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:re_node_set_init_1 fun:link_nfa_nodes fun:preorder fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:re_node_set_init_copy fun:create_cd_newstate fun:re_acquire_state_context fun:create_initial_state fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:re_node_set_alloc fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:re_node_set_init_1 fun:re_node_set_insert fun:duplicate_node_closure fun:calc_eclosure_iter fun:calc_eclosure fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal11ThreadLocalIPNS_31TestPartResultReporterInterfaceEEC1ERKS3_ fun:_ZN7testing8internal12UnitTestImplC1EPNS_8UnitTestE fun:_ZN7testing8UnitTestC1Ev fun:_ZN7testing8UnitTest11GetInstanceEv fun:_ZN7testing8internal15GetUnitTestImplEv fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIPN7testing8TestCaseEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIPN7testing8TestCaseEEE8allocateERS3_m fun:_ZNSt12_Vector_baseIPN7testing8TestCaseESaIS2_EE11_M_allocateEm fun:_ZNSt6vectorIPN7testing8TestCaseESaIS2_EE17_M_realloc_insertIJRKS2_EEEvN9__gnu_cxx17__normal_iteratorIPS2_S4_EEDpOT_ fun:_ZNSt6vectorIPN7testing8TestCaseESaIS2_EE9push_backERKS2_ fun:_ZN7testing8internal12UnitTestImpl11GetTestCaseEPKcS3_PFvvES5_ fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIN7testing8internal10linked_ptrINS2_15ExpectationBaseEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEEEE8allocateERS5_m fun:_ZNSt12_Vector_baseIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE11_M_allocateEm fun:_ZNSt6vectorIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE17_M_realloc_insertIJRKS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_ fun:_ZNSt6vectorIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE9push_backERKS4_ fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE25DefaultValueHolderFactory13MakeNewHolderEv fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE16GetOrCreateValueEv fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE7pointerEv fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE3getEv fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing7BetweenEii fun:_ZN7testing7AtLeastEi fun:_ZN7testing9AnyNumberEv fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK7testing17PolymorphicActionINS_8internal12InvokeActionIZN10chaos_testC4EvEUlvE_EEEcvNS_6ActionIT_EEIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteISE_EEvEEEv fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal16TypedExpectationIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE8WillOnceERKNS_6ActionIS9_EE fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK7testing17PolymorphicActionINS_8internal12InvokeActionIZN10chaos_testC4EvEUlvE0_EEEcvNS_6ActionIT_EEIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteISE_EEvEEEv fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIPKvE8allocateEmS2_ fun:_ZNSt16allocator_traitsISaIPKvEE8allocateERS2_m fun:_ZNSt12_Vector_baseIPKvSaIS1_EE11_M_allocateEm fun:_ZNSt6vectorIPKvSaIS1_EE17_M_realloc_insertIJS1_EEEvN9__gnu_cxx17__normal_iteratorIPS1_S3_EEDpOT_ fun:_ZNSt6vectorIPKvSaIS1_EE12emplace_backIJS1_EEERS1_DpOT_ fun:_ZNSt6vectorIPKvSaIS1_EE9push_backEOS1_ fun:_ZN7testing8internal16TypedExpectationIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE8WillOnceERKNS_6ActionIS9_EE fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIN7testing8internal10linked_ptrINS2_15ExpectationBaseEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEEEE8allocateERS5_m fun:_ZNSt12_Vector_baseIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE11_M_allocateEm fun:_ZNSt6vectorIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE17_M_realloc_insertIJRKS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_ fun:_ZNSt6vectorIN7testing8internal10linked_ptrINS1_15ExpectationBaseEEESaIS4_EE9push_backERKS4_ fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK7testing17PolymorphicActionINS_8internal12InvokeActionIZN10chaos_testC4EvEUlT_E1_EEEcvNS_6ActionIS4_EEIFvSt8functionIFvRKN5boost6system10error_codeEEEEEEv fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK7testing17PolymorphicActionINS_8internal12InvokeActionIZN10chaos_testC4EvEUlT_E2_EEEcvNS_6ActionIS4_EEIFvSt8functionIFvRKN5boost6system10error_codeEEEEEEv fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost15program_options29options_description_easy_initclEPKcS3_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZSt15allocate_sharedIN3bzn7optionsESaIS1_EJEESt10shared_ptrIT_ERKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3anyC1ItEERKT_ fun:_ZN5boost15program_options11typed_valueItcE13default_valueERKt fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3anyC1IbEERKT_ fun:_ZN5boost15program_options11typed_valueIbcE13default_valueERKb fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3anyC1ImEERKT_ fun:_ZN5boost15program_options11typed_valueImcE13default_valueERKm fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3anyC1IdEERKT_ fun:_ZN5boost15program_options11typed_valueIdcE13default_valueERKd fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3anyC1IjEERKT_ fun:_ZN5boost15program_options11typed_valueIjcE13default_valueERKj fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3anyC1IbEEOT_PNS_10disable_ifINS_7is_sameIRS0_S2_EEvE4typeEPNS4_INS_8is_constIS2_EEvE4typeE fun:_ZN5boost15program_options8validateERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS9_EEPbi fun:_ZNK5boost15program_options11typed_valueIbcE6xparseERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EE fun:_ZNK5boost15program_options29value_semantic_codecvt_helperIcE5parseERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEb fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK5boost3any6holderItE5cloneEv fun:_ZN5boost3anyC1ERKS0_ fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK5boost3any6holderIjE5cloneEv fun:_ZN5boost3anyC1ERKS0_ fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:_ZN5boost3log12v2s_mt_posix3aux19stateless_allocatorIhE8allocateEmPKv fun:_ZN5boost3log12v2s_mt_posix9attribute4implnwEm fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEEC1Ev fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_7sources3aux16logger_singletonINS1_7trivial6loggerEEENS_10shared_ptrINS5_13logger_holderINS4_18severity_logger_mtINS7_14severity_levelEEEEEEEE3getEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5chaos17start_crash_timerEv fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_ } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:create_cd_newstate fun:re_acquire_state_context fun:create_initial_state fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:realloc fun:register_state fun:create_cd_newstate fun:re_acquire_state_context fun:create_initial_state fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_ fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_ fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN3bzn5chaosC2ESt10shared_ptrINS_4asio15io_context_baseEES1_INS_12options_baseEE fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_ fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN3bzn7options18parse_command_lineEiPPKc fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_ fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN3bzn14simple_optionsC2Ev fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_ fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_ fun:_ZN5boost15program_options29options_description_easy_initclEPKcPKNS0_14value_semanticES3_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZN5boost15program_options19options_descriptionC1ERKS1_ fun:_ZN5boost15program_options19options_description3addERKS1_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZN5boost15program_options19options_descriptionC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjj fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZN7testing8TestInfoC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_PKcSA_NS_8internal12CodeLocationEPKvPNSB_15TestFactoryBaseE fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_ fun:_ZN7testing8TestCaseC1EPKcS2_PFvvES4_ fun:_ZN7testing8internal12UnitTestImpl11GetTestCaseEPKcS3_PFvvES5_ fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZN5boost3any6holderINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC1ERKS7_ fun:_ZN5boost3anyC1INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEERKT_ fun:_ZN5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcE13default_valueERKS7_ fun:_ZN3bzn14simple_options13build_optionsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_ fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_ fun:_ZN5boost15program_options29options_description_easy_initclEPKcS3_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS_16exception_detail10clone_implINS3_10bad_alloc_EEEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructIKNS_16exception_detail10clone_baseENS2_10clone_implINS2_10bad_alloc_EEEEEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrIKNS_16exception_detail10clone_baseEEC1INS1_10clone_implINS1_10bad_alloc_EEEEEPT_ fun:_ZN5boost16exception_detail27get_static_exception_objectINS0_10bad_alloc_EEENS_13exception_ptrEv fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN5boost6detail16thread_data_baseD2Ev fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS_16exception_detail10clone_implINS3_14bad_exception_EEEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructIKNS_16exception_detail10clone_baseENS2_10clone_implINS2_14bad_exception_EEEEEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrIKNS_16exception_detail10clone_baseEEC1INS1_10clone_implINS1_14bad_exception_EEEEEPT_ fun:_ZN5boost16exception_detail27get_static_exception_objectINS0_14bad_exception_EEENS_13exception_ptrEv fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN5boost6detail16thread_data_baseD2Ev fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1IKNS_15program_options14value_semanticEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructIKNS_15program_options14value_semanticES4_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrIKNS_15program_options14value_semanticEEC1IS3_EEPT_ fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_ fun:_ZN5boost15program_options29options_description_easy_initclEPKcS3_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS_15program_options18option_descriptionEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS_15program_options18option_descriptionES3_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_15program_options18option_descriptionEEC1IS2_EEPT_ fun:_ZN5boost15program_options29options_description_easy_initclEPKcS3_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1IKNS_15program_options14value_semanticEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructIKNS_15program_options14value_semanticES4_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrIKNS_15program_options14value_semanticEEC1IS3_EEPT_ fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_ fun:_ZN5boost15program_options29options_description_easy_initclEPKcPKNS0_14value_semanticES3_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS_15program_options18option_descriptionEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS_15program_options18option_descriptionES3_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_15program_options18option_descriptionEEC1IS2_EEPT_ fun:_ZN5boost15program_options29options_description_easy_initclEPKcPKNS0_14value_semanticES3_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS_15program_options19options_descriptionEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS_15program_options19options_descriptionES3_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_15program_options19options_descriptionEEC1IS2_EEPT_ fun:_ZN5boost15program_options19options_description3addERKS1_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS_3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15namesEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS_3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15namesES7_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15namesEEC1IS6_EEPT_ fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15namesEE5resetIS6_EEvPT_ fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS2_23default_attribute_names12_GLOBAL__N_15namesENS_10shared_ptrIS6_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names3getEv fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names8severityEv fun:_ZN5boost3log12v2s_mt_posix5sinks3aux12default_sinkC1Ev fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix5sinks3aux12default_sinkEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_ fun:_ZN5boost3log12v2s_mt_posix4core14implementationC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS_3log12v2s_mt_posix4coreEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS_3log12v2s_mt_posix4coreES4_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix4coreEEC1IS3_EEPT_ fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix4coreEE5resetIS3_EEvPT_ fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix4core3getEv fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5chaos17start_crash_timerEv fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_ fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5chaos17start_crash_timerEv fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_ fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPKcEEvT_S8_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1EPKcRKS3_ fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN3bzn5utils6crypto13base64_decodeERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt6vectorIhSaIhEE fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS2_23default_attribute_names12_GLOBAL__N_15namesENS_10shared_ptrIS6_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names3getEv fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names8severityEv fun:_ZN5boost3log12v2s_mt_posix5sinks3aux12default_sinkC1Ev fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix5sinks3aux12default_sinkEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_ fun:_ZN5boost3log12v2s_mt_posix4core14implementationC1Ev fun:_ZN5boost3log12v2s_mt_posix4coreC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix4core3getEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7reserveEm fun:_ZN7testing8internal20StringStreamToStringEPNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE fun:_ZNK7testing7Message9GetStringB5cxx11Ev fun:_ZN7testing8internal18StreamableToStringIPcEENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKT_ fun:_ZN7testing8internal18InitGoogleTestImplIcEEvPiPPT_ fun:_ZN7testing14InitGoogleTestEPiPPc fun:_ZN7testing8internal18InitGoogleMockImplIcEEvPiPPT_ fun:_ZN7testing14InitGoogleMockEPiPPc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKc fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc fun:_ZN7testing4Mock31RegisterUseByOnCallOrExpectCallEPKvPKci fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_ fun:_ZN10chaos_testC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKc fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc fun:_ZN7testing4Mock31RegisterUseByOnCallOrExpectCallEPKvPKci fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_ fun:_ZN10chaos_testC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_assignERKS4_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSERKS4_ fun:_ZN5boost6detail19copy_converter_implINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_E11try_convertIRKS7_EEbOT_RS7_ fun:_ZN5boost10conversion6detail19try_lexical_convertINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_EEbRKT0_RT_ fun:_ZN5boost12lexical_castINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_EET_RKT0_ fun:_ZN5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcE13default_valueERKS7_ fun:_ZN3bzn14simple_options13build_optionsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignEPKc fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSEPKc fun:_ZN7testing8internal14CapturedStreamC1Ei fun:_ZN7testing8internal13CaptureStreamEiPKcPPNS0_14CapturedStreamE fun:_ZN7testing8internal13CaptureStderrEv fun:_ZN7testing8internal15NoExecDeathTest10AssumeRoleEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8allocateERS6_m fun:_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE11_M_allocateEm fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_M_realloc_insertIJS5_EEEvN9__gnu_cxx17__normal_iteratorIPS5_S7_EEDpOT_ fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE12emplace_backIJS5_EEERS5_DpOT_ fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE9push_backEOS5_ fun:_ZN7testing8internal18InitGoogleTestImplIcEEvPiPPT_ fun:_ZN7testing14InitGoogleTestEPiPPc fun:_ZN7testing8internal18InitGoogleMockImplIcEEvPiPPT_ fun:_ZN7testing14InitGoogleMockEPiPPc fun:main } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8allocateERS6_m fun:_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE11_M_allocateEm fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_M_realloc_insertIJRKS5_EEEvN9__gnu_cxx17__normal_iteratorIPS5_S7_EEDpOT_ fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE9push_backERKS5_ fun:_ZN5boost15program_options18option_description9set_namesEPKc fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_ fun:_ZN5boost15program_options29options_description_easy_initclEPKcPKNS0_14value_semanticES3_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux14light_functionIFbRKNS1_19attribute_value_setEEEC1INS1_6filter14default_filterEEEOT_ fun:_ZN5boost3log12v2s_mt_posix6filterC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementationC1Ev fun:_ZN5boost3log12v2s_mt_posix4coreC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix4core3getEv fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIN5boost3log12v2s_mt_posix13attribute_set4nodeEE8allocateEmPKv fun:_ZN5boost3log12v2s_mt_posix14pool_allocatorINS1_13attribute_set4nodeEE8allocateEmPKv fun:_ZN5boost3log12v2s_mt_posix13attribute_set14implementation6insertENS1_14attribute_nameERKNS1_9attributeE fun:_ZN5boost3log12v2s_mt_posix13attribute_set6insertENS1_14attribute_nameERKNS1_9attributeE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE22add_attribute_unlockedERKNS1_14attribute_nameERKNS1_9attributeE fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt14_Function_base13_Base_managerISt5_BindIFMN3bzn5chaosEFvRKN5boost6system10error_codeEESt10shared_ptrIS3_ESt12_PlaceholderILi1EEEEE8_M_cloneERSt9_Any_dataRKSI_St17integral_constantIbLb0EE fun:_ZNSt14_Function_base13_Base_managerISt5_BindIFMN3bzn5chaosEFvRKN5boost6system10error_codeEESt10shared_ptrIS3_ESt12_PlaceholderILi1EEEEE10_M_managerERSt9_Any_dataRKSI_St18_Manager_operation fun:_ZNSt8functionIFvRKN5boost6system10error_codeEEEC1ERKS6_ fun:_ZNSt8functionIFvRKN5boost6system10error_codeEEEaSERKS6_ fun:_ZZN10chaos_testC4EvENKUlT_E1_clISt8functionIFvRKN5boost6system10error_codeEEEEEDaS0_ fun:_ZN7testing8internal12InvokeHelperIvSt5tupleIJSt8functionIFvRKN5boost6system10error_codeEEEEEE6InvokeIZN10chaos_testC4EvEUlT_E1_EEvSF_RKSB_ fun:_ZN7testing8internal12InvokeActionIZN10chaos_testC4EvEUlT_E1_E7PerformIvSt5tupleIJSt8functionIFvRKN5boost6system10error_codeEEEEEEES3_RKT0_ fun:_ZN7testing17PolymorphicActionINS_8internal12InvokeActionIZN10chaos_testC4EvEUlT_E1_EEE15MonomorphicImplIFvSt8functionIFvRKN5boost6system10error_codeEEEEE7PerformERKSt5tupleIJSG_EE fun:_ZNK7testing6ActionIFvSt8functionIFvRKN5boost6system10error_codeEEEEE7PerformERKSt5tupleIJS8_EE fun:_ZN7testing8internal18ActionResultHolderIvE13PerformActionIFvSt8functionIFvRKN5boost6system10error_codeEEEEEEPS2_RKNS_6ActionIT_EERKNS0_8FunctionISF_E13ArgumentTupleE fun:_ZNK7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE20UntypedPerformActionEPKvSD_ } { Memcheck:Leak match-leak-kinds: reachable fun:realloc fun:re_node_set_merge fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:realloc fun:re_node_set_merge fun:calc_eclosure_iter fun:calc_eclosure fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3anyC1IdEEOT_PNS_10disable_ifINS_7is_sameIRS0_S2_EEvE4typeEPNS4_INS_8is_constIS2_EEvE4typeE fun:_ZN5boost15program_options8validateIdcEEvRNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIT0_St11char_traitsIS7_ESaIS7_EEESaISB_EEPT_l fun:_ZNK5boost15program_options11typed_valueIdcE6xparseERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EE fun:_ZNK5boost15program_options29value_semantic_codecvt_helperIcE5parseERNS_3anyERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaISB_EEb fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK5boost3any6holderIdE5cloneEv fun:_ZN5boost3anyC1ERKS0_ fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_EC1IJRS6_EJLm0EEJEJEEERSt5tupleIJDpT_EERSA_IJDpT1_EESt12_Index_tupleIJXspT0_EEESJ_IJXspT2_EEE fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_EC1IJRS6_EJEEESt21piecewise_construct_tSt5tupleIJDpT_EESB_IJDpT0_EE fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_EEE9constructISA_JRKSt21piecewise_construct_tSt5tupleIJRS9_EESH_IJEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_EEEE9constructIS9_JRKSt21piecewise_construct_tSt5tupleIJRS8_EESH_IJEEEEEvRSB_PT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing18TestEventListenersC1Ev fun:_ZN7testing8internal12UnitTestImplC1EPNS_8UnitTestE fun:_ZN7testing8UnitTestC1Ev fun:_ZN7testing8UnitTest11GetInstanceEv fun:_ZN7testing8internal15GetUnitTestImplEv fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_assignERKS4_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSERKS4_ fun:_ZN7testing8internal8FilePath3SetERKS1_ fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeIPN7testing8internal25UntypedFunctionMockerBaseEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeIPN7testing8internal25UntypedFunctionMockerBaseEEEE8allocateERS6_m fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE14_M_create_nodeIJRKS3_EEEPSt13_Rb_tree_nodeIS3_EDpOT_ fun:_ZNKSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE11_Alloc_nodeclIRKS3_EEPSt13_Rb_tree_nodeIS3_EOT_ fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE10_M_insert_IRKS3_NS9_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS3_EPSt18_Rb_tree_node_baseSH_OT_RT0_ fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE16_M_insert_uniqueIRKS3_EESt4pairISt17_Rb_tree_iteratorIS3_EbEOT_ fun:_ZNSt3setIPN7testing8internal25UntypedFunctionMockerBaseESt4lessIS3_ESaIS3_EE6insertERKS3_ fun:_ZN7testing4Mock8RegisterEPKvPNS_8internal25UntypedFunctionMockerBaseE fun:_ZN7testing8internal25UntypedFunctionMockerBase13RegisterOwnerEPKv fun:_ZN3bzn4asio19Mockio_context_base30gmock_make_unique_steady_timerEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3anyC1INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEERKT_ fun:_ZN5boost15program_options11typed_valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEcE13default_valueERKS7_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:realloc fun:re_dfa_add_node fun:duplicate_node fun:duplicate_node_closure fun:calc_eclosure_iter fun:calc_eclosure fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal13CaptureStreamEiPKcPPNS0_14CapturedStreamE fun:_ZN7testing8internal13CaptureStderrEv fun:_ZN7testing8internal15NoExecDeathTest10AssumeRoleEv fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZN5boost3any6holderINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEC1ERKS7_ fun:_ZNK5boost3any6holderINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5cloneEv fun:_ZN5boost3anyC1ERKS0_ fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN7testing8internal12CallReactionEEEE8allocateEmS4_ fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN7testing8internal12CallReactionEEEEE8allocateERSA_m fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEEPSt13_Rb_tree_nodeIS7_EDpOT_ fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEESt17_Rb_tree_iteratorIS7_ESt23_Rb_tree_const_iteratorIS7_EDpOT_ fun:_ZNSt3mapIPKvN7testing8internal12CallReactionESt4lessIS1_ESaISt4pairIKS1_S4_EEEixERS8_ fun:_ZN7testing12_GLOBAL__N_131SetReactionOnUninterestingCallsEPKvNS_8internal12CallReactionE fun:_ZN7testing4Mock23AllowUninterestingCallsEPKv fun:_ZN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEEE9constructIS6_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEEEE9constructIS5_JEEEvRS6_PT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN7testing8internal12CallReactionEEEE8allocateEmS4_ fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN7testing8internal12CallReactionEEEEE8allocateERSA_m fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEEPSt13_Rb_tree_nodeIS7_EDpOT_ fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing8internal12CallReactionEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEESt17_Rb_tree_iteratorIS7_ESt23_Rb_tree_const_iteratorIS7_EDpOT_ fun:_ZNSt3mapIPKvN7testing8internal12CallReactionESt4lessIS1_ESaISt4pairIKS1_S4_EEEixERS8_ fun:_ZN7testing12_GLOBAL__N_131SetReactionOnUninterestingCallsEPKvNS_8internal12CallReactionE fun:_ZN7testing4Mock23AllowUninterestingCallsEPKv fun:_ZN7testing8NiceMockIN3bzn4asio21Mocksteady_timer_baseEEC1Ev fun:_ZSt11make_uniqueIN7testing8NiceMockIN3bzn4asio21Mocksteady_timer_baseEEEJEENSt9_MakeUniqIT_E15__single_objectEDpOT0_ fun:_ZN10chaos_testC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIN5boost10shared_ptrINS1_15program_options18option_descriptionEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIN5boost10shared_ptrINS0_15program_options18option_descriptionEEEEE8allocateERS5_m fun:_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EE11_M_allocateEm fun:_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EE17_M_create_storageEm fun:_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EEC1EmRKS5_ fun:_ZNSt6vectorIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EEC1ERKS6_ fun:_ZN5boost15program_options19options_descriptionC1ERKS1_ fun:_ZN5boost15program_options19options_description3addERKS1_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:init_dfa fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal23DefaultDeathTestFactory6CreateEPKcPKNS0_2REES3_iPPNS0_9DeathTestE fun:_ZN7testing8internal9DeathTest6CreateEPKcPKNS0_2REES3_iPPS1_ fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK5boost3any6holderImE5cloneEv fun:_ZN5boost3anyC1ERKS0_ fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZN7testing8internal12CodeLocationC1ERKS1_ fun:_ZN7testing8TestInfoC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_PKcSA_NS_8internal12CodeLocationEPKvPNSB_15TestFactoryBaseE fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost16exception_detail27get_static_exception_objectINS0_10bad_alloc_EEENS_13exception_ptrEv fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN5boost6detail16thread_data_baseD2Ev fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost16exception_detail27get_static_exception_objectINS0_14bad_exception_EEENS_13exception_ptrEv fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN5boost6detail16thread_data_baseD2Ev fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIPNSt8__detail15_Hash_node_baseEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIPNSt8__detail15_Hash_node_baseEEE8allocateERS3_m fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ELb1EEEEE19_M_allocate_bucketsEm fun:_ZNSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESaIS8_ENSt8__detail10_Select1stESt8equal_toIS5_ESt4hashIS5_ENSA_18_Mod_range_hashingENSA_20_Default_ranged_hashENSA_20_Prime_rehash_policyENSA_17_Hashtable_traitsILb1ELb0ELb1EEEE19_M_allocate_bucketsEm fun:_ZNSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESaIS8_ENSt8__detail10_Select1stESt8equal_toIS5_ESt4hashIS5_ENSA_18_Mod_range_hashingENSA_20_Default_ranged_hashENSA_20_Prime_rehash_policyENSA_17_Hashtable_traitsILb1ELb0ELb1EEEE13_M_rehash_auxEmSt17integral_constantIbLb1EE fun:_ZNSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESaIS8_ENSt8__detail10_Select1stESt8equal_toIS5_ESt4hashIS5_ENSA_18_Mod_range_hashingENSA_20_Default_ranged_hashENSA_20_Prime_rehash_policyENSA_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZNSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESaIS8_ENSt8__detail10_Select1stESt8equal_toIS5_ESt4hashIS5_ENSA_18_Mod_range_hashingENSA_20_Default_ranged_hashENSA_20_Prime_rehash_policyENSA_17_Hashtable_traitsILb1ELb0ELb1EEEE21_M_insert_unique_nodeEmmPNSA_10_Hash_nodeIS8_Lb1EEE fun:_ZNSt8__detail9_Map_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS6_S6_ESaIS9_ENS_10_Select1stESt8equal_toIS6_ESt4hashIS6_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb1ELb0ELb1EEELb1EEixERS8_ fun:_ZNSt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St4hashIS5_ESt8equal_toIS5_ESaISt4pairIKS5_S5_EEEixERSB_ fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKN5boost9typeindex14stl_type_indexENS3_10shared_ptrINS3_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKN5boost9typeindex14stl_type_indexENS2_10shared_ptrINS2_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEEEEEE8allocateERSF_m fun:_ZNSt8_Rb_treeIN5boost9typeindex14stl_type_indexESt4pairIKS2_NS0_10shared_ptrINS0_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEEESt10_Select1stISC_ESt4lessIS2_ESaISC_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIN5boost9typeindex14stl_type_indexESt4pairIKS2_NS0_10shared_ptrINS0_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEEESt10_Select1stISC_ESt4lessIS2_ESaISC_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS4_EESN_IJEEEEEPSt13_Rb_tree_nodeISC_EDpOT_ fun:_ZNSt8_Rb_treeIN5boost9typeindex14stl_type_indexESt4pairIKS2_NS0_10shared_ptrINS0_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEEESt10_Select1stISC_ESt4lessIS2_ESaISC_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS4_EESN_IJEEEEESt17_Rb_tree_iteratorISC_ESt23_Rb_tree_const_iteratorISC_EDpOT_ fun:_ZNSt3mapIN5boost9typeindex14stl_type_indexENS0_10shared_ptrINS0_3log12v2s_mt_posix7sources3aux18logger_holder_baseEEESt4lessIS2_ESaISt4pairIKS2_S9_EEEixERSD_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_7sources3aux16logger_singletonINS1_7trivial6loggerEEENS_10shared_ptrINS5_13logger_holderINS4_18severity_logger_mtINS7_14severity_levelEEEEEEEE3getEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE3getEv fun:_ZN5boost3log12v2s_mt_posix7trivial6logger3getEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7replaceEN9__gnu_cxx17__normal_iteratorIPKcS4_EES9_S8_S8_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignIPKcvEERS4_T_S9_ fun:_ZN5boost6detail27lexical_ostream_limited_srcIcSt11char_traitsIcEErsISaIcEEEbRNSt7__cxx1112basic_stringIcS3_T_EE fun:_ZN5boost6detail22lexical_converter_implINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdE11try_convertERKdRS7_ fun:_ZN5boost10conversion6detail19try_lexical_convertINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEdEEbRKT0_RT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_assignERKS4_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6assignERKS4_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEaSERKS4_ fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8allocateERS6_m fun:_ZNSt12_Vector_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE11_M_allocateEm fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_M_realloc_insertIJRKS5_EEEvN9__gnu_cxx17__normal_iteratorIPS5_S7_EEDpOT_ fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE9push_backERKS5_ fun:_ZN5boost15program_options18option_description9set_namesEPKc fun:_ZN5boost15program_options18option_descriptionC1EPKcPKNS0_14value_semanticES3_ fun:_ZN5boost15program_options29options_description_easy_initclEPKcS3_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIPN5boost3log12v2s_mt_posix14attribute_name10repository4nodeEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIPN5boost3log12v2s_mt_posix14attribute_name10repository4nodeEEE8allocateERS7_m fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EE15_M_allocate_mapEm fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EE17_M_initialize_mapEm fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EEC1Ev fun:_ZNSt5dequeIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EEC1Ev fun:_ZN5boost3log12v2s_mt_posix14attribute_name10repositoryC1Ev fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix14attribute_name10repositoryEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_ fun:_ZN5boost3log12v2s_mt_posix14attribute_name10repository13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix14attribute_name18get_id_from_stringEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN5boost6detail13tss_data_nodeEEEE8allocateEmS4_ fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN5boost6detail13tss_data_nodeEEEEE8allocateERSA_m fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJS2_IS1_S6_EEEEPSt13_Rb_tree_nodeIS7_EDpOT_ fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE17_M_emplace_uniqueIJS2_IS1_S6_EEEES2_ISt17_Rb_tree_iteratorIS7_EbEDpOT_ fun:_ZNSt3mapIPKvN5boost6detail13tss_data_nodeESt4lessIS1_ESaISt4pairIKS1_S4_EEE6insertIS7_IS1_S4_EEENSt9enable_ifIXsrSt16is_constructibleIS9_JT_EE5valueES7_ISt17_Rb_tree_iteratorIS9_EbEE4typeEOSG_ fun:_ZN5boost6detail16add_new_tss_nodeEPKvPFvPFvPvES3_ES5_S3_ fun:_ZN5boost6detail12set_tss_dataEPKvPFvPFvPvES3_ES5_S3_b fun:_ZN5boost19thread_specific_ptrINS_3log12v2s_mt_posix4core14implementation11thread_dataEE5resetEPS5_ fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN5boost6detail13tss_data_nodeEEEE8allocateEmS4_ fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN5boost6detail13tss_data_nodeEEEEE8allocateERSA_m fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJS2_IS1_S6_EEEEPSt13_Rb_tree_nodeIS7_EDpOT_ fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N5boost6detail13tss_data_nodeEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE17_M_emplace_uniqueIJS2_IS1_S6_EEEES2_ISt17_Rb_tree_iteratorIS7_EbEDpOT_ fun:_ZNSt3mapIPKvN5boost6detail13tss_data_nodeESt4lessIS1_ESaISt4pairIKS1_S4_EEE6insertIS7_IS1_S4_EEENSt9enable_ifIXsrSt16is_constructibleIS9_JT_EE5valueES7_ISt17_Rb_tree_iteratorIS9_EbEE4typeEOSG_ fun:_ZN5boost6detail16add_new_tss_nodeEPKvPFvPFvPvES3_ES5_S3_ fun:_ZN5boost6detail12set_tss_dataEPKvPFvPFvPvES3_ES5_S3_b fun:_ZN5boost19thread_specific_ptrINS_3log12v2s_mt_posix3aux12_GLOBAL__N_120stream_compound_poolIcEEE5resetEPS6_ fun:_ZN5boost3log12v2s_mt_posix3aux12_GLOBAL__N_120stream_compound_poolIcE3getEv fun:_ZN5boost3log12v2s_mt_posix3aux15stream_providerIcE17allocate_compoundERNS1_6recordE } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:init_dfa fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZN7testing8internal15ExpectationBaseC1EPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN7testing8internal16TypedExpectationIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEEC1EPNS0_18FunctionMockerBaseIS9_EEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_ } { Memcheck:Leak match-leak-kinds: reachable fun:realloc fun:re_node_set_merge fun:calc_eclosure_iter fun:calc_eclosure_iter fun:calc_eclosure fun:analyze fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_EC1IJRS6_EJLm0EEJEJEEERSt5tupleIJDpT_EERSA_IJDpT1_EESt12_Index_tupleIJXspT0_EEESJ_IJXspT2_EEE fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_EC1IJRS6_EJEEESt21piecewise_construct_tSt5tupleIJDpT_EESB_IJDpT0_EE fun:_ZN9__gnu_cxx13new_allocatorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_EE9constructIS9_JRKSt21piecewise_construct_tSt5tupleIJRS8_EESF_IJEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_EEE9constructIS8_JRKSt21piecewise_construct_tSt5tupleIJRS7_EESF_IJEEEEEvRS9_PT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE9constructIS7_JRKS7_EEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEE9constructIS6_JRKS6_EEEvRS8_PT_DpOT0_ fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE17_M_construct_nodeIJRKS5_EEEvPSt13_Rb_tree_nodeIS5_EDpOT_ fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE14_M_create_nodeIJRKS5_EEEPSt13_Rb_tree_nodeIS5_EDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorINSt8__detail10_Hash_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_ELb1EEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaINSt8__detail10_Hash_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ELb1EEEEE8allocateERSC_m fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ELb1EEEEE16_M_allocate_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS9_EESI_IJEEEEEPSB_DpOT_ fun:_ZNSt8__detail9_Map_baseINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS6_S6_ESaIS9_ENS_10_Select1stESt8equal_toIS6_ESt4hashIS6_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb1ELb0ELb1EEELb1EEixERS8_ fun:_ZNSt13unordered_mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St4hashIS5_ESt8equal_toIS5_ESaISt4pairIKS5_S5_EEEixERSB_ fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeIPN7testing8internal25UntypedFunctionMockerBaseEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeIPN7testing8internal25UntypedFunctionMockerBaseEEEE8allocateERS6_m fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE14_M_create_nodeIJRKS3_EEEPSt13_Rb_tree_nodeIS3_EDpOT_ fun:_ZNKSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE11_Alloc_nodeclIRKS3_EEPSt13_Rb_tree_nodeIS3_EOT_ fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE10_M_insert_IRKS3_NS9_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS3_EPSt18_Rb_tree_node_baseSH_OT_RT0_ fun:_ZNSt8_Rb_treeIPN7testing8internal25UntypedFunctionMockerBaseES3_St9_IdentityIS3_ESt4lessIS3_ESaIS3_EE16_M_insert_uniqueIRKS3_EESt4pairISt17_Rb_tree_iteratorIS3_EbEOT_ fun:_ZNSt3setIPN7testing8internal25UntypedFunctionMockerBaseESt4lessIS3_ESaIS3_EE6insertERKS3_ fun:_ZN7testing4Mock8RegisterEPKvPNS_8internal25UntypedFunctionMockerBaseE fun:_ZN7testing8internal25UntypedFunctionMockerBase13RegisterOwnerEPKv fun:_ZN3bzn4asio21Mocksteady_timer_base16gmock_async_waitERKN7testing7MatcherISt8functionIFvRKN5boost6system10error_codeEEEEE } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:create_cd_newstate fun:re_acquire_state_context fun:create_initial_state fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1IPNS_3log12v2s_mt_posix5sinks3aux12default_sinkENS0_13sp_ms_deleterIS7_EEEET_NS0_14sp_inplace_tagIT0_EE fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix5sinks3aux12default_sinkEEC1IS5_NS_6detail14sp_inplace_tagINS8_13sp_ms_deleterIS5_EEEEEEPT_T0_ fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix5sinks3aux12default_sinkEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_ fun:_ZN5boost3log12v2s_mt_posix4core14implementationC1Ev fun:_ZN5boost3log12v2s_mt_posix4coreC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix4core3getEv fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZN7testing8internal15ExpectationBaseC1EPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN7testing8internal16TypedExpectationIFvSt8functionIFvRKN5boost6system10error_codeEEEEEC1EPNS0_18FunctionMockerBaseISA_EEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost15program_options29options_description_easy_initclEPKcPKNS0_14value_semanticES3_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZSt15allocate_sharedIN3bzn7optionsESaIS1_EJEESt10shared_ptrIT_ERKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost15program_options19options_description3addERKS1_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZSt15allocate_sharedIN3bzn7optionsESaIS1_EJEESt10shared_ptrIT_ERKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIN5boost10shared_ptrINS1_15program_options19options_descriptionEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIN5boost10shared_ptrINS0_15program_options19options_descriptionEEEEE8allocateERS5_m fun:_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_15program_options19options_descriptionEEESaIS4_EE11_M_allocateEm fun:_ZNSt6vectorIN5boost10shared_ptrINS0_15program_options19options_descriptionEEESaIS4_EE17_M_realloc_insertIJRKS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_ fun:_ZNSt6vectorIN5boost10shared_ptrINS0_15program_options19options_descriptionEEESaIS4_EE9push_backERKS4_ fun:_ZN5boost15program_options19options_description3addERKS1_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix4coreC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix4core3getEv fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK5boost3any6holderIbE5cloneEv fun:_ZN5boost3anyC1ERKS0_ fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv fun:_Z13RUN_ALL_TESTSv fun:main } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1IPNS_3log12v2s_mt_posix7sources3aux13logger_holderINS5_18severity_logger_mtINS4_7trivial14severity_levelEEEEENS0_13sp_ms_deleterISC_EEEET_NS0_14sp_inplace_tagIT0_EE fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix7sources3aux13logger_holderINS3_18severity_logger_mtINS2_7trivial14severity_levelEEEEEEC1ISA_NS_6detail14sp_inplace_tagINSD_13sp_ms_deleterISA_EEEEEEPT_T0_ fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix7sources3aux13logger_holderINS3_18severity_logger_mtINS2_7trivial14severity_levelEEEEEJPKcjS9_EEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_7sources3aux16logger_singletonINS1_7trivial6loggerEEENS_10shared_ptrINS5_13logger_holderINS4_18severity_logger_mtINS7_14severity_levelEEEEEEEE3getEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE3getEv fun:_ZN5boost3log12v2s_mt_posix7trivial6logger3getEv fun:_ZN3bzn5chaos17start_crash_timerEv fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN7testing12_GLOBAL__N_115MockObjectStateEEEE8allocateEmS4_ fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN7testing12_GLOBAL__N_115MockObjectStateEEEEE8allocateERSA_m fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEEPSt13_Rb_tree_nodeIS7_EDpOT_ fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEESt17_Rb_tree_iteratorIS7_ESt23_Rb_tree_const_iteratorIS7_EDpOT_ fun:_ZNSt3mapIPKvN7testing12_GLOBAL__N_115MockObjectStateESt4lessIS1_ESaISt4pairIKS1_S4_EEEixERS8_ fun:_ZN7testing4Mock8RegisterEPKvPNS_8internal25UntypedFunctionMockerBaseE fun:_ZN7testing8internal25UntypedFunctionMockerBase13RegisterOwnerEPKv fun:_ZN3bzn4asio19Mockio_context_base30gmock_make_unique_steady_timerEv fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKvN7testing12_GLOBAL__N_115MockObjectStateEEEE8allocateEmS4_ fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKPKvN7testing12_GLOBAL__N_115MockObjectStateEEEEE8allocateERSA_m fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEEPSt13_Rb_tree_nodeIS7_EDpOT_ fun:_ZNSt8_Rb_treeIPKvSt4pairIKS1_N7testing12_GLOBAL__N_115MockObjectStateEESt10_Select1stIS7_ESt4lessIS1_ESaIS7_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESI_IJEEEEESt17_Rb_tree_iteratorIS7_ESt23_Rb_tree_const_iteratorIS7_EDpOT_ fun:_ZNSt3mapIPKvN7testing12_GLOBAL__N_115MockObjectStateESt4lessIS1_ESaISt4pairIKS1_S4_EEEixERS8_ fun:_ZN7testing4Mock8RegisterEPKvPNS_8internal25UntypedFunctionMockerBaseE fun:_ZN7testing8internal25UntypedFunctionMockerBase13RegisterOwnerEPKv fun:_ZN3bzn4asio21Mocksteady_timer_base16gmock_async_waitERKN7testing7MatcherISt8functionIFvRKN5boost6system10error_codeEEEEE fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost15program_options5valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPNS0_11typed_valueIT_cEEPS9_ fun:_ZN5boost15program_options5valueINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEPNS0_11typed_valueIT_cEEv fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost15program_options5valueItEEPNS0_11typed_valueIT_cEEPS3_ fun:_ZN5boost15program_options5valueItEEPNS0_11typed_valueIT_cEEv fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost15program_options5valueIbEEPNS0_11typed_valueIT_cEEPS3_ fun:_ZN5boost15program_options5valueIbEEPNS0_11typed_valueIT_cEEv fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost15program_options5valueImEEPNS0_11typed_valueIT_cEEPS3_ fun:_ZN5boost15program_options5valueImEEPNS0_11typed_valueIT_cEEv fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost15program_options5valueIdEEPNS0_11typed_valueIT_cEEPS3_ fun:_ZN5boost15program_options5valueIdEEPNS0_11typed_valueIT_cEEv fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost15program_options5valueIjEEPNS0_11typed_valueIT_cEEPS3_ fun:_ZN5boost15program_options5valueIjEEPNS0_11typed_valueIT_cEEv fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7optionsEEE9constructIS1_JEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1IPNS_3log12v2s_mt_posix14attribute_name10repositoryENS0_13sp_ms_deleterIS6_EEEET_NS0_14sp_inplace_tagIT0_EE fun:_ZN5boost10shared_ptrINS_3log12v2s_mt_posix14attribute_name10repositoryEEC1IS4_NS_6detail14sp_inplace_tagINS7_13sp_ms_deleterIS4_EEEEEEPT_T0_ fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix14attribute_name10repositoryEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_ fun:_ZN5boost3log12v2s_mt_posix14attribute_name10repository13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix14attribute_name18get_id_from_stringEPKc fun:_ZN5boost3log12v2s_mt_posix14attribute_nameC1EPKc fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15namesC1Ev fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS2_23default_attribute_names12_GLOBAL__N_15namesENS_10shared_ptrIS6_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix3aux23default_attribute_names12_GLOBAL__N_15names3getEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEE8allocateERS8_m fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE14_M_create_nodeIJRKS5_EEEPSt13_Rb_tree_nodeIS5_EDpOT_ fun:_ZNKSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE11_Alloc_nodeclIRKS5_EEPSt13_Rb_tree_nodeIS5_EOT_ fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE10_M_insert_IRKS5_NSB_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS5_EPSt18_Rb_tree_node_baseSJ_OT_RT0_ fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE17_M_insert_unique_IRKS5_NSB_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS5_ESt23_Rb_tree_const_iteratorIS5_EOT_RT0_ fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St9_IdentityIS5_ESt4lessIS5_ESaIS5_EE16_M_insert_uniqueISt23_Rb_tree_const_iteratorIS5_EEEvT_SF_ fun:_ZNSt3setINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4lessIS5_ESaIS5_EE6insertISt23_Rb_tree_const_iteratorIS5_EEEvT_SD_ fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:realloc fun:re_compile_internal fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKcmEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKcmEEEE8allocateERS5_m fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE14_M_create_nodeIJRKS2_EEEPSt13_Rb_tree_nodeIS2_EDpOT_ fun:_ZNKSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_Alloc_nodeclIRKS2_EEPSt13_Rb_tree_nodeIS2_EOT_ fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE10_M_insert_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_EPSt18_Rb_tree_node_baseSG_OT_RT0_ fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE17_M_insert_unique_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EOT_RT0_ fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE16_M_insert_uniqueIPKS2_EEvT_SC_ fun:_ZNSt3mapIcmSt4lessIcESaISt4pairIKcmEEEC1ESt16initializer_listIS4_ERKS1_RKS5_ fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKcmEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKcmEEEE8allocateERS5_m fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE14_M_create_nodeIJRKS2_EEEPSt13_Rb_tree_nodeIS2_EDpOT_ fun:_ZNKSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_Alloc_nodeclIRKS2_EEPSt13_Rb_tree_nodeIS2_EOT_ fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE10_M_insert_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_EPSt18_Rb_tree_node_baseSG_OT_RT0_ fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE17_M_insert_unique_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EOT_RT0_ fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE16_M_insert_uniqueIPKS2_EEvT_SC_ fun:_ZNSt3mapIcmSt4lessIcESaISt4pairIKcmEEEC1ESt16initializer_listIS4_ERKS1_RKS5_ fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN3bzn5chaosC2ESt10shared_ptrINS_4asio15io_context_baseEES1_INS_12options_baseEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKcmEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKcmEEEE8allocateERS5_m fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE14_M_create_nodeIJRKS2_EEEPSt13_Rb_tree_nodeIS2_EDpOT_ fun:_ZNKSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE11_Alloc_nodeclIRKS2_EEPSt13_Rb_tree_nodeIS2_EOT_ fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE10_M_insert_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_EPSt18_Rb_tree_node_baseSG_OT_RT0_ fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE17_M_insert_unique_IRKS2_NS8_11_Alloc_nodeEEESt17_Rb_tree_iteratorIS2_ESt23_Rb_tree_const_iteratorIS2_EOT_RT0_ fun:_ZNSt8_Rb_treeIcSt4pairIKcmESt10_Select1stIS2_ESt4lessIcESaIS2_EE16_M_insert_uniqueIPKS2_EEvT_SC_ fun:_ZNSt3mapIcmSt4lessIcESaISt4pairIKcmEEEC1ESt16initializer_listIS4_ERKS1_RKS5_ fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN3bzn7options18parse_command_lineEiPPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal12UnitTestImpl11GetTestCaseEPKcS3_PFvvES5_ fun:_ZN7testing8internal12UnitTestImpl11AddTestInfoEPFvvES3_PNS_8TestInfoE fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing4TestC1Ev fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:malloc fun:regcomp fun:_ZN7testing8internal2RE4InitEPKc fun:_ZN7testing8internal2REC1EPKc fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal18FunctionMockerBaseIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE fun:_ZN7testing8internal8MockSpecIFSt10unique_ptrIN3bzn4asio17steady_timer_baseESt14default_deleteIS5_EEvEE18InternalExpectedAtEPKciSC_SC_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEEEE8allocateERSE_m fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_N5boost15program_options14variable_valueEESt10_Select1stISB_ESt4lessIS5_ESaISB_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_N5boost15program_options14variable_valueEESt10_Select1stISB_ESt4lessIS5_ESaISB_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS7_EESM_IJEEEEEPSt13_Rb_tree_nodeISB_EDpOT_ fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_N5boost15program_options14variable_valueEESt10_Select1stISB_ESt4lessIS5_ESaISB_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS7_EESM_IJEEEEESt17_Rb_tree_iteratorISB_ESt23_Rb_tree_const_iteratorISB_EDpOT_ fun:_ZNSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueESt4lessIS5_ESaISt4pairIKS5_S8_EEEixERSC_ fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5chaos17start_crash_timerEv fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNK5boost3any6holderINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE5cloneEv fun:_ZN5boost3anyC1ERKS0_ fun:_ZN5boost15program_options14variable_valueC1ERKNS_3anyEb fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEC1IJRS6_EJLm0EEJEJEEERSt5tupleIJDpT_EERSD_IJDpT1_EESt12_Index_tupleIJXspT0_EEESM_IJXspT2_EEE fun:_ZNSt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEC1IJRS6_EJEEESt21piecewise_construct_tSt5tupleIJDpT_EESE_IJDpT0_EE fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEEE9constructISD_JRKSt21piecewise_construct_tSt5tupleIJRS9_EESK_IJEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEN5boost15program_options14variable_valueEEEEE9constructISC_JRKSt21piecewise_construct_tSt5tupleIJRS8_EESK_IJEEEEEvRSE_PT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix13attribute_setC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementationC1Ev fun:_ZN5boost3log12v2s_mt_posix4coreC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_4core14implementationENS_10shared_ptrIS4_EEE3getEv fun:_ZN5boost3log12v2s_mt_posix4core3getEv fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix13attribute_setC1Ev fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_EC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources18severity_logger_mtINS1_7trivial14severity_levelEEC1INS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS5_EEEERKT_NS_11enable_if_cIXsrNS_3mpl3or_INS_10is_base_ofINS9_20tagged_argument_baseESG_EENSM_INS9_14empty_arg_listESG_EEN4mpl_5bool_ILb0EEEST_ST_EE5valueENS1_3aux12sfinae_dummyEE4typeE fun:_ZN5boost3log12v2s_mt_posix7trivial6logger16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE16construct_loggerEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14global_storage11get_or_initENS_9typeindex14stl_type_indexEPFNS_10shared_ptrINS3_18logger_holder_baseEEEvE fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_7sources3aux16logger_singletonINS1_7trivial6loggerEEENS_10shared_ptrINS5_13logger_holderINS4_18severity_logger_mtINS7_14severity_levelEEEEEEEE3getEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux16logger_singletonINS1_7trivial6loggerEE3getEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix13attribute_setC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5chaos17start_crash_timerEv fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_EEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt13_Rb_tree_nodeISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES7_EEEE8allocateERSB_m fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESt10_Select1stIS8_ESt4lessIS5_ESaIS8_EE11_M_get_nodeEv fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESt10_Select1stIS8_ESt4lessIS5_ESaIS8_EE14_M_create_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS7_EESJ_IJEEEEEPSt13_Rb_tree_nodeIS8_EDpOT_ fun:_ZNSt8_Rb_treeINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_S5_ESt10_Select1stIS8_ESt4lessIS5_ESaIS8_EE22_M_emplace_hint_uniqueIJRKSt21piecewise_construct_tSt5tupleIJRS7_EESJ_IJEEEEESt17_Rb_tree_iteratorIS8_ESt23_Rb_tree_const_iteratorIS8_EDpOT_ fun:_ZNSt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES5_St4lessIS5_ESaISt4pairIKS5_S5_EEEixERS9_ fun:_ZN5boost15program_options5storeERKNS0_20basic_parsed_optionsIcEERNS0_13variables_mapEb fun:_ZN3bzn14simple_options15combine_optionsEv fun:_ZN3bzn14simple_options3setERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZSt11make_uniqueIN7testing8NiceMockIN3bzn4asio21Mocksteady_timer_baseEEEJEENSt9_MakeUniqIT_E15__single_objectEDpOT0_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_15TestFactoryBaseEPNS_4TestEEET0_PT_MS6_FS5_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux15stream_providerIcE17allocate_compoundERNS1_6recordE fun:_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC1ERS8_RNS1_6recordE fun:make_record_pump > fun:_ZN3bzn5chaos17start_crash_timerEv fun:_ZZN3bzn5chaos5startEvENKUlvE_clEv fun:_ZSt13__invoke_implIvZN3bzn5chaos5startEvEUlvE_JEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIZN3bzn5chaos5startEvEUlvE_JEENSt15__invoke_resultIT_JDpT0_EE4typeEOS4_DpOS5_ fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIZN3bzn5chaos5startEvEUlvE_JEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16_M_construct_auxIPcEEvT_S7_St12__false_type fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_ fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1ERKS4_ fun:_ZN9__gnu_cxx13new_allocatorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE9constructIS6_JRKS6_EEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEE9constructIS5_JRKS5_EEEvRS6_PT_DpOT0_ fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE17_M_realloc_insertIJRKS5_EEEvN9__gnu_cxx17__normal_iteratorIPS5_S7_EEDpOT_ fun:_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE9push_backERKS5_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7testing8UnitTestC1Ev fun:_ZN7testing8UnitTest11GetInstanceEv fun:_ZN7testing8internal15GetUnitTestImplEv fun:_ZN7testing8internal23MakeAndRegisterTestInfoEPKcS2_S2_S2_NS0_12CodeLocationEPKvPFvvES7_PNS0_15TestFactoryBaseE fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeEEE8allocateERS6_m fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EE16_M_allocate_nodeEv fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EE15_M_create_nodesEPPS5_S9_ fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EE17_M_initialize_mapEm fun:_ZNSt11_Deque_baseIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EEC1Ev fun:_ZNSt5dequeIN5boost3log12v2s_mt_posix14attribute_name10repository4nodeESaIS5_EEC1Ev fun:_ZN5boost3log12v2s_mt_posix14attribute_name10repositoryC1Ev fun:_ZN5boost11make_sharedINS_3log12v2s_mt_posix14attribute_name10repositoryEJEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_ fun:_ZN5boost3log12v2s_mt_posix14attribute_name10repository13init_instanceEv fun:_ZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS3_ELNS_12_Lock_policyE2EEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS2_ELN9__gnu_cxx12_Lock_policyE2EEEE8allocateERS7_m fun:_ZSt18__allocate_guardedISaISt23_Sp_counted_ptr_inplaceIN3bzn7optionsESaIS2_ELN9__gnu_cxx12_Lock_policyE2EEEESt15__allocated_ptrIT_ERS9_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7optionsESaIS5_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7optionsELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7optionsEEC1ISaIS1_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZSt15allocate_sharedIN3bzn7optionsESaIS1_EJEESt10shared_ptrIT_ERKT0_DpOT1_ fun:_ZSt11make_sharedIN3bzn7optionsEJEESt10shared_ptrIT_EDpOT0_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt23_Sp_counted_ptr_inplaceIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEESaIS7_ELNS_12_Lock_policyE2EEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt23_Sp_counted_ptr_inplaceIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEESaIS6_ELN9__gnu_cxx12_Lock_policyE2EEEE8allocateERSB_m fun:_ZSt18__allocate_guardedISaISt23_Sp_counted_ptr_inplaceIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEESaIS6_ELN9__gnu_cxx12_Lock_policyE2EEEESt15__allocated_ptrIT_ERSD_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEESaIS9_EJEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS5_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEEEC1ISaIS5_EJEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZSt15allocate_sharedIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEESaIS5_EJEESt10shared_ptrIT_ERKT0_DpOT1_ fun:_ZSt11make_sharedIN7testing8NiceMockIN3bzn4asio19Mockio_context_baseEEEJEESt10shared_ptrIT_EDpOT0_ fun:_ZN10chaos_testC1Ev fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestC1Ev fun:_ZN7testing8internal15TestFactoryImplI59chaos_test_DeathTest_test_crash_scheduled_and_executed_TestE10CreateTestEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIN5boost10shared_ptrINS1_15program_options18option_descriptionEEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIN5boost10shared_ptrINS0_15program_options18option_descriptionEEEEE8allocateERS5_m fun:_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EE11_M_allocateEm fun:_ZNSt6vectorIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EE17_M_realloc_insertIJRKS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_ fun:_ZNSt6vectorIN5boost10shared_ptrINS0_15program_options18option_descriptionEEESaIS4_EE9push_backERKS4_ fun:_ZN5boost15program_options19options_description3addENS_10shared_ptrINS0_18option_descriptionEEE fun:_ZN5boost15program_options19options_description3addERKS1_ fun:_ZN3bzn14simple_options13build_optionsEv fun:_ZN3bzn14simple_optionsC1Ev fun:_ZN3bzn7optionsC1Ev fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7optionsEE9constructIS2_JEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:__new_exitfn fun:__internal_atexit fun:__cxa_atexit fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test10test_info_E fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:__new_exitfn fun:__internal_atexit fun:__cxa_atexit fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN3bzn5chaosC2ESt10shared_ptrINS_4asio15io_context_baseEES1_INS_12options_baseEE fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:__new_exitfn fun:__internal_atexit fun:__cxa_atexit fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN3bzn7options18parse_command_lineEiPPKc fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:__new_exitfn fun:__internal_atexit fun:__cxa_atexit fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN3bzn14simple_optionsC2Ev fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:calloc fun:__new_exitfn fun:__internal_atexit fun:__cxa_atexit fun:_Z41__static_initialization_and_destruction_0ii fun:_GLOBAL__sub_I__ZN7testing8internal17kStackTraceMarkerE fun:__libc_csu_init fun:(below main) } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorISt23_Sp_counted_ptr_inplaceIN3bzn5chaosESaIS3_ELNS_12_Lock_policyE2EEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaISt23_Sp_counted_ptr_inplaceIN3bzn5chaosESaIS2_ELN9__gnu_cxx12_Lock_policyE2EEEE8allocateERS7_m fun:_ZSt18__allocate_guardedISaISt23_Sp_counted_ptr_inplaceIN3bzn5chaosESaIS2_ELN9__gnu_cxx12_Lock_policyE2EEEESt15__allocated_ptrIT_ERS9_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn5chaosESaIS5_EJRSt10shared_ptrINS4_4asio19Mockio_context_baseEERS7_INS4_7optionsEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn5chaosELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJRSt10shared_ptrINS0_4asio19Mockio_context_baseEERS7_INS0_7optionsEEEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn5chaosEEC1ISaIS1_EJRS_INS0_4asio19Mockio_context_baseEERS_INS0_7optionsEEEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZSt15allocate_sharedIN3bzn5chaosESaIS1_EJRSt10shared_ptrINS0_4asio19Mockio_context_baseEERS3_INS0_7optionsEEEES3_IT_ERKT0_DpOT1_ fun:_ZSt11make_sharedIN3bzn5chaosEJRSt10shared_ptrINS0_4asio19Mockio_context_baseEERS2_INS0_7optionsEEEES2_IT_EDpOT0_ fun:_ZN10chaos_test11build_chaosEv fun:_ZN59chaos_test_DeathTest_test_crash_scheduled_and_executed_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn4crud14handle_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12database_msgSt10shared_ptrINS_12session_baseEE fun:_ZN48crud_test_that_create_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn4crud14handle_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12database_msgSt10shared_ptrINS_12session_baseEE fun:_ZN48crud_test_that_create_sends_proper_response_Test8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn4crud14handle_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12database_msgSt10shared_ptrINS_12session_baseEE fun:_ZN48crud_test_that_create_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn4crud14handle_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12database_msgSt10shared_ptrINS_12session_baseEE fun:_ZN48crud_test_that_create_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN46crud_test_that_read_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN46crud_test_that_read_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN63crud_test_that_point_of_contact_read_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN63crud_test_that_point_of_contact_read_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN48crud_test_that_update_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN48crud_test_that_update_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_update7set_keyEPKc fun:_ZN48crud_test_that_update_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_update9set_valueEPKc fun:_ZN48crud_test_that_update_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN65crud_test_that_point_of_contact_update_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN65crud_test_that_point_of_contact_update_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_update7set_keyEPKc fun:_ZN65crud_test_that_point_of_contact_update_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_update9set_valueEPKc fun:_ZN65crud_test_that_point_of_contact_update_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN48crud_test_that_delete_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN48crud_test_that_delete_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN65crud_test_that_point_of_contact_delete_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN65crud_test_that_point_of_contact_delete_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN45crud_test_that_has_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN45crud_test_that_has_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN62crud_test_that_point_of_contact_has_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN62crud_test_that_point_of_contact_has_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN46crud_test_that_keys_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN46crud_test_that_keys_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN63crud_test_that_point_of_contact_keys_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN63crud_test_that_point_of_contact_keys_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN46crud_test_that_size_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN46crud_test_that_size_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create7set_keyEPKc fun:_ZN63crud_test_that_point_of_contact_size_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZN6google8protobuf8internal14ArenaStringPtr10SetNoArenaEPKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEOS8_ fun:_ZN15database_create9set_valueEPKc fun:_ZN63crud_test_that_point_of_contact_size_sends_proper_response_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf6StructC1Ev obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn4crud14handle_requestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERK12database_msgSt10shared_ptrINS_12session_baseEE fun:_ZN48crud_test_that_create_sends_proper_response_Test8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal24OnShutdownDestroyMessageEPKv fun:_ZN25protobuf_database_2eprotoL28InitDefaultsdatabase_requestEv obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN6google8protobuf8internal7InitSCCEPNS1_11SCCInfoBaseE fun:_ZN25protobuf_database_2eproto12InitDefaultsEv fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn6cryptoESaIS5_EJRSt10shared_ptrINS4_12options_baseEERS7_INS4_12mock_monitorEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn6cryptoELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn6cryptoEEC1ISaIS1_EJRS_INS0_12options_baseEERS_INS0_12mock_monitorEEEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn6cryptoESaIS5_EJRSt10shared_ptrINS4_12options_baseEERS7_INS4_12mock_monitorEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf6StructC1Ev obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto12InitDefaultsEv fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN12_GLOBAL__N_113get_api_tokenERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN3bzn68ethereum_test_that_there_is_a_token_balance_for_a_valid_address_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN12_GLOBAL__N_113get_api_tokenERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN3bzn68ethereum_test_that_there_is_a_token_balance_for_a_valid_address_Test8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN12_GLOBAL__N_113get_api_tokenERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN3bzn68ethereum_test_that_there_is_a_token_balance_for_a_valid_address_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN12_GLOBAL__N_113get_api_tokenERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN3bzn68ethereum_test_that_there_is_a_token_balance_for_a_valid_address_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN12_GLOBAL__N_113get_api_tokenERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN3bzn68ethereum_test_that_there_is_a_token_balance_for_a_valid_address_Test8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn7monitorC1ESt10shared_ptrINS_12options_baseEES1_INS_4asio15io_context_baseEES1_INS_17system_clock_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7monitorEE9constructIS2_JRSt10shared_ptrINS1_17mock_options_baseEERS5_INS1_4asio19Mockio_context_baseEERS5_INS1_17mock_system_clockEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7monitorEEE9constructIS1_JRSt10shared_ptrINS0_17mock_options_baseEERS5_INS0_4asio19Mockio_context_baseEERS5_INS0_17mock_system_clockEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7monitorESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_17mock_options_baseEERS7_INS0_4asio19Mockio_context_baseEERS7_INS0_17mock_system_clockEEEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7monitorESaIS5_EJRSt10shared_ptrINS4_17mock_options_baseEERS7_INS4_4asio19Mockio_context_baseEERS7_INS4_17mock_system_clockEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn7monitorELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJRSt10shared_ptrINS0_17mock_options_baseEERS7_INS0_4asio19Mockio_context_baseEERS7_INS0_17mock_system_clockEEEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn7monitorEEC1ISaIS1_EJRS_INS0_17mock_options_baseEERS_INS0_4asio19Mockio_context_baseEERS_INS0_17mock_system_clockEEEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn7monitorC1ESt10shared_ptrINS_12options_baseEES1_INS_4asio15io_context_baseEES1_INS_17system_clock_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7monitorEE9constructIS2_JRSt10shared_ptrINS1_17mock_options_baseEERS5_INS1_4asio19Mockio_context_baseEERS5_INS1_17mock_system_clockEEEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn7monitorC1ESt10shared_ptrINS_12options_baseEES1_INS_4asio15io_context_baseEES1_INS_17system_clock_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7monitorEE9constructIS2_JRSt10shared_ptrINS1_17mock_options_baseEERS5_INS1_4asio19Mockio_context_baseEERS5_INS1_17mock_system_clockEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7monitorEEE9constructIS1_JRSt10shared_ptrINS0_17mock_options_baseEERS5_INS0_4asio19Mockio_context_baseEERS5_INS0_17mock_system_clockEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7monitorESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_17mock_options_baseEERS7_INS0_4asio19Mockio_context_baseEERS7_INS0_17mock_system_clockEEEEES2_DpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn7monitorC1ESt10shared_ptrINS_12options_baseEES1_INS_4asio15io_context_baseEES1_INS_17system_clock_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7monitorEE9constructIS2_JRSt10shared_ptrINS1_17mock_options_baseEERS5_INS1_4asio19Mockio_context_baseEERS5_INS1_17mock_system_clockEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn7monitorEEE9constructIS1_JRSt10shared_ptrINS0_17mock_options_baseEERS5_INS0_4asio19Mockio_context_baseEERS5_INS0_17mock_system_clockEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn7monitorESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_17mock_options_baseEERS7_INS0_4asio19Mockio_context_baseEERS7_INS0_17mock_system_clockEEEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn7monitorESaIS5_EJRSt10shared_ptrINS4_17mock_options_baseEERS7_INS4_4asio19Mockio_context_baseEERS7_INS4_17mock_system_clockEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn7monitorC1ESt10shared_ptrINS_12options_baseEES1_INS_4asio15io_context_baseEES1_INS_17system_clock_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn7monitorEE9constructIS2_JRSt10shared_ptrINS1_17mock_options_baseEERS5_INS1_4asio19Mockio_context_baseEERS5_INS1_17mock_system_clockEEEEEvPT_DpOT0_ } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv fun:_ZN3bzn4asio13smart_mock_io22do_incoming_connectionEm fun:_ZN3bzn47node_test2_test_accept_incoming_connection_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv fun:_ZN3bzn47node_test2_test_accept_incoming_connection_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv fun:_Z13RUN_ALL_TESTSv } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN10node_test2D1Ev fun:_ZN3bzn47node_test2_test_accept_incoming_connection_TestD1Ev fun:_ZN3bzn47node_test2_test_accept_incoming_connection_TestD0Ev fun:_ZN7testing4Test11DeleteSelf_Ev fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv fun:_ZN3bzn40node_test2_test_make_new_connection_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv fun:_Z13RUN_ALL_TESTSv } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN10node_test2D1Ev fun:_ZN3bzn40node_test2_test_make_new_connection_TestD1Ev fun:_ZN3bzn40node_test2_test_make_new_connection_TestD0Ev fun:_ZN7testing4Test11DeleteSelf_Ev fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv fun:_ZN3bzn37node_test2_test_reuse_connection_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv fun:_Z13RUN_ALL_TESTSv } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN10node_test2D1Ev fun:_ZN3bzn37node_test2_test_reuse_connection_TestD1Ev fun:_ZN3bzn37node_test2_test_reuse_connection_TestD0Ev fun:_ZN7testing4Test11DeleteSelf_Ev fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv fun:_ZN3bzn38node_test2_new_session_for_new_ep_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv fun:_Z13RUN_ALL_TESTSv } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN10node_test2D1Ev fun:_ZN3bzn38node_test2_new_session_for_new_ep_TestD1Ev fun:_ZN3bzn38node_test2_new_session_for_new_ep_TestD0Ev fun:_ZN7testing4Test11DeleteSelf_Ev fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv fun:_ZN3bzn41node_test2_test_replace_dead_session_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv fun:_Z13RUN_ALL_TESTSv } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN10node_test2D1Ev fun:_ZN3bzn41node_test2_test_replace_dead_session_TestD1Ev fun:_ZN3bzn41node_test2_test_replace_dead_session_TestD0Ev fun:_ZN7testing4Test11DeleteSelf_Ev fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN13session_test2D1Ev fun:_ZN3bzn63session_test2_session_sets_swarm_id_when_sending_a_message_TestD1Ev fun:_ZN3bzn63session_test2_session_sets_swarm_id_when_sending_a_message_TestD0Ev fun:_ZN7testing4Test11DeleteSelf_Ev fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN13session_test2D1Ev fun:_ZN3bzn60session_test2_message_queued_before_handshake_gets_sent_TestD1Ev fun:_ZN3bzn60session_test2_message_queued_before_handshake_gets_sent_TestD0Ev fun:_ZN7testing4Test11DeleteSelf_Ev fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN13session_test2D1Ev fun:_ZN3bzn46session_test2_idle_timeout_closes_session_TestD1Ev fun:_ZN3bzn46session_test2_idle_timeout_closes_session_TestD0Ev fun:_ZN7testing4Test11DeleteSelf_Ev fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN3bzn56session_test2_no_idle_timeout_when_connect_rejected_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv fun:_Z13RUN_ALL_TESTSv } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN13session_test2D1Ev fun:_ZN3bzn56session_test2_no_idle_timeout_when_connect_rejected_TestD1Ev fun:_ZN3bzn56session_test2_no_idle_timeout_when_connect_rejected_TestD0Ev fun:_ZN7testing4Test11DeleteSelf_Ev fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io17yield_until_clearEv fun:_ZN3bzn71session_test2_additional_shutdown_handlers_can_be_added_to_session_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv fun:_Z13RUN_ALL_TESTSv } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN3bzn71session_test2_additional_shutdown_handlers_can_be_added_to_session_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8UnitTest3RunEv fun:_Z13RUN_ALL_TESTSv } { Memcheck:Cond fun:_ZN3bzn4asio13smart_mock_io8shutdownEv fun:_ZN13session_test2D1Ev fun:_ZN3bzn71session_test2_additional_shutdown_handlers_can_be_added_to_session_TestD1Ev fun:_ZN3bzn71session_test2_additional_shutdown_handlers_can_be_added_to_session_TestD0Ev fun:_ZN7testing4Test11DeleteSelf_Ev fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv fun:_ZN7testing8internal12UnitTestImpl11RunAllTestsEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS0_12UnitTestImplEbEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn4node20register_for_messageEN12bzn_envelope11PayloadCaseESt8functionIFvRKS1_St10shared_ptrINS_12session_baseEEEE fun:_ZN3bzn69node_test_that_registering_message_handler_can_only_be_done_once_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn4node20register_for_messageEN12bzn_envelope11PayloadCaseESt8functionIFvRKS1_St10shared_ptrINS_12session_baseEEEE fun:_ZN3bzn69node_test_that_registering_message_handler_can_only_be_done_once_Test8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorIPN6google8protobuf20FileDescriptorTablesESaIS3_EE17_M_realloc_insertIJRKS3_EEEvN9__gnu_cxx17__normal_iteratorIPS3_S5_EEDpOT_ fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf15UnknownFieldSet16default_instanceEv fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS2_13TextGeneratorE fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS0_2io20ZeroCopyOutputStreamE fun:_ZNK6google8protobuf10TextFormat7Printer13PrintToStringERKNS0_7MessageEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf7Message16ShortDebugStringB5cxx11Ev fun:_ZN3bzn4node21priv_protobuf_handlerERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE fun:_ZN3bzn55node_test_that_wrongly_signed_messages_are_dropped_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn4node20register_for_messageEN12bzn_envelope11PayloadCaseESt8functionIFvRKS1_St10shared_ptrINS_12session_baseEEEE fun:_ZN3bzn69node_test_that_registering_message_handler_can_only_be_done_once_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorISt4pairIPKN6google8protobuf8MetadataES5_ESaIS6_EE17_M_realloc_insertIJS6_EEEvN9__gnu_cxx17__normal_iteratorIPS6_S8_EEDpOT_ fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn4node20register_for_messageEN12bzn_envelope11PayloadCaseESt8functionIFvRKS1_St10shared_ptrINS_12session_baseEEEE fun:_ZN3bzn69node_test_that_registering_message_handler_can_only_be_done_once_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorIN6google8protobuf14DescriptorPool6Tables10CheckPointESaIS4_EE17_M_realloc_insertIJS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_ fun:_ZN6google8protobuf14DescriptorPool6Tables13AddCheckpointEv fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6TablesC1Ev fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf6StructC1Ev obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE25DefaultValueHolderFactory13MakeNewHolderEv fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE16GetOrCreateValueEv fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE7pointerEv fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE3getEv fun:_ZN7testing8internal18FunctionMockerBaseIFvSt8functionIFvRKN5boost6system10error_codeEEEEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJNS_7MatcherIS9_EEEE fun:_ZN7testing8internal8MockSpecIFvSt8functionIFvRKN5boost6system10error_codeEEEEE18InternalExpectedAtEPKciSD_SD_ fun:_ZZN3bzn4asio13smart_mock_ioC4EvENKUlRT_E5_clIN5boost4asio19basic_stream_socketINS7_2ip3tcpENS7_8executorEEEEEDaS3_ fun:_ZN7testing8internal12InvokeHelperISt10unique_ptrIN3bzn5beast21websocket_stream_baseESt14default_deleteIS5_EESt5tupleIJRN5boost4asio19basic_stream_socketINSB_2ip3tcpENSB_8executorEEEEEE6InvokeIZNS3_4asio13smart_mock_ioC4EvEUlRT_E5_EES8_SN_RKSI_ fun:_ZN7testing8internal12InvokeActionIZN3bzn4asio13smart_mock_ioC4EvEUlRT_E5_E7PerformISt10unique_ptrINS2_5beast21websocket_stream_baseESt14default_deleteISC_EESt5tupleIJRN5boost4asio19basic_stream_socketINSI_2ip3tcpENSI_8executorEEEEEEES5_RKT0_ fun:_ZN7testing17PolymorphicActionINS_8internal12InvokeActionIZN3bzn4asio13smart_mock_ioC4EvEUlRT_E5_EEE15MonomorphicImplIFSt10unique_ptrINS3_5beast21websocket_stream_baseESt14default_deleteISE_EERN5boost4asio19basic_stream_socketINSJ_2ip3tcpENSJ_8executorEEEEE7PerformERKSt5tupleIJSP_EE fun:_ZNK7testing6ActionIFSt10unique_ptrIN3bzn5beast21websocket_stream_baseESt14default_deleteIS4_EERN5boost4asio19basic_stream_socketINS9_2ip3tcpENS9_8executorEEEEE7PerformERKSt5tupleIJSF_EE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ } { Memcheck:Leak match-leak-kinds: definite fun:_Znwm fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE25DefaultValueHolderFactory13MakeNewHolderEv fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE16GetOrCreateValueEv fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE7pointerEv fun:_ZNK7testing8internal11ThreadLocalIPNS_8SequenceEE3getEv fun:_ZN7testing8internal18FunctionMockerBaseIFRN5boost4asio19basic_stream_socketINS3_2ip3tcpENS3_8executorEEEvEE17AddNewExpectationEPKciRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt5tupleIJEE fun:_ZN7testing8internal8MockSpecIFRN5boost4asio19basic_stream_socketINS3_2ip3tcpENS3_8executorEEEvEE18InternalExpectedAtEPKciSD_SD_ fun:_ZZN3bzn4asio13smart_mock_ioC4EvENKUlvE3_clEv fun:_ZN7testing8internal12InvokeHelperISt10unique_ptrIN3bzn4asio15tcp_socket_baseESt14default_deleteIS5_EESt5tupleIJEEE6InvokeIZNS4_13smart_mock_ioC4EvEUlvE3_EES8_T_RKSA_ fun:_ZN7testing8internal12InvokeActionIZN3bzn4asio13smart_mock_ioC4EvEUlvE3_E7PerformISt10unique_ptrINS3_15tcp_socket_baseESt14default_deleteIS9_EESt5tupleIJEEEET_RKT0_ fun:_ZN7testing17PolymorphicActionINS_8internal12InvokeActionIZN3bzn4asio13smart_mock_ioC4EvEUlvE3_EEE15MonomorphicImplIFSt10unique_ptrINS4_15tcp_socket_baseESt14default_deleteISB_EEvEE7PerformERKSt5tupleIJEE fun:_ZNK7testing6ActionIFSt10unique_ptrIN3bzn4asio15tcp_socket_baseESt14default_deleteIS4_EEvEE7PerformERKSt5tupleIJEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_N6google8protobuf6SymbolEESaIS7_ENSt8__detail10_Select1stENS5_5streqENS5_4hashIS1_EENS9_18_Mod_range_hashingENS9_20_Default_ranged_hashENS9_20_Prime_rehash_policyENS9_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn4node20register_for_messageEN12bzn_envelope11PayloadCaseESt8functionIFvRKS1_St10shared_ptrINS_12session_baseEEEE fun:_ZN3bzn69node_test_that_registering_message_handler_can_only_be_done_once_Test8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal24OnShutdownDestroyMessageEPKv fun:_ZN25protobuf_database_2eprotoL28InitDefaultsdatabase_requestEv obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN6google8protobuf8internal7InitSCCEPNS1_11SCCInfoBaseE fun:_ZN25protobuf_database_2eproto12InitDefaultsEv fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn25pbft_persistent_operationC1EmmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_12storage_baseEEm fun:_ZN9__gnu_cxx13new_allocatorIN3bzn25pbft_persistent_operationEE9constructIS2_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS1_12storage_baseEEmEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn25pbft_persistent_operationEEE9constructIS1_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn25pbft_persistent_operationESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn25pbft_persistent_operationESaIS5_EJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS4_12storage_baseEEmEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn25pbft_persistent_operationELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn25pbft_persistent_operationEEC1ISaIS1_EJRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERS_INS0_12storage_baseEEmEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn25pbft_persistent_operationC1EmmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_12storage_baseEEm fun:_ZN9__gnu_cxx13new_allocatorIN3bzn25pbft_persistent_operationEE9constructIS2_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS1_12storage_baseEEmEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorIPN6google8protobuf20FileDescriptorTablesESaIS3_EE17_M_realloc_insertIJRKS3_EEEvN9__gnu_cxx17__normal_iteratorIPS3_S5_EEDpOT_ fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn25pbft_persistent_operationC1EmmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_12storage_baseEEm fun:_ZN9__gnu_cxx13new_allocatorIN3bzn25pbft_persistent_operationEE9constructIS2_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS1_12storage_baseEEmEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn25pbft_persistent_operationEEE9constructIS1_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn25pbft_persistent_operationESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEES2_DpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorISt4pairIPKN6google8protobuf8MetadataES5_ESaIS6_EE17_M_realloc_insertIJS6_EEEvN9__gnu_cxx17__normal_iteratorIPS6_S8_EEDpOT_ fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn25pbft_persistent_operationC1EmmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_12storage_baseEEm fun:_ZN9__gnu_cxx13new_allocatorIN3bzn25pbft_persistent_operationEE9constructIS2_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS1_12storage_baseEEmEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn25pbft_persistent_operationEEE9constructIS1_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn25pbft_persistent_operationESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS0_12storage_baseEEmEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn25pbft_persistent_operationESaIS5_EJRmS7_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS4_12storage_baseEEmEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorIN6google8protobuf14DescriptorPool6Tables10CheckPointESaIS4_EE17_M_realloc_insertIJS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_ fun:_ZN6google8protobuf14DescriptorPool6Tables13AddCheckpointEv fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6TablesC1Ev fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf6StructC1Ev obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables20AddEnumValueByNumberEPKNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn25pbft_persistent_operationC1EmmRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrINS_12storage_baseEEm fun:_ZN9__gnu_cxx13new_allocatorIN3bzn25pbft_persistent_operationEE9constructIS2_JRmS5_RNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERSt10shared_ptrINS1_12storage_baseEEmEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables20AddEnumValueByNumberEPKNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_N6google8protobuf6SymbolEESaIS7_ENSt8__detail10_Select1stENS5_5streqENS5_4hashIS1_EENS9_18_Mod_range_hashingENS9_20_Default_ranged_hashENS9_20_Prime_rehash_policyENS9_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal24OnShutdownDestroyMessageEPKv fun:_ZN25protobuf_database_2eprotoL28InitDefaultsdatabase_requestEv obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN6google8protobuf8internal7InitSCCEPNS1_11SCCInfoBaseE fun:_ZN25protobuf_database_2eproto12InitDefaultsEv fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_ fun:_ZNK6google8protobuf8internal26GeneratedMessageReflection6HasBitERKNS0_7MessageEPKNS0_15FieldDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn6cryptoESaIS5_EJRSt10shared_ptrINS4_12options_baseEERS7_INS4_12mock_monitorEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ fun:_ZNSt12__shared_ptrIN3bzn6cryptoELN9__gnu_cxx12_Lock_policyE2EEC1ISaIS1_EJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEESt19_Sp_make_shared_tagRKT_DpOT0_ fun:_ZNSt10shared_ptrIN3bzn6cryptoEEC1ISaIS1_EJRS_INS0_12options_baseEERS_INS0_12mock_monitorEEEEESt19_Sp_make_shared_tagRKT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf15UnknownFieldSet16default_instanceEv fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS2_13TextGeneratorE fun:_ZNK6google8protobuf10TextFormat7Printer10PrintFieldERKNS0_7MessageEPKNS0_10ReflectionEPKNS0_15FieldDescriptorEPNS2_13TextGeneratorE fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS2_13TextGeneratorE fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS0_2io20ZeroCopyOutputStreamE fun:_ZNK6google8protobuf10TextFormat7Printer13PrintToStringERKNS0_7MessageEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf7Message16ShortDebugStringB5cxx11Ev fun:_ZN3bzn4pbft14handle_messageERK8pbft_msgRK12bzn_envelope fun:_ZN3bzn4test47pbft_test_test_preprepare_triggers_prepare_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorIPN6google8protobuf7MessageESaIS3_EE17_M_realloc_insertIJS3_EEEvN9__gnu_cxx17__normal_iteratorIPS3_S5_EEDpOT_ fun:_ZN6google8protobuf17DescriptorBuilder15AllocateOptionsINS0_15FieldDescriptorEEEvRKNT_11OptionsTypeEPS4_i fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn6cryptoEEE9constructIS1_JRSt10shared_ptrINS0_12options_baseEERS5_INS0_12mock_monitorEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn6cryptoESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRSt10shared_ptrINS0_12options_baseEERS7_INS0_12mock_monitorEEEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn6cryptoESaIS5_EJRSt10shared_ptrINS4_12options_baseEERS7_INS4_12mock_monitorEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE8allocateERS9_m fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE16_M_allocate_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESF_IJEEEEEPS8_DpOT_ fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_ fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_ fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE fun:_ZN7rocksdb16ColumnFamilyDataC1EjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_7VersionEPNS_5CacheEPNS_18WriteBufferManagerERKNS_19ColumnFamilyOptionsERKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_15ColumnFamilySetE fun:_ZN7rocksdb15ColumnFamilySetC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_5CacheEPNS_18WriteBufferManagerEPNS_15WriteControllerE fun:_ZN7rocksdb10VersionSetC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_5CacheEPNS_18WriteBufferManagerEPNS_15WriteControllerE fun:_ZN7rocksdb6DBImplC1ERKNS_9DBOptionsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIPNSt8__detail15_Hash_node_baseEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIPNSt8__detail15_Hash_node_baseEEE8allocateERS3_m fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE19_M_allocate_bucketsEm fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE19_M_allocate_bucketsEm fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE13_M_rehash_auxEmSt17integral_constantIbLb1EE fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE21_M_insert_unique_nodeEmmPNS7_10_Hash_nodeIS5_Lb0EEE fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_ fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_ fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE8allocateERS9_m fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE16_M_allocate_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESF_IJEEEEEPS8_DpOT_ fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_ fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_ fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE fun:_ZN7rocksdb16ColumnFamilyDataC1EjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_7VersionEPNS_5CacheEPNS_18WriteBufferManagerERKNS_19ColumnFamilyOptionsERKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_15ColumnFamilySetE fun:_ZN7rocksdb15ColumnFamilySet18CreateColumnFamilyERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjPNS_7VersionERKNS_19ColumnFamilyOptionsE fun:_ZN7rocksdb10VersionSet18CreateColumnFamilyERKNS_19ColumnFamilyOptionsEPNS_11VersionEditE fun:_ZN7rocksdb10VersionSet7RecoverERKSt6vectorINS_22ColumnFamilyDescriptorESaIS2_EEb } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorIN6google8protobuf14DescriptorPool6Tables10CheckPointESaIS4_EE17_M_realloc_insertIJS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_ fun:_ZN6google8protobuf14DescriptorPool6Tables13AddCheckpointEv fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_ fun:_ZNK6google8protobuf8internal26GeneratedMessageReflection6HasBitERKNS0_7MessageEPKNS0_15FieldDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_ fun:_ZNK6google8protobuf8internal26GeneratedMessageReflection6HasBitERKNS0_7MessageEPKNS0_15FieldDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorIPN6google8protobuf20FileDescriptorTablesESaIS3_EE17_M_realloc_insertIJRKS3_EEEvN9__gnu_cxx17__normal_iteratorIPS3_S5_EEDpOT_ fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6TablesC1Ev fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf6StructC1Ev obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorISt4pairIPKN6google8protobuf8MetadataES5_ESaIS6_EE17_M_realloc_insertIJS6_EEEvN9__gnu_cxx17__normal_iteratorIPS6_S8_EEDpOT_ fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_bluzelle_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf17DescriptorBuilder15AllocateOptionsINS0_15FieldDescriptorEEEvRKNT_11OptionsTypeEPS4_i fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder10BuildOneofERKNS0_20OneofDescriptorProtoEPNS0_10DescriptorEPNS0_15OneofDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIPNSt8__detail15_Hash_node_baseEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIPNSt8__detail15_Hash_node_baseEEE8allocateERS3_m fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeIPN7rocksdb16ThreadStatusDataELb0EEEEE19_M_allocate_bucketsEm fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE19_M_allocate_bucketsEm fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE13_M_rehash_auxEmSt17integral_constantIbLb1EE fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE9_M_rehashEmRKm fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE21_M_insert_unique_nodeEmmPNS4_10_Hash_nodeIS2_Lb0EEE fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE9_M_insertIRKS2_NS4_10_AllocNodeISaINS4_10_Hash_nodeIS2_Lb0EEEEEEEESt4pairINS4_14_Node_iteratorIS2_Lb1ELb0EEEbEOT_RKT0_St17integral_constantIbLb1EE fun:_ZNSt8__detail12_Insert_baseIPN7rocksdb16ThreadStatusDataES3_SaIS3_ENS_9_IdentityESt8equal_toIS3_ESt4hashIS3_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb1ELb1EEEE6insertERKS3_ fun:_ZNSt13unordered_setIPN7rocksdb16ThreadStatusDataESt4hashIS2_ESt8equal_toIS2_ESaIS2_EE6insertERKS2_ fun:_ZN7rocksdb19ThreadStatusUpdater14RegisterThreadENS_12ThreadStatus10ThreadTypeEm } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_ fun:_ZNK6google8protobuf8internal26GeneratedMessageReflection6HasBitERKNS0_7MessageEPKNS0_15FieldDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables20AddEnumValueByNumberEPKNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables20AddEnumValueByNumberEPKNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7rocksdb12_GLOBAL__N_125CreateThreadStatusUpdaterEv fun:_ZN7rocksdb12_GLOBAL__N_18PosixEnvC1Ev fun:_ZN7rocksdb3Env7DefaultEv fun:_ZN7rocksdb9DBOptionsC1Ev fun:_ZN7rocksdb7OptionsC1Ev fun:_ZN3bzn15rocksdb_storage4openEv fun:_ZN3bzn15rocksdb_storageC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_S8_ fun:_ZN9__gnu_cxx13new_allocatorIN3bzn15rocksdb_storageEE9constructIS2_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn15rocksdb_storageEEE9constructIS1_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn15rocksdb_storageESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn15rocksdb_storageESaIS5_EJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7rocksdb14ThreadLocalPtr8InstanceEv fun:_ZN7rocksdb14ThreadLocalPtr14InitSingletonsEv fun:_ZN7rocksdb3Env7DefaultEv fun:_ZN7rocksdb9DBOptionsC1Ev fun:_ZN7rocksdb7OptionsC1Ev fun:_ZN3bzn15rocksdb_storage4openEv fun:_ZN3bzn15rocksdb_storageC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_S8_ fun:_ZN9__gnu_cxx13new_allocatorIN3bzn15rocksdb_storageEE9constructIS2_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn15rocksdb_storageEEE9constructIS1_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn15rocksdb_storageESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn15rocksdb_storageESaIS5_EJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6cryptoC1ESt10shared_ptrINS_12options_baseEES1_INS_12monitor_baseEE fun:_ZN9__gnu_cxx13new_allocatorIN3bzn6cryptoEE9constructIS2_JRSt10shared_ptrINS1_12options_baseEERS5_INS1_12mock_monitorEEEEEvPT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv fun:__pthread_once_slow fun:_ZSt9call_onceIRPFvPKN6google8protobuf15FieldDescriptorEEJRS4_EEvRSt9once_flagOT_DpOT0_ fun:_ZNK6google8protobuf8internal26GeneratedMessageReflection6HasBitERKNS0_7MessageEPKNS0_15FieldDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables20AddEnumValueByNumberEPKNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool31TryFindSymbolInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf14DescriptorPool6Tables16FindByNameHelperEPKS1_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool23CrossLinkOnDemandHelperERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb fun:_ZNK6google8protobuf15FieldDescriptor20InternalTypeOnceInitEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder14BuildEnumValueERKNS0_24EnumValueDescriptorProtoEPKNS0_14EnumDescriptorEPNS0_19EnumValueDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder9BuildEnumERKNS0_19EnumDescriptorProtoEPKNS0_10DescriptorEPNS0_14EnumDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_N6google8protobuf6SymbolEESaIS7_ENSt8__detail10_Select1stENS5_5streqENS5_4hashIS1_EENS9_18_Mod_range_hashingENS9_20_Default_ranged_hashENS9_20_Prime_rehash_policyENS9_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal24OnShutdownDestroyMessageEPKv fun:_ZN25protobuf_database_2eprotoL28InitDefaultsdatabase_requestEv obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN6google8protobuf8internal7InitSCCEPNS1_11SCCInfoBaseE fun:_ZN25protobuf_database_2eproto12InitDefaultsEv fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN21protobuf_pbft_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN25protobuf_database_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables19AllocateOnceDynamicEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_ fun:_ZSt8__invokeIRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEEJRS5_IS1_ES4_S7_EENSt15__invoke_resultIT_JDpT0_EE4typeEOSE_DpOSF_ fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEE6__callIvJS4_OS7_EJLm0ELm1ELm2EEEET_OSt5tupleIJDpT0_EESt12_Index_tupleIJXspT1_EEE fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEEclIJS4_S7_EvEET0_DpOT_ fun:_ZNSt17_Function_handlerIFvRK12bzn_envelopeSt10shared_ptrIN3bzn12session_baseEEESt5_BindIFMNS4_6statusEFvS2_S6_ES3_IS9_ESt12_PlaceholderILi1EESD_ILi2EEEEE9_M_invokeERKSt9_Any_dataS2_OS6_ fun:_ZNKSt8functionIFvRK12bzn_envelopeSt10shared_ptrIN3bzn12session_baseEEEEclES2_S6_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorIPN6google8protobuf20FileDescriptorTablesESaIS3_EE17_M_realloc_insertIJRKS3_EEEvN9__gnu_cxx17__normal_iteratorIPS3_S5_EEDpOT_ fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf15UnknownFieldSet16default_instanceEv fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS2_13TextGeneratorE fun:_ZNK6google8protobuf10TextFormat7Printer5PrintERKNS0_7MessageEPNS0_2io20ZeroCopyOutputStreamE fun:_ZNK6google8protobuf10TextFormat7Printer13PrintToStringERKNS0_7MessageEPNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf7Message11DebugStringB5cxx11Ev fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_ fun:_ZSt8__invokeIRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEEJRS5_IS1_ES4_S7_EENSt15__invoke_resultIT_JDpT0_EE4typeEOSE_DpOSF_ fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEE6__callIvJS4_OS7_EJLm0ELm1ELm2EEEET_OSt5tupleIJDpT0_EESt12_Index_tupleIJXspT1_EEE fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEEclIJS4_S7_EvEET0_DpOT_ fun:_ZNSt17_Function_handlerIFvRK12bzn_envelopeSt10shared_ptrIN3bzn12session_baseEEESt5_BindIFMNS4_6statusEFvS2_S6_ES3_IS9_ESt12_PlaceholderILi1EESD_ILi2EEEEE9_M_invokeERKSt9_Any_dataS2_OS6_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_ fun:_ZSt8__invokeIRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEEJRS5_IS1_ES4_S7_EENSt15__invoke_resultIT_JDpT0_EE4typeEOSE_DpOSF_ fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEE6__callIvJS4_OS7_EJLm0ELm1ELm2EEEET_OSt5tupleIJDpT0_EESt12_Index_tupleIJXspT1_EEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorISt4pairIPKN6google8protobuf8MetadataES5_ESaIS6_EE17_M_realloc_insertIJS6_EEEvN9__gnu_cxx17__normal_iteratorIPS6_S8_EEDpOT_ fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_ fun:_ZSt8__invokeIRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEEJRS5_IS1_ES4_S7_EENSt15__invoke_resultIT_JDpT0_EE4typeEOSE_DpOSF_ fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEE6__callIvJS4_OS7_EJLm0ELm1ELm2EEEET_OSt5tupleIJDpT0_EESt12_Index_tupleIJXspT1_EEE fun:_ZNSt5_BindIFMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEES5_IS1_ESt12_PlaceholderILi1EESB_ILi2EEEEclIJS4_S7_EvEET0_DpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN23protobuf_status_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZNSt6vectorIN6google8protobuf14DescriptorPool6Tables10CheckPointESaIS4_EE17_M_realloc_insertIJS4_EEEvN9__gnu_cxx17__normal_iteratorIPS4_S6_EEDpOT_ fun:_ZN6google8protobuf14DescriptorPool6Tables13AddCheckpointEv fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables7AddFileEPKNS0_14FileDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6TablesC1Ev fun:_ZN6google8protobuf14DescriptorPoolC1EPNS0_18DescriptorDatabaseEPNS1_14ErrorCollectorE fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTablesC1Ev fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf6StructC1Ev obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN23protobuf_status_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_N6google8protobuf6SymbolEESaIS7_ENSt8__detail10_Select1stENS5_5streqENS5_4hashIS1_EENS9_18_Mod_range_hashingENS9_20_Default_ranged_hashENS9_20_Prime_rehash_policyENS9_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool23internal_generated_poolEv fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_appendEPKcm fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_mutateEmmPKcm fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE14_M_replace_auxEmmmc fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN23protobuf_status_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables16AddFieldByNumberEPKNS0_15FieldDescriptorE fun:_ZN6google8protobuf17DescriptorBuilder14CrossLinkFieldEPNS0_15FieldDescriptorERKNS0_20FieldDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder16CrossLinkMessageEPNS0_10DescriptorERKNS0_15DescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13CrossLinkFileEPNS0_14FileDescriptorERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool6Tables14AllocateStringERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf20FileDescriptorTables19AddAliasUnderParentEPKvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKvS9_RKNS0_7MessageENS0_6SymbolE fun:_ZN6google8protobuf17DescriptorBuilder21BuildFieldOrExtensionERKNS0_20FieldDescriptorProtoEPKNS0_10DescriptorEPNS0_15FieldDescriptorEb fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn6status29handle_status_request_messageERK12bzn_envelopeSt10shared_ptrINS_12session_baseEE fun:_ZSt13__invoke_implIvRMN3bzn6statusEFvRK12bzn_envelopeSt10shared_ptrINS0_12session_baseEEERS5_IS1_EJS4_S7_EET_St21__invoke_memfun_derefOT0_OT1_DpOT2_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables18AllocateFileTablesEv fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14DescriptorPool6Tables13AllocateBytesEi fun:_ZN6google8protobuf17DescriptorBuilder12BuildMessageERKNS0_15DescriptorProtoEPKNS0_10DescriptorEPS5_ fun:_ZN6google8protobuf17DescriptorBuilder13BuildFileImplERKNS0_19FileDescriptorProtoE fun:_ZN6google8protobuf17DescriptorBuilder9BuildFileERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool21BuildFileFromDatabaseERKNS0_19FileDescriptorProtoE fun:_ZNK6google8protobuf14DescriptorPool29TryFindFileInFallbackDatabaseERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZNK6google8protobuf14DescriptorPool14FindFileByNameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN6google8protobuf8internal17AssignDescriptorsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS1_15MigrationSchemaEPKPKNS0_7MessageEPKjPNS0_8MetadataEPPKNS0_14EnumDescriptorEPPKNS0_17ServiceDescriptorE fun:_ZN23protobuf_status_2eproto26protobuf_AssignDescriptorsEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto12InitDefaultsEv fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn11mem_storage13load_snapshotERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN30storageTest_test_snapshot_TestIN3bzn11mem_storageEE8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn11mem_storage13load_snapshotERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN30storageTest_test_snapshot_TestIN3bzn11mem_storageEE8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn11mem_storage13load_snapshotERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN30storageTest_test_snapshot_TestIN3bzn11mem_storageEE8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn11mem_storage13load_snapshotERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN30storageTest_test_snapshot_TestIN3bzn11mem_storageEE8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow fun:_ZL14__gthread_oncePiPFvvE fun:_ZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ fun:_ZN6google8protobuf8internal9call_onceIJRSt9once_flagRFvvEEEEvDpOT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf6StructC1Ev obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE8allocateERS9_m fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE16_M_allocate_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESF_IJEEEEEPS8_DpOT_ fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_ fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_ fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE fun:_ZN7rocksdb16ColumnFamilyDataC1EjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_7VersionEPNS_5CacheEPNS_18WriteBufferManagerERKNS_19ColumnFamilyOptionsERKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_15ColumnFamilySetE fun:_ZN7rocksdb15ColumnFamilySetC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_5CacheEPNS_18WriteBufferManagerEPNS_15WriteControllerE fun:_ZN7rocksdb10VersionSetC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_5CacheEPNS_18WriteBufferManagerEPNS_15WriteControllerE fun:_ZN7rocksdb6DBImplC1ERKNS_9DBOptionsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEb } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaINSt8__detail10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE8allocateERS9_m fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE16_M_allocate_nodeIJRKSt21piecewise_construct_tSt5tupleIJRS3_EESF_IJEEEEEPS8_DpOT_ fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_ fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_ fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE fun:_ZN7rocksdb16ColumnFamilyDataC1EjRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEPNS_7VersionEPNS_5CacheEPNS_18WriteBufferManagerERKNS_19ColumnFamilyOptionsERKNS_18ImmutableDBOptionsERKNS_10EnvOptionsEPNS_15ColumnFamilySetE fun:_ZN7rocksdb15ColumnFamilySet18CreateColumnFamilyERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEjPNS_7VersionERKNS_19ColumnFamilyOptionsE fun:_ZN7rocksdb10VersionSet18CreateColumnFamilyERKNS_19ColumnFamilyOptionsEPNS_11VersionEditE fun:_ZN7rocksdb10VersionSet7RecoverERKSt6vectorINS_22ColumnFamilyDescriptorESaIS2_EEb } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIPNSt8__detail15_Hash_node_baseEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIPNSt8__detail15_Hash_node_baseEEE8allocateERS3_m fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeISt4pairIKjPFvPvEELb0EEEEE19_M_allocate_bucketsEm fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE19_M_allocate_bucketsEm fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE13_M_rehash_auxEmSt17integral_constantIbLb1EE fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZNSt10_HashtableIjSt4pairIKjPFvPvEESaIS5_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS7_18_Mod_range_hashingENS7_20_Default_ranged_hashENS7_20_Prime_rehash_policyENS7_17_Hashtable_traitsILb0ELb0ELb1EEEE21_M_insert_unique_nodeEmmPNS7_10_Hash_nodeIS5_Lb0EEE fun:_ZNSt8__detail9_Map_baseIjSt4pairIKjPFvPvEESaIS6_ENS_10_Select1stESt8equal_toIjESt4hashIjENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb0ELb1EEELb1EEixERS2_ fun:_ZNSt13unordered_mapIjPFvPvESt4hashIjESt8equal_toIjESaISt4pairIKjS2_EEEixERS8_ fun:_ZN7rocksdb14ThreadLocalPtr10StaticMeta10SetHandlerEjPFvPvE fun:_ZN7rocksdb14ThreadLocalPtrC1EPFvPvE } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal20InitProtobufDefaultsEv fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN53protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN41protobuf_google_2fprotobuf_2ftype_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fduration_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN42protobuf_google_2fprotobuf_2fempty_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN49protobuf_google_2fprotobuf_2ffield_5fmask_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN43protobuf_google_2fprotobuf_2fstruct_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN46protobuf_google_2fprotobuf_2ftimestamp_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_bluzelle_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf18InsertIfNotPresentISt3mapINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIPKviESt4lessIS8_ESaIS9_IKS8_SC_EEEEEbPT_RKNSJ_10value_type10first_typeERKNSL_11second_typeE fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIPNSt8__detail15_Hash_node_baseEE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIPNSt8__detail15_Hash_node_baseEEE8allocateERS3_m fun:_ZNSt8__detail16_Hashtable_allocISaINS_10_Hash_nodeIPN7rocksdb16ThreadStatusDataELb0EEEEE19_M_allocate_bucketsEm fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE19_M_allocate_bucketsEm fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE13_M_rehash_auxEmSt17integral_constantIbLb1EE fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE9_M_rehashEmRKm fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE21_M_insert_unique_nodeEmmPNS4_10_Hash_nodeIS2_Lb0EEE fun:_ZNSt10_HashtableIPN7rocksdb16ThreadStatusDataES2_SaIS2_ENSt8__detail9_IdentityESt8equal_toIS2_ESt4hashIS2_ENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb1ELb1EEEE9_M_insertIRKS2_NS4_10_AllocNodeISaINS4_10_Hash_nodeIS2_Lb0EEEEEEEESt4pairINS4_14_Node_iteratorIS2_Lb1ELb0EEEbEOT_RKT0_St17integral_constantIbLb1EE fun:_ZNSt8__detail12_Insert_baseIPN7rocksdb16ThreadStatusDataES3_SaIS3_ENS_9_IdentityESt8equal_toIS3_ESt4hashIS3_ENS_18_Mod_range_hashingENS_20_Default_ranged_hashENS_20_Prime_rehash_policyENS_17_Hashtable_traitsILb0ELb1ELb1EEEE6insertERKS3_ fun:_ZNSt13unordered_setIPN7rocksdb16ThreadStatusDataESt4hashIS2_ESt8equal_toIS2_ESaIS2_EE6insertERKS2_ fun:_ZN7rocksdb19ThreadStatusUpdater14RegisterThreadENS_12ThreadStatus10ThreadTypeEm } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN21protobuf_pbft_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fany_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZNSt10_HashtableIPKcSt4pairIKS1_PFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEESaISE_ENSt8__detail10_Select1stEN6google8protobuf5streqENSJ_4hashIS1_EENSG_18_Mod_range_hashingENSG_20_Default_ranged_hashENSG_20_Prime_rehash_policyENSG_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_rehashEmRKm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7rocksdb12_GLOBAL__N_125CreateThreadStatusUpdaterEv fun:_ZN7rocksdb12_GLOBAL__N_18PosixEnvC1Ev fun:_ZN7rocksdb3Env7DefaultEv fun:_ZN7rocksdb9DBOptionsC1Ev fun:_ZN7rocksdb7OptionsC1Ev fun:_ZN3bzn15rocksdb_storage4openEv fun:_ZN3bzn15rocksdb_storageC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_S8_ fun:_ZN9__gnu_cxx13new_allocatorIN3bzn15rocksdb_storageEE9constructIS2_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn15rocksdb_storageEEE9constructIS1_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn15rocksdb_storageESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn15rocksdb_storageESaIS5_EJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN7rocksdb14ThreadLocalPtr8InstanceEv fun:_ZN7rocksdb14ThreadLocalPtr14InitSingletonsEv fun:_ZN7rocksdb3Env7DefaultEv fun:_ZN7rocksdb9DBOptionsC1Ev fun:_ZN7rocksdb7OptionsC1Ev fun:_ZN3bzn15rocksdb_storage4openEv fun:_ZN3bzn15rocksdb_storageC1ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES8_S8_ fun:_ZN9__gnu_cxx13new_allocatorIN3bzn15rocksdb_storageEE9constructIS2_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvPT_DpOT0_ fun:_ZNSt16allocator_traitsISaIN3bzn15rocksdb_storageEEE9constructIS1_JRA3_KcRA6_S5_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEEvRS2_PT_DpOT0_ fun:_ZNSt23_Sp_counted_ptr_inplaceIN3bzn15rocksdb_storageESaIS1_ELN9__gnu_cxx12_Lock_policyE2EEC1IJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEES2_DpOT_ fun:_ZNSt14__shared_countILN9__gnu_cxx12_Lock_policyE2EEC1IN3bzn15rocksdb_storageESaIS5_EJRA3_KcRA6_S7_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEESt19_Sp_make_shared_tagPT_RKT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN40protobuf_google_2fprotobuf_2fapi_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN6google8protobuf14MessageFactory29InternalRegisterGeneratedFileEPKcPFvRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn11mem_storage13load_snapshotERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE fun:_ZN30storageTest_test_snapshot_TestIN3bzn11mem_storageEE8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN22protobuf_audit_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv fun:_ZNSt16allocator_traitsISaIcEE8allocateERS0_m fun:_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9_M_createERmm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN45protobuf_google_2fprotobuf_2fwrappers_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN47protobuf_google_2fprotobuf_2fdescriptor_2eproto18AddDescriptorsImplEv fun:__pthread_once_slow obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:call_init fun:_dl_init obj:/lib/x86_64-linux-gnu/ld-2.27.so } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal13OnShutdownRunEPFvPKvES3_ fun:_ZN6google8protobuf8internal24OnShutdownDestroyMessageEPKv fun:_ZN25protobuf_database_2eprotoL28InitDefaultsdatabase_requestEv obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf8internal11InitSCCImplEPNS1_11SCCInfoBaseE fun:_ZN6google8protobuf8internal7InitSCCEPNS1_11SCCInfoBaseE fun:_ZN25protobuf_database_2eproto12InitDefaultsEv fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm obj:/usr/lib/x86_64-linux-gnu/libprotobuf.so.17.0.0 fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE9AddSymbolERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES6_ fun:_ZN6google8protobuf24SimpleDescriptorDatabase15DescriptorIndexISt4pairIPKviEE7AddFileERKNS0_19FileDescriptorProtoES6_ fun:_ZN6google8protobuf25EncodedDescriptorDatabase3AddEPKvi fun:_ZN6google8protobuf14DescriptorPool24InternalAddGeneratedFileEPKvi fun:_ZN25protobuf_database_2eproto18AddDescriptorsImplEv fun:_ZSt13__invoke_implIvRFvvEJEET_St14__invoke_otherOT0_DpOT1_ fun:_ZSt8__invokeIRFvvEJEENSt15__invoke_resultIT_JDpT0_EE4typeEOS3_DpOS4_ fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENKUlvE0_clEv fun:_ZZSt9call_onceIRFvvEJEEvRSt9once_flagOT_DpOT0_ENUlvE0_4_FUNEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5utils6crypto16verify_signatureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_ fun:_ZN85util_test_test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv fun:_ZN7testing8TestInfo3RunEv fun:_ZN7testing8TestCase3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost3log12v2s_mt_posix3aux11this_thread6get_idEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_data15get_random_seedEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation11thread_dataC1Ev fun:_ZN5boost3log12v2s_mt_posix4core14implementation16init_thread_dataEv fun:_ZN5boost3log12v2s_mt_posix4core14implementation15get_thread_dataEv fun:open_record fun:_ZN5boost3log12v2s_mt_posix4core11open_recordERKNS1_13attribute_setE fun:_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5utils6crypto16verify_signatureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_ fun:_ZN85util_test_test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully_Test8TestBodyEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_25thread_exit_callback_nodeERPNS0_25thread_exit_function_baseERPS2_EEPT_OT0_OT1_ fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5utils6crypto16verify_signatureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_ fun:_ZN85util_test_test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_20thread_exit_functionINS_3_bi6bind_tINS3_11unspecifiedENS_15checked_deleterImEENS3_5list1INS3_5valueIPmEEEEEEEERSD_EEPT_OT0_ fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5utils6crypto16verify_signatureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_ fun:_ZN85util_test_test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully_Test8TestBodyEv fun:_ZN7testing8internal38HandleSehExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing8internal35HandleExceptionsInMethodIfSupportedINS_4TestEvEET0_PT_MS4_FS3_vEPKc fun:_ZN7testing4Test3RunEv } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail12shared_countC1INS0_16thread_data_baseEEEPT_ fun:_ZN5boost6detail20sp_pointer_constructINS0_16thread_data_baseES2_EEvPNS_10shared_ptrIT_EEPT0_RNS0_12shared_countE fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEEC1IS2_EEPT_ fun:_ZN5boost10shared_ptrINS_6detail16thread_data_baseEE5resetIS2_EEvPT_ fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ } { Memcheck:Leak match-leak-kinds: reachable fun:_Znwm fun:_ZN5boost6detail8heap_newINS0_26externally_launched_threadEEEPT_v fun:_ZN5boost6detail25make_external_thread_dataEv fun:_ZN5boost6detail31get_or_make_current_thread_dataEv fun:_ZN5boost6detail24add_thread_exit_functionEPNS0_25thread_exit_function_baseE fun:_ZN5boost11this_thread14at_thread_exitINS_3_bi6bind_tINS2_11unspecifiedENS_15checked_deleterImEENS2_5list1INS2_5valueIPmEEEEEEEEvT_ fun:_ZN5boost3log12v2s_mt_posix7sources3aux18get_severity_levelEv fun:_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_ fun:_ZN5boost3log12v2s_mt_posix7sources21basic_severity_loggerINS2_12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEEES7_E20open_record_unlockedINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS7_EEEENS1_6recordERKT_ fun:_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEENS1_6recordERKT_ fun:_ZN3bzn5utils6crypto16verify_signatureERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEES9_S9_ fun:_ZN85util_test_test_that_verifying_a_signature_with_empty_inputs_will_fail_gracefully_Test8TestBodyEv } ================================================ FILE: valgrind/create_suppressions.sh ================================================ #!/bin/bash # $ cd /output # $ /valgrind/create_suppressions.sh # $ cp bluzelle.supp /valgrind/ echo "Clearing stale valgrind logs & suppression files..." rm -f *_tests_valgrind.log *.supp rm -f bluzelle.supp SCRIPT_DIR="$( cd "$( dirname "$0" )" && pwd )" for utest in *_tests do if valgrind --leak-check=full --show-reachable=yes --error-limit=no --gen-suppressions=all --log-file=${utest}_valgrind.log ./$utest; then echo "Creating suppression file for ${utest}..." cat ./${utest}_valgrind.log | $SCRIPT_DIR/parse_valgrind_suppressions.sh > ./${utest}.supp cat ./${utest}.supp >> bluzelle.supp else echo "${utest} exited with an error!!!" exit 1 fi done echo "Done!" ================================================ FILE: valgrind/parse_valgrind_suppressions.sh ================================================ #! /usr/bin/awk -f # A script to extract the actual suppression info from the output of (for example) valgrind --leak-check=full --show-reachable=yes --error-limit=no --gen-suppressions=all ./minimal # The desired bits are between ^{ and ^} (including the braces themselves). # The combined output should either be appended to /usr/lib/valgrind/default.supp, or placed in a .supp of its own # If the latter, either tell valgrind about it each time with --suppressions=, or add that line to ~/.valgrindrc # NB This script uses the |& operator, which I believe is gawk-specific. In case of failure, check that you're using gawk rather than some other awk # The script looks for suppressions. When it finds one it stores it temporarily in an array, # and also feeds it line by line to the external app 'md5sum' which generates a unique checksum for it. # The checksum is used as an index in a different array. If an item with that index already exists the suppression must be a duplicate and is discarded. BEGIN { suppression=0; md5sum = "md5sum" } # If the line begins with '{', it's the start of a supression; so set the var and initialise things /^{/ { suppression=1; i=0; next } # If the line begins with '}' its the end of a suppression /^}/ { if (suppression) { suppression=0; close(md5sum, "to") # We've finished sending data to md5sum, so close that part of the pipe ProcessInput() # Do the slightly-complicated stuff in functions delete supparray # We don't want subsequent suppressions to append to it! } } # Otherwise, it's a normal line. If we're inside a supression, store it, and pipe it to md5sum. Otherwise it's cruft, so ignore it { if (suppression) { supparray[++i] = $0 print |& md5sum } } function ProcessInput() { # Pipe the result from md5sum, then close it md5sum |& getline result close(md5sum) # gawk can't cope with enormous ints like $result would be, so stringify it first by prefixing a definite string resultstring = "prefix"result if (! (resultstring in chksum_array) ) { chksum_array[resultstring] = 0; # This checksum hasn't been seen before, so add it to the array OutputSuppression() # and output the contents of the suppression } } function OutputSuppression() { # A suppression is surrounded by '{' and '}'. Its data was stored line by line in the array print "{" for (n=1; n <= i; ++n) { print supparray[n] } print "}" }