Skip to content

Refactor gun pooling and simplify adapter option insertion

rinpatch requested to merge refactor/gun-pool-registry into develop

This patch refactors gun pooling to use Elixir process registry and simplifies adapter option insertion.

Having the pool use process registry instead of a GenServer has a number of advantages:

  • Simpler code: the initial implementation adds about half the lines of code it deletes
  • Concurrency: unlike a GenServer, ETS-based registry can handle multiple checkout/checkin requests at the same time
  • Precise and easy idle connection clousure: current proposal for closing idle connections in the GenServer-based pool needs to filter through all connections once a minute and compare their last active time with closing time. With Elixir process registry this can be done by just using Process.send_after/Process.cancel_timer in the worker process.
  • Lower memory footprint: In my tests gun-memory-leak branch uses about 290mb on peak load (250 connections) and 235mb on idle (5-10 connections). Registry-based pool uses 210mb on idle and 240mb on peak load

TODO:

  • Port pool-aware FollowRedirects middleware from !2440 (closed)
  • Decide on what "pools" are supposed to be
  • Fix tests
  • Add failure logging (maybe use :telemetry)

Closes #1680 (closed), #1700 (closed)

Edited by rinpatch

Merge request reports