# SPDX-FileCopyrightText: 2026 EfficiOS, Inc
#
# SPDX-License-Identifier: CC-BY-SA-4.0

2026-08-27 lttng-tools 2.16.0 (National Tug of War Day)
	* ChangeLog: move license header to the top of the file
	* sessiond: Allow missing UST app channel when modifying events
	* tests: Add regression test for sessiond assert
	* tests: Add debug option to GDB scripts for automatic print statements
	* tests: Add option to limit the number of tests skipped for missing requirements
	* Replace removed Python 2 C API macros for SWIG 4.5.0 compatibility
	* tests: Use `os.walk()` instead of `Path.walk()` in `test_shellcheck`
	* tests: Change meta/test_shellcheck to test scripts by default

2026-07-30 lttng-tools 2.16.0-rc2 (Friendship Day)
	* Use the official 'Autoconf-exception-macro' SPDX License ID
	* common: keep the formatting utilities out of error.hpp
	* common: move utils_create_value_file() to its own header
	* sessiond: derive kernel tracer capabilities from its ABI version
	* Fix: sessiond: unclear error when creating a map against lttng-modules < 2.16
	* Fix: common: counter commands unknown to lttng-modules < 2.16
	* tests: Add recording rule propagation tests
	* Fix: tests: robust protocol test is not distributed in static builds
	* Fix: tests: stress: kill-relayd scripts are not distributed
	* tests: map: Add key exhaustion tests
	* Fix: sessiond: scoped triggers evaluated in unspecified order
	* Fix: sessiond: map keys exhausted in unspecified order on app sync
	* tests: map: check that map-only sessions don't spawn a consumer daemon
	* Fix: sessiond: consumer daemon spawned for map-only sessions
	* tests: Add map channel tests for the agent domains
	* tests: map: Add kernel counterpart of the rule filter test
	* tests: map: Add test for the filters of several rules of a map channel
	* Fix: sessiond: agent map counters stay at zero
	* Fix: ust-consumerd: oldest packet lost in snapshot of active channel
	* tests: Fix `test_vermin` oot builds
	* reuse: Add missing copyright/license tags
	* tests: missing name in copyright header
	* Fix: sessiond: rollback event context when channel notification registration fails
	* Fix: common: check load data type in filter globbing validation
	* Fix: common: bound filter IR nesting depth
	* Fix: sessiond: validate filter bytecode generation length
	* Fix: common: harden trigger-list header decoding against short payloads
	* Fix: common: bound key-template segment count from payload
	* Fix: common: validate action header length before dereferencing
	* Fix: common: daemon abort on invalid log-level-rule type
	* Fix: common: validate action list payload length
	* Fix: sessiond: sanitize agent event-listing reply
	* Fix: common: sanitize event exclusion count on deserialization
	* Fix: tests: notification generator toggle hangs on suspend
	* tests: close export-maps connection on BaseException
	* tests: add lttng_consumerd_resume helper
	* Fix: tests: reclaim timer channel keys unreadable on s390x
	* Fix: sessiond: app departure flushes channels of a destroyed session
	* Fix: sessiond: departing app's buffers not flushed by stop
	* Fix: consumerd: crash when consuming a packet with no output
	* Fix: ust-consumerd: crash when flushing a stream that has no chunk
	* tests: regression test for rotation of never-active streams
	* Fix: consumerd: no packet produced for idle streams on rotation
	* tests: regression test for per-process reclaim timer resume
	* Fix: ust-consumerd: reclaim timer resumed for a single channel only
	* tests: regression test for explicit reclaim without an age limit
	* Fix: ust-consumerd: crash on deferred reclaim without an age limit
	* tests: regression test for reclaim timer resume after explicit reclaim
	* tests: Fix kernel module leakage in `test_map_value_type_multilib_kernel.py`
	* Fix: ust-consumerd: reclaim timer not resumed after explicit reclaim
	* tests: scheduler unit tests for re-arming a cancelled task
	* common: re-arm a cancelled scheduler task when it is rescheduled
	* Fix: ust-consumerd: lock inversion between reclaim request and scheduler
	* Fix: sessiond: unsafe string copies when building session config path
	* Fix: common: swapped provider/probe names in SDT uprobe config parsing
	* misc: Split vermin config out of pyproject.toml

2026-06-24 | lttng-tools 2.16.0-rc1 (La Saint-Jean — Fête Nationale du Québec)

WHAT'S NEW?
━━━━━━━━━━━
New features and changes in LTTng 2.16:

General:
    • Maps are the main feature of LTTng 2.16: they add a new live event
      counter aggregation path alongside event recording. They let you
      count event activity, such as how often each system call fires or
      which events an application emits the most, without recording a
      single event record.

      A map channel configures a set of per-CPU counters: named integer
      values, keyed by strings, which accumulate over time. Unlike an
      event record channel (the new name for what used to be simply
      called a "channel"), a map channel doesn't record individual
      events to ring buffers; instead, it maintains running totals you
      can read at any moment. Map channels and event record channels are
      independent and may coexist within the same recording session.

      Add a map channel to a recording session with the new
      lttng-add-map-channel(1) command:

          $ lttng add-map-channel --type=user my-counters

      Populate its counters with the new `incr-map-value` action of the
      lttng-add-trigger(1) command. The `--key` option is a template:
      LTTng substitutes the `{event_name}` and `{provider_name}`
      placeholders for each matching event, so that a single trigger can
      feed many counters.

      Read the current counter values with the new lttng-show-maps(1)
      command, which can sort, filter, and slice the output many ways
      (per CPU, per owner, by user or process ID, by key, and more):

          $ lttng show-maps

      Export every counter of every map channel as a self-contained
      SQLite script with the new lttng-export-maps(1) command, then
      query the raw data with the full power of SQL:

          $ lttng export-maps | sqlite3 -box :memory:

      A map channel may hold 32-bit or 64-bit signed integer counters,
      cap its number of keys, and follow a per-user or per-process
      buffer ownership model for user space tracing with the
      `--value-type`, `--max-key-count`, and `--buffer-ownership`
      options of lttng-add-map-channel(1).

      With a per-process buffer ownership model, the
      `--dead-process-policy` option of lttng-add-map-channel(1)
      controls what happens to the counters of an instrumented process
      when it terminates while the map channel still exists: either
      discard them or, by default, fold them into the shared counters of
      the map channel.

    • The lttng-list(1) and lttng-status(1) commands now list map
      channels and their configuration; filter them with the new
      `--map-channel` option.

    • The lttng-clear(1) command resets all the counters of a recording
      session to 0, without removing any allocated keys.

    • The lttng-save(1) and lttng-load(1) commands now serialize and
      restore triggers. Saving a recording session configuration also
      writes every trigger which exists at saving time, and loading it
      recreates those triggers. This is the only way to preserve the
      `incr-map-value` triggers which populate the counters of a
      recording session. Skip this behavior with the new `--no-triggers`
      option of both commands.

      lttng-load(1) doesn't restore the original owner of a loaded
      trigger: the Unix user running the command becomes the owner of
      every loaded trigger, regardless of which Unix user owned it at
      saving time.

    • LTTng-UST gains BLOB field instrumentation support to record an
      arbitrary sequence of bytes tagged with an IANA media type (for
      example `image/jpeg`) with the new
      lttng_ust_field_fixed_length_blob() and
      lttng_ust_field_variable_length_blob() field macros. CTF 2
      supports the BLOB field class as is, including the media type; for
      CTF 1.8, LTTng records the bytes as a best-effort array of 8-bit
      unsigned integers, which loses the media type.

    • Pass the new `--spawn-consumers` option to the lttng-sessiond(8)
      command to start the consumer daemons immediately instead of
      having the session daemon spawn them on first need.

liblttng-ctl:
    • lttng_session_add_map_channel() and
      lttng_session_list_map_channels(): add and enumerate map channels.

    • The lttng_map_channel_*(), lttng_map_group_*(), and
      lttng_map_key_*() function families: configure and inspect map
      channels and their keys.

    • The lttng_action_increment_map_value_*() function family: build the
      new "increment map value" trigger action, along with string key
      template utilities.

    • New `LTTNG_EVENT_FIELD_VALUE_TYPE_BLOB` event field value type to
      capture and filter on BLOB event fields from triggers. Get the
      IANA media type, length, and data of a captured BLOB field with
      lttng_event_field_value_blob_get_media_type(),
      lttng_event_field_value_blob_get_length(), and
      lttng_event_field_value_blob_get_data().

    • lttng_register_consumer() is deprecated and now returns
      `LTTNG_ERR_NOT_SUPPORTED`.

Compatibility:
    • MI schema version bumped to 4.3.
