Class | PhusionPassenger::SpawnManager |
In: |
lib/phusion_passenger/spawn_manager.rb
|
Parent: | AbstractServer |
The spawn manager is capable of spawning Ruby on Rails or Rack application instances. It acts like a simple fascade for the rest of the spawn manager system.
Note: SpawnManager may only be started synchronously with AbstractServer#start_synchronously. Starting asynchronously has not been tested. Don‘t forget to call cleanup after the server‘s main loop has finished.
Spawning a Ruby on Rails application is usually slow. But SpawnManager will preload and cache Ruby on Rails frameworks, as well as application code, so subsequent spawns will be very fast.
Internally, SpawnManager uses Railz::FrameworkSpawner to preload and cache Ruby on Rails frameworks. Railz::FrameworkSpawner, in turn, uses Railz::ApplicationSpawner to preload and cache application code.
In case you‘re wondering why the namespace is "Railz" and not "Rails": it‘s to work around an obscure bug in ActiveSupport‘s Dispatcher.
# File lib/phusion_passenger/spawn_manager.rb, line 61 61: def initialize 62: super() 63: @spawners = AbstractServerCollection.new 64: define_message_handler(:spawn_application, :handle_spawn_application) 65: define_message_handler(:reload, :handle_reload) 66: define_signal_handler('SIGHUP', :reload) 67: 68: # Start garbage collector in order to free up some existing 69: # heap slots. This prevents the heap from growing unnecessarily 70: # during the startup phase. 71: GC.start 72: if GC.copy_on_write_friendly? 73: # Preload libraries for copy-on-write semantics. 74: require 'base64' 75: require 'phusion_passenger/application' 76: require 'phusion_passenger/railz/framework_spawner' 77: require 'phusion_passenger/railz/application_spawner' 78: require 'phusion_passenger/rack/application_spawner' 79: require 'phusion_passenger/html_template' 80: require 'phusion_passenger/platform_info' 81: require 'phusion_passenger/exceptions' 82: end 83: end
Cleanup resources. Should be called when this SpawnManager is no longer needed.
# File lib/phusion_passenger/spawn_manager.rb, line 206 206: def cleanup 207: @spawners.cleanup 208: end
Remove the cached application instances at the given application root. If nil is specified as application root, then all cached application instances will be removed, no matter the application root.
Long description: Application code might be cached in memory. But once it a while, it will be necessary to reload the code for an application, such as after deploying a new version of the application. This method makes sure that any cached application code is removed, so that the next time an application instance is spawned, the application code will be freshly loaded into memory.
Raises AbstractServer::SpawnError if something went wrong.
# File lib/phusion_passenger/spawn_manager.rb, line 179 179: def reload(app_root = nil) 180: @spawners.synchronize do 181: if app_root 182: # Delete associated ApplicationSpawner. 183: @spawners.delete("app:#{app_root}") 184: else 185: # Delete all ApplicationSpawners. 186: keys_to_delete = [] 187: @spawners.each_pair do |key, spawner| 188: if spawner.is_a?(Railz::ApplicationSpawner) 189: keys_to_delete << key 190: end 191: end 192: keys_to_delete.each do |key| 193: @spawners.delete(key) 194: end 195: end 196: @spawners.each do |spawner| 197: # Reload all FrameworkSpawners. 198: if spawner.respond_to?(:reload) 199: spawner.reload(app_root) 200: end 201: end 202: end 203: end
Spawn an application with the given spawn options. When successful, an Application object will be returned, which represents the spawned application. At least one option must be given: app_root. This is the application‘s root folder.
Other options are:
"smart" caches the Rails framework code in a framework spawner server, and application code in an application spawner server. Sometimes it is desirable to skip the framework spawning and going directly for the application spawner instead. The "smart-lv2" method allows you to do that.
Caching however can be incompatible with some applications. The "conservative" spawning method does not involve any caching at all. Spawning will be slower, but is guaranteed to be compatible with all applications.
The default spawn method is "smart-lv2".
A timeout of 0 means that the spawner server should never idle timeout. A timeout of -1 means that the default timeout value should be used. The default value is -1.
Exceptions:
# File lib/phusion_passenger/spawn_manager.rb, line 133 133: def spawn_application(options) 134: if !options["app_root"] 135: raise ArgumentError, "The 'app_root' option must be given." 136: end 137: options = sanitize_spawn_options(options) 138: 139: if options["app_type"] == "rails" 140: if !defined?(Railz::FrameworkSpawner) 141: require 'phusion_passenger/application' 142: require 'phusion_passenger/railz/framework_spawner' 143: require 'phusion_passenger/railz/application_spawner' 144: end 145: return spawn_rails_application(options) 146: elsif options["app_type"] == "rack" 147: if !defined?(Rack::ApplicationSpawner) 148: require 'phusion_passenger/rack/application_spawner' 149: end 150: return Rack::ApplicationSpawner.spawn_application( 151: options["app_root"], options 152: ) 153: elsif options["app_type"] == "wsgi" 154: require 'phusion_passenger/wsgi/application_spawner' 155: return WSGI::ApplicationSpawner.spawn_application( 156: options["app_root"], 157: options["lower_privilege"], 158: options["lowest_user"], 159: options["environment"] 160: ) 161: else 162: raise ArgumentError, "Unknown 'app_type' value '#{options["app_type"]}'." 163: end 164: end