summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Feuer <mfeuer@jaguarlandrover.com>2015-03-13 16:37:04 -0700
committerMagnus Feuer <mfeuer@jaguarlandrover.com>2015-03-13 16:37:37 -0700
commit0b4c7fe1e18ce983bcabc8c6307c1712da56e348 (patch)
tree50e1241116323b15681e36d714a2a6117c8689d4
parent5da3d2c1ee896ad2dfa4d9b1049e7b38464cab4b (diff)
downloadrvi_core-0b4c7fe1e18ce983bcabc8c6307c1712da56e348.tar.gz
Fix issue #14
-rw-r--r--components/service_discovery/src/service_discovery_rpc.erl97
1 files changed, 63 insertions, 34 deletions
diff --git a/components/service_discovery/src/service_discovery_rpc.erl b/components/service_discovery/src/service_discovery_rpc.erl
index ef54518..cce7898 100644
--- a/components/service_discovery/src/service_discovery_rpc.erl
+++ b/components/service_discovery/src/service_discovery_rpc.erl
@@ -65,8 +65,7 @@ dump_table(Table) ->
dump_table(Table, ets:first(Table)).
register_remote_service(NetworkAddress) ->
- ?info("service_discovery_rpc:register_remote_service(): service: empty"),
- ?info("service_discovery_rpc:register_remote_service(): network_address: ~p", [NetworkAddress]),
+ ?info("service_discovery_rpc:register_remote_service(): service(n/a) -> ~p", [NetworkAddress]),
ets:insert(?REMOTE_ADDRESS_TABLE,
#service_entry {
@@ -79,8 +78,7 @@ register_remote_service(NetworkAddress) ->
register_remote_service(Service, NetworkAddress) ->
- ?info("service_discovery_rpc:register_remote_service(): service: ~p", [Service]),
- ?info("service_discovery_rpc:register_remote_service(): network_address: ~p", [NetworkAddress]),
+ ?info("service_discovery_rpc:register_remote_service(): service(~p) -> ~p", [Service, NetworkAddress]),
FullSvcName = rvi_common:remote_service_to_string(Service),
@@ -123,15 +121,59 @@ unregister_remote_services_by_address(NetworkAddress) ->
%% Delete all services registered under the given address.
Svcs = ets:lookup(?REMOTE_ADDRESS_TABLE, NetworkAddress),
+ %% We now have a bunch of service records, convert them to a list of service
+ %% names and send them of to schedule for deregistration
+ AllSvcNames = lists:foldr(fun(#service_entry { service = SvcName }, Acc) ->
+ [SvcName | Acc]
+ end, [], Svcs),
+
?info("service_discovery_rpc:unregister_remote_services_by_address(): ~p -> ~p",
- [NetworkAddress, Svcs]),
+ [NetworkAddress, AllSvcNames]),
+
+ %% We need to filter AllSvcNames to remove all service entries that have
+ %% been registered under another name.
+ %% We do this by creating a list of all matching entries associated
+ %% with a network address not matching the disconnected NetworkAddress
+ %%
+ %% See issue https://github.com/PDXostc/rvi/issues/14 for details
+ FilterSvc =
+ lists:foldr(
+ fun(Service, Acc) ->
+
+ %% Lookup the service in the service table.
+ case ets:lookup(?REMOTE_SERVICE_TABLE, Service) of
+
+ %% Not found. Do not filter out.
+ [] ->
+ Acc;
+
+ %% We found or own entry, tiet to the disconnected address.
+ %% Do not add to addresses to be removed.
+ [ #service_entry { network_address = NetworkAddress } ] ->
+ Acc;
+
+ %% We found an entry that does not the disconnected
+ %% network address. This one should be filtered out
+ [ _ ] ->
+ [ Service | Acc ]
+
+ end
+ end, [], AllSvcNames),
+ SvcNames = AllSvcNames -- FilterSvc,
- %% We now have a bunch of service records, convert them to a list of service
- %% names and send them of to schedule for deregistration
- SvcNames = lists:foldr(fun(#service_entry { service = SvcName }, Acc) ->
- [SvcName | Acc]
- end, [], Svcs),
+
+ case FilterSvc of
+ [] -> ok;
+
+ _ ->
+ ?info("service_discovery_rpc:unregister_remote_services_by_address(): Resurrected services: ~p",
+ [FilterSvc]),
+
+ ?info("service_discovery_rpc:unregister_remote_services_by_address(): Filtered services to be deleted: ~p",
+ [SvcNames])
+ end,
+
%% Delete any addresses stored with an empty service name,
%% installed with register_remote_service/1, since we now have at
@@ -143,10 +185,11 @@ unregister_remote_services_by_address(NetworkAddress) ->
}),
ets:delete(?REMOTE_ADDRESS_TABLE, NetworkAddress),
- case Svcs of
+ case SvcNames of
[] ->
true;
_ ->
+
rvi_common:send_component_request(schedule, unregister_remote_services,
[
{ services, SvcNames }
@@ -187,11 +230,6 @@ unregister_single_remote_service_by_name_(Service) ->
network_address = '_'
}),
- Prior = ets:foldl(fun(#service_entry { service = Svc }, Acc) ->
- [ Svc | Acc ] end,
- [], ?REMOTE_SERVICE_TABLE),
-
- ?debug("Before removing ~p: ~p", [ Service, Prior ]),
ets:delete(?REMOTE_SERVICE_TABLE, Service),
After = ets:foldl(fun(#service_entry { service = Svc }, Acc) ->
[ Svc | Acc ] end,
@@ -232,8 +270,7 @@ unregister_local_service(Service) ->
register_local_service(NetworkAddress, Service) ->
- ?info("service_discovery_rpc:register_local_service(): service: ~p", [Service]),
- ?info("service_discovery_rpc:register_local_service(): network_address: ~p", [NetworkAddress]),
+ ?info("service_discovery_rpc:register_local_service(): ~p -> ~p", [Service, NetworkAddress]),
FullSvcName = rvi_common:local_service_to_string(Service),
@@ -248,8 +285,8 @@ register_local_service(NetworkAddress, Service) ->
resolve_local_service(RawService) ->
Service = rvi_common:sanitize_service_string(RawService),
- ?info("service_discovery_rpc:resolve_local_service(): RawService: ~p", [RawService]),
- ?info("service_discovery_rpc:resolve_local_service(): Cleaned Service: ~p", [Service]),
+ ?debug("service_discovery_rpc:resolve_local_service(): RawService: ~p", [RawService]),
+ ?debug("service_discovery_rpc:resolve_local_service(): Cleaned Service: ~p", [Service]),
case resolve_service(?LOCAL_SERVICE_TABLE, Service) of
not_found ->
{ ok, [ { status, rvi_common:json_rpc_status(not_found) }]};
@@ -261,8 +298,8 @@ resolve_local_service(RawService) ->
resolve_remote_service(RawService) ->
Service = rvi_common:sanitize_service_string(RawService),
- ?info("service_discovery_rpc:resolve_remote_service(): RawService: ~p", [RawService]),
- ?info("service_discovery_rpc:resolve_remote_service(): Cleaned Service: ~p", [Service]),
+ ?debug("service_discovery_rpc:resolve_remote_service(): RawService: ~p", [RawService]),
+ ?debug("service_discovery_rpc:resolve_remote_service(): Cleaned Service: ~p", [Service]),
case resolve_service(?REMOTE_SERVICE_TABLE, Service) of
{ok, NetworkAddress } ->
{ok, [ { status, rvi_common:json_rpc_status(ok) },
@@ -329,26 +366,18 @@ register_remote_services(Address, Services) ->
{ok, [ { status, rvi_common:json_rpc_status(ok) } ]}.
resolve_service(Table, Service) ->
-
- ?info("service_discovery_rpc:resolve_service(): CleanedService: ~p", [Service]),
-
- %% For info purposes only
- Svcs = ets:foldl(fun({service_entry, ServiceName, ServiceAddr}, Acc) ->
- [ {ServiceName, ServiceAddr} | Acc ] end,
- [], Table),
- ?info("service_discovery_rpc:resolve_service(): Services: ~p", [Svcs]),
-
-
case ets:lookup(Table, Service) of
%% We found a service entry, report it back
[#service_entry { network_address = NetworkAddress }] ->
- ?info("service_discovery_rpc:resolve_service(): service: ~p -> ~p",
- [ Service, NetworkAddress ]),
+ ?debug("service_discovery_rpc:resolve_service(~p): service: ~p -> ~p",
+ [ Table, Service, NetworkAddress ]),
{ok, NetworkAddress };
%% We did not find a service entry, check statically configured nodes.
[] ->
+ ?debug("service_discovery_rpc:resolve_service(~p): service: ~p -> Not Found",
+ [ Table, Service ]),
not_found
end.