summaryrefslogtreecommitdiff
path: root/components/schedule
diff options
context:
space:
mode:
authorMagnus Feuer <mfeuer@jaguarlandrover.com>2014-11-06 16:37:18 -0800
committerMagnus Feuer <mfeuer@jaguarlandrover.com>2014-11-06 16:37:18 -0800
commit84d4de2702a6d8b4bd5066c10bc2a88e99fe7fc4 (patch)
tree344d22693d0b0a364eb095a2a685bd6e5d26f33b /components/schedule
parented72af918b6eb4e7943dd06c9759bb106d424588 (diff)
downloadrvi_core-84d4de2702a6d8b4bd5066c10bc2a88e99fe7fc4.tar.gz
Added handling of a data link loss, with the removal of all associated services.
Diffstat (limited to 'components/schedule')
-rw-r--r--components/schedule/src/schedule.erl39
-rw-r--r--components/schedule/src/schedule_rpc.erl8
2 files changed, 20 insertions, 27 deletions
diff --git a/components/schedule/src/schedule.erl b/components/schedule/src/schedule.erl
index bc5ac9b..c9221ae 100644
--- a/components/schedule/src/schedule.erl
+++ b/components/schedule/src/schedule.erl
@@ -111,8 +111,8 @@ schedule_message(SvcName,
register_remote_services(NetworkAddress, AvailableServices) ->
gen_server:cast(?SERVER, { register_remote_services, NetworkAddress, AvailableServices }).
-unregister_remote_services(NetworkAddress) ->
- gen_server:cast(?SERVER, { unregister_remote_services, NetworkAddress }).
+unregister_remote_services(ServiceNames) ->
+ gen_server:cast(?SERVER, { unregister_remote_services, ServiceNames }).
%%--------------------------------------------------------------------
%% @private
@@ -179,9 +179,9 @@ handle_cast( {register_remote_services, NetworkAddress, AvailableServices}, St)
{noreply, NSt};
-handle_cast( {unregister_remote_services, NetworkAddress}, St) ->
- ?info("schedule:register_remote_services(): NetworkAddress: ~p", [NetworkAddress]),
-
+handle_cast( {unregister_remote_services, ServiceNames}, St) ->
+ ?info("schedule:unregister_remote_services(): Services: ~p", [ServiceNames]),
+ {ok, NSt} = multiple_services_unavailable(ServiceNames, St),
{noreply, NSt };
handle_cast(_Msg, St) ->
@@ -335,7 +335,7 @@ try_sending_messages(#service {
?debug("schedule:try_send(): SvcName: ~p", [SvcName]),
?debug("schedule:try_send(): Network Address: ~p", [NetworkAddress]),
-
+
%% Extract the first message of the queue.
case ets:first(Tid) of
%% No more messages to send.
@@ -394,21 +394,10 @@ service_available(SvcName, NetworkAddress, St) ->
try_sending_messages(Svc, NSt1).
-service_unavailable(NetworkAddress, #st { services_tid = SvcTid } = St) ->
- ?info("schedule:service_unavailable(): address: ~p", [ NetworkAddress ]),
-
- NSt1 =
- case ets:lookup(SvcTid, SvcName) of
- [] -> %% The given service does not exist.
- St ;
-
- [ Svc ] ->
- %% Update the network address, if applicable.
- {ok, _, TmpSt, _} = update_service_network_address(Svc, unavailable, St),
- TmpSt
- end,
-
- { ok, NSt1 }.
+service_unavailable(SvcName, #st { services_tid = SvcTid } = St) ->
+ ?info("schedule:service_unavailable(): Service: ~p", [ SvcName ]),
+ ets:delete(SvcTid, SvcName),
+ { ok, St }.
bring_up_data_link(SvcName) ->
@@ -479,13 +468,19 @@ send_message(NetworkAddress, SvcName, Timeout,
%% service.
%%
multiple_services_available([], _NetworkAddress, St) ->
- ?info("schedule:multiple_services_available(): St: ~p", [ St]),
{ok, St};
multiple_services_available([ Svc | T], NetworkAddress, St) ->
{ok, NSt} = service_available(Svc, NetworkAddress, St),
multiple_services_available(T, NetworkAddress, NSt).
+multiple_services_unavailable([], St) ->
+ {ok, St};
+
+multiple_services_unavailable([ SvcName | T], St) ->
+ {ok, NSt} = service_unavailable(SvcName, St),
+ multiple_services_unavailable(T, NSt).
+
find_or_create_service(ServiceName, St) ->
%% Invoke with retain to keep any exising network addresses already
diff --git a/components/schedule/src/schedule_rpc.erl b/components/schedule/src/schedule_rpc.erl
index 8563aa1..9a19d40 100644
--- a/components/schedule/src/schedule_rpc.erl
+++ b/components/schedule/src/schedule_rpc.erl
@@ -49,10 +49,9 @@ register_remote_services(NetworkAddress, AvailableServices) ->
{ok, [ { status, rvi_common:json_rpc_status(ok)}]}.
-unregister_remote_services(NetworkAddress, DiscountinuedServices) ->
- ?debug("schedule_rpc:unregister_remote_services(): network_address: ~p", [ NetworkAddress]),
+unregister_remote_services(DiscountinuedServices) ->
?debug("schedule_rpc:unregister_remote_services(): services ~p", [ DiscountinuedServices]),
- schedule:unregister_remote_services(NetworkAddress, DiscountinuedServices),
+ schedule:unregister_remote_services(DiscountinuedServices),
{ok, [ { status, rvi_common:json_rpc_status(ok)}]}.
@@ -76,9 +75,8 @@ handle_rpc("register_remote_services", Args) ->
register_remote_services(NetworkAddress, AvailableServices);
handle_rpc("unregister_remote_services", Args) ->
- {ok, NetworkAddress} = rvi_common:get_json_element(["network_address"], Args),
{ok, DiscountinuedServices} = rvi_common:get_json_element(["services"], Args),
- unregister_remote_services(NetworkAddress, DiscountinuedServices);
+ unregister_remote_services(DiscountinuedServices);
handle_rpc(Other, _Args) ->
?debug("schedule_rpc:handle_rpc(~p): unknown", [ Other ]),