Add API for get current transaction ID

This commit is contained in:
Eishun Kondoh 2018-01-31 02:31:56 +09:00
parent 7635272fbd
commit 4c517a8147
3 changed files with 20 additions and 3 deletions

View file

@ -1,7 +1,10 @@
defmodule Tres.Controller do defmodule Tres.Controller do
def controller_helpers do def controller_helpers do
quote do quote do
import Tres.SwitchRegistry, only: [send_message: 2] import Tres.SwitchRegistry, only: [
send_message: 2,
get_current_xid: 1
]
use Tres.Messages use Tres.Messages
use Tres.MessageHelper use Tres.MessageHelper

View file

@ -251,6 +251,11 @@ defmodule Tres.SecureChannel do
:keep_state_and_data :keep_state_and_data
end end
defp handle_CONNECTED({:call, from}, :get_xid, state_data) do
xid = State.get_transaction_id(state_data.xid)
{:keep_state_and_data, [{:reply, from, {:ok, xid}}]}
end
defp handle_CONNECTED(:cast, {:send_message, message} = action, state_data) do defp handle_CONNECTED(:cast, {:send_message, message} = action, state_data) do
new_action_queue = new_action_queue =
if XACT_KV.is_empty(state_data.xact_kv_ref) do if XACT_KV.is_empty(state_data.xact_kv_ref) do

View file

@ -19,13 +19,22 @@ defmodule Tres.SwitchRegistry do
end end
def send_message(message, {_dpid, _aux_id} = datapath_id) do def send_message(message, {_dpid, _aux_id} = datapath_id) do
Registry.dispatch(__MODULE__, datapath_id, &dispatch(&1, message)) Registry.dispatch(__MODULE__, datapath_id, &do_send_message(&1, message))
end end
def send_message(message, dpid) when is_binary(dpid) do def send_message(message, dpid) when is_binary(dpid) do
send_message(message, {dpid, 0}) send_message(message, {dpid, 0})
end end
def get_current_xid({_dpid, _aux_id} = datapath_id) do
[{pid, _}|_] = Registry.lookup(__MODULE__, datapath_id)
:gen_statem.call(pid, :get_xid, 1000)
end
def get_current_xid(datapath_id) do
get_current_xid({datapath_id, 0})
end
def monitor(datapath_id) do def monitor(datapath_id) do
datapath_id datapath_id
|> lookup_pid |> lookup_pid
@ -34,7 +43,7 @@ defmodule Tres.SwitchRegistry do
# private function # private function
defp dispatch(entries, message) do defp do_send_message(entries, message) do
for {pid, _} <- entries, do: :gen_statem.cast(pid, {:send_message, message}) for {pid, _} <- entries, do: :gen_statem.cast(pid, {:send_message, message})
end end
end end