From 16f8e52696486200012af606d81c5eb1da7e0233 Mon Sep 17 00:00:00 2001 From: Christopher Date: Sat, 7 Mar 2020 13:25:48 -0600 Subject: [PATCH] use prefix, not key, for looking for a prefix --- lib/cluster_kv/ring.ex | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/lib/cluster_kv/ring.ex b/lib/cluster_kv/ring.ex index e98f691..0e61050 100644 --- a/lib/cluster_kv/ring.ex +++ b/lib/cluster_kv/ring.ex @@ -45,17 +45,14 @@ defmodule ClusterKV.Ring do @handle_anti_entropy "HandleAntiEntropy" def put(name, key, value) do - Logger.debug("PUT - #{key}: #{inspect(value)}") :gen_statem.cast(ClusterKV.ring_name(name), {:put, key, value}) end def get(name, key, timeout \\ 5000) do - Logger.debug("GET - #{key}") :gen_statem.call(ClusterKV.ring_name(name), {:get, key}, timeout) end def prefix(name, key, split_on, min) do - Logger.debug("PREFIX - #{key} / #{inspect(split_on)} : #{min}") :gen_statem.call(ClusterKV.ring_name(name), {:prefix, key, split_on, min}) end @@ -134,11 +131,11 @@ defmodule ClusterKV.Ring do parts = String.split(key, split_on) head = Enum.slice(parts, 0..(min - 1)) itr = Enum.slice(parts, min..-2) - get_prefix(head, key, r, me, repls, n, ref) + get_prefix(head, r, me, repls, n, ref) Enum.reduce(itr, head, fn ns, acc -> next = acc ++ [ns] - get_prefix(next, key, r, me, repls, n, ref) + get_prefix(next, r, me, repls, n, ref) next end) @@ -202,19 +199,19 @@ defmodule ClusterKV.Ring do {:ok, %SL{sl | data: %Ring{data | ring: ring}}, [{:next_event, :internal, :node_down}]} end - defp get_prefix(next, key, r, me, repls, n, ref) do + defp get_prefix(next, r, me, repls, n, ref) do prefix = Enum.join(next, ".") - node = get_node(key, r, me, repls) + node = get_node(prefix, r, me, repls) send({n, node}, {:get_key, prefix, ref, me}) end - defp get_node(key, r, _node, repls) do + defp get_node(key, r, node, repls) do nodes = HashRing.key_to_nodes(r, key, repls) - Enum.random(nodes) - # case node in nodes do - # true -> node - # false -> Enum.random(nodes) - # end + + case node in nodes do + true -> node + false -> Enum.random(nodes) + end end defp do_stream(db) do @@ -295,7 +292,6 @@ defmodule ClusterKV.Ring do defp send_sync(name, nodes, key, value) do Enum.each(nodes, fn n -> - Logger.info("Sending #{key} to #{name} on #{n}") send({name, n}, {:sync, [{key, value}]}) end) end -- 2.45.3