diff options
author | Magnus Feuer <mfeuer@jaguarlandrover.com> | 2015-03-13 16:37:04 -0700 |
---|---|---|
committer | Magnus Feuer <mfeuer@jaguarlandrover.com> | 2015-03-13 16:37:37 -0700 |
commit | 0b4c7fe1e18ce983bcabc8c6307c1712da56e348 (patch) | |
tree | 50e1241116323b15681e36d714a2a6117c8689d4 | |
parent | 5da3d2c1ee896ad2dfa4d9b1049e7b38464cab4b (diff) | |
download | rvi_core-0b4c7fe1e18ce983bcabc8c6307c1712da56e348.tar.gz |
Fix issue #14
-rw-r--r-- | components/service_discovery/src/service_discovery_rpc.erl | 97 |
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. |