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

Remove SMTP server reloading #2799

Merged
merged 1 commit into from
Feb 13, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 16 additions & 46 deletions lib/postal/smtp_server/server.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
require "ipaddr"
require "nio"

# rubocop:disable Style/GlobalVars
module Postal
module SMTPServer
class Server
Expand All @@ -14,25 +13,26 @@ def initialize(options = {})
prepare_environment
end

def run
listen
run_event_loop
end

private

def prepare_environment
$\ = "\r\n"
BasicSocket.do_not_reverse_lookup = true

trap("USR1") do
$stdout.puts "Received USR1 signal, respawning."
fork do
if ENV["APP_ROOT"]
Dir.chdir(ENV["APP_ROOT"])
end
ENV.delete("BUNDLE_GEMFILE")
exec("bundle exec --keep-file-descriptors rake postal:smtp_server", close_others: false)
end
end

trap("TERM") do
$stdout.puts "Received TERM signal, shutting down."
unlisten
end

trap("INT") do
$stdout.puts "Received INT signal, shutting down."
unlisten
end
end

def ssl_context
Expand All @@ -48,11 +48,7 @@ def ssl_context
end

def listen
if ENV["SERVER_FD"]
@server = TCPServer.for_fd(ENV["SERVER_FD"].to_i)
else
@server = TCPServer.open(Postal.config.smtp_server.bind_address, Postal.config.smtp_server.port)
end
@server = TCPServer.open(Postal.config.smtp_server.bind_address, Postal.config.smtp_server.port)
@server.autoclose = false
@server.close_on_exec = false
if defined?(Socket::SOL_SOCKET) && defined?(Socket::SO_KEEPALIVE)
Expand All @@ -63,20 +59,15 @@ def listen
@server.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPINTVL, 10)
@server.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPCNT, 5)
end
ENV["SERVER_FD"] = @server.to_i.to_s
logger.info "Listening on #{Postal.config.smtp_server.bind_address}:#{Postal.config.smtp_server.port}"
end

def unlisten
# Instruct the nio loop to unlisten and wake it
$unlisten = true
@unlisten = true
@io_selector.wakeup
end

def kill_parent
Process.kill("TERM", Process.ppid)
end

def run_event_loop
# Set up an instance of nio4r to monitor for connections and data
@io_selector = NIO::Selector.new
Expand Down Expand Up @@ -259,7 +250,7 @@ def run_event_loop
end
end
# If unlisten has been called, stop listening
next unless $unlisten
next unless @unlisten

@io_selector.deregister(@server)
@server.close
Expand All @@ -268,35 +259,14 @@ def run_event_loop
Process.exit(0)
end
# Clear the request
$unlisten = false
end
end

def run
# Write PID to file if path specified
if ENV["PID_FILE"]
File.write(ENV["PID_FILE"], Process.pid.to_s + "\n")
end
# If we have been spawned to replace an existing processm shut down the
# parent after listening.
# rubocop:disable Style/IdenticalConditionalBranches
if ENV["SERVER_FD"]
listen
kill_parent if ENV["SERVER_FD"]
else
listen
@unlisten = false
end
# rubocop:enable Style/IdenticalConditionalBranches
run_event_loop
end

private

def logger
Postal.logger_for(:smtp_server)
end

end
end
end
# rubocop:enable Style/GlobalVars
Loading