Class: Theine::Server
- Inherits:
-
Object
- Object
- Theine::Server
- Includes:
- DRb::DRbUndumped
- Defined in:
- lib/theine/server.rb
Instance Attribute Summary collapse
-
#config ⇒ Object
readonly
Returns the value of attribute config.
Instance Method Summary collapse
- #add_worker ⇒ Object
- #all_size ⇒ Object
- #check_min_free_workers ⇒ Object
- #get_port(spawn_new = true) ⇒ Object
-
#initialize ⇒ Server
constructor
A new instance of Server.
- #set_worker_pid(port, pid) ⇒ Object
- #stop! ⇒ Object
- #worker_boot(port) ⇒ Object
- #worker_done(port) ⇒ Object
- #worker_session_name(port) ⇒ Object
Constructor Details
#initialize ⇒ Server
Returns a new instance of Server.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'lib/theine/server.rb', line 11 def initialize @config = ConfigReader.new(Dir.pwd) @workers = [] @workers_in_use = [] @worker_pids = {} @spawning_workers = [] @available_ports = ((config.base_port + 1)..config.max_port).to_a @check_mutex = Mutex.new @workers_mutex = Mutex.new run end |
Instance Attribute Details
#config ⇒ Object (readonly)
Returns the value of attribute config.
9 10 11 |
# File 'lib/theine/server.rb', line 9 def config @config end |
Instance Method Details
#add_worker ⇒ Object
26 27 28 29 30 31 32 33 34 |
# File 'lib/theine/server.rb', line 26 def add_worker path = File.('../worker.rb', __FILE__) port = @workers_mutex.synchronize { @available_ports.shift } puts "(spawn #{port})" spawn("screen", "-d", "-m", "-S", worker_session_name(port), "sh", "-c", "ruby #{path} #{config.base_port.to_s} #{port.to_s} #{config.rails_root}") @workers_mutex.synchronize { @spawning_workers << port } end |
#all_size ⇒ Object
88 89 90 |
# File 'lib/theine/server.rb', line 88 def all_size @workers_mutex.synchronize { @workers.size + @spawning_workers.size } end |
#check_min_free_workers ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/theine/server.rb', line 74 def check_min_free_workers if @check_mutex.try_lock # TODO: mutex, and dont do it if already in progress # do this in thread while all_size < config.min_free_workers unless config.spawn_parallel sleep 0.1 until @workers_mutex.synchronize { @spawning_workers.empty? } end add_worker end @check_mutex.unlock end end |
#get_port(spawn_new = true) ⇒ Object
63 64 65 66 67 68 69 70 71 72 |
# File 'lib/theine/server.rb', line 63 def get_port(spawn_new = true) add_worker if spawn_new && all_size == 0 port = @workers_mutex.synchronize { @workers.shift } @workers_mutex.synchronize { @workers_in_use << port } if port Thread.new { check_min_free_workers } if spawn_new port end |
#set_worker_pid(port, pid) ⇒ Object
40 41 42 43 44 |
# File 'lib/theine/server.rb', line 40 def set_worker_pid(port, pid) @workers_mutex.synchronize do @worker_pids[port] = pid end end |
#stop! ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/theine/server.rb', line 92 def stop! if spawning_worker_pids.include?(nil) puts "Waiting for workers to quit..." sleep 0.1 while spawning_worker_pids.include?(nil) end @workers_mutex.synchronize do (@spawning_workers + @workers_in_use + @workers).each do |port| kill_worker(port) end end exit(0) end |
#worker_boot(port) ⇒ Object
46 47 48 49 50 51 52 53 |
# File 'lib/theine/server.rb', line 46 def worker_boot(port) puts "+ worker #{port}" @workers_mutex.synchronize do @spawning_workers.delete(port) @workers << port end end |
#worker_done(port) ⇒ Object
55 56 57 58 59 60 61 |
# File 'lib/theine/server.rb', line 55 def worker_done(port) puts "- worker #{port}" @workers_mutex.synchronize do @workers_in_use.delete(port) @available_ports << port end end |
#worker_session_name(port) ⇒ Object
36 37 38 |
# File 'lib/theine/server.rb', line 36 def worker_session_name(port) "theine#{port}" end |