Class: Theine::Server

Inherits:
Object
  • Object
show all
Includes:
DRb::DRbUndumped
Defined in:
lib/theine/server.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeServer

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

#configObject (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_workerObject



26
27
28
29
30
31
32
33
34
# File 'lib/theine/server.rb', line 26

def add_worker
  path = File.expand_path('../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_sizeObject



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_workersObject



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