Fix race create sessione su CPX: ready solo dopo MediaMTX.
I nodi cloud restano in provisioning finché :9997 risponde; retry su create_path e 503 retryable se l’ingest è ancora irraggiungibile. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -4,6 +4,9 @@ module Mediamtx
|
||||
class Client
|
||||
class Error < StandardError; end
|
||||
|
||||
CREATE_PATH_RETRIES = -> { ENV.fetch("MEDIAMTX_CREATE_RETRIES", "5").to_i }
|
||||
CREATE_PATH_RETRY_BASE_SECS = -> { ENV.fetch("MEDIAMTX_CREATE_RETRY_BASE_SECS", "0.4").to_f }
|
||||
|
||||
def self.for_session(session)
|
||||
new(base_url: session.mediamtx_api_base_url)
|
||||
end
|
||||
@@ -19,6 +22,19 @@ module Mediamtx
|
||||
|
||||
attr_reader :base_url
|
||||
|
||||
# Health probe for CPX readiness (GET /v3/paths/list).
|
||||
def reachable?(timeout: 2)
|
||||
conn = Faraday.new(url: @base_url) do |f|
|
||||
f.adapter Faraday.default_adapter
|
||||
f.options.open_timeout = timeout
|
||||
f.options.timeout = timeout
|
||||
end
|
||||
response = conn.get("/v3/paths/list")
|
||||
response.success?
|
||||
rescue Faraday::Error
|
||||
false
|
||||
end
|
||||
|
||||
def create_path(session)
|
||||
path = session.mediamtx_path_name
|
||||
# record: false finché non c'è publisher — con alwaysAvailable MediaMTX registrerebbe
|
||||
@@ -30,7 +46,9 @@ module Mediamtx
|
||||
body[:alwaysAvailable] = true
|
||||
body[:alwaysAvailableFile] = slate_file_path(session)
|
||||
# YouTube: telefono → MediaMTX; relay copy verso RTMPS in sidekiq.
|
||||
response = @conn.post("/v3/config/paths/add/#{CGI.escape(path)}", body)
|
||||
response = with_connection_retries("create_path #{path}") do
|
||||
@conn.post("/v3/config/paths/add/#{CGI.escape(path)}", body)
|
||||
end
|
||||
unless response.success?
|
||||
err = response.body.is_a?(Hash) ? response.body["error"] : response.body
|
||||
raise Error, "MediaMTX path create failed: #{response.status} #{err}"
|
||||
@@ -161,6 +179,23 @@ module Mediamtx
|
||||
|
||||
private
|
||||
|
||||
def with_connection_retries(label)
|
||||
attempts = [CREATE_PATH_RETRIES.call, 1].max
|
||||
base = CREATE_PATH_RETRY_BASE_SECS.call
|
||||
try = 0
|
||||
begin
|
||||
try += 1
|
||||
yield
|
||||
rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
|
||||
raise if try >= attempts
|
||||
|
||||
sleep_secs = base * (2**(try - 1))
|
||||
Rails.logger.warn("[Mediamtx::Client] #{label} retry #{try}/#{attempts} after #{e.class}: #{e.message} (sleep #{sleep_secs}s)")
|
||||
sleep(sleep_secs)
|
||||
retry
|
||||
end
|
||||
end
|
||||
|
||||
def recording_body(session, enabled:)
|
||||
ent = session.match.team.entitlements
|
||||
can_record = ent.recording_enabled_for_mediamtx?
|
||||
|
||||
Reference in New Issue
Block a user