class ActiveStorage::Service::MirrorService
Active Storage Mirror Service
Wraps a set of mirror services and provides a single ActiveStorage::Service object that will all have the files uploaded to them. A primary service is designated to answer calls to:
-
download -
exists? -
url -
url_for_direct_upload -
headers_for_direct_upload
Attributes
Public Class Methods
Source
# File lib/active_storage/service/mirror_service.rb, line 31 def initialize(primary:, mirrors:) @primary, @mirrors = primary, mirrors @executor = Concurrent::ThreadPoolExecutor.new( min_threads: 1, max_threads: mirrors.size, max_queue: 0, fallback_policy: :caller_runs, idle_time: 60 ) end
Public Instance Methods
Source
# File lib/active_storage/service/mirror_service.rb, line 52 def delete(key) perform_across_services :delete, key end
Delete the file at the key on all services.
Source
# File lib/active_storage/service/mirror_service.rb, line 57 def delete_prefixed(prefix) perform_across_services :delete_prefixed, prefix end
Delete files at keys starting with the prefix on all services.
Source
# File lib/active_storage/service/mirror_service.rb, line 66 def mirror(key, checksum:) instrument :mirror, key: key, checksum: checksum do if (mirrors_in_need_of_mirroring = mirrors.select { |service| !service.exist?(key) }).any? primary.open(key, checksum: checksum) do |io| mirrors_in_need_of_mirroring.each do |service| io.rewind service.upload key, io, checksum: checksum end end end end end
Copy the file at the key from the primary service to each of the mirrors where it doesnβt already exist.
Source
# File lib/active_storage/service/mirror_service.rb, line 45 def upload(key, io, checksum: nil, **options) io.rewind primary.upload key, io, checksum: checksum, **options mirror_later key, checksum: checksum end
Upload the io to the key specified to all services. The upload to the primary service is done synchronously whereas the upload to the mirrors is done asynchronously. If a checksum is provided, all services will ensure a match when the upload has completed or raise an ActiveStorage::IntegrityError.
Private Instance Methods
Source
# File lib/active_storage/service/mirror_service.rb, line 80 def each_service(&block) [ primary, *mirrors ].each(&block) end
Source
# File lib/active_storage/service/mirror_service.rb, line 84 def perform_across_services(method, *args) tasks = each_service.collect do |service| Concurrent::Promise.execute(executor: @executor) do service.public_send method, *args end end tasks.each(&:value!) end