aprs.me/lib/aprsme/application.ex
Graham McIntire 0298c8ec91
Revert all packet processing optimizations to fix buffer overflow
- Restored original PacketConsumer implementation from before optimizations
- Reverted to fixed batch size of 50 packets (original value)
- Removed SystemMonitor and InsertOptimizer from application startup
- Restored original config with buffer size 1000 and batch timeout 1000ms
- Removed all dynamic batch sizing and optimization logic

The recent performance optimizations were causing packet buffer overflows
because the dynamic batch sizing was actually slowing down processing.
Reverting to the simpler, working implementation that processes packets
consistently without buffer overflows.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-15 08:44:26 -05:00

131 lines
4 KiB
Elixir

defmodule Aprsme.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false
use Application
# Configure Oban for background jobs
@impl true
def start(_type, _args) do
# Run migrations on startup
migrate()
:logger.add_handler(:my_sentry_handler, Sentry.LoggerHandler, %{
config: %{metadata: [:file, :line]}
})
topologies = Application.get_env(:libcluster, :topologies) || []
children = [
# Start the Telemetry supervisor
AprsmeWeb.Telemetry,
# Start the Ecto repository
Aprsme.Repo,
# Start the PubSub system
{Phoenix.PubSub, name: Aprsme.PubSub},
# Start cache systems
%{id: :query_cache, start: {Cachex, :start_link, [:query_cache, [limit: 10_000]]}},
%{id: :device_cache, start: {Cachex, :start_link, [:device_cache, [limit: 5_000]]}},
%{id: :symbol_cache, start: {Cachex, :start_link, [:symbol_cache, [limit: 1_000]]}},
# Start circuit breaker
Aprsme.CircuitBreaker,
# Start device cache manager
Aprsme.DeviceCache,
# Start spatial PubSub for viewport-based filtering
Aprsme.SpatialPubSub,
# Start packet store for efficient LiveView memory usage
AprsmeWeb.MapLive.PacketStore,
# Start the Endpoint (http/https)
AprsmeWeb.Endpoint,
# Start a worker by calling: Aprsme.Worker.start_link(arg)
# {Aprsme.Worker, arg}
{Registry, keys: :duplicate, name: Registry.PubSub, partitions: System.schedulers_online()},
{Cluster.Supervisor, [topologies, [name: Aprsme.ClusterSupervisor]]},
# Start Oban for background jobs
{Oban, :aprsme |> Application.get_env(Oban, []) |> Keyword.put(:queues, default: 10, maintenance: 2)},
Aprsme.Presence,
Aprsme.PostgresNotifier,
# Start the packet processing pipeline
Aprsme.PacketPipelineSupervisor,
# Start the packet pipeline setup
Aprsme.PacketPipelineSetup
]
children = maybe_add_is_supervisor(children, Application.get_env(:aprsme, :env))
children = maybe_add_aprs_connection(children, Application.get_env(:aprsme, :env))
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: Aprsme.Supervisor]
{:ok, sup} = Supervisor.start_link(children, opts)
# Now that the Repo is started, run the refresh in a background task
# Skip in test environment to avoid DBConnection.OwnershipError
env = Application.get_env(:aprsme, :env)
if env != :test do
Task.start(fn -> Aprsme.DeviceIdentification.maybe_refresh_devices() end)
end
{:ok, sup}
end
# Tell Phoenix to update the endpoint configuration
# whenever the application is updated.
@impl true
def config_change(changed, _new, removed) do
AprsmeWeb.Endpoint.config_change(changed, removed)
:ok
end
defp migrate do
auto_migrate = Application.get_env(:aprsme, :auto_migrate, true)
do_migrate(auto_migrate)
# Gettext translations are automatically compiled during Mix compilation
rescue
error ->
require Logger
Logger.error("Failed to run migrations: #{inspect(error)}")
# Don't crash the application, just log the error
:ok
end
defp maybe_add_is_supervisor(children, env) do
disable_connection = Application.get_env(:aprsme, :disable_aprs_connection, false)
if env in [:prod, :dev] and not disable_connection do
children ++ [Aprsme.Is.IsSupervisor]
else
children
end
end
defp maybe_add_aprs_connection(children, _env) do
disable_connection = Application.get_env(:aprsme, :disable_aprs_connection, false)
if disable_connection do
children
else
children ++ [Aprsme.AprsIsConnection]
end
end
defp do_migrate(true) do
require Logger
Logger.info("Running database migrations...")
Aprsme.Release.migrate()
Logger.info("Database migrations completed")
end
defp do_migrate(false) do
require Logger
Logger.info("Automatic migrations disabled")
end
end