Current section
34 Versions
Jump to
Current section
34 Versions
Compare versions
3
files changed
+18
additions
-12
deletions
| @@ -21,4 +21,4 @@ | |
| 21 21 | {<<"name">>,<<"gen_state_machine">>}, |
| 22 22 | {<<"optional">>,false}, |
| 23 23 | {<<"requirement">>,<<"~> 2.0">>}]]}. |
| 24 | - {<<"version">>,<<"3.0.3">>}. |
| 24 | + {<<"version">>,<<"3.0.4">>}. |
| @@ -298,8 +298,20 @@ defmodule Swarm.Tracker do | |
| 298 298 | GenStateMachine.cast(from, {:sync_ack, Node.self}) |
| 299 299 | # load target registry |
| 300 300 | for entry(name: name, pid: pid, meta: meta, clock: clock) <- registry do |
| 301 | - ref = Process.monitor(pid) |
| 302 | - true = :ets.insert_new(:swarm_registry, entry(name: name, pid: pid, ref: ref, meta: meta, clock: clock)) |
| 301 | + case Registry.get_by_name(name) do |
| 302 | + :undefined -> |
| 303 | + ref = Process.monitor(pid) |
| 304 | + true = :ets.insert_new(:swarm_registry, entry(name: name, pid: pid, ref: ref, meta: meta, clock: clock)) |
| 305 | + entry(pid: ^pid, meta: ^meta) -> |
| 306 | + :ok |
| 307 | + entry(pid: ^pid, meta: old_meta) -> |
| 308 | + # Merge meta |
| 309 | + new_meta = Map.merge(old_meta, meta) |
| 310 | + :ets.update_element(:swarm_registry, name, [{entry(:meta)+1, new_meta}]) |
| 311 | + entry(pid: _other_pid) -> |
| 312 | + # the local registration already exists, but for a differnt pid |
| 313 | + warn "conflicting registration for #{inspect name}!" |
| 314 | + end |
| 303 315 | end |
| 304 316 | # update our local clock to match remote clock |
| 305 317 | state = %{state | clock: clock} |
| @@ -1089,14 +1101,8 @@ defmodule Swarm.Tracker do | |
| 1089 1101 | _, {{:nodedown, _}, _} -> |
| 1090 1102 | warn "failed to start #{inspect name} on #{remote_node}: nodedown, retrying operation.." |
| 1091 1103 | new_state = %{state | nodes: state.nodes -- [remote_node], ring: HashRing.remove_node(state.ring, remote_node)} |
| 1092 | - current_node = Node.self |
| 1093 | - case HashRing.key_to_node(new_state.ring, name) do |
| 1094 | - ^current_node -> |
| 1095 | - reply = track(name, m, f, a) |
| 1096 | - GenStateMachine.reply(from, reply) |
| 1097 | - other_node -> |
| 1098 | - start_pid_remotely(other_node, from, name, m, f, a, new_state) |
| 1099 | - end |
| 1104 | + new_node = HashRing.key_to_node(new_state.ring, name) |
| 1105 | + start_pid_remotely(new_node, from, name, m, f, a, new_state) |
| 1100 1106 | kind, err when from != nil -> |
| 1101 1107 | error Exception.format(kind, err, System.stacktrace) |
| 1102 1108 | warn "failed to start #{inspect name} on #{remote_node}: #{inspect err}" |
| @@ -13,7 +13,7 @@ defmodule Swarm.Mixfile do | |
| 13 13 | |
| 14 14 | def project do |
| 15 15 | [app: :swarm, |
| 16 | - version: "3.0.3", |
| 16 | + version: "3.0.4", |
| 17 17 | elixir: "~> 1.3", |
| 18 18 | elixirc_paths: elixirc_paths(Mix.env), |
| 19 19 | build_embedded: Mix.env == :prod, |