link-target.lua: change into a async hook
link setup is a asynchronous action, async hook serves the purpose well here. The code dependent on links will be less error prone with this design.
This commit is contained in:

committed by
Julian Bouzas

parent
a8aeb1010e
commit
4b153ec553
@@ -10,7 +10,7 @@
|
||||
local putils = require ("policy-utils")
|
||||
local cutils = require ("common-utils")
|
||||
|
||||
SimpleEventHook {
|
||||
AsyncEventHook {
|
||||
name = "linking/link-target",
|
||||
after = "linking/prepare-link",
|
||||
interests = {
|
||||
@@ -18,12 +18,16 @@ SimpleEventHook {
|
||||
Constraint { "event.type", "=", "select-target" },
|
||||
},
|
||||
},
|
||||
execute = function (event)
|
||||
steps = {
|
||||
start = {
|
||||
next = "link_activated",
|
||||
execute = function (event, transition)
|
||||
local source, om, si, si_props, si_flags, target =
|
||||
putils:unwrap_find_target_event (event)
|
||||
|
||||
-- bypass the hook, nothing to link to
|
||||
if not target then
|
||||
-- bypass the hook, nothing to link to.
|
||||
transition:advance ()
|
||||
return
|
||||
end
|
||||
|
||||
@@ -45,8 +49,8 @@ SimpleEventHook {
|
||||
si_flags.failed_peer_id == target.id and
|
||||
si_flags.failed_count ~= nil and
|
||||
si_flags.failed_count > 5 then
|
||||
Log.warning (si, "tried to link on last rescan, not retrying")
|
||||
goto done
|
||||
transition:return_error ("tried to link on last rescan, not retrying "
|
||||
.. tostring (si_link))
|
||||
end
|
||||
|
||||
if si_props ["item.node.direction"] == "output" then
|
||||
@@ -77,8 +81,9 @@ SimpleEventHook {
|
||||
["in.item.port.context"] = "input",
|
||||
["is.policy.item.link"] = true,
|
||||
} then
|
||||
Log.warning (si_link, "failed to configure si-standard-link")
|
||||
goto done
|
||||
transition:return_error ("failed to configure si-standard-link "
|
||||
.. tostring (si_link))
|
||||
return
|
||||
end
|
||||
|
||||
si_link:connect("link-error", function (_, error_msg)
|
||||
@@ -117,25 +122,42 @@ SimpleEventHook {
|
||||
-- activate
|
||||
si_link:activate (Feature.SessionItem.ACTIVE, function (l, e)
|
||||
if e then
|
||||
Log.info (l, "failed to activate si-standard-link: " .. tostring (si) .. " error:" .. tostring (e))
|
||||
transition:return_error ("failed to activate si-standard-link: "
|
||||
.. tostring (si) .. " error:" .. tostring (e))
|
||||
if si_flags ~= nil then
|
||||
si_flags.peer_id = nil
|
||||
end
|
||||
l:remove ()
|
||||
else
|
||||
si_flags.si_link = si_link
|
||||
transition:advance ()
|
||||
end
|
||||
end)
|
||||
end,
|
||||
},
|
||||
link_activated = {
|
||||
next = "none",
|
||||
execute = function (event, transition)
|
||||
local source, om, si, si_props, si_flags, target =
|
||||
putils:unwrap_find_target_event (event)
|
||||
if not target then
|
||||
-- bypass the hook, nothing to link to.
|
||||
transition:advance ()
|
||||
return
|
||||
end
|
||||
|
||||
if si_flags ~= nil then
|
||||
si_flags.failed_peer_id = nil
|
||||
if si_flags.peer_id == nil then
|
||||
si_flags.peer_id = target.id
|
||||
si_flags.peer_id = si_target.id
|
||||
end
|
||||
si_flags.failed_count = 0
|
||||
end
|
||||
Log.info (l, "activated si-standard-link " .. tostring (si))
|
||||
end
|
||||
end)
|
||||
Log.info (si_flags.si_link, "activated si-standard-link between "
|
||||
.. tostring (si).." and "..tostring(si_target))
|
||||
|
||||
::done::
|
||||
si_flags.was_handled = true
|
||||
putils.checkFollowDefault (si, target, si_flags.has_node_defined_target)
|
||||
end
|
||||
transition:advance ()
|
||||
end,
|
||||
},
|
||||
},
|
||||
}:register ()
|
||||
|
Reference in New Issue
Block a user