Skip to content

Conversation

@yaauie
Copy link
Contributor

@yaauie yaauie commented Oct 28, 2025

Uses the PortManagementSupport mixin from logstash-plugins/logstash-mixin-port_management_support#1 to reserve a port in #register so that the plugin will fail to start if the port is unavailable.

Resolves the TCP input's expression of elastic/logstash#17703

@yaauie yaauie requested a review from jsvd October 28, 2025 15:35
Comment on lines +183 to +185
@port_reservation = port_management.reserve(addr: @host, port: @port) do |reserved_addr, reserved_port|
@loop = InputLoop.new(@id, reserved_addr, reserved_port, DecoderImpl.new(@codec, self), @tcp_keep_alive, java_ssl_context)
end
Copy link
Member

Choose a reason for hiding this comment

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

I don't think we need to use blocks here since we're not wrapping behavior:

Suggested change
@port_reservation = port_management.reserve(addr: @host, port: @port) do |reserved_addr, reserved_port|
@loop = InputLoop.new(@id, reserved_addr, reserved_port, DecoderImpl.new(@codec, self), @tcp_keep_alive, java_ssl_context)
end
port_management.reserve(port: @port) # if this succeeds, there is a reservation for the port
@loop = InputLoop.new(@id, @host, @port, DecoderImpl.new(@codec, self), @tcp_keep_alive, java_ssl_context)

Also we should set the reservation scope for the port alone. Not sure if it's worth differentiating the addr, we can be conservative here and allow the port to be reserved regardless of the addr.

Comment on lines +192 to +196
@port_reservation.convert do |reserved_addr, reserved_port|
@logger.info("Starting tcp input listener", :address => "#{reserved_addr}:#{reserved_port}", :ssl_enabled => @ssl_enabled)
@loop.start
end
@loop.wait_until_closed
Copy link
Member

Choose a reason for hiding this comment

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

Could we just do:

Suggested change
@port_reservation.convert do |reserved_addr, reserved_port|
@logger.info("Starting tcp input listener", :address => "#{reserved_addr}:#{reserved_port}", :ssl_enabled => @ssl_enabled)
@loop.start
end
@loop.wait_until_closed
@logger.info("Starting tcp input listener", :address => "#{@host}:#{@port}", :ssl_enabled => @ssl_enabled)
port_management.release(port: @port) { @loop.run }

Essentially tell the global manager:

  1. ok I'm here.
  2. release the port but don't free the reservation until I'm out?

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants