Skip to content

lib: cmetrics: upgrade to v2.2.1#12088

Open
edsiper wants to merge 2 commits into
masterfrom
cmetrics-2.2.1
Open

lib: cmetrics: upgrade to v2.2.1#12088
edsiper wants to merge 2 commits into
masterfrom
cmetrics-2.2.1

Conversation

@edsiper

@edsiper edsiper commented Jul 12, 2026

Copy link
Copy Markdown
Member

Fluent Bit is licensed under Apache 2.0, by submitting this pull request I understand that this code will be released under the terms of that license.

Summary by CodeRabbit

  • New Features
    • Added opt-in performance benchmarking (new CMake option, benchmark executable, and repeatable run script).
  • Bug Fixes
    • Improved long metric label decoding to be lossless and to fail safely on invalid/truncated inputs.
    • Fixed Prometheus remote-write staleness/cutoff handling and tightened label filtering to exact matches.
    • Strengthened quantile bounds/validation, summary concatenation, and related expiration behavior.
    • Improved OpenTelemetry scope attribute encoding/cleanup to preserve expected attributes.
  • Documentation
    • Added benchmark guide, design notes, label-value handling doc, and updated architecture/dependency/contribution workflows.
  • Tests
    • Expanded unit test coverage across conversions, parsing, encoding/decoding, filtering, concurrency, expiration, and error/boundary cases.

@coderabbitai

coderabbitai Bot commented Jul 12, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

CMetrics adds synchronized label-aware metric indexing, arena-backed OpenTelemetry encoding, revised remote-write staleness handling, lossless MessagePack strings, opt-in benchmarks, repository workflows, and expanded regression coverage.

Changes

CMetrics runtime and validation

Layer / File(s) Summary
Repository guidance and verification
lib/cmetrics/AGENTS.md, lib/cmetrics/docs/ai/*, lib/cmetrics/scripts/*, lib/cmetrics/.github/workflows/build.yaml
Adds repository guidance, workflow documentation, verification scripts, and Debian Bookworm CI configuration.
Opt-in benchmark tooling
lib/cmetrics/CMakeLists.txt, lib/cmetrics/benchmarks/*
Adds conditional benchmark builds, lookup/update/encoding workloads, repeated performance scripts, and benchmark instructions.
Metric indexing and expiration
lib/cmetrics/include/cmetrics/*, lib/cmetrics/src/cmt_map.c, lib/cmetrics/tests/{counter,expire}.c
Adds synchronized label-aware indexing, lazy storage preparation, indexed cleanup, and static expiration handling with concurrency and expiration coverage.
String ownership and MessagePack decoding
lib/cmetrics/src/{cmt_decode_prometheus.c,cmt_mpack_utils.c}, lib/cmetrics/include/cmetrics/*, lib/cmetrics/docs/label-value-handling.md, lib/cmetrics/tests/{issues,prometheus_parser}.c
Introduces owned Prometheus metric-name buffers and byte-based MessagePack decoding with long-label and cleanup tests.
OpenTelemetry arena-backed encoding
lib/cmetrics/src/cmt_encode_opentelemetry.c, lib/cmetrics/tests/opentelemetry.c
Moves encoder-created protobuf structures and nested data into an encoder-owned arena and validates scope attribute cleanup.
Remote-write staleness handling
lib/cmetrics/src/cmt_encode_prometheus_remote_write.c, lib/cmetrics/tests/encoding.c
Skips stale samples while continuing to encode fresh series and preserves future-dated samples.
Metric behavior corrections
lib/cmetrics/src/{cmt_cat.c,cmt_filter.c,cmt_summary.c,cmt_decode_msgpack.c}, lib/cmetrics/tests/{cat,filter,summary}.c, tests/runtime/processor_labels.c
Updates summary reuse, exact label matching, safe deletion, quantile validation, summary metadata decoding, and runtime label expectations.
Cross-format conversion validation
lib/cmetrics/tests/format_conversion.c, lib/cmetrics/tests/CMakeLists.txt
Adds MessagePack round-trip coverage for native and decoded models and exercises supported encoders.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant cmt_map_metric_get
  participant metric_hash_lookup
  participant metric_prepare_storage
  Caller->>cmt_map_metric_get: request metric with labels and write_op
  cmt_map_metric_get->>metric_hash_lookup: find hash and matching labels
  metric_hash_lookup-->>cmt_map_metric_get: return existing or indexed metric
  cmt_map_metric_get->>metric_prepare_storage: prepare lazy storage
  metric_prepare_storage-->>Caller: return metric
Loading

Possibly related PRs

Suggested reviewers: cosmo0920

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 4.31% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: upgrading lib/cmetrics to version 2.2.1.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cmetrics-2.2.1

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@edsiper edsiper added this to the Fluent Bit v5.1 milestone Jul 12, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@lib/cmetrics/benchmarks/benchmark.c`:
- Around line 115-120: Check the return value of cmt_create() immediately in
benchmark_lookup, benchmark_update, benchmark_prometheus, and
benchmark_opentelemetry before passing cmt to create_series(). On NULL, return
the same failure result with appropriate cleanup, matching the existing handling
in benchmark_opentelemetry_mixed, while preserving the current counter
allocation failure paths.

In `@lib/cmetrics/src/cmt_cat.c`:
- Around line 889-902: The summary reuse validation after summary_lookup must
compare the label-key schema, not just quantiles. Before merging a matching
summary, compare each label key and its ordering against the destination
summary’s labels, while retaining the existing quantile checks; reject the reuse
path and free labels on any key mismatch. Do not add a redundant label-count
check.

In `@lib/cmetrics/src/cmt_map.c`:
- Around line 86-107: Update cmt_map_metric_destroy so it clears
map->last_metric whenever it points to the metric being destroyed, regardless of
metric->hash_indexed. Keep hash-list removal and indexed-count updates
conditional on hash_indexed, while preserving metric->map cleanup and preventing
metric_hash_lookup from dereferencing freed memory.
- Around line 32-41: Update cmt_map_metric_destroy() to acquire map_lock()
before modifying metric_buckets, indexed_metric_count, or last_metric, and
release it with map_unlock() on every exit path. Preserve the existing
destruction behavior while ensuring concurrent cmt_map_metric_get() and
cmt_map_metrics_expire() operations cannot traverse the map during unlinking.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ed6893ea-2caa-4f0e-99c9-adebcbf055fa

📥 Commits

Reviewing files that changed from the base of the PR and between b4cb968 and 9eb07aa.

📒 Files selected for processing (32)
  • lib/cmetrics/.github/workflows/build.yaml
  • lib/cmetrics/AGENTS.md
  • lib/cmetrics/CMakeLists.txt
  • lib/cmetrics/README.md
  • lib/cmetrics/benchmarks/CMakeLists.txt
  • lib/cmetrics/benchmarks/README.md
  • lib/cmetrics/benchmarks/benchmark.c
  • lib/cmetrics/benchmarks/run-perf.sh
  • lib/cmetrics/docs/label-value-handling.md
  • lib/cmetrics/include/cmetrics/cmt_decode_prometheus.h
  • lib/cmetrics/include/cmetrics/cmt_map.h
  • lib/cmetrics/include/cmetrics/cmt_metric.h
  • lib/cmetrics/include/cmetrics/cmt_mpack_utils_defs.h
  • lib/cmetrics/src/cmt_cat.c
  • lib/cmetrics/src/cmt_decode_msgpack.c
  • lib/cmetrics/src/cmt_decode_prometheus.c
  • lib/cmetrics/src/cmt_encode_opentelemetry.c
  • lib/cmetrics/src/cmt_encode_prometheus_remote_write.c
  • lib/cmetrics/src/cmt_filter.c
  • lib/cmetrics/src/cmt_map.c
  • lib/cmetrics/src/cmt_mpack_utils.c
  • lib/cmetrics/src/cmt_summary.c
  • lib/cmetrics/tests/CMakeLists.txt
  • lib/cmetrics/tests/cat.c
  • lib/cmetrics/tests/counter.c
  • lib/cmetrics/tests/encoding.c
  • lib/cmetrics/tests/expire.c
  • lib/cmetrics/tests/filter.c
  • lib/cmetrics/tests/format_conversion.c
  • lib/cmetrics/tests/issues.c
  • lib/cmetrics/tests/prometheus_parser.c
  • lib/cmetrics/tests/summary.c

Comment thread lib/cmetrics/benchmarks/benchmark.c
Comment thread lib/cmetrics/src/cmt_cat.c
Comment thread lib/cmetrics/src/cmt_map.c
Comment thread lib/cmetrics/src/cmt_map.c

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
lib/cmetrics/src/cmt_decode_msgpack.c (1)

1336-1345: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a regression test for implicitly-static summary quantile-count decoding.

None of the summary tests in tests/cat.c exercise the zero-label ("implicitly static") path through unpack_metric_array_entry; they all use non-empty label sets, so this fix (lines 1339-1340) has no direct test coverage in the reviewed diff. Consider adding a msgpack round-trip test for a summary created with 0 labels that asserts sum_quantiles_count on the decoded map matches the original quantiles_count.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/cmetrics/src/cmt_decode_msgpack.c` around lines 1336 - 1345, Add a
regression test in tests/cat.c covering a msgpack round trip for a summary
created with zero labels, exercising unpack_metric_array_entry’s implicitly
static path. Assert that the decoded map’s sum_quantiles_count matches the
original quantiles_count, while preserving the existing non-empty-label summary
tests.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@lib/cmetrics/src/cmt_decode_msgpack.c`:
- Around line 1336-1345: Add a regression test in tests/cat.c covering a msgpack
round trip for a summary created with zero labels, exercising
unpack_metric_array_entry’s implicitly static path. Assert that the decoded
map’s sum_quantiles_count matches the original quantiles_count, while preserving
the existing non-empty-label summary tests.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7ea519f4-1a5e-41c7-94c7-1236fa8cbc46

📥 Commits

Reviewing files that changed from the base of the PR and between 9eb07aa and c9aa855.

📒 Files selected for processing (32)
  • lib/cmetrics/.github/workflows/build.yaml
  • lib/cmetrics/AGENTS.md
  • lib/cmetrics/CMakeLists.txt
  • lib/cmetrics/README.md
  • lib/cmetrics/benchmarks/CMakeLists.txt
  • lib/cmetrics/benchmarks/README.md
  • lib/cmetrics/benchmarks/benchmark.c
  • lib/cmetrics/benchmarks/run-perf.sh
  • lib/cmetrics/docs/label-value-handling.md
  • lib/cmetrics/include/cmetrics/cmt_decode_prometheus.h
  • lib/cmetrics/include/cmetrics/cmt_map.h
  • lib/cmetrics/include/cmetrics/cmt_metric.h
  • lib/cmetrics/include/cmetrics/cmt_mpack_utils_defs.h
  • lib/cmetrics/src/cmt_cat.c
  • lib/cmetrics/src/cmt_decode_msgpack.c
  • lib/cmetrics/src/cmt_decode_prometheus.c
  • lib/cmetrics/src/cmt_encode_opentelemetry.c
  • lib/cmetrics/src/cmt_encode_prometheus_remote_write.c
  • lib/cmetrics/src/cmt_filter.c
  • lib/cmetrics/src/cmt_map.c
  • lib/cmetrics/src/cmt_mpack_utils.c
  • lib/cmetrics/src/cmt_summary.c
  • lib/cmetrics/tests/CMakeLists.txt
  • lib/cmetrics/tests/cat.c
  • lib/cmetrics/tests/counter.c
  • lib/cmetrics/tests/encoding.c
  • lib/cmetrics/tests/expire.c
  • lib/cmetrics/tests/filter.c
  • lib/cmetrics/tests/format_conversion.c
  • lib/cmetrics/tests/issues.c
  • lib/cmetrics/tests/prometheus_parser.c
  • lib/cmetrics/tests/summary.c
🚧 Files skipped from review as they are similar to previous changes (27)
  • lib/cmetrics/AGENTS.md
  • lib/cmetrics/benchmarks/run-perf.sh
  • lib/cmetrics/README.md
  • lib/cmetrics/.github/workflows/build.yaml
  • lib/cmetrics/benchmarks/README.md
  • lib/cmetrics/benchmarks/CMakeLists.txt
  • lib/cmetrics/src/cmt_decode_prometheus.c
  • lib/cmetrics/tests/CMakeLists.txt
  • lib/cmetrics/include/cmetrics/cmt_mpack_utils_defs.h
  • lib/cmetrics/CMakeLists.txt
  • lib/cmetrics/src/cmt_cat.c
  • lib/cmetrics/include/cmetrics/cmt_map.h
  • lib/cmetrics/tests/summary.c
  • lib/cmetrics/tests/filter.c
  • lib/cmetrics/src/cmt_filter.c
  • lib/cmetrics/tests/prometheus_parser.c
  • lib/cmetrics/tests/encoding.c
  • lib/cmetrics/include/cmetrics/cmt_decode_prometheus.h
  • lib/cmetrics/include/cmetrics/cmt_metric.h
  • lib/cmetrics/docs/label-value-handling.md
  • lib/cmetrics/src/cmt_mpack_utils.c
  • lib/cmetrics/src/cmt_summary.c
  • lib/cmetrics/tests/format_conversion.c
  • lib/cmetrics/benchmarks/benchmark.c
  • lib/cmetrics/src/cmt_encode_prometheus_remote_write.c
  • lib/cmetrics/src/cmt_map.c
  • lib/cmetrics/src/cmt_encode_opentelemetry.c

edsiper added 2 commits July 12, 2026 21:26
Signed-off-by: Eduardo Silva <eduardo@chronosphere.io>
Signed-off-by: Eduardo Silva <eduardo@chronosphere.io>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
lib/cmetrics/src/cmt_encode_opentelemetry.c (1)

29-66: 🩺 Stability & Availability | 🔵 Trivial

Run ASAN/Valgrind to validate the heap-to-arena ownership transition.

This change moves all temporary protobuf encoding structures from heap to arena allocation. Per the project's memory-safety review guidelines, ownership changes should be validated with AddressSanitizer or Valgrind to detect invalid frees, use-after-free, or double-free issues — especially in the destroy paths and destroy_opentelemetry_context teardown ordering (line 2904–2909: destroy_metrics_data runs before cfl_arena_destroy).

Suggested verification:

# Build with ASAN
cmake -S lib/cmetrics -B build/cmetrics-asan \
  -DCMAKE_C_FLAGS="-fsanitize=address -fno-omit-frame-pointer" \
  -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address"
cmake --build build/cmetrics-asan
ctest --test-dir build/cmetrics-asan -R opentelemetry --output-on-failure

# Or with Valgrind
cmake --build lib/cmetrics/build
ctest --test-dir lib/cmetrics/build -R opentelemetry \
  --valgrind --output-on-failure

Based on learnings, use AddressSanitizer or Valgrind for ownership changes, following docs/ai/memory-safety-review.md. Also run scripts/agent-verify.sh before handoff.

Also applies to: 2895-2911, 2979-3015

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/cmetrics/src/cmt_encode_opentelemetry.c` around lines 29 - 66, Validate
the arena ownership transition in create_encoder_arena,
destroy_opentelemetry_context, and the related destroy paths using
AddressSanitizer or Valgrind, covering opentelemetry tests for invalid frees,
use-after-free, and double frees. Confirm teardown ordering keeps
destroy_metrics_data before cfl_arena_destroy, then run scripts/agent-verify.sh
before handoff.

Source: Learnings

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@lib/cmetrics/src/cmt_encode_opentelemetry.c`:
- Around line 29-66: Validate the arena ownership transition in
create_encoder_arena, destroy_opentelemetry_context, and the related destroy
paths using AddressSanitizer or Valgrind, covering opentelemetry tests for
invalid frees, use-after-free, and double frees. Confirm teardown ordering keeps
destroy_metrics_data before cfl_arena_destroy, then run scripts/agent-verify.sh
before handoff.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 45d24223-711b-4f4b-805f-c79dbf829c11

📥 Commits

Reviewing files that changed from the base of the PR and between eb3d95d and 0b3fdbb.

📒 Files selected for processing (47)
  • lib/cmetrics/.github/workflows/build.yaml
  • lib/cmetrics/AGENTS.md
  • lib/cmetrics/CLAUDE.md
  • lib/cmetrics/CMakeLists.txt
  • lib/cmetrics/README.md
  • lib/cmetrics/benchmarks/CMakeLists.txt
  • lib/cmetrics/benchmarks/README.md
  • lib/cmetrics/benchmarks/benchmark.c
  • lib/cmetrics/benchmarks/run-perf.sh
  • lib/cmetrics/docs/ai/bug-fix.md
  • lib/cmetrics/docs/ai/code-review.md
  • lib/cmetrics/docs/ai/cross-repository.md
  • lib/cmetrics/docs/ai/dependency-update.md
  • lib/cmetrics/docs/ai/investigate.md
  • lib/cmetrics/docs/ai/memory-safety-review.md
  • lib/cmetrics/docs/ai/performance-review.md
  • lib/cmetrics/docs/architecture.md
  • lib/cmetrics/docs/dependencies.md
  • lib/cmetrics/docs/label-value-handling.md
  • lib/cmetrics/include/cmetrics/cmt_decode_prometheus.h
  • lib/cmetrics/include/cmetrics/cmt_map.h
  • lib/cmetrics/include/cmetrics/cmt_metric.h
  • lib/cmetrics/include/cmetrics/cmt_mpack_utils_defs.h
  • lib/cmetrics/scripts/agent-build.sh
  • lib/cmetrics/scripts/agent-test.sh
  • lib/cmetrics/scripts/agent-verify.sh
  • lib/cmetrics/src/cmt_cat.c
  • lib/cmetrics/src/cmt_decode_msgpack.c
  • lib/cmetrics/src/cmt_decode_prometheus.c
  • lib/cmetrics/src/cmt_encode_opentelemetry.c
  • lib/cmetrics/src/cmt_encode_prometheus_remote_write.c
  • lib/cmetrics/src/cmt_filter.c
  • lib/cmetrics/src/cmt_map.c
  • lib/cmetrics/src/cmt_mpack_utils.c
  • lib/cmetrics/src/cmt_summary.c
  • lib/cmetrics/tests/CMakeLists.txt
  • lib/cmetrics/tests/cat.c
  • lib/cmetrics/tests/counter.c
  • lib/cmetrics/tests/encoding.c
  • lib/cmetrics/tests/expire.c
  • lib/cmetrics/tests/filter.c
  • lib/cmetrics/tests/format_conversion.c
  • lib/cmetrics/tests/issues.c
  • lib/cmetrics/tests/opentelemetry.c
  • lib/cmetrics/tests/prometheus_parser.c
  • lib/cmetrics/tests/summary.c
  • tests/runtime/processor_labels.c
🚧 Files skipped from review as they are similar to previous changes (37)
  • lib/cmetrics/docs/ai/performance-review.md
  • lib/cmetrics/tests/CMakeLists.txt
  • lib/cmetrics/scripts/agent-build.sh
  • lib/cmetrics/include/cmetrics/cmt_decode_prometheus.h
  • lib/cmetrics/benchmarks/CMakeLists.txt
  • lib/cmetrics/scripts/agent-test.sh
  • lib/cmetrics/scripts/agent-verify.sh
  • lib/cmetrics/docs/ai/memory-safety-review.md
  • lib/cmetrics/.github/workflows/build.yaml
  • lib/cmetrics/docs/ai/cross-repository.md
  • lib/cmetrics/benchmarks/run-perf.sh
  • lib/cmetrics/src/cmt_decode_prometheus.c
  • lib/cmetrics/include/cmetrics/cmt_metric.h
  • lib/cmetrics/docs/ai/bug-fix.md
  • lib/cmetrics/src/cmt_mpack_utils.c
  • tests/runtime/processor_labels.c
  • lib/cmetrics/AGENTS.md
  • lib/cmetrics/CMakeLists.txt
  • lib/cmetrics/include/cmetrics/cmt_mpack_utils_defs.h
  • lib/cmetrics/src/cmt_decode_msgpack.c
  • lib/cmetrics/docs/label-value-handling.md
  • lib/cmetrics/tests/summary.c
  • lib/cmetrics/include/cmetrics/cmt_map.h
  • lib/cmetrics/src/cmt_filter.c
  • lib/cmetrics/tests/prometheus_parser.c
  • lib/cmetrics/tests/counter.c
  • lib/cmetrics/tests/format_conversion.c
  • lib/cmetrics/src/cmt_summary.c
  • lib/cmetrics/tests/opentelemetry.c
  • lib/cmetrics/src/cmt_cat.c
  • lib/cmetrics/README.md
  • lib/cmetrics/benchmarks/benchmark.c
  • lib/cmetrics/src/cmt_encode_prometheus_remote_write.c
  • lib/cmetrics/tests/filter.c
  • lib/cmetrics/tests/cat.c
  • lib/cmetrics/src/cmt_map.c
  • lib/cmetrics/tests/encoding.c

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant