Class: Droonga::Serf
Defined Under Namespace
Classes: SerfProcess
Constant Summary collapse
- ROLE =
{ :default => { :port => 7946, }, :source => { :port => 7947, }, :destination => { :port => 7948, }, }
Class Method Summary collapse
Instance Method Summary collapse
- #cluster_id ⇒ Object
-
#initialize(loop, name) ⇒ Serf
constructor
A new instance of Serf.
- #join(*hosts) ⇒ Object
- #live_nodes ⇒ Object
- #restart ⇒ Object
- #running? ⇒ Boolean
- #send_query(query, payload) ⇒ Object
- #set_tag(name, value) ⇒ Object
- #start ⇒ Object
- #stop ⇒ Object
- #update_cluster_id ⇒ Object
Constructor Details
#initialize(loop, name) ⇒ Serf
Returns a new instance of Serf.
51 52 53 54 55 56 57 |
# File 'lib/droonga/serf.rb', line 51 def initialize(loop, name) # TODO: Don't allow nil for loop. It reduces nil checks and # simplifies source code. @loop = loop @name = name @agent = nil end |
Class Method Details
Instance Method Details
#cluster_id ⇒ Object
156 157 158 159 160 |
# File 'lib/droonga/serf.rb', line 156 def cluster_id loader = CatalogLoader.new(Path.catalog.to_s) catalog = loader.load catalog.cluster_id end |
#join(*hosts) ⇒ Object
98 99 100 101 102 103 104 |
# File 'lib/droonga/serf.rb', line 98 def join(*hosts) ensure_serf nodes = hosts.collect do |host| "#{host}:#{port}" end run_once("join", *nodes) end |
#live_nodes ⇒ Object
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/droonga/serf.rb', line 128 def live_nodes ensure_serf nodes = {} result = run_once("members", "-format", "json") result[:result] = JSON.parse(result[:result]) members = result[:result] current_cluster_id = cluster_id members["members"].each do |member| if member["status"] == "alive" and member["tags"]["cluster_id"] == current_cluster_id nodes[member["name"]] = { "serfAddress" => member["addr"], "tags" => member["tags"], } end end nodes end |
#restart ⇒ Object
91 92 93 94 95 96 |
# File 'lib/droonga/serf.rb', line 91 def restart logger.trace("restart: start") stop start logger.trace("restart: done") end |
#running? ⇒ Boolean
79 80 81 |
# File 'lib/droonga/serf.rb', line 79 def running? @agent and @agent.running? end |
#send_query(query, payload) ⇒ Object
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/droonga/serf.rb', line 106 def send_query(query, payload) ensure_serf = ["-format", "json"] + (payload) += [query, JSON.generate(payload)] result = run_once("query", *) result[:result] = JSON.parse(result[:result]) if payload["node"] responses = result[:result]["Responses"] response = responses[payload["node"]] if response.is_a?(String) begin result[:response] = JSON.parse(response) rescue JSON::ParserError result[:response] = response end else result[:response] = response end end result end |
#set_tag(name, value) ⇒ Object
147 148 149 150 |
# File 'lib/droonga/serf.rb', line 147 def set_tag(name, value) ensure_serf run_once("tags", "-set", "#{name}=#{value}") end |
#start ⇒ Object
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/droonga/serf.rb', line 59 def start logger.trace("start: start") ensure_serf ENV["SERF"] = @serf ENV["SERF_RPC_ADDRESS"] = rpc_address retry_joins = [] detect_other_hosts.each do |other_host| retry_joins.push("-retry-join", other_host) end @agent = run("agent", "-node", @name, "-bind", "#{extract_host(@name)}:#{port}", "-event-handler", "droonga-engine-serf-event-handler", "-log-level", log_level, "-tag", "role=engine", "-tag", "cluster_id=#{cluster_id}", *retry_joins) logger.trace("start: done") end |
#stop ⇒ Object
83 84 85 86 87 88 89 |
# File 'lib/droonga/serf.rb', line 83 def stop logger.trace("stop: start") run("leave").stop @agent.stop @agent = nil logger.trace("stop: done") end |
#update_cluster_id ⇒ Object
152 153 154 |
# File 'lib/droonga/serf.rb', line 152 def update_cluster_id set_tag("cluster_id", cluster_id) end |