Skip to content

Prepare release 3.10.312.1; fix embedded SDK shutdown lifetimes and Apple coexistence - #1560

Open
bmehta001 wants to merge 3 commits into
microsoft:mainfrom
bmehta001:fix-embedded-telemetry-lifetimes
Open

bmehta001 wants to merge 3 commits into
microsoft:mainfrom
bmehta001:fix-embedded-telemetry-lifetimes

Conversation

@bmehta001

@bmehta001 bmehta001 commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Upstream the SDK-version and auth-token mutex lifetime fixes carried by Update vcpkg and telemetry to 3.10.309.1; isolate Apple delegate foundry-local#1305. Both can first initialize after a telemetry owner registers its exit callback. Return the SDK version as a compile-time literal through the internal const char* accessor: no allocation, destructor, or leaked buffer on library unload. Keep the auth mutex in aligned static placement-new storage so late upload workers remain safe; normal SDK worker/resource teardown is unchanged.
  • Resolve Apple's system SQLite and zlib even when a vcpkg toolchain is active, while preserving caller-provided canonical targets and explicit vendored/minimal selections.
  • Add MATSDK_APPLE_HTTP_DELEGATE_CLASS for independently embedded Apple SDK copies. The default class name is unchanged; the definition is private to Apple's HTTP implementation and does not rename public wrapper classes.
  • Add deterministic production-source lifetime regressions and an 18-case portable Apple dependency/delegate configuration matrix to the existing embedding tests.

SDK-version leak follow-up (e630e2c9d11176499856393ffac9179520c80da6)

  • The previous placement-new std::string retained a 28-byte heap buffer per unloaded SDK copy. Two actual unload/reload cycles reproduce a 56-byte LSan leak. A string literal removes the allocation while retaining late-worker safety. PAL.hpp is internal, not an installed public API; SDK consumers compile on both Windows and Linux.
  • Adapt the existing exit-lifetime instrumentation to hook accessor entry and validate std::string_view contents and .data() identity. Preserve destructor-observing instrumentation for original-SDK negative controls.
  • Add sdk_version_reload: load a shared fixture containing the real static SDK archive, validate the SDK version, verify actual unload, and repeat. Linux disables GNU-unique pinning in the test archive and uses local symbol binding for the fixture.
  • Add a dedicated Linux ASan/LSan embedding CI job. Leak detection is explicitly enabled; no suppressions, test skips, or negative filters are used.

Follow-up validation

  • Windows / Visual Studio 18 2026: cmake --build out/lifetime-windows --config Release --target embedding_test --parallel 6; ctest --test-dir out/lifetime-windows -C Release --output-on-failure: 6/6 pass.
  • Linux / WSL / GCC 13, native build directory /home/bhamehta/build/1ds-upstream-lifetimes, configured with -DMATSDK_EMBEDDING_ADDRESS_SANITIZER=ON: build target embedding_test; unfiltered CTest: 6/6 pass, including real unload/reload under ASan/LSan.
  • Leak negative control: restore the previous allocating placement-new implementation (return its buffer through the internal accessor); ctest -R '^sdk_version_reload$' fails with 56 bytes leaked in 2 allocations. Restore the literal implementation: passes.
  • Original-destructible-static negative controls: restore ordinary SDK-version and auth-mutex statics; ctest -R '^sdk_lifetime_' fails 3/3 with expected destruction diagnostics on Windows and Linux. Restore production fixes: all pass.
  • clang-format --dry-run --Werror on all changed/new C++ tests; changed-line git clang-format --diff HEAD on PAL sources; complete existing cached misspell workflow; git diff --check: all pass.
  • The auth mutex, Apple/system dependency/delegate changes, and release version bump are preserved.

Earlier validation (before the leak follow-up)

  • Windows / Visual Studio 2026: SDK and embedding targets build with SDK warnings-as-errors; all 5 embedding CTest cases pass, including all 18 Apple configuration combinations.
  • Linux / WSL / GCC 13: SDK and embedding targets build with SDK warnings-as-errors; all 5 embedding CTest cases pass, including all 18 Apple configuration combinations. Build output uses the native WSL filesystem to avoid mounted-drive Ninja compiler-probe I/O failures.
  • Negative controls on both Windows and Linux: restore the original destructible statics in the generated instrumented SDK objects; all 3 lifetime cases fail with the expected version/mutex destruction diagnostics. Restore the fixes; all 3 pass.
  • Existing package dependency tests: 48 configurations, 3 missing-target checks, and 30 missing-package checks pass.
  • Existing native and registry vcpkg feature-policy regressions pass.
  • Existing complete misspell workflow, clang-format check for the new C++ regression, and git diff --check pass before push.

Scope and limitations

  • Exit-lifetime regressions use static embedding with instrumented production objects; the unload/reload fixture instead links the actual unmodified SDK archive. No registered tests are skipped or negatively filtered in either complete embedding suite.
  • Apple configuration tests validate actual dependency-resolution code and the production private target definition, not native Objective-C compilation or runtime co-loading. Native macOS/iOS validation is left to the existing Apple CI matrix.
  • This does not change shutdown sequencing, fix arbitrary application teardown after library unloading, or make separate SDK copies share one telemetry runtime.

Retain the SDK version and auth-token lock through exit-owner teardown. Honor Apple system SQLite/zlib even with vcpkg, and let independent embedded copies select a private Objective-C HTTP delegate name without changing the default.

Files: CMakeLists.txt; cmake/MatsdkOptions.cmake; docs/embedding-with-cmake.md; lib/CMakeLists.txt; lib/api/AuthTokensController.cpp; lib/pal/PAL.cpp; tests/apple/embedding-options-tests.cmake; tests/apple/embedding-options/CMakeLists.txt; tests/embedding/CMakeLists.txt; tests/embedding/lifetime-tests.cmake; tests/embedding/lifetime-tests.cpp

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 5484aed9-9464-4bc8-9ca7-fd67954034ff
@bmehta001 bmehta001 changed the title Fix embedded SDK shutdown lifetimes and Apple coexistence Prepare release 3.10.312.1; fix embedded SDK shutdown lifetimes and Apple coexistence Nov 9, 2026
@bmehta001
bmehta001 requested a balanced review from Copilot November 9, 2026 00:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The iOS guard ignores custom delegate names when Apple HTTP is disabled, risking process-global class collisions, and the new embedding test requires CMake 3.19 despite supporting 3.15–3.18.

2 open issues
What changed in this PR

Prepares SDK release 3.10.312.1 and improves shutdown safety and coexistence for independently embedded SDK copies.

Changes:

  • Keeps SDK-version and auth-token mutex storage alive for late shutdown workers.
  • Uses Apple system SQLite/zlib under vcpkg and adds a configurable private HTTP delegate name.
  • Adds lifetime regressions and an 18-case Apple configuration matrix.
File Description
tests/​embedding/​lifetime-tests.cpp Checks state identity and availability during shutdown.
tests/​embedding/​lifetime-tests.cmake Instruments production sources and registers lifetime tests.
tests/​embedding/​CMakeLists.txt Integrates lifetime and Apple configuration tests.
tests/​apple/​embedding-options/​CMakeLists.txt Validates dependency targets and delegate definitions.
tests/​apple/​embedding-options-tests.cmake Runs the 18-case configuration matrix.
Package.swift Updates the binary artifact reference to 3.10.310.1.
lib/​pal/​PAL.cpp Preserves SDK-version storage through process exit.
lib/​include/​public/​Version.hpp Advances SDK version constants to 3.10.312.1.
lib/​CMakeLists.txt Applies the private Apple delegate-name definition.
lib/​api/​AuthTokensController.cpp Preserves the auth-token mutex through process exit.
docs/​embedding-with-cmake.md Documents Apple dependencies and delegate naming.
CMakeLists.txt Resolves Apple system libraries with vcpkg active.
cmake/​MatsdkOptions.cmake Adds and validates the delegate-class option.

Review effort: Balanced

Comment thread lib/CMakeLists.txt
message(STATUS "Building static SDK library")
add_library(mat STATIC ${SRCS})
endif()
if(APPLE AND MATSDK_BUILD_APPLE_HTTP)
enable_testing()
add_test(NAME embedding_test COMMAND embedding_test)
include("${CMAKE_CURRENT_LIST_DIR}/lifetime-tests.cmake")
add_test(NAME apple_embedding_options
The placement-new string avoided exit-time destruction but abandoned its
heap buffer on unload: two real reload cycles leak 56 bytes under LSan.
Return the compile-time literal through the internal const-char accessor
instead, preserving late-worker safety without allocation or destruction.
Keep the auth mutex and existing Apple embedding fixes unchanged.

Files:
- lib/pal/PAL.cpp, lib/pal/PAL.hpp: allocation-free internal version accessor.
- tests/embedding/lifetime-tests.cpp: string-view value/address expectations.
- tests/embedding/lifetime-tests.cmake: entry instrumentation and real DSO test.
- tests/embedding/version-reload-fixture.cpp: embed the production SDK archive.
- tests/embedding/version-reload-test.cpp: verify two actual unload cycles.
- tests/embedding/CMakeLists.txt: opt-in Linux ASan/LSan coverage.
- .github/workflows/test-embedding.yml: enforce sanitizer coverage in CI.

Validation: Windows VS2026 and Linux GCC13 ASan/LSan embedding suites each
pass all six tests. The old placement-new buffer leaks exactly 56 bytes;
original destructible statics fail all three lifetime tests on both OSes.
Formatting, existing misspell workflow and git diff --check pass.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 5484aed9-9464-4bc8-9ca7-fd67954034ff

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants