Sha256: d32e9ff3caed1fd71337a868eeb872495cf760f75e69f7592324e280b37bcc53

Contents?: true

Size: 1.94 KB

Versions: 29

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true

module ActiveRecord
  module Middleware
    # The ShardSelector Middleware provides a framework for automatically
    # swapping shards. Rails provides a basic framework to determine which
    # shard to switch to and allows for applications to write custom strategies
    # for swapping if needed.
    #
    # The ShardSelector takes a set of options (currently only +lock+ is supported)
    # that can be used by the middleware to alter behavior. +lock+ is
    # true by default and will prohibit the request from switching shards once
    # inside the block. If +lock+ is false, then shard swapping will be allowed.
    # For tenant based sharding, +lock+ should always be true to prevent application
    # code from mistakenly switching between tenants.
    #
    # Options can be set in the config:
    #
    #   config.active_record.shard_selector = { lock: true }
    #
    # Applications must also provide the code for the resolver as it depends on application
    # specific models. An example resolver would look like this:
    #
    #   config.active_record.shard_resolver = ->(request) {
    #     subdomain = request.subdomain
    #     tenant = Tenant.find_by_subdomain!(subdomain)
    #     tenant.shard
    #   }
    class ShardSelector
      def initialize(app, resolver, options = {})
        @app = app
        @resolver = resolver
        @options = options
      end

      attr_reader :resolver, :options

      def call(env)
        request = ActionDispatch::Request.new(env)

        shard = selected_shard(request)

        set_shard(shard) do
          @app.call(env)
        end
      end

      private
        def selected_shard(request)
          resolver.call(request)
        end

        def set_shard(shard, &block)
          ActiveRecord::Base.connected_to(shard: shard.to_sym) do
            ActiveRecord::Base.prohibit_shard_swapping(options.fetch(:lock, true), &block)
          end
        end
    end
  end
end

Version data entries

29 entries across 29 versions & 6 rubygems

Version Path
trusty-cms-7.0.9.1 vendor/bundle/ruby/3.3.0/gems/activerecord-7.0.8.7/lib/active_record/middleware/shard_selector.rb
activerecord-7.0.8.7 lib/active_record/middleware/shard_selector.rb
activerecord-7.0.8.6 lib/active_record/middleware/shard_selector.rb
activerecord-7.0.8.5 lib/active_record/middleware/shard_selector.rb
blacklight-spotlight-3.6.0.beta8 vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8.4/lib/active_record/middleware/shard_selector.rb
cm-admin-1.5.22 vendor/bundle/ruby/3.3.0/gems/activerecord-7.0.5.1/lib/active_record/middleware/shard_selector.rb
cm-admin-1.5.21 vendor/bundle/ruby/3.3.0/gems/activerecord-7.0.5.1/lib/active_record/middleware/shard_selector.rb
cm-admin-1.5.20 vendor/bundle/ruby/3.3.0/gems/activerecord-7.0.5.1/lib/active_record/middleware/shard_selector.rb
activerecord-7.0.8.4 lib/active_record/middleware/shard_selector.rb
activerecord-7.0.8.1 lib/active_record/middleware/shard_selector.rb
scrapbook-0.3.2 vendor/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/middleware/shard_selector.rb
activerecord-7.0.8 lib/active_record/middleware/shard_selector.rb
activerecord-7.0.7.2 lib/active_record/middleware/shard_selector.rb
activerecord-7.0.7.1 lib/active_record/middleware/shard_selector.rb
activerecord-7.0.7 lib/active_record/middleware/shard_selector.rb
activerecord-7.0.6 lib/active_record/middleware/shard_selector.rb
activerecord-7.0.5.1 lib/active_record/middleware/shard_selector.rb
scrapbook-0.3.1 vendor/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/middleware/shard_selector.rb
rubypitaya-3.12.5 ./lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4/lib/active_record/middleware/shard_selector.rb
activerecord-7.0.5 lib/active_record/middleware/shard_selector.rb