1
0
مراية لـ https://github.com/postalserver/postal.git تم المزامنة 2025-12-01 05:43:04 +00:00

refactor: remove reloading on the smtp server

هذا الالتزام موجود في:
Adam Cooke
2024-02-12 10:56:16 +00:00
الأصل ec636661d5
التزام c3c304e98b

عرض الملف

@@ -3,7 +3,6 @@
require "ipaddr" require "ipaddr"
require "nio" require "nio"
# rubocop:disable Style/GlobalVars
module Postal module Postal
module SMTPServer module SMTPServer
class Server class Server
@@ -14,25 +13,26 @@ module Postal
prepare_environment prepare_environment
end end
def run
listen
run_event_loop
end
private
def prepare_environment def prepare_environment
$\ = "\r\n" $\ = "\r\n"
BasicSocket.do_not_reverse_lookup = true 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 trap("TERM") do
$stdout.puts "Received TERM signal, shutting down." $stdout.puts "Received TERM signal, shutting down."
unlisten unlisten
end end
trap("INT") do
$stdout.puts "Received INT signal, shutting down."
unlisten
end
end end
def ssl_context def ssl_context
@@ -48,11 +48,7 @@ module Postal
end end
def listen 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) @server = TCPServer.open(Postal.config.smtp_server.bind_address, Postal.config.smtp_server.port)
end
@server.autoclose = false @server.autoclose = false
@server.close_on_exec = false @server.close_on_exec = false
if defined?(Socket::SOL_SOCKET) && defined?(Socket::SO_KEEPALIVE) if defined?(Socket::SOL_SOCKET) && defined?(Socket::SO_KEEPALIVE)
@@ -63,20 +59,15 @@ module Postal
@server.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPINTVL, 10) @server.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPINTVL, 10)
@server.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPCNT, 5) @server.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPCNT, 5)
end end
ENV["SERVER_FD"] = @server.to_i.to_s
logger.info "Listening on #{Postal.config.smtp_server.bind_address}:#{Postal.config.smtp_server.port}" logger.info "Listening on #{Postal.config.smtp_server.bind_address}:#{Postal.config.smtp_server.port}"
end end
def unlisten def unlisten
# Instruct the nio loop to unlisten and wake it # Instruct the nio loop to unlisten and wake it
$unlisten = true @unlisten = true
@io_selector.wakeup @io_selector.wakeup
end end
def kill_parent
Process.kill("TERM", Process.ppid)
end
def run_event_loop def run_event_loop
# Set up an instance of nio4r to monitor for connections and data # Set up an instance of nio4r to monitor for connections and data
@io_selector = NIO::Selector.new @io_selector = NIO::Selector.new
@@ -259,7 +250,7 @@ module Postal
end end
end end
# If unlisten has been called, stop listening # If unlisten has been called, stop listening
next unless $unlisten next unless @unlisten
@io_selector.deregister(@server) @io_selector.deregister(@server)
@server.close @server.close
@@ -268,30 +259,10 @@ module Postal
Process.exit(0) Process.exit(0)
end end
# Clear the request # Clear the request
$unlisten = false @unlisten = false
end end
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
end
# rubocop:enable Style/IdenticalConditionalBranches
run_event_loop
end
private
def logger def logger
Postal.logger_for(:smtp_server) Postal.logger_for(:smtp_server)
end end
@@ -299,4 +270,3 @@ module Postal
end end
end end
end end
# rubocop:enable Style/GlobalVars