diff --git a/app/models/miq_worker.rb b/app/models/miq_worker.rb index c0241688fc7..38f34809701 100644 --- a/app/models/miq_worker.rb +++ b/app/models/miq_worker.rb @@ -314,6 +314,7 @@ def self.before_fork def self.after_fork close_pg_sockets_inherited_from_parent DRb.stop_service + close_drb_pool_connections renice(Process.pid) end @@ -330,6 +331,23 @@ def self.close_pg_sockets_inherited_from_parent end end + # Close all open DRb connections so that connections in the parent's memory space + # which is shared due to forking the child process do not pollute the child's DRb + # connection pool. This can lead to errors when the children connect to a server + # and get an incorrect response back. + # + # ref: https://bugs.ruby-lang.org/issues/2718 + def self.close_drb_pool_connections + require 'drb' + + # HACK: DRb doesn't provide an interface to close open pool connections. + # + # Once that is added this should be replaced. + DRb::DRbConn.instance_variable_get(:@mutex).synchronize do + DRb::DRbConn.instance_variable_get(:@pool).each(&:close) + end + end + # Overriding queue_name as now some queue names can be # arrays of names for some workers not just a singular name. # We use JSON.parse as the array of names is stored as a string.