From 6751be972eb9092261cae1470344867d527114e9 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 14 Oct 2024 04:23:19 +0200 Subject: [PATCH] Fix memory leak with sidecar trace sender (#2875) And set LSAN_OPTIONS=fast_unwind_on_malloc=0 for more complete traces --- Makefile | 5 +++-- ext/ddtrace.c | 4 ++-- ext/sidecar.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 2defe8b86f..a14c38532c 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ Q := @ +, := , PROJECT_ROOT := ${PWD} TRACER_SOURCE_DIR := $(PROJECT_ROOT)/src/ ASAN ?= $(shell ldd $(shell which php) 2>/dev/null | grep -q libasan && echo 1) @@ -156,7 +157,7 @@ run_tests: $(TEST_FILES) $(TEST_STUB_FILES) $(BUILD_DIR)/run-tests.php DD_TRACE_GIT_METADATA_ENABLED=0 $(RUN_TESTS_CMD) $(TESTS) test_c: $(SO_FILE) $(TEST_FILES) $(TEST_STUB_FILES) $(BUILD_DIR)/run-tests.php - $(if $(ASAN), USE_ZEND_ALLOC=0 USE_TRACKED_ALLOC=1) DD_TRACE_GIT_METADATA_ENABLED=0 $(RUN_TESTS_CMD) -d extension=$(SO_FILE) $(BUILD_DIR)/$(subst $(BUILD_DIR_NAME)/,,$(TESTS)) + $(if $(ASAN), USE_ZEND_ALLOC=0 USE_TRACKED_ALLOC=1 LSAN_OPTIONS=fast_unwind_on_malloc=0$${LSAN_OPTIONS:+$(,)$${LSAN_OPTIONS}}) DD_TRACE_GIT_METADATA_ENABLED=0 $(RUN_TESTS_CMD) -d extension=$(SO_FILE) $(BUILD_DIR)/$(subst $(BUILD_DIR_NAME)/,,$(TESTS)) test_c_coverage: dist_clean DD_TRACE_DOCKER_DEBUG=1 EXTRA_CFLAGS="-fprofile-arcs -ftest-coverage" $(MAKE) test_c || exit 0 @@ -1405,7 +1406,7 @@ test_api_unit: composer.lock global_test_run_dependencies # Just test it does not crash, i.e. the exit code test_internal_api_randomized: $(SO_FILE) - $(if $(ASAN), USE_ZEND_ALLOC=0 USE_TRACKED_ALLOC=1) php -n -ddatadog.trace.cli_enabled=1 -d extension=$(SO_FILE) tests/internal-api-stress-test.php 2> >(grep -A 1000 ==============) + $(if $(ASAN), DD_TRACE_DEBUG=1 USE_ZEND_ALLOC=0 USE_TRACKED_ALLOC=1 LSAN_OPTIONS=fast_unwind_on_malloc=0$${LSAN_OPTIONS:+$(,)$${LSAN_OPTIONS}}) php -n -ddatadog.trace.cli_enabled=1 -d extension=$(SO_FILE) tests/internal-api-stress-test.php 2> >(grep -A 1000 ==============) composer.lock: composer.json $(call run_composer_with_retry,,) diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 68572086d4..0c9bd0771f 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -2475,7 +2475,7 @@ PHP_FUNCTION(dd_trace_internal_fn) { } else #endif if (ddtrace_sidecar) { - ddog_sidecar_flush_traces(&ddtrace_sidecar); + ddtrace_ffi_try("Failed synchronously flushing traces", ddog_sidecar_flush_traces(&ddtrace_sidecar)); } RETVAL_TRUE; #ifndef _WIN32 @@ -2592,7 +2592,7 @@ PHP_FUNCTION(dd_trace_synchronous_flush) { } else #endif if (ddtrace_sidecar) { - ddog_sidecar_flush_traces(&ddtrace_sidecar); + ddtrace_ffi_try("Failed synchronously flushing traces", ddog_sidecar_flush_traces(&ddtrace_sidecar)); } RETURN_NULL(); } diff --git a/ext/sidecar.c b/ext/sidecar.c index 443a5c18ce..0157f6088b 100644 --- a/ext/sidecar.c +++ b/ext/sidecar.c @@ -371,7 +371,7 @@ void ddtrace_sidecar_submit_root_span_data_direct(ddtrace_root_span_data *root, changed = ddog_remote_configs_service_env_change(DDTRACE_G(remote_config_state), service_slice, env_slice, version_slice, &DDTRACE_G(active_global_tags)); } if (changed || !root) { - ddog_sidecar_set_remote_config_data(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), service_slice, env_slice, version_slice, &DDTRACE_G(active_global_tags)); + ddtrace_ffi_try("Failed sending remote config data", ddog_sidecar_set_remote_config_data(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), service_slice, env_slice, version_slice, &DDTRACE_G(active_global_tags))); } if (free_string) {