Skip to content

Commit

Permalink
Avoid lock when ecs_compatibility is explicitly specified (#16786)
Browse files Browse the repository at this point in the history
Because a `break` escapes a `begin`...`end` block, we must not use a `break` in order to ensure that the explicitly set value gets memoized to avoid lock contention.

> ~~~ ruby
> def fake_sync(&block)
>   puts "FAKE_SYNC:enter"
>   val = yield
>   puts "FAKE_SYNC:return(#{val})"
>   return val
> ensure
>   puts "FAKE_SYNC:ensure"
> end
>
> fake_sync do
>   @ivar = begin
>     puts("BE:begin")
>   	break :break
>
>   	val = :ret
>   	puts("BE:return(#{val})")
>   	val
>   ensure
>     puts("BE:ensure")
>   end
> end
> ~~~

Note: no `FAKE_SYNC:return`:

> ~~~
> ╭─{ rye@perhaps:~/src/elastic/logstash (main ✔) }
> ╰─● ruby break-esc.rb
> FAKE_SYNC:enter
> BE:begin
> BE:ensure
> FAKE_SYNC:ensure
> [success]
> ~~~

(cherry picked from commit 01c8e8b)
  • Loading branch information
yaauie authored and logstashmachine committed Dec 19, 2024
1 parent 886a0c7 commit 5c091ec
Showing 1 changed file with 4 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ def self.included(base)

def ecs_compatibility
@_ecs_compatibility || LogStash::Util.synchronize(self) do
@_ecs_compatibility ||= begin
# use config_init-set value if present
break @ecs_compatibility unless @ecs_compatibility.nil?
# use config_init-set value if present
@_ecs_compatibility ||= @ecs_compatibility

# load default from settings
@_ecs_compatibility ||= begin
pipeline = execution_context.pipeline
pipeline_settings = pipeline && pipeline.settings
pipeline_settings ||= LogStash::SETTINGS
Expand Down

0 comments on commit 5c091ec

Please sign in to comment.