class ManqodServer

this file is part of manqod manqod is distributed under the CDDL licence the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)

Attributes

connected_clients[R]
dbs[R]
starting_up[R]
uri[R]

Public Class Methods

new(opts) click to toggle source
# File lib/ManqodServer.rb, line 11
def initialize(opts)
        @starting_up=true
        @uri=opts[:bind]
        @logdev=opts[:log]
        @log_level=opts[:debug]
        @report_address=opts[:report]
        @path=opts[:path]
        @connections_conf=opts[:connections_conf]
        @conns=Hash.new
        @dbs=Hash.new
        @connected_clients=Hash.new
end

Public Instance Methods

alive?() click to toggle source
# File lib/ManqodServer.rb, line 155
def alive?
        true
end
conn(conn_name) click to toggle source
# File lib/ManqodServer.rb, line 66
def conn(conn_name)
        @conns[conn_name]
end
conn_list() { |conn_name,conn| ... } click to toggle source
# File lib/ManqodServer.rb, line 70
def conn_list
        @conns.each_pair{|conn_name,conn|
                yield conn_name,conn
        }
end
default_connection() click to toggle source
# File lib/ManqodServer.rb, line 76
def default_connection
        dc=nil
        @conns.each_pair{|cn,c| dc=c if c.has_key?("client_default") && c["client_default"]}
        dc
end
free_conn(conn_name) click to toggle source
# File lib/ManqodServer.rb, line 125
def free_conn(conn_name)
        if @dbs.has_key?(conn_name)
                @dbs[conn_name].exit
                @dbs.delete(conn_name)
                einfo("#{conn_name} freed.")
        end
end
init() click to toggle source
# File lib/ManqodServer.rb, line 26
def init
        ManqodLogger.instance.set_log(@logdev) if @logdev
        einfo("setting log level to #{@log_level}")
        ManqodLogger.instance.set_level(@log_level) if @log_level
        ManqodLogger.instance.set_report_address(@report_address) if @report_address
        load_conns
        begin
                DRb.start_service(@uri,self)
        rescue =>err
                eerror("starting main server failed: #{err}")
                return false
        end
        @conns.sort{|a,b| a[1]["auto_load_order"] <=> b[1]["auto_load_order"]}.each{|conn| 
                load_conn(conn[0]) if conn[1]["auto_load"]
        }
        setup_clients
        init_HeartBeat
        @starting_up=false
        eprint("serving")
        DRb.thread.join
        einfo("graceful shutdown")
end
load_conn(conn_name) click to toggle source
# File lib/ManqodServer.rb, line 90
        def load_conn(conn_name)
                if @conns.has_key?(conn_name)
                        begin
                                @conns[conn_name]["key_name"]=conn_name
                                @conns[conn_name]['pid']=fork{
                                        th=DrbDb.new(@conns[conn_name],@uri)
                                        th.init
                                }
                                Process.detach(@conns[conn_name]['pid'])
                                edebug("forked \"#{conn_name}\" [#{@conns[conn_name]['uri']}](#{@conns[conn_name]['pid']})")
                                
                                begin
                                        sleep 1
                                        @dbs[conn_name]=DRb::DRbObject.new_with_uri(@conns[conn_name]['uri'])
#                                       @dbs[conn_name].alive?
                                        @dbs[conn_name].state
                                        @dbs[conn_name].setup_client
                                        rescue => err
                                        #check if pid is alive
                                        begin
                                                Process::kill(0,@conns[conn_name]['pid'])
                                        rescue Errno::ESRCH
                                                raise("Process with pid #{@conns[conn_name]['pid']} is dead")
                                        end
                                        ewarn("waiting for startup of #{conn_name} (#{err})")
                                        retry
                                end while @dbs[conn_name].state != DrbDb::SERVING
                        rescue =>err
                                eerror("error starting connection:#{conn_name} #{err}, retrying")
                                sleep 1
                                retry
                        end
                end
        end
register_client(client_id,client_object,client_db) click to toggle source
# File lib/ManqodServer.rb, line 146
def register_client(client_id,client_object,client_db)
        @connected_clients[client_id.clone]={:object => client_object, :db => client_db} unless @connected_clients.has_key?(client_id)
        einfo("#{client_id} registered to [#{client_db}]")
end
reload_conn(conn_name) click to toggle source
# File lib/ManqodServer.rb, line 82
def reload_conn(conn_name)
        if @conns.has_key?(conn_name)
                free_conn(conn_name) if @dbs.has_key?(conn_name)
                load_conn(conn_name)
                setup_clients
        end
end
setup_clients() click to toggle source
# File lib/ManqodServer.rb, line 49
def setup_clients
        #wait for all clients to start up
        begin
                begin
                        found=false
                        @dbs.each_value{|drbdb|
                                unless drbdb.serving?
                                        found = true 
                                        sleep 1
                                end
                        }
                end while found
                @dbs.each_pair{|conn_name,drbdb| drbdb.setup_client unless drbdb.client and drbdb.client.alive?}
        rescue
        end
end
stop() click to toggle source
# File lib/ManqodServer.rb, line 133
def stop
        @dbs.each_key{|dbn| 
                begin
                        free_conn(dbn)
                rescue =>err
                        eerror("cannot stop #{dbn}:#{err}")
                end
        }
        current_server.stop_service
        einfo("server halted")
        exit
end
to_s() click to toggle source
# File lib/ManqodServer.rb, line 159
def to_s
        "ManqodServer"
end
unregister_client(client_id) click to toggle source
# File lib/ManqodServer.rb, line 150
def unregister_client(client_id)
        @connected_clients.delete(client_id)
        einfo("#{client_id} unregistered")
end