Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport unified pipeline for APM SDKs for SSI artifacts #5868

Merged
merged 2 commits into from
Aug 12, 2024

Conversation

randomanderson
Copy link
Contributor

Summary of changes

This is a backport of #5818 to the 2.x release branch. The main difference is that 2.x needs the init images for musl published under the -musl tag suffix

Reason for change

By using the unified pipeline across all APM libraries, there is less maintenance hassle, fewer mistakes, and a more uniform creation of artifacts.

Implementation details

I kept all of the changes from the original PR isolated to a single commit for ease of review. The goal of the changes was to do the minimal without having to change one-pipeline upstream.

download-single-step-artifacts.sh :
download the musl tarball from Github releases

prepare-oci-package.sh :
if LIBC is musl use the musl tarball

gitlab-ci.yml :

  • package-oci-musl : I couldn't change the package-oci matrix without having dependency/artifact issues so a new job is created to build the musl oci package. This package is only used to create the lib injection image and the OCI package is not published anywhere
  • create-arch-specific-lib-injection-image-musl: build the lib injection image from package-oci-musl. The hack is that ARCH is abused to get the tag to be COMMIT_SHA-musl . A multiach image is unneeded because only amd64 supports musl and the single arch image is tagged correctly.
  • generate-lib-init-pinned-tag-values : The master version overrode one-pipeline to add musl tag to everything. That override is removed
  • generate-lib-init-pinned-tag-values-musl: Generates the musl tags
  • publish-lib-init-pinned-tags-musl : publishes the musl tags using COMMIT_SHA-musl as the source

@randomanderson randomanderson added area:builds project files, build scripts, pipelines, versioning, releases, packages type:refactor labels Aug 8, 2024
@datadog-ddstaging
Copy link

datadog-ddstaging bot commented Aug 8, 2024

Datadog Report

Branch report: landerson/backport-unified-pipeline
Commit report: 7abc602
Test service: dd-trace-dotnet

✅ 0 Failed, 345417 Passed, 1754 Skipped, 14h 49m 39.57s Total Time

@andrewlock
Copy link
Member

andrewlock commented Aug 9, 2024

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing the following branches/commits:

Execution-time benchmarks measure the whole time it takes to execute a program. And are intended to measure the one-off costs. Cases where the execution time results for the PR are worse than latest master results are shown in red. The following thresholds were used for comparing the execution times:

  • Welch test with statistical test for significance of 5%
  • Only results indicating a difference greater than 5% and 5 ms are considered.

Note that these results are based on a single point-in-time result for each branch. For full results, see the dashboard.

Graphs show the p99 interval based on the mean and StdDev of the test run, as well as the mean value of the run (shown as a diamond below the graph).

gantt
    title Execution time (ms) FakeDbCommand (.NET Framework 4.6.2) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5868) - mean (74ms)  : 64, 84
     .   : milestone, 74,
    master - mean (72ms)  : 64, 79
     .   : milestone, 72,

    section CallTarget+Inlining+NGEN
    This PR (5868) - mean (1,032ms)  : 1003, 1061
     .   : milestone, 1032,
    master - mean (1,072ms)  : 1045, 1098
     .   : milestone, 1072,

Loading
gantt
    title Execution time (ms) FakeDbCommand (.NET Core 3.1) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5868) - mean (110ms)  : 106, 114
     .   : milestone, 110,
    master - mean (109ms)  : 105, 113
     .   : milestone, 109,

    section CallTarget+Inlining+NGEN
    This PR (5868) - mean (719ms)  : 697, 741
     .   : milestone, 719,
    master - mean (747ms)  : 729, 764
     .   : milestone, 747,

Loading
gantt
    title Execution time (ms) FakeDbCommand (.NET 6) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5868) - mean (92ms)  : 87, 96
     .   : milestone, 92,
    master - mean (92ms)  : 89, 94
     .   : milestone, 92,

    section CallTarget+Inlining+NGEN
    This PR (5868) - mean (670ms)  : 646, 693
     .   : milestone, 670,
    master - mean (704ms)  : 677, 730
     .   : milestone, 704,

Loading
gantt
    title Execution time (ms) HttpMessageHandler (.NET Framework 4.6.2) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5868) - mean (192ms)  : 189, 196
     .   : milestone, 192,
    master - mean (192ms)  : 189, 194
     .   : milestone, 192,

    section CallTarget+Inlining+NGEN
    This PR (5868) - mean (1,127ms)  : 1099, 1155
     .   : milestone, 1127,
    master - mean (1,169ms)  : 1144, 1195
     .   : milestone, 1169,

Loading
gantt
    title Execution time (ms) HttpMessageHandler (.NET Core 3.1) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5868) - mean (276ms)  : 270, 281
     .   : milestone, 276,
    master - mean (276ms)  : 272, 281
     .   : milestone, 276,

    section CallTarget+Inlining+NGEN
    This PR (5868) - mean (892ms)  : 865, 919
     .   : milestone, 892,
    master - mean (914ms)  : 896, 933
     .   : milestone, 914,

Loading
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6) 
    dateFormat  X
    axisFormat %s
    todayMarker off
    section Baseline
    This PR (5868) - mean (266ms)  : 262, 270
     .   : milestone, 266,
    master - mean (265ms)  : 260, 270
     .   : milestone, 265,

    section CallTarget+Inlining+NGEN
    This PR (5868) - mean (872ms)  : 848, 897
     .   : milestone, 872,
    master - mean (901ms)  : 879, 922
     .   : milestone, 901,

Loading

@andrewlock
Copy link
Member

andrewlock commented Aug 9, 2024

Benchmarks Report for tracer 🐌

Benchmarks for #5868 compared to master:

  • 2 benchmarks are faster, with geometric mean 1.175
  • 1 benchmarks are slower, with geometric mean 1.152
  • All benchmarks have the same allocations

The following thresholds were used for comparing the benchmark speeds:

  • Mann–Whitney U test with statistical test for significance of 5%
  • Only results indicating a difference greater than 10% and 0.3 ns are considered.

Allocation changes below 0.5% are ignored.

Benchmark details

Benchmarks.Trace.ActivityBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StartStopWithChild net6.0 7.62μs 41.3ns 234ns 0.0143 0.00714 0 5.43 KB
master StartStopWithChild netcoreapp3.1 10.1μs 55.4ns 355ns 0.0198 0.0099 0 5.62 KB
master StartStopWithChild net472 15.9μs 37.7ns 141ns 1.01 0.303 0.0956 6.06 KB
#5868 StartStopWithChild net6.0 7.65μs 41ns 287ns 0.0154 0.0077 0 5.43 KB
#5868 StartStopWithChild netcoreapp3.1 9.81μs 52.8ns 284ns 0.0195 0.00974 0 5.61 KB
#5868 StartStopWithChild net472 16.4μs 58.1ns 225ns 1.01 0.288 0.0881 6.06 KB
Benchmarks.Trace.AgentWriterBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net6.0 467μs 592ns 2.21μs 0 0 0 2.7 KB
master WriteAndFlushEnrichedTraces netcoreapp3.1 626μs 413ns 1.49μs 0 0 0 2.7 KB
master WriteAndFlushEnrichedTraces net472 839μs 600ns 2.32μs 0.419 0 0 3.3 KB
#5868 WriteAndFlushEnrichedTraces net6.0 490μs 323ns 1.25μs 0 0 0 2.7 KB
#5868 WriteAndFlushEnrichedTraces netcoreapp3.1 639μs 389ns 1.51μs 0 0 0 2.7 KB
#5868 WriteAndFlushEnrichedTraces net472 849μs 543ns 2.1μs 0.422 0 0 3.3 KB
Benchmarks.Trace.AspNetCoreBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendRequest net6.0 208μs 1.2μs 10μs 0.192 0 0 18.45 KB
master SendRequest netcoreapp3.1 232μs 1.39μs 13.8μs 0.215 0 0 20.61 KB
master SendRequest net472 3.25E‑05ns 3.25E‑05ns 0.000113ns 0 0 0 0 b
#5868 SendRequest net6.0 196μs 1.13μs 8.57μs 0.214 0 0 18.45 KB
#5868 SendRequest netcoreapp3.1 230μs 1.35μs 11.9μs 0.222 0 0 20.61 KB
#5868 SendRequest net472 0.0024ns 0.00101ns 0.00378ns 0 0 0 0 b
Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master WriteAndFlushEnrichedTraces net6.0 591μs 3.31μs 22μs 0.616 0 0 41.61 KB
master WriteAndFlushEnrichedTraces netcoreapp3.1 691μs 3.63μs 19.5μs 0.334 0 0 41.66 KB
master WriteAndFlushEnrichedTraces net472 868μs 4.26μs 18.6μs 8.45 2.53 0.422 53.29 KB
#5868 WriteAndFlushEnrichedTraces net6.0 558μs 2.68μs 10.4μs 0.566 0 0 41.76 KB
#5868 WriteAndFlushEnrichedTraces netcoreapp3.1 702μs 3.78μs 20μs 0.338 0 0 41.61 KB
#5868 WriteAndFlushEnrichedTraces net472 900μs 4.4μs 18.1μs 8.04 2.23 0.446 53.29 KB
Benchmarks.Trace.DbCommandBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteNonQuery net6.0 1.21μs 0.979ns 3.79ns 0.014 0 0 1.02 KB
master ExecuteNonQuery netcoreapp3.1 1.66μs 1.62ns 6.28ns 0.014 0 0 1.02 KB
master ExecuteNonQuery net472 2.08μs 2.02ns 7.83ns 0.157 0 0 987 B
#5868 ExecuteNonQuery net6.0 1.25μs 1.09ns 4.22ns 0.0144 0 0 1.02 KB
#5868 ExecuteNonQuery netcoreapp3.1 1.67μs 1.32ns 5.11ns 0.0134 0 0 1.02 KB
#5868 ExecuteNonQuery net472 1.92μs 2.54ns 9.84ns 0.156 0 0 987 B
Benchmarks.Trace.ElasticsearchBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master CallElasticsearch net6.0 1.15μs 0.845ns 3.16ns 0.0138 0 0 976 B
master CallElasticsearch netcoreapp3.1 1.57μs 0.551ns 1.99ns 0.0133 0 0 976 B
master CallElasticsearch net472 2.48μs 1.55ns 5.81ns 0.157 0 0 995 B
master CallElasticsearchAsync net6.0 1.28μs 0.473ns 1.7ns 0.0129 0 0 952 B
master CallElasticsearchAsync netcoreapp3.1 1.59μs 0.796ns 2.98ns 0.0136 0 0 1.02 KB
master CallElasticsearchAsync net472 2.68μs 1.89ns 7.33ns 0.167 0 0 1.05 KB
#5868 CallElasticsearch net6.0 1.24μs 0.467ns 1.81ns 0.0137 0 0 976 B
#5868 CallElasticsearch netcoreapp3.1 1.5μs 1.58ns 5.92ns 0.0127 0 0 976 B
#5868 CallElasticsearch net472 2.55μs 1.1ns 4.27ns 0.158 0 0 995 B
#5868 CallElasticsearchAsync net6.0 1.28μs 2.32ns 9ns 0.0131 0 0 952 B
#5868 CallElasticsearchAsync netcoreapp3.1 1.61μs 0.422ns 1.58ns 0.0137 0 0 1.02 KB
#5868 CallElasticsearchAsync net472 2.53μs 1.98ns 7.67ns 0.167 0 0 1.05 KB
Benchmarks.Trace.GraphQLBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master ExecuteAsync net6.0 1.2μs 0.505ns 1.82ns 0.0133 0 0 952 B
master ExecuteAsync netcoreapp3.1 1.59μs 0.585ns 2.19ns 0.0127 0 0 952 B
master ExecuteAsync net472 1.71μs 0.797ns 2.98ns 0.145 0 0 915 B
#5868 ExecuteAsync net6.0 1.22μs 0.628ns 2.35ns 0.0134 0 0 952 B
#5868 ExecuteAsync netcoreapp3.1 1.53μs 0.789ns 3.06ns 0.0129 0 0 952 B
#5868 ExecuteAsync net472 1.7μs 0.834ns 3.12ns 0.145 0 0 915 B
Benchmarks.Trace.HttpClientBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendAsync net6.0 4.14μs 4.06ns 15.7ns 0.0314 0 0 2.22 KB
master SendAsync netcoreapp3.1 5.2μs 1.27ns 4.77ns 0.0364 0 0 2.76 KB
master SendAsync net472 7.69μs 2.94ns 11.4ns 0.497 0 0 3.15 KB
#5868 SendAsync net6.0 4.14μs 1.58ns 5.9ns 0.0309 0 0 2.22 KB
#5868 SendAsync netcoreapp3.1 4.98μs 1.65ns 6.16ns 0.0374 0 0 2.76 KB
#5868 SendAsync net472 7.69μs 2.34ns 9.07ns 0.499 0 0 3.15 KB
Benchmarks.Trace.ILoggerBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 1.43μs 0.546ns 1.89ns 0.0228 0 0 1.64 KB
master EnrichedLog netcoreapp3.1 2.21μs 1.1ns 3.79ns 0.022 0 0 1.64 KB
master EnrichedLog net472 2.62μs 1.35ns 5.21ns 0.249 0 0 1.57 KB
#5868 EnrichedLog net6.0 1.46μs 0.8ns 2.99ns 0.0234 0 0 1.64 KB
#5868 EnrichedLog netcoreapp3.1 2.15μs 2.33ns 8.71ns 0.0225 0 0 1.64 KB
#5868 EnrichedLog net472 2.76μs 0.907ns 3.51ns 0.249 0 0 1.57 KB
Benchmarks.Trace.Log4netBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 115μs 255ns 986ns 0.058 0 0 4.28 KB
master EnrichedLog netcoreapp3.1 121μs 206ns 799ns 0 0 0 4.28 KB
master EnrichedLog net472 150μs 117ns 454ns 0.674 0.225 0 4.46 KB
#5868 EnrichedLog net6.0 116μs 111ns 428ns 0.0577 0 0 4.28 KB
#5868 EnrichedLog netcoreapp3.1 121μs 159ns 595ns 0 0 0 4.28 KB
#5868 EnrichedLog net472 148μs 299ns 1.16μs 0.669 0.223 0 4.46 KB
Benchmarks.Trace.NLogBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 3.18μs 0.874ns 3.27ns 0.0304 0 0 2.2 KB
master EnrichedLog netcoreapp3.1 4.21μs 2.37ns 9.18ns 0.0293 0 0 2.2 KB
master EnrichedLog net472 4.76μs 1.52ns 5.87ns 0.319 0 0 2.02 KB
#5868 EnrichedLog net6.0 3.18μs 0.785ns 2.94ns 0.0308 0 0 2.2 KB
#5868 EnrichedLog netcoreapp3.1 4.09μs 1.18ns 4.58ns 0.0287 0 0 2.2 KB
#5868 EnrichedLog net472 4.6μs 1ns 3.89ns 0.319 0 0 2.02 KB
Benchmarks.Trace.RedisBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master SendReceive net6.0 1.3μs 0.551ns 2.06ns 0.0159 0 0 1.14 KB
master SendReceive netcoreapp3.1 1.8μs 1.25ns 4.66ns 0.0152 0 0 1.14 KB
master SendReceive net472 2.11μs 1.23ns 4.75ns 0.183 0.00107 0 1.16 KB
#5868 SendReceive net6.0 1.28μs 1.81ns 6.76ns 0.0159 0 0 1.14 KB
#5868 SendReceive netcoreapp3.1 1.77μs 1ns 3.88ns 0.0149 0 0 1.14 KB
#5868 SendReceive net472 2.07μs 0.788ns 3.05ns 0.183 0 0 1.16 KB
Benchmarks.Trace.SerilogBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master EnrichedLog net6.0 2.74μs 0.845ns 3.05ns 0.0219 0 0 1.6 KB
master EnrichedLog netcoreapp3.1 3.78μs 1.15ns 4.47ns 0.0208 0 0 1.65 KB
master EnrichedLog net472 4.36μs 2.81ns 10.9ns 0.322 0 0 2.04 KB
#5868 EnrichedLog net6.0 2.77μs 1.03ns 4.01ns 0.022 0 0 1.6 KB
#5868 EnrichedLog netcoreapp3.1 3.78μs 1.89ns 7.31ns 0.0209 0 0 1.65 KB
#5868 EnrichedLog net472 4.4μs 1.39ns 5.19ns 0.324 0 0 2.04 KB
Benchmarks.Trace.SpanBenchmark - Slower ⚠️ Same allocations ✔️

Slower ⚠️ in #5868

Benchmark diff/base Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.SpanBenchmark.StartFinishScope‑netcoreapp3.1 1.152 673.39 775.80

Faster 🎉 in #5868

Benchmark base/diff Base Median (ns) Diff Median (ns) Modality
Benchmarks.Trace.SpanBenchmark.StartFinishSpan‑netcoreapp3.1 1.182 635.11 537.21
Benchmarks.Trace.SpanBenchmark.StartFinishSpan‑net6.0 1.169 473.39 405.09

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master StartFinishSpan net6.0 473ns 0.256ns 0.99ns 0.00798 0 0 576 B
master StartFinishSpan netcoreapp3.1 635ns 0.284ns 1.1ns 0.00761 0 0 576 B
master StartFinishSpan net472 637ns 0.719ns 2.79ns 0.0916 0 0 578 B
master StartFinishScope net6.0 484ns 0.218ns 0.845ns 0.00975 0 0 696 B
master StartFinishScope netcoreapp3.1 673ns 0.378ns 1.46ns 0.00939 0 0 696 B
master StartFinishScope net472 889ns 0.715ns 2.77ns 0.104 0 0 658 B
#5868 StartFinishSpan net6.0 405ns 0.158ns 0.61ns 0.0081 0 0 576 B
#5868 StartFinishSpan netcoreapp3.1 537ns 0.23ns 0.891ns 0.00765 0 0 576 B
#5868 StartFinishSpan net472 631ns 0.24ns 0.931ns 0.0916 0 0 578 B
#5868 StartFinishScope net6.0 481ns 0.117ns 0.455ns 0.00978 0 0 696 B
#5868 StartFinishScope netcoreapp3.1 775ns 0.831ns 3.22ns 0.00925 0 0 696 B
#5868 StartFinishScope net472 911ns 0.506ns 1.96ns 0.104 0 0 658 B
Benchmarks.Trace.TraceAnnotationsBenchmark - Same speed ✔️ Same allocations ✔️

Raw results

Branch Method Toolchain Mean StdError StdDev Gen 0 Gen 1 Gen 2 Allocated
master RunOnMethodBegin net6.0 647ns 0.477ns 1.85ns 0.00976 0 0 696 B
master RunOnMethodBegin netcoreapp3.1 896ns 0.286ns 1.11ns 0.00925 0 0 696 B
master RunOnMethodBegin net472 1.14μs 0.332ns 1.2ns 0.104 0 0 658 B
#5868 RunOnMethodBegin net6.0 629ns 0.194ns 0.752ns 0.00977 0 0 696 B
#5868 RunOnMethodBegin netcoreapp3.1 901ns 2.35ns 8.77ns 0.00925 0 0 696 B
#5868 RunOnMethodBegin net472 1.1μs 1.56ns 5.83ns 0.104 0 0 658 B

.gitlab/download-single-step-artifacts.sh Outdated Show resolved Hide resolved
.gitlab-ci.yml Show resolved Hide resolved
randomanderson and others added 2 commits August 9, 2024 12:20
## Summary of changes
Converts the Gitlab workflow to use the unified pipeline.

The changes can be summarized as follows:

* Removing Github actions that are now taken over by the unified
pipeline
* Removing Gitlab jobs taken over by the unified pipeline

## Reason for change
By using the unified pipeline across all APM libraries, there is less
maintenance hassle, fewer mistakes, and a more uniform creation of
artifacts.

## Implementation details

Artifacts are downloaded using the `download-single-step-artifacts`
script. If the pipeline is a _release_, artifacts are downloaded from
the Github release, otherwise, the script attempts to download artifacts
from Azure. `prepare-oci-package` takes the artifacts and creates the
OCI package. Everything else is handled by the unified pipeline.

## Test coverage
Tests, other than manual tests, are mostly impossible with pipelines.

<!-- ⚠️ Note: where possible, please obtain 2 approvals prior to
merging. Unless CODEOWNERS specifies otherwise, for external teams it is
typically best to have one review from a team member, and one review
from apm-dotnet. Trivial changes do not require 2 reviews. -->
@randomanderson randomanderson force-pushed the landerson/backport-unified-pipeline branch from 824e51a to 7abc602 Compare August 9, 2024 16:20
@randomanderson randomanderson marked this pull request as ready for review August 9, 2024 16:20
@randomanderson randomanderson requested a review from a team as a code owner August 9, 2024 16:20
Copy link
Member

@andrewlock andrewlock left a comment

Choose a reason for hiding this comment

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

LGTM - assuming everything passes, I think we're good, thanks!

@randomanderson randomanderson merged commit abd12ae into release/2.x Aug 12, 2024
59 of 62 checks passed
@randomanderson randomanderson deleted the landerson/backport-unified-pipeline branch August 12, 2024 12:45
@github-actions github-actions bot added this to the vNext-v2 milestone Aug 12, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:builds project files, build scripts, pipelines, versioning, releases, packages type:refactor
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants