Class: Droonga::Serf

Inherits:
Object
  • Object
show all
Includes:
Loggable
Defined in:
lib/droonga/serf.rb

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

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

.pathObject



44
45
46
# File 'lib/droonga/serf.rb', line 44

def path
  Droonga::Path.base + "serf"
end

Instance Method Details

#cluster_idObject



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_nodesObject



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

#restartObject



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

Returns:

  • (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
  options = ["-format", "json"] + additional_options_from_payload(payload)
  options += [query, JSON.generate(payload)]
  result = run_once("query", *options)
  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

#startObject



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

#stopObject



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_idObject



152
153
154
# File 'lib/droonga/serf.rb', line 152

def update_cluster_id
  set_tag("cluster_id", cluster_id)
end