From c911ca1290965b31e530adff82da46aee2d568be Mon Sep 17 00:00:00 2001 From: Alice39s Date: Sun, 28 Jun 2026 00:07:09 +0900 Subject: [PATCH] feat(erlang): create version-specific worker pools from db config --- binding/erlang/src/ip2region.app.src | 3 ++ binding/erlang/src/ip2region_sup.erl | 37 ++++++++++++++++------ binding/erlang/test/ip2region_sup_test.erl | 17 ++++++++++ 3 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 binding/erlang/test/ip2region_sup_test.erl diff --git a/binding/erlang/src/ip2region.app.src b/binding/erlang/src/ip2region.app.src index 4de369c..8619174 100644 --- a/binding/erlang/src/ip2region.app.src +++ b/binding/erlang/src/ip2region.app.src @@ -11,6 +11,9 @@ {poolargs, [ {size, 1}, {max_overflow, 5} + ]}, + {db, [ + {ipv4, "ip2region.xdb"} ]} ]}, {modules, []}, diff --git a/binding/erlang/src/ip2region_sup.erl b/binding/erlang/src/ip2region_sup.erl index 6aa6695..e93d505 100644 --- a/binding/erlang/src/ip2region_sup.erl +++ b/binding/erlang/src/ip2region_sup.erl @@ -2,7 +2,7 @@ %% Copyright 2022 The Ip2Region Authors. All rights reserved. %% Use of this source code is governed by a Apache2.0-style %% license that can be found in the LICENSE file. -%% +%% %% @doc ip2region top level supervisor. %% @end %%%------------------------------------------------------------------- @@ -18,7 +18,6 @@ start_link() -> {ok, SupPid} = supervisor:start_link({local, ?SERVER}, ?MODULE, []), - {ok, _PoolPid} = start_ip2region_pool(SupPid), {ok, SupPid}. %% sup_flags() = #{strategy => strategy(), % optional @@ -35,11 +34,11 @@ init([]) -> SupFlags = #{strategy => one_for_one, intensity => 10, period => 5}, - ChildSpecs = [], + ChildSpecs = pool_child_specs(), {ok, {SupFlags, ChildSpecs}}. %% internal functions -%% +%% create_table() -> Opts = [named_table, set, public, {read_concurrency, true}, {keypos, 1}], %% Legacy tables (kept for backward compatibility) @@ -60,10 +59,28 @@ ensure_table(Name, Opts) -> _ -> ok end. -start_ip2region_pool(Sup) -> +pool_child_specs() -> + {ok, DbConfig} = application:get_env(db), {ok, PoolArgsCfg} = application:get_env(poolargs), - PoolName = ?IP2REGION_POOL, - PoolArgs = [{strategy, fifo}, {name, {local, PoolName}}, {worker_module, ip2region_worker} | PoolArgsCfg], - WorkerArgs = [], - ChildSpecs = poolboy:child_spec(PoolName, PoolArgs, WorkerArgs), - supervisor:start_child(Sup, ChildSpecs). \ No newline at end of file + Versions = [Version || {Version, _File} <- DbConfig], + UseLegacyName = (Versions == [ipv4]), + lists:foldl( + fun({ipv4, File}, Acc) when UseLegacyName -> + [make_pool_spec(?IP2REGION_POOL, ipv4, File, PoolArgsCfg) | Acc]; + ({ipv4, File}, Acc) -> + [make_pool_spec(?IP2REGION_POOL_V4, ipv4, File, PoolArgsCfg) | Acc]; + ({ipv6, File}, Acc) -> + [make_pool_spec(?IP2REGION_POOL_V6, ipv6, File, PoolArgsCfg) | Acc]; + (_, Acc) -> + Acc + end, [], DbConfig). + +make_pool_spec(PoolName, Version, File, PoolArgsCfg) -> + PoolArgs = [ + {strategy, fifo}, + {name, {local, PoolName}}, + {worker_module, ip2region_worker} + | PoolArgsCfg + ], + WorkerArgs = [{xdb_file, File}, {version, Version}], + poolboy:child_spec(PoolName, PoolArgs, WorkerArgs). diff --git a/binding/erlang/test/ip2region_sup_test.erl b/binding/erlang/test/ip2region_sup_test.erl new file mode 100644 index 0000000..d7a9c6f --- /dev/null +++ b/binding/erlang/test/ip2region_sup_test.erl @@ -0,0 +1,17 @@ +-module(ip2region_sup_test). +-include_lib("eunit/include/eunit.hrl"). +-include("ip2region.hrl"). + +pools_started_test() -> + application:stop(ip2region), + application:unload(ip2region), + ok = application:load(ip2region), + {ok, Cwd} = file:get_cwd(), + V6File = filename:join([Cwd, "..", "..", "data", "ip2region_v6.xdb"]), + ok = application:set_env(ip2region, db, [ + {ipv4, "ip2region.xdb"}, + {ipv6, V6File} + ]), + application:ensure_started(ip2region), + ?assert(is_pid(whereis(?IP2REGION_POOL_V4))), + ?assert(is_pid(whereis(?IP2REGION_POOL_V6))).