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

Minor: Import upstream safety check into the profiler custom rb_profile_frames #2583

Merged
merged 1 commit into from
Jan 25, 2023

Conversation

ivoanjo
Copy link
Member

@ivoanjo ivoanjo commented Jan 25, 2023

What does this PR do?:

This PR imports the fix in ruby/ruby#7116 into the custom version of rb_profile_frames that we ship inside ddtrace.

Motivation:

As I mention in the inline comments, I don't expect this extra safety check to ever be triggered, but just in case I decided to add it anyway, since the cost of getting my expectation wrong is a VM crash.

Additional Notes:

N/A

How to test the change?:

Adding test coverage for this is... difficult. Our current test of this logic is indirect (e.g. via our own code for sampling), and reproducing the state to trigger this is hard.

So for now I only added the check without extra testing.

…ile_frames`

**What does this PR do?**:

This PR imports the fix in ruby/ruby#7116 into
the custom version of `rb_profile_frames` that we ship inside ddtrace.

**Motivation**:

As I mention in the inline comments, I don't expect this extra safety
check to ever be triggered, but just in case I decided to add it
anyway, since the cost of getting my expectation wrong is a VM crash.

**Additional Notes**:

N/A

**How to test the change?**:

Adding test coverage for this is... difficult. Our current test of
this logic is indirect (e.g. via our own code for sampling), and
reproducing the state to trigger this is hard.

So for now I only added the check without extra testing.
@ivoanjo ivoanjo requested a review from a team January 25, 2023 14:53
@ivoanjo ivoanjo added the profiling Involves Datadog profiling label Jan 25, 2023
@ivoanjo ivoanjo merged commit 919bd48 into master Jan 25, 2023
@ivoanjo ivoanjo deleted the ivoanjo/import-upstream-safety-check branch January 25, 2023 15:41
@github-actions github-actions bot added this to the 1.9.0 milestone Jan 25, 2023
ivoanjo added a commit that referenced this pull request Feb 2, 2023
**What does this PR do?**:

In #2583 we added a very small check to our custom
`ddtrace_rb_profile_frames` to match a similar fix added to upstream
Ruby.

But I've just spotted this caused one of the profiling tests to become
flaky:

```
$ bundle exec rspec spec/datadog/profiling --seed 14514

Failures:

  1) Datadog::Profiling::Collectors::Stack when sampling a thread with empty locations gathers a one-element stack with a "In native code" placeholder
     Failure/Error: expect(gathered_stack).to contain_exactly({ base_label: '', path: 'In native code', lineno: 0 })

       expected collection contained:  [{:base_label=>"", :lineno=>0, :path=>"In native code"}]
       actual collection contained:    []
       the missing elements were:      [{:base_label=>"", :lineno=>0, :path=>"In native code"}]
     # ./spec/datadog/profiling/collectors/stack_spec.rb:373:in `block (3 levels) in <top (required)>'
     # ./spec/spec_helper.rb:220:in `block (2 levels) in <top (required)>'
     # ./spec/spec_helper.rb:112:in `block (2 levels) in <top (required)>'
     # /home/ivo.anjo/.rvm/gems/ruby-2.7.7/gems/webmock-3.13.0/lib/webmock/rspec.rb:37:in `block (2 levels) in <top (required)>'

  2) Datadog::Profiling::Collectors::Stack when sampling a thread with empty locations when marking sample as being in garbage collection gathers a two-element stack with a placeholder for "In native code" and another for garbage collection
     Failure/Error:
       expect(gathered_stack).to contain_exactly(
         { base_label: '', path: 'Garbage Collection', lineno: 0 },
         { base_label: '', path: 'In native code', lineno: 0 }
       )

       expected collection contained:  [{:base_label=>"", :lineno=>0, :path=>"Garbage Collection"}, {:base_label=>"", :lineno=>0, :path=>"In native code"}]
       actual collection contained:    [{:base_label=>"", :lineno=>0, :path=>"Garbage Collection"}]
       the missing elements were:      [{:base_label=>"", :lineno=>0, :path=>"In native code"}]
     # ./spec/datadog/profiling/collectors/stack_spec.rb:380:in `block (4 levels) in <top (required)>'
     # ./spec/spec_helper.rb:220:in `block (2 levels) in <top (required)>'
     # ./spec/spec_helper.rb:112:in `block (2 levels) in <top (required)>'
     # /home/ivo.anjo/.rvm/gems/ruby-2.7.7/gems/webmock-3.13.0/lib/webmock/rspec.rb:37:in `block (2 levels) in <top (required)>'

Finished in 13.42 seconds (files took 0.44192 seconds to load)
563 examples, 2 failures, 15 pending

Failed examples:

rspec ./spec/datadog/profiling/collectors/stack_spec.rb:372 # Datadog::Profiling::Collectors::Stack when sampling a thread with empty locations gathers a one-element stack with a "In native code" placeholder
rspec ./spec/datadog/profiling/collectors/stack_spec.rb:379 # Datadog::Profiling::Collectors::Stack when sampling a thread with empty locations when marking sample as being in garbage collection gathers a two-element stack with a placeholder for "In native code" and another for garbage collection
```

This issue was caused by the `cfp == NULL` check being added before the
`end_cfp == NULL` check we have to detect when we should add the "In
native code" placeholder.

In some cases, `cfp` is set and the placeholder is added, but in others,
it's not.

To fix this, I've swapped the order of the checks, so that the check to
introduce the placeholder gets higher priority.

**Motivation**:

Fix bug (that also causes flaky tests).

**Additional Notes**:

(N/A)

**How to test the change?**:

Validate that running profiling test suite works with for instance
seed 14154.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
profiling Involves Datadog profiling
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants