Cache connection info
This commit is contained in:
+79
-6
@@ -2,19 +2,88 @@
|
||||
-vsn("0.6.1").
|
||||
|
||||
-export([get_pool_address/0]).
|
||||
-export([cache_good_address/1,
|
||||
invalidate_cache/0]).
|
||||
|
||||
-include_lib("kernel/include/logger.hrl").
|
||||
-include("gmhc_events.hrl").
|
||||
|
||||
get_pool_address() ->
|
||||
case cached_address() of
|
||||
{ok, _} = Ok -> Ok;
|
||||
{error, _} ->
|
||||
get_pool_address_()
|
||||
end.
|
||||
|
||||
cached_address() ->
|
||||
CacheF = cache_filename(),
|
||||
?LOG_DEBUG("Eureka cache filename: ~p", [CacheF]),
|
||||
case file:read_file(CacheF) of
|
||||
{ok, Bin} ->
|
||||
NowTS = erlang:system_time(seconds),
|
||||
OldestTS = NowTS - 24*60*60,
|
||||
try binary_to_term(Bin) of
|
||||
#{ ts := TS
|
||||
, host := _
|
||||
, port := _
|
||||
, pool_id := _} = Map ->
|
||||
if TS >= OldestTS ->
|
||||
Result = maps:remove(ts, Map),
|
||||
?LOG_DEBUG("Cached eureka info: ~p", [Result]),
|
||||
{ok, Result};
|
||||
true ->
|
||||
{error, outdated}
|
||||
end;
|
||||
Other ->
|
||||
{error, {invalid_cache_term, Other}}
|
||||
catch
|
||||
error:E ->
|
||||
{error, {invalid_cache_data, E}}
|
||||
end;
|
||||
{error, _} = Err ->
|
||||
Err
|
||||
end.
|
||||
|
||||
cache_good_address(#{host := Addr,
|
||||
port := Port,
|
||||
pool_id := PoolId}) ->
|
||||
CacheF = cache_filename(),
|
||||
ToCache = #{ host => unicode:characters_to_binary(Addr)
|
||||
, port => Port
|
||||
, pool_id => unicode:characters_to_binary(PoolId)
|
||||
, ts => erlang:system_time(seconds)},
|
||||
case file:write_file(CacheF, term_to_binary(ToCache)) of
|
||||
ok ->
|
||||
?LOG_DEBUG("Cached eureka info in: ~p", [CacheF]),
|
||||
{ok, ToCache};
|
||||
{error, _} = Err ->
|
||||
?LOG_DEBUG("Couldn't cache eureka in ~p: ~p", [CacheF, Err]),
|
||||
Err
|
||||
end.
|
||||
|
||||
invalidate_cache() ->
|
||||
CacheF = cache_filename(),
|
||||
case file:delete_file(CacheF) of
|
||||
ok ->
|
||||
?LOG_DEBUG("Eureka cache file removed (~p)", [CacheF]),
|
||||
ok;
|
||||
{error, _} = Err ->
|
||||
?LOG_DEBUG("Couldn't remove Eureka cache (~p): ~p", [CacheF, Err]),
|
||||
Err
|
||||
end.
|
||||
|
||||
cache_filename() ->
|
||||
filename:join(setup:data_dir(), "gmhc_eureka.cache").
|
||||
|
||||
get_pool_address_() ->
|
||||
case gmconfig:find_config([<<"pool_admin">>, <<"url">>], [user_config]) of
|
||||
{ok, URL0} ->
|
||||
case expand_url(URL0) of
|
||||
<<"local">> ->
|
||||
#{<<"address">> => <<"127.0.0.1">>,
|
||||
<<"port">> => gmconfig:get_config(
|
||||
[<<"pool">>, <<"port">>], [schema_default]),
|
||||
<<"pool_id">> => gmhc_config:get_config([<<"pool">>, <<"id">>]) };
|
||||
#{host => <<"127.0.0.1">>,
|
||||
port => gmconfig:get_config(
|
||||
[<<"pool">>, <<"port">>], [schema_default]),
|
||||
pool_id => gmhc_config:get_config([<<"pool">>, <<"id">>]) };
|
||||
URL ->
|
||||
?LOG_INFO("Trying to connect to ~p", [URL]),
|
||||
connect1(URL)
|
||||
@@ -49,9 +118,13 @@ connect1(URL0) ->
|
||||
Error
|
||||
end.
|
||||
|
||||
get_host_port(Data) ->
|
||||
get_host_port(#{ <<"address">> := Addr
|
||||
, <<"port">> := Port
|
||||
, <<"pool_id">> := PoolId } = Data) ->
|
||||
?LOG_DEBUG("Data = ~p", [Data]),
|
||||
maps:with([<<"address">>, <<"port">>, <<"pool_id">>], Data).
|
||||
{ok, #{ host => Addr
|
||||
, port => Port
|
||||
, pool_id => PoolId }}.
|
||||
|
||||
request(get, URL) ->
|
||||
case request(get, URL, []) of
|
||||
|
||||
Reference in New Issue
Block a user