class Roma::Client::Proxy::Daemon

Attributes

daemon[R]

Public Class Methods

new(argv = nil) click to toggle source
    # File lib/roma/client/proxy/daemon.rb
139 def initialize(argv = nil)
140   options(argv)
141   initialize_logger
142   @sender = Roma::Client::Sender.new
143   update_rttable(@init_nodes)
144 end
rttable() click to toggle source
    # File lib/roma/client/proxy/daemon.rb
135 def self.rttable
136   @@rttable
137 end

Private Class Methods

daemon() { || ... } click to toggle source
    # File lib/roma/client/proxy/daemon.rb
246 def self.daemon
247   p = Process.fork {
248     pid=Process.setsid
249     Signal.trap(:INT){
250       exit! 0
251     }
252     Signal.trap(:TERM){
253       exit! 0       
254     }
255     Signal.trap(:HUP){
256       exit! 0
257     }
258     File.open("/dev/null","r+"){|f|
259       STDIN.reopen f
260       STDOUT.reopen f
261       STDERR.reopen f
262     }
263     yield
264   }
265   $stderr.puts p
266   exit! 0
267 end

Public Instance Methods

initialize_logger() click to toggle source
    # File lib/roma/client/proxy/daemon.rb
146 def initialize_logger
147   Roma::Logging::RLogger.create_singleton_instance(@log_path,
148                                                    @log_age,
149                                                    @log_size)
150 end
start() click to toggle source
    # File lib/roma/client/proxy/daemon.rb
152 def start
153   
154   timer
155   
156   loop do
157     begin
158       EventMachine::run do
159         EventMachine.start_server('0.0.0.0', @port, ClientHandler)
160         EventMachine.start_unix_domain_server("/tmp/#{@uds_name}", ClientHandler)
161       end
162     rescue =>e
163       $log.error("#{e} #{$@}")
164       retry
165     end
166   end
167 end

Private Instance Methods

make_rttable(node) click to toggle source
    # File lib/roma/client/proxy/daemon.rb
184 def make_rttable(node)
185   mklhash = @sender.send_route_mklhash_command(node)
186   return nil unless mklhash
187 
188   if @@rttable && @@rttable.mklhash == mklhash
189     return @@rttable
190   end
191 
192   rd = @sender.send_routedump_command(node)
193   if rd
194     ret = Roma::Client::ClientRoutingTable.new(rd)
195     ret.mklhash = mklhash
196     return ret
197   end
198   nil
199 rescue =>e
200   $log.error("#{e} #{$@}")
201   nil
202 end
options(argv) click to toggle source
    # File lib/roma/client/proxy/daemon.rb
204 def options(argv)
205   opts = OptionParser.new
206   opts.banner="usage:#{File.basename($0)} [options] addr_port"
207 
208   @uds_name = 'roma'
209   opts.on("-n", "--name [name]","Unix domain socket name.default=roma") { |v| @uds_name = v }
210   @port = 12345
211   opts.on("-p", "--port [port number]","default=12345"){ |v| @port = v.to_i }
212   @log_path = "./rcdaemon.log"
213   opts.on("-l", "--log [path]","default=./"){ |v|
214     @log_path = v
215     @log_path << "/" if @log_path[-1] != "/"
216     @log_path << "rcdaemon.log"
217   }
218 
219   @daemon = true
220   opts.on(nil, "--debug"){ @daemon = false }
221   @log_age = 10
222   @log_size = 1024 * 1024
223 
224   opts.parse!(argv)
225   raise OptionParser::ParseError.new if argv.length < 1
226   @init_nodes = argv
227 rescue OptionParser::ParseError => e
228   $stderr.puts e.message
229   $stderr.puts opts.help
230   exit 1
231 end
timer() click to toggle source
    # File lib/roma/client/proxy/daemon.rb
233 def timer
234   Thread.new do
235     loop do
236       sleep 10
237       timer_event_10sec
238     end
239   end
240 end
timer_event_10sec() click to toggle source
    # File lib/roma/client/proxy/daemon.rb
242 def timer_event_10sec
243   update_rttable(@@rttable.nodes)
244 end
update_rttable(nodes) click to toggle source
    # File lib/roma/client/proxy/daemon.rb
171 def update_rttable(nodes)
172   raise RuntimeError.new("nodes must not be nil.") unless nodes
173   
174   nodes.each { |node|
175     rt = make_rttable(node)
176     if rt != nil
177       @@rttable = rt
178       return
179     end
180   }
181   raise RuntimeError.new("fatal error")
182 end