Skip to content

Commit

Permalink
Merge branch 'release/v0.7.3' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
general-CbIC committed Jun 21, 2023
2 parents b78b3da + c781b24 commit 7a9e709
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 13 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/ci-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
otp: '25'
- elixir: '1.14'
otp: '25'
- elixir: '1.14'
- elixir: '1.15'
otp: '26'
steps:
- uses: actions/checkout@v3
Expand Down Expand Up @@ -66,6 +66,6 @@ jobs:
uses: erlef/setup-beam@v1
with:
otp-version: '26'
elixir-version: '1.14'
elixir-version: '1.15'
- run: mix do deps.get, compile
- run: mix check
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
erlang 25.3.2.1
elixir 1.14.5-otp-25
elixir 1.15.0-otp-25
9 changes: 8 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.7.3] - 2023-06-21

### Fixed

- Fixed a bug with an incorrect number of running workers when specifying a zero or negative number in the `workers_count` parameter ([PR](https://github.com/general-CbIC/poolex/pull/49)).

## [0.7.2] - 2023-06-11

### Fixed
Expand Down Expand Up @@ -177,7 +183,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Supported main interface `Poolex.run/3` with `:timeout` option.

[unreleased]: https://github.com/general-CbIC/poolex/compare/v0.7.2...HEAD
[unreleased]: https://github.com/general-CbIC/poolex/compare/v0.7.3...HEAD
[0.7.3]: https://github.com/general-CbIC/poolex/compare/v0.7.2...v0.7.3
[0.7.2]: https://github.com/general-CbIC/poolex/compare/v0.7.1...v0.7.2
[0.7.1]: https://github.com/general-CbIC/poolex/compare/v0.7.0...v0.7.1
[0.7.0]: https://github.com/general-CbIC/poolex/compare/v0.6.1...v0.7.0
Expand Down
28 changes: 20 additions & 8 deletions lib/poolex.ex
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ defmodule Poolex do
@type poolex_option() ::
{:pool_id, pool_id()}
| {:worker_module, module()}
| {:workers_count, pos_integer()}
| {:workers_count, non_neg_integer()}
| {:max_overflow, non_neg_integer()}
| {:worker_args, list(any())}
| {:worker_start_fun, atom()}
Expand Down Expand Up @@ -294,15 +294,27 @@ defmodule Poolex do
worker_start_fun: worker_start_fun
}

worker_pids =
Enum.map(1..workers_count, fn _ ->
{:ok, worker_pid} = start_worker(state)
Monitoring.add(monitor_id, worker_pid, :worker)
worker_pids = start_workers(workers_count, state, monitor_id)
{:ok, %State{state | idle_workers_state: IdleWorkers.init(idle_workers_impl, worker_pids)}}
end

worker_pid
end)
@spec start_workers(non_neg_integer(), State.t(), Monitoring.monitor_id()) :: [pid]
defp start_workers(0, _state, _monitor_id) do
[]
end

{:ok, %State{state | idle_workers_state: IdleWorkers.init(idle_workers_impl, worker_pids)}}
defp start_workers(workers_count, _state, _monitor_id) when workers_count < 0 do
msg = "workers_count must be non negative number, received: #{inspect(workers_count)}"
raise ArgumentError, msg
end

defp start_workers(workers_count, state, monitor_id) do
Enum.map(1..workers_count, fn _ ->
{:ok, worker_pid} = start_worker(state)
Monitoring.add(monitor_id, worker_pid, :worker)

worker_pid
end)
end

@spec start_worker(State.t()) :: {:ok, pid()}
Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ defmodule Poolex.MixProject do
package: package(),
source_url: "https://github.com/general-CbIC/poolex",
start_permanent: Mix.env() == :prod,
version: "0.7.2"
version: "0.7.3"
]
end

Expand Down
39 changes: 39 additions & 0 deletions test/poolex_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,45 @@ defmodule PoolexTest do
assert debug_info.idle_workers_count == 0
assert debug_info.overflow == 0
end

test "allows workers_count: 0" do
pool_name = start_pool(worker_module: SomeWorker, workers_count: 0, max_overflow: 2)
debug_info = Poolex.get_debug_info(pool_name)

assert debug_info.idle_workers_count == 0
assert debug_info.idle_workers_pids == []
assert debug_info.busy_workers_count == 0
assert debug_info.busy_workers_pids == []
assert debug_info.overflow == 0

pid = self()

spawn(fn ->
Poolex.run!(pool_name, fn server ->
SomeWorker.traceable_call(server, pid, :foo, 50)
end)
end)

assert_receive {:traceable_start, :foo, worker_pid}
refute_received {:traceable_end, _, _}

debug_info = Poolex.get_debug_info(pool_name)

assert debug_info.idle_workers_count == 0
assert debug_info.idle_workers_pids == []
assert debug_info.busy_workers_count == 1
assert debug_info.busy_workers_pids == [worker_pid]
assert debug_info.overflow == 1

assert_receive {:traceable_end, :foo, ^worker_pid}
debug_info = Poolex.get_debug_info(pool_name)

assert debug_info.idle_workers_count == 0
assert debug_info.idle_workers_pids == []
assert debug_info.busy_workers_count == 0
assert debug_info.busy_workers_pids == []
assert debug_info.overflow == 0
end
end

describe "child_spec" do
Expand Down
13 changes: 13 additions & 0 deletions test/support/some_worker.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,27 @@ defmodule SomeWorker do
@moduledoc false
use GenServer

def traceable_call(server, pid, msg, delay) do
GenServer.call(server, {:traceable, pid, msg, delay})
end

def start_link do
GenServer.start_link(__MODULE__, [])
end

@impl true
def init(_options) do
{:ok, :ok}
end

@impl true
def handle_call({:traceable, pid, msg, delay}, _pid, state) do
send(pid, {:traceable_start, msg, self()})
:timer.sleep(delay)
Process.send_after(pid, {:traceable_end, msg, self()}, 10)
{:reply, :ok, state}
end

def handle_call(:do_some_work, _from, state) do
{:reply, :some_result, state}
end
Expand Down

0 comments on commit 7a9e709

Please sign in to comment.