From 68812c7be5b8479cc523273527b4accb1ba10a2c Mon Sep 17 00:00:00 2001 From: Rounak Datta Date: Thu, 12 Oct 2017 20:29:03 +0530 Subject: [PATCH 1/6] simpler example added --- README.md | 80 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 495d812..8011cf3 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,7 @@ ok ## Example -This is an example application showcasing database connection pools using -Poolboy and [epgsql](https://github.com/epgsql/epgsql). +This is a very simple Poolboy example showcasing the call flow. Print statements at various checkpoints and dummy call of workers (doing nothing actually) is what we aim to demonstrate in this example. ### example.app @@ -38,20 +37,20 @@ Poolboy and [epgsql](https://github.com/epgsql/epgsql). {pool1, [ {size, 10}, {max_overflow, 20} - ], [ - {hostname, "127.0.0.1"}, - {database, "db1"}, - {username, "db1"}, - {password, "abc123"} + ], [ + {hostname, "127.0.0.1/login.php"}, + {database, "database"}, + {username, "root"}, + {password, "rootpassword"} ]}, {pool2, [ {size, 5}, {max_overflow, 10} - ], [ - {hostname, "127.0.0.1"}, - {database, "db2"}, - {username, "db2"}, - {password, "abc123"} + ], [ + {hostname, "127.0.0.1/login.php"}, + {database, "database"}, + {username, "root"}, + {password, "rootpassword"} ]} ]} ]} @@ -65,40 +64,56 @@ Poolboy and [epgsql](https://github.com/epgsql/epgsql). -behaviour(application). -behaviour(supervisor). --export([start/0, stop/0, squery/2, equery/3]). +-export([start/0, stop/0, squery/2, equery/3, xquery/3]). -export([start/2, stop/1]). -export([init/1]). start() -> + io:fwrite("just about to example:start()~n"), application:start(?MODULE). stop() -> + io:fwrite("just about to example:stop()~n"), application:stop(?MODULE). start(_Type, _Args) -> + io:fwrite("just about to supervisor:start_link()~n"), supervisor:start_link({local, example_sup}, ?MODULE, []). stop(_State) -> + io:fwrite("BYE! just about to stop example~n"), ok. init([]) -> + io:fwrite("just about to example:init([])~n"), {ok, Pools} = application:get_env(example, pools), + io:fwrite("just about to define PoolSpecs~n"), PoolSpecs = lists:map(fun({Name, SizeArgs, WorkerArgs}) -> + io:fwrite("just about to define PoolSpecs:PoolArgs~n"), PoolArgs = [{name, {local, Name}}, {worker_module, example_worker}] ++ SizeArgs, poolboy:child_spec(Name, PoolArgs, WorkerArgs) end, Pools), + io:fwrite("just about to finalize example:init~n"), {ok, {{one_for_one, 10, 10}, PoolSpecs}}. squery(PoolName, Sql) -> + io:fwrite("i called squery call~n"), poolboy:transaction(PoolName, fun(Worker) -> gen_server:call(Worker, {squery, Sql}) end). equery(PoolName, Stmt, Params) -> + io:fwrite("i called equery call~n"), poolboy:transaction(PoolName, fun(Worker) -> gen_server:call(Worker, {equery, Stmt, Params}) end). + +xquery(PoolName, Stmt, Params) -> + io:fwrite("i called xquery cast~n"), + poolboy:transaction(PoolName, fun(Worker) -> + gen_server:cast(Worker, {xquery, Stmt, Params}) + end). ``` ### example_worker.erl @@ -111,43 +126,70 @@ equery(PoolName, Stmt, Params) -> -export([start_link/1]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). +-export([play/0]). -record(state, {conn}). start_link(Args) -> + io:fwrite("just about to start example_worker:start_link~n"), gen_server:start_link(?MODULE, Args, []). init(Args) -> + io:fwrite("just about to define example_worker:init~n"), process_flag(trap_exit, true), Hostname = proplists:get_value(hostname, Args), Database = proplists:get_value(database, Args), Username = proplists:get_value(username, Args), Password = proplists:get_value(password, Args), - {ok, Conn} = epgsql:connect(Hostname, Username, Password, [ - {database, Database} - ]), - {ok, #state{conn=Conn}}. + io:fwrite("just about to play~n"), + {ok} = play(), + io:fwrite("play complete~n"), + {ok, ok}. + +play() -> + io:fwrite("lets play~n"), + {ok}. handle_call({squery, Sql}, _From, #state{conn=Conn}=State) -> + io:fwrite("lets handle a squery call~n"), {reply, epgsql:squery(Conn, Sql), State}; handle_call({equery, Stmt, Params}, _From, #state{conn=Conn}=State) -> + io:fwrite("lets handle a equery call~n"), {reply, epgsql:equery(Conn, Stmt, Params), State}; handle_call(_Request, _From, State) -> + io:fwrite("call handling success~n"), {reply, ok, State}. handle_cast(_Msg, State) -> + io:fwrite("lets handle a cast (async call)~n"), {noreply, State}. handle_info(_Info, State) -> + io:fwrite("lets example_worker:handle_info~n"), {noreply, State}. -terminate(_Reason, #state{conn=Conn}) -> - ok = epgsql:close(Conn), +terminate(_Reason, ok) -> + io:fwrite("just about to terminate example_worker~n"), ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. ``` +## Example usage + +```erl-sh +1> example:start(). +--- % start the supervisors, initiate the workers +2> example:squery(pool1, hello). +--- % get the workers to work : (synchronous) call +3> example:equery(pool1, hello, world). +--- % get the workers to work : (synchronous) call +4> example:xquery(pool1, hello, world). +--- % get the workers to work : (asynchronous) cast +5> example:stop(). +--- % kill the workers and end the pool +``` +Find the complete terminal screenshots along with stats and explanation [here](https://github.com/rounakdatta/poolboy/edit/master/report.pdf). ## Options From abd6f3340f38668d56b52b718e0065af2c4e70ac Mon Sep 17 00:00:00 2001 From: Rounak Datta Date: Thu, 12 Oct 2017 20:31:21 +0530 Subject: [PATCH 2/6] report --- report.pdf | Bin 0 -> 75021 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 report.pdf diff --git a/report.pdf b/report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f984e11a98073359e3b7ddbd725e2750f9190a3 GIT binary patch literal 75021 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 literal 0 HcmV?d00001 From f3d87ae69f675320a5a1b7c81cdd2937852b25e8 Mon Sep 17 00:00:00 2001 From: Rounak Datta Date: Tue, 17 Oct 2017 22:29:47 +0530 Subject: [PATCH 3/6] poolboy Pid msgs --- src/poolboy.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/poolboy.erl b/src/poolboy.erl index db4973b..bb1decd 100644 --- a/src/poolboy.erl +++ b/src/poolboy.erl @@ -124,6 +124,7 @@ status(Pool) -> init({PoolArgs, WorkerArgs}) -> process_flag(trap_exit, true), + io:fwrite("#MESSAGE : ~p starting poolboy server~n", [self()]), Waiting = queue:new(), Monitors = ets:new(monitors, [private]), init(PoolArgs, WorkerArgs, #state{waiting = Waiting, monitors = Monitors}). From 4926af003debc3541a0d1afd5b475a147c62bfea Mon Sep 17 00:00:00 2001 From: Rounak Datta Date: Tue, 17 Oct 2017 22:30:45 +0530 Subject: [PATCH 4/6] poolboy_sup start msg disp --- src/poolboy_sup.erl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/poolboy_sup.erl b/src/poolboy_sup.erl index e6485a6..b85e128 100644 --- a/src/poolboy_sup.erl +++ b/src/poolboy_sup.erl @@ -9,6 +9,7 @@ start_link(Mod, Args) -> supervisor:start_link(?MODULE, {Mod, Args}). init({Mod, Args}) -> + io:fwrite("#MESSAGE : ~p starting poolboy supervisor~n", [self()]), {ok, {{simple_one_for_one, 0, 1}, [{Mod, {Mod, start_link, [Args]}, temporary, 5000, worker, [Mod]}]}}. From 6389cec0020e2d00a22d5277ff1c7268ea180ccf Mon Sep 17 00:00:00 2001 From: Rounak Datta Date: Tue, 17 Oct 2017 22:31:46 +0530 Subject: [PATCH 5/6] simpler example with callflow --- example/example.app | 30 +++++++++++++++++++++ example/example.erl | 53 ++++++++++++++++++++++++++++++++++++ example/example_worker.erl | 55 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 example/example.app create mode 100644 example/example.erl create mode 100644 example/example_worker.erl diff --git a/example/example.app b/example/example.app new file mode 100644 index 0000000..469aec0 --- /dev/null +++ b/example/example.app @@ -0,0 +1,30 @@ +{application, example, [ + {description, "An example application"}, + {vsn, "0.1"}, + {applications, [kernel, stdlib, sasl, crypto, ssl]}, + {modules, [example, example_worker]}, + {registered, [example]}, + {mod, {example, []}}, + {env, [ + {pools, [ + {pool1, [ + {size, 10}, + {max_overflow, 20} + ], [ + {hostname, "127.0.0.1"}, + {database, "db1"}, + {username, "db1"}, + {password, "abc123"} + ]}, + {pool2, [ + {size, 5}, + {max_overflow, 10} + ], [ + {hostname, "127.0.0.1"}, + {database, "db2"}, + {username, "db2"}, + {password, "abc123"} + ]} + ]} + ]} +]}. \ No newline at end of file diff --git a/example/example.erl b/example/example.erl new file mode 100644 index 0000000..2492af8 --- /dev/null +++ b/example/example.erl @@ -0,0 +1,53 @@ +-module(example). +-behaviour(application). +-behaviour(supervisor). + +-export([start/0, stop/0, squery/2, equery/3, xquery/3]). +-export([start/2, stop/1]). +-export([init/1]). + +start() -> + io:fwrite("#MESSAGE : ~p calls example:start()~n", [self()]), + application:start(?MODULE). + +stop() -> + io:fwrite("#MESSAGE : ~p calls example:stop()~n", [self()]), + application:stop(?MODULE). + +start(_Type, _Args) -> + io:fwrite("#MESSAGE : ~p calls supervisor:start_link()~n(default callback is example:init())~n", [self()]), + supervisor:start_link({local, example_sup}, ?MODULE, []). + +stop(_State) -> + ok. + +init([]) -> + io:fwrite("#MESSAGE : ~p called example:init()~n", [self()]), + {ok, Pools} = application:get_env(example, pools), + io:fwrite("#MESSAGE : ~p defining PoolSpecs~n", [self()]), + PoolSpecs = lists:map(fun({Name, SizeArgs, WorkerArgs}) -> + io:fwrite("#MESSAGE : ~p defining PoolArgs~n", [self()]), + PoolArgs = [{name, {local, Name}}, + {worker_module, example_worker}] ++ SizeArgs, + poolboy:child_spec(Name, PoolArgs, WorkerArgs) + end, Pools), + io:fwrite("#MESSAGE : ~p example:init() call is now complete~n", [self()]), + {ok, {{one_for_one, 10, 10}, PoolSpecs}}. + +squery(PoolName, Sql) -> + io:fwrite("i called squery call~n"), + poolboy:transaction(PoolName, fun(Worker) -> + gen_server:call(Worker, {squery, Sql}) + end). + +equery(PoolName, Stmt, Params) -> + io:fwrite("i called equery call~n"), + poolboy:transaction(PoolName, fun(Worker) -> + gen_server:call(Worker, {equery, Stmt, Params}) + end). + +xquery(PoolName, Stmt, Params) -> + io:fwrite("i called xquery cast~n"), + poolboy:transaction(PoolName, fun(Worker) -> + gen_server:cast(Worker, {xquery, Stmt, Params}) + end). \ No newline at end of file diff --git a/example/example_worker.erl b/example/example_worker.erl new file mode 100644 index 0000000..0b333ca --- /dev/null +++ b/example/example_worker.erl @@ -0,0 +1,55 @@ +-module(example_worker). +-behaviour(gen_server). +-behaviour(poolboy_worker). + +-export([start_link/1]). +-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, + code_change/3]). +-export([warmup /0]). + +-record(state, {conn}). + +start_link(Args) -> + %io:fwrite("#MESSAGE : ~p calls example_worker:start_link()~n(default callback is example_worker:init())~n"), + gen_server:start_link(?MODULE, Args, []). + +init(Args) -> + io:fwrite("#MESSAGE : ~p defines a new worker~n", [self()]), + process_flag(trap_exit, true), + Hostname = proplists:get_value(hostname, Args), + Database = proplists:get_value(database, Args), + Username = proplists:get_value(username, Args), + Password = proplists:get_value(password, Args), + io:fwrite("#MESSAGE : ~p will be starting to warmup~n", [self()]), + {ok} = warmup(), + io:fwrite("#MESSAGE : ~p warmup is complete~n~n~n", [self()]), + {ok, ok}. + +warmup() -> + io:fwrite("#MESSAGE : ~p is now warming up~n", [self()]), + {ok}. + +handle_call({squery, Sql}, _From, #state{conn=Conn}=State) -> + io:fwrite("lets handle a squery call~n"), + {reply, epgsql:squery(Conn, Sql), State}; +handle_call({equery, Stmt, Params}, _From, #state{conn=Conn}=State) -> + io:fwrite("lets handle a equery call~n"), + {reply, epgsql:equery(Conn, Stmt, Params), State}; +handle_call(_Request, _From, State) -> + io:fwrite("call handling success~n"), + {reply, ok, State}. + +handle_cast(_Msg, State) -> + io:fwrite("lets handle a cast (async call)~n"), + {noreply, State}. + +handle_info(_Info, State) -> + io:fwrite("lets example_worker:handle_info~n"), + {noreply, State}. + +terminate(_Reason, ok) -> + io:fwrite("#MESSAGE : ~p wants to terminate the worker~n", [self()]), + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. \ No newline at end of file From 59f121f061f1822cf539bf13d1d7c5d9831a09f8 Mon Sep 17 00:00:00 2001 From: Rounak Datta Date: Tue, 17 Oct 2017 22:33:48 +0530 Subject: [PATCH 6/6] workflow explained --- README.md | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 8011cf3..1a6efff 100644 --- a/README.md +++ b/README.md @@ -69,32 +69,31 @@ This is a very simple Poolboy example showcasing the call flow. Print statements -export([init/1]). start() -> - io:fwrite("just about to example:start()~n"), + io:fwrite("#MESSAGE : ~p calls example:start()~n", [self()]), application:start(?MODULE). stop() -> - io:fwrite("just about to example:stop()~n"), + io:fwrite("#MESSAGE : ~p calls example:stop()~n", [self()]), application:stop(?MODULE). start(_Type, _Args) -> - io:fwrite("just about to supervisor:start_link()~n"), + io:fwrite("#MESSAGE : ~p calls supervisor:start_link()~n(default callback is example:init())~n", [self()]), supervisor:start_link({local, example_sup}, ?MODULE, []). stop(_State) -> - io:fwrite("BYE! just about to stop example~n"), ok. init([]) -> - io:fwrite("just about to example:init([])~n"), + io:fwrite("#MESSAGE : ~p called example:init()~n", [self()]), {ok, Pools} = application:get_env(example, pools), - io:fwrite("just about to define PoolSpecs~n"), + io:fwrite("#MESSAGE : ~p defining PoolSpecs~n", [self()]), PoolSpecs = lists:map(fun({Name, SizeArgs, WorkerArgs}) -> - io:fwrite("just about to define PoolSpecs:PoolArgs~n"), + io:fwrite("#MESSAGE : ~p defining PoolArgs~n", [self()]), PoolArgs = [{name, {local, Name}}, {worker_module, example_worker}] ++ SizeArgs, poolboy:child_spec(Name, PoolArgs, WorkerArgs) end, Pools), - io:fwrite("just about to finalize example:init~n"), + io:fwrite("#MESSAGE : ~p example:init() call is now complete~n", [self()]), {ok, {{one_for_one, 10, 10}, PoolSpecs}}. squery(PoolName, Sql) -> @@ -126,28 +125,27 @@ xquery(PoolName, Stmt, Params) -> -export([start_link/1]). -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). --export([play/0]). +-export([warmup /0]). -record(state, {conn}). start_link(Args) -> - io:fwrite("just about to start example_worker:start_link~n"), gen_server:start_link(?MODULE, Args, []). init(Args) -> - io:fwrite("just about to define example_worker:init~n"), + io:fwrite("#MESSAGE : ~p defines a new worker~n", [self()]), process_flag(trap_exit, true), Hostname = proplists:get_value(hostname, Args), Database = proplists:get_value(database, Args), Username = proplists:get_value(username, Args), Password = proplists:get_value(password, Args), - io:fwrite("just about to play~n"), - {ok} = play(), - io:fwrite("play complete~n"), + io:fwrite("#MESSAGE : ~p will be starting to warmup~n", [self()]), + {ok} = warmup(), + io:fwrite("#MESSAGE : ~p warmup is complete~n~n~n", [self()]), {ok, ok}. -play() -> - io:fwrite("lets play~n"), +warmup() -> + io:fwrite("#MESSAGE : ~p is now warming up~n", [self()]), {ok}. handle_call({squery, Sql}, _From, #state{conn=Conn}=State) -> @@ -169,7 +167,7 @@ handle_info(_Info, State) -> {noreply, State}. terminate(_Reason, ok) -> - io:fwrite("just about to terminate example_worker~n"), + io:fwrite("#MESSAGE : ~p wants to terminate the worker~n", [self()]), ok. code_change(_OldVsn, State, _Extra) ->