From 8ac96f4a377831614fc252a60ca46709d99c5c50 Mon Sep 17 00:00:00 2001 From: Julian Bouzas Date: Tue, 31 Oct 2023 12:28:18 -0400 Subject: [PATCH] linking: handle 'target.linger' property When set to 'true', the node will remain alive without any error produced if it cannot be linked to its specified target; in all other cases, an error will be produced and the node will be destroyed. --- src/scripts/lib/linking-utils.lua | 14 ++++++++++++++ src/scripts/linking/find-defined-target.lua | 10 +++++++++- src/scripts/linking/find-filter-target.lua | 12 ++++++++++-- src/scripts/linking/prepare-link.lua | 18 ++---------------- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/scripts/lib/linking-utils.lua b/src/scripts/lib/linking-utils.lua index 0a422f4b..15f2433c 100644 --- a/src/scripts/lib/linking-utils.lua +++ b/src/scripts/lib/linking-utils.lua @@ -303,4 +303,18 @@ function putils.haveAvailableRoutes (si_props) return false end +function putils.sendClientError (event, node, message) + local source = event:get_source () + local client_id = node.properties ["client.id"] + if client_id then + local clients_om = source:call ("get-object-manager", "client") + local client = clients_om:lookup { + Constraint { "bound-id", "=", client_id, type = "gobject" } + } + if client then + client:send_error (node ["bound-id"], -2, message) + end + end +end + return putils diff --git a/src/scripts/linking/find-defined-target.lua b/src/scripts/linking/find-defined-target.lua index 8e687fce..62b316e5 100644 --- a/src/scripts/linking/find-defined-target.lua +++ b/src/scripts/linking/find-defined-target.lua @@ -38,6 +38,7 @@ SimpleEventHook { local node = si:get_associated_proxy ("node") local dont_fallback = cutils.parseBool (node.properties ["target.dont-fallback"]) local dont_move = cutils.parseBool (node.properties ["target.dont-move"]) + local linger = cutils.parseBool (node.properties ["target.linger"]) local target_key local target_value = nil local node_defined = false @@ -113,7 +114,14 @@ SimpleEventHook { si_flags.can_passthrough = can_passthrough event:set_data ("target", target) elseif target_value and dont_fallback then - log:info(si, "... waiting for defined target as dont-fallback is set") + -- send error to client and destroy node if linger is not set + if not linger then + putils.sendClientError (event, node, "defined target not found") + node:request_destroy () + log:info(si, "... destroyed node as defined target was not found") + else + log:info(si, "... waiting for defined target as dont-fallback is set") + end event:stop_processing () end diff --git a/src/scripts/linking/find-filter-target.lua b/src/scripts/linking/find-filter-target.lua index 97904035..1f6a0f4d 100644 --- a/src/scripts/linking/find-filter-target.lua +++ b/src/scripts/linking/find-filter-target.lua @@ -51,6 +51,7 @@ SimpleEventHook { local node = si:get_associated_proxy ("node") local dont_fallback = cutils.parseBool (node.properties ["target.dont-fallback"]) + local linger = cutils.parseBool (node.properties ["target.linger"]) local target_picked = false local allow_fallback @@ -64,7 +65,7 @@ SimpleEventHook { passthrough_compatible, can_passthrough = putils.checkPassthroughCompatibility (si, target) if putils.canLink (si_props, target) and passthrough_compatible then - target_picked = true; + target_picked = true end end @@ -77,7 +78,14 @@ SimpleEventHook { si_flags.can_passthrough = can_passthrough event:set_data ("target", target) elseif is_smart_filter and dont_fallback then - log:info(si, "... waiting for smart filter defined target as dont-fallback is set") + -- send error to client and destroy node if linger is not set + if not linger then + putils.sendClientError (event, node, "smart filter defined target not found") + node:request_destroy () + log:info(si, "... destroyed node as smart filter defined target was not found") + else + log:info(si, "... waiting for smart filter defined target as dont-fallback is set") + end event:stop_processing () end end diff --git a/src/scripts/linking/prepare-link.lua b/src/scripts/linking/prepare-link.lua index 2e4fb85f..def59960 100644 --- a/src/scripts/linking/prepare-link.lua +++ b/src/scripts/linking/prepare-link.lua @@ -100,22 +100,8 @@ SimpleEventHook { return end - local client_id = node.properties ["client.id"] - if client_id then - local clients_om = source:call ("get-object-manager", "client") - local client = clients_om:lookup { - Constraint { "bound-id", "=", client_id, type = "gobject" } - } - local message - if reconnect then - message = "no target node available" - else - message = "target not found" - end - if client then - client:send_error (node ["bound-id"], -2, message) - end - end + putils.sendClientError (event, node, + reconnect and "no target node available" or "target not found") if not reconnect then log:info (si, "... destroy node")