redis_queued_locks 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/README.md +11 -0
- data/lib/redis_queued_locks/acquier/acquire_lock/yield_with_expire.rb +8 -1
- data/lib/redis_queued_locks/acquier/acquire_lock.rb +30 -9
- data/lib/redis_queued_locks/acquier/extend_lock_ttl.rb +2 -1
- data/lib/redis_queued_locks/acquier/release_all_locks.rb +4 -1
- data/lib/redis_queued_locks/acquier/release_lock.rb +4 -1
- data/lib/redis_queued_locks/client.rb +18 -11
- data/lib/redis_queued_locks/instrument/active_support.rb +1 -1
- data/lib/redis_queued_locks/instrument/void_notifier.rb +1 -1
- data/lib/redis_queued_locks/instrument.rb +3 -3
- data/lib/redis_queued_locks/logging/void_logger.rb +43 -0
- data/lib/redis_queued_locks/logging.rb +57 -0
- data/lib/redis_queued_locks/version.rb +2 -2
- data/lib/redis_queued_locks.rb +2 -0
- metadata +4 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 4360a9af038cc33ca36215d729558bab6810b9c5a4fec7f31df6ca2871b7dd80
         | 
| 4 | 
            +
              data.tar.gz: 10b80a0f389994fde9a4815c3a5031ae85cee3c61d9c2a02e85d80146208bb99
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 362e7708a37f8716217e08117f072ef34d14886677379d28bef08f80c1a1a82e1309509dfc5fe4f748a3a10268bf340087c83e797ebcd72cb8172594352fb23d
         | 
| 7 | 
            +
              data.tar.gz: 32a0943ee8c80b8ed745dff8eeea748c2289008d8fb00d3e20c7b464ef14a4d21158066e548bb86cfebc73c5d61a365289b49ae8061bc3ea0339ad7bb3c9894d
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,8 +1,12 @@ | |
| 1 1 | 
             
            ## [Unreleased]
         | 
| 2 2 |  | 
| 3 | 
            +
            ## [0.0.22] - 2024-03-21
         | 
| 4 | 
            +
            ### Added
         | 
| 5 | 
            +
            - Logging infrastructure. Initial implementation includes the only debugging features.
         | 
| 6 | 
            +
             | 
| 3 7 | 
             
            ## [0.0.21] - 2024-03-19
         | 
| 4 8 | 
             
            ### Changed
         | 
| 5 | 
            -
            - `RedisQueuedLocks::Acquier | 
| 9 | 
            +
            - Refactored `RedisQueuedLocks::Acquier`;
         | 
| 6 10 |  | 
| 7 11 | 
             
            ## [0.0.20] - 2024-03-14
         | 
| 8 12 | 
             
            ### Added
         | 
    
        data/README.md
    CHANGED
    
    | @@ -134,6 +134,16 @@ clinet = RedisQueuedLocks::Client.new(redis_client) do |config| | |
| 134 134 | 
             
              # - it is calculated once per `RedisQueudLocks::Client` instance;
         | 
| 135 135 | 
             
              # - expects the proc object;
         | 
| 136 136 | 
             
              config.uniq_identifier = -> { RedisQueuedLocks::Resource.calc_uniq_identity }
         | 
| 137 | 
            +
             | 
| 138 | 
            +
              # (default: RedisQueuedLocks::Logging::VoidLogger)
         | 
| 139 | 
            +
              # - the logger object;
         | 
| 140 | 
            +
              # - should implement `debug(progname = nil, &block)` (minimal requirement) or be an instance of Ruby's `::Logger` class/subclass;
         | 
| 141 | 
            +
              # - at this moment the only debug logs are realised in 3 cases:
         | 
| 142 | 
            +
              #   - start of lock obtaining: "[redis_queud_locks.start_lock_obtaining] lock_key => 'rql:lock:your_lock'"
         | 
| 143 | 
            +
              #   - finish of the lock obtaining: "[redis_queued_locks.lock_obtained] lock_key => 'rql:lock:your_lock' acq_time => 123.456 (ms)"
         | 
| 144 | 
            +
              #   - start of the lock expiration after `yield`: "[redis_queud_locks.expire_lock] lock_key => 'rql:lock:your_lock'"
         | 
| 145 | 
            +
              # - by default uses VoidLogger that does nothing;
         | 
| 146 | 
            +
              config.logger = RedisQueuedLocks::Logging::VoidLogger
         | 
| 137 147 | 
             
            end
         | 
| 138 148 | 
             
            ```
         | 
| 139 149 |  | 
| @@ -581,6 +591,7 @@ Detalized event semantics and payload structure: | |
| 581 591 | 
             
              - an ability to add custom metadata to the lock and an ability to read this data;
         | 
| 582 592 | 
             
              - lock prioritization;
         | 
| 583 593 | 
             
              - support for LIFO strategy;
         | 
| 594 | 
            +
              - structured logging;
         | 
| 584 595 | 
             
            - **Minor**
         | 
| 585 596 | 
             
              - GitHub Actions CI;
         | 
| 586 597 | 
             
              - `RedisQueuedLocks::Acquier::Try.try_to_lock` - detailed successful result analization;
         | 
| @@ -3,7 +3,11 @@ | |
| 3 3 | 
             
            # @api private
         | 
| 4 4 | 
             
            # @since 0.1.0
         | 
| 5 5 | 
             
            module RedisQueuedLocks::Acquier::AcquireLock::YieldWithExpire
         | 
| 6 | 
            +
              # @since 0.1.0
         | 
| 7 | 
            +
              extend RedisQueuedLocks::Utilities
         | 
| 8 | 
            +
             | 
| 6 9 | 
             
              # @param redis [RedisClient] Redis connection manager.
         | 
| 10 | 
            +
              # @param logger [#debug] Logger object.
         | 
| 7 11 | 
             
              # @param lock_key [String] Lock key to be expired.
         | 
| 8 12 | 
             
              # @param timed [Boolean] Should the lock be wrapped by Tiemlout with with lock's ttl
         | 
| 9 13 | 
             
              # @param ttl_shift [Float] Lock's TTL shifting. Should affect block's ttl. In millisecodns.
         | 
| @@ -13,7 +17,7 @@ module RedisQueuedLocks::Acquier::AcquireLock::YieldWithExpire | |
| 13 17 | 
             
              #
         | 
| 14 18 | 
             
              # @api private
         | 
| 15 19 | 
             
              # @since 0.1.0
         | 
| 16 | 
            -
              def yield_with_expire(redis, lock_key, timed, ttl_shift, ttl, &block)
         | 
| 20 | 
            +
              def yield_with_expire(redis, logger, lock_key, timed, ttl_shift, ttl, &block)
         | 
| 17 21 | 
             
                if block_given?
         | 
| 18 22 | 
             
                  if timed && ttl != nil
         | 
| 19 23 | 
             
                    timeout = ((ttl - ttl_shift) / 1000.0).yield_self { |time| (time < 0) ? 0.0 : time }
         | 
| @@ -23,6 +27,9 @@ module RedisQueuedLocks::Acquier::AcquireLock::YieldWithExpire | |
| 23 27 | 
             
                  end
         | 
| 24 28 | 
             
                end
         | 
| 25 29 | 
             
              ensure
         | 
| 30 | 
            +
                run_non_critical do
         | 
| 31 | 
            +
                  logger.debug("[redis_queued_locks.expire_lock] lock_key => '#{lock_key}'")
         | 
| 32 | 
            +
                end
         | 
| 26 33 | 
             
                redis.call('EXPIRE', lock_key, '0')
         | 
| 27 34 | 
             
              end
         | 
| 28 35 |  | 
| @@ -69,6 +69,9 @@ module RedisQueuedLocks::Acquier::AcquireLock | |
| 69 69 | 
             
                #   already obtained.
         | 
| 70 70 | 
             
                # @option metadata [NilClass,Any]
         | 
| 71 71 | 
             
                #   - A custom metadata wich will be passed to the instrumenter's payload with :meta key;
         | 
| 72 | 
            +
                # @option logger [#debug]
         | 
| 73 | 
            +
                #   - Logger object used from `configuration` layer (see config[:logger]);
         | 
| 74 | 
            +
                #   - See RedisQueuedLocks::Logging::VoidLogger for example;
         | 
| 72 75 | 
             
                # @param [Block]
         | 
| 73 76 | 
             
                #   A block of code that should be executed after the successfully acquired lock.
         | 
| 74 77 | 
             
                # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>,yield]
         | 
| @@ -96,6 +99,7 @@ module RedisQueuedLocks::Acquier::AcquireLock | |
| 96 99 | 
             
                  identity:,
         | 
| 97 100 | 
             
                  fail_fast:,
         | 
| 98 101 | 
             
                  metadata:,
         | 
| 102 | 
            +
                  logger:,
         | 
| 99 103 | 
             
                  &block
         | 
| 100 104 | 
             
                )
         | 
| 101 105 | 
             
                  # Step 1: prepare lock requirements (generate lock name, calc lock ttl, etc).
         | 
| @@ -127,6 +131,13 @@ module RedisQueuedLocks::Acquier::AcquireLock | |
| 127 131 | 
             
                  }
         | 
| 128 132 | 
             
                  acq_dequeue = -> { dequeue_from_lock_queue(redis, lock_key_queue, acquier_id) }
         | 
| 129 133 |  | 
| 134 | 
            +
                  run_non_critical do
         | 
| 135 | 
            +
                    logger.debug(
         | 
| 136 | 
            +
                      "[redis_queued_locks.start_lock_obtaining] " \
         | 
| 137 | 
            +
                      "lock_key => '#{lock_key}'"
         | 
| 138 | 
            +
                    )
         | 
| 139 | 
            +
                  end
         | 
| 140 | 
            +
             | 
| 130 141 | 
             
                  # Step 2: try to lock with timeout
         | 
| 131 142 | 
             
                  with_acq_timeout(timeout, lock_key, raise_errors, on_timeout: acq_dequeue) do
         | 
| 132 143 | 
             
                    acq_start_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
         | 
| @@ -153,15 +164,25 @@ module RedisQueuedLocks::Acquier::AcquireLock | |
| 153 164 |  | 
| 154 165 | 
             
                      # Step 2.1: analyze an acquirement attempt
         | 
| 155 166 | 
             
                      if ok
         | 
| 167 | 
            +
                        run_non_critical do
         | 
| 168 | 
            +
                          logger.debug(
         | 
| 169 | 
            +
                            "[redis_queued_locks.lock_obtained] " \
         | 
| 170 | 
            +
                            "lock_key => '#{result[:lock_key]}'" \
         | 
| 171 | 
            +
                            "acq_time => #{acq_time} (ms)"
         | 
| 172 | 
            +
                          )
         | 
| 173 | 
            +
                        end
         | 
| 174 | 
            +
             | 
| 156 175 | 
             
                        # Step X (instrumentation): lock obtained
         | 
| 157 | 
            -
                         | 
| 158 | 
            -
                           | 
| 159 | 
            -
             | 
| 160 | 
            -
             | 
| 161 | 
            -
             | 
| 162 | 
            -
             | 
| 163 | 
            -
             | 
| 164 | 
            -
             | 
| 176 | 
            +
                        run_non_critical do
         | 
| 177 | 
            +
                          instrumenter.notify('redis_queued_locks.lock_obtained', {
         | 
| 178 | 
            +
                            lock_key: result[:lock_key],
         | 
| 179 | 
            +
                            ttl: result[:ttl],
         | 
| 180 | 
            +
                            acq_id: result[:acq_id],
         | 
| 181 | 
            +
                            ts: result[:ts],
         | 
| 182 | 
            +
                            acq_time: acq_time,
         | 
| 183 | 
            +
                            meta: metadata
         | 
| 184 | 
            +
                          })
         | 
| 185 | 
            +
                        end
         | 
| 165 186 |  | 
| 166 187 | 
             
                        # Step 2.1.a: successfully acquired => build the result
         | 
| 167 188 | 
             
                        acq_process[:lock_info] = {
         | 
| @@ -225,7 +246,7 @@ module RedisQueuedLocks::Acquier::AcquireLock | |
| 225 246 | 
             
                      begin
         | 
| 226 247 | 
             
                        yield_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
         | 
| 227 248 | 
             
                        ttl_shift = ((yield_time - acq_process[:acq_end_time]) * 1000).ceil(2)
         | 
| 228 | 
            -
                        yield_with_expire(redis, lock_key, timed, ttl_shift, ttl, &block)
         | 
| 249 | 
            +
                        yield_with_expire(redis, logger, lock_key, timed, ttl_shift, ttl, &block)
         | 
| 229 250 | 
             
                      ensure
         | 
| 230 251 | 
             
                        acq_process[:rel_time] = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
         | 
| 231 252 | 
             
                        acq_process[:hold_time] = (
         | 
| @@ -7,11 +7,12 @@ module RedisQueuedLocks::Acquier::ExtendLockTTL | |
| 7 7 | 
             
                # @param redis_client [RedisClient]
         | 
| 8 8 | 
             
                # @param lock_name [String]
         | 
| 9 9 | 
             
                # @param milliseconds [Integer]
         | 
| 10 | 
            +
                # @param logger [#debug]
         | 
| 10 11 | 
             
                # @return [?]
         | 
| 11 12 | 
             
                #
         | 
| 12 13 | 
             
                # @api private
         | 
| 13 14 | 
             
                # @since 0.1.0
         | 
| 14 | 
            -
                def extend_lock_ttl(redis_client, lock_name, milliseconds)
         | 
| 15 | 
            +
                def extend_lock_ttl(redis_client, lock_name, milliseconds, logger)
         | 
| 15 16 | 
             
                  # TODO: realize
         | 
| 16 17 | 
             
                end
         | 
| 17 18 | 
             
              end
         | 
| @@ -17,12 +17,15 @@ module RedisQueuedLocks::Acquier::ReleaseAllLocks | |
| 17 17 | 
             
                #   The number of lock keys that should be released in a time.
         | 
| 18 18 | 
             
                # @param isntrumenter [#notify]
         | 
| 19 19 | 
             
                #   See RedisQueuedLocks::Instrument::ActiveSupport for example.
         | 
| 20 | 
            +
                # @param logger [#debug]
         | 
| 21 | 
            +
                #   - Logger object used from `configuration` layer (see config[:logger]);
         | 
| 22 | 
            +
                #   - See RedisQueuedLocks::Logging::VoidLogger for example;
         | 
| 20 23 | 
             
                # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
         | 
| 21 24 | 
             
                #   Format: { ok: true/false, result: Hash<Symbol,Numeric> }
         | 
| 22 25 | 
             
                #
         | 
| 23 26 | 
             
                # @api private
         | 
| 24 27 | 
             
                # @since 0.1.0
         | 
| 25 | 
            -
                def release_all_locks(redis, batch_size, instrumenter)
         | 
| 28 | 
            +
                def release_all_locks(redis, batch_size, instrumenter, logger)
         | 
| 26 29 | 
             
                  rel_start_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
         | 
| 27 30 | 
             
                  fully_release_all_locks(redis, batch_size) => { ok:, result: }
         | 
| 28 31 | 
             
                  time_at = Time.now.to_i
         | 
| @@ -20,12 +20,15 @@ module RedisQueuedLocks::Acquier::ReleaseLock | |
| 20 20 | 
             
                #   The lock name that should be released.
         | 
| 21 21 | 
             
                # @param isntrumenter [#notify]
         | 
| 22 22 | 
             
                #   See RedisQueuedLocks::Instrument::ActiveSupport for example.
         | 
| 23 | 
            +
                # @param logger [#debug]
         | 
| 24 | 
            +
                #   - Logger object used from `configuration` layer (see config[:logger]);
         | 
| 25 | 
            +
                #   - See RedisQueuedLocks::Logging::VoidLogger for example;
         | 
| 23 26 | 
             
                # @return [RedisQueuedLocks::Data,Hash<Symbol,Any>]
         | 
| 24 27 | 
             
                #   Format: { ok: true/false, result: Hash<Symbil,Numeric|String> }
         | 
| 25 28 | 
             
                #
         | 
| 26 29 | 
             
                # @api private
         | 
| 27 30 | 
             
                # @since 0.1.0
         | 
| 28 | 
            -
                def release_lock(redis, lock_name, instrumenter)
         | 
| 31 | 
            +
                def release_lock(redis, lock_name, instrumenter, logger)
         | 
| 29 32 | 
             
                  lock_key = RedisQueuedLocks::Resource.prepare_lock_key(lock_name)
         | 
| 30 33 | 
             
                  lock_key_queue = RedisQueuedLocks::Resource.prepare_lock_queue(lock_name)
         | 
| 31 34 |  | 
| @@ -9,18 +9,16 @@ class RedisQueuedLocks::Client | |
| 9 9 |  | 
| 10 10 | 
             
              configuration do
         | 
| 11 11 | 
             
                setting :retry_count, 3
         | 
| 12 | 
            -
                setting :retry_delay, 200 # NOTE: milliseconds
         | 
| 13 | 
            -
                setting :retry_jitter, 25 # NOTE: milliseconds
         | 
| 14 | 
            -
                setting :try_to_lock_timeout, 10 # NOTE: seconds
         | 
| 15 | 
            -
                setting :default_lock_ttl, 5_000 # NOTE: milliseconds
         | 
| 16 | 
            -
                setting :default_queue_ttl, 15 # NOTE: seconds
         | 
| 12 | 
            +
                setting :retry_delay, 200 # NOTE: in milliseconds
         | 
| 13 | 
            +
                setting :retry_jitter, 25 # NOTE: in milliseconds
         | 
| 14 | 
            +
                setting :try_to_lock_timeout, 10 # NOTE: in seconds
         | 
| 15 | 
            +
                setting :default_lock_ttl, 5_000 # NOTE: in milliseconds
         | 
| 16 | 
            +
                setting :default_queue_ttl, 15 # NOTE: in seconds
         | 
| 17 17 | 
             
                setting :lock_release_batch_size, 100
         | 
| 18 18 | 
             
                setting :key_extraction_batch_size, 500
         | 
| 19 19 | 
             
                setting :instrumenter, RedisQueuedLocks::Instrument::VoidNotifier
         | 
| 20 20 | 
             
                setting :uniq_identifier, -> { RedisQueuedLocks::Resource.calc_uniq_identity }
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                # TODO: setting :logger, Logger.new(IO::NULL)
         | 
| 23 | 
            -
                # TODO: setting :debug, true/false
         | 
| 21 | 
            +
                setting :logger, RedisQueuedLocks::Logging::VoidLogger
         | 
| 24 22 |  | 
| 25 23 | 
             
                validate('retry_count') { |val| val == nil || (val.is_a?(::Integer) && val >= 0) }
         | 
| 26 24 | 
             
                validate('retry_delay') { |val| val.is_a?(::Integer) && val >= 0 }
         | 
| @@ -30,6 +28,7 @@ class RedisQueuedLocks::Client | |
| 30 28 | 
             
                validate('default_queue_ttl', :integer)
         | 
| 31 29 | 
             
                validate('lock_release_batch_size', :integer)
         | 
| 32 30 | 
             
                validate('instrumenter') { |val| RedisQueuedLocks::Instrument.valid_interface?(val) }
         | 
| 31 | 
            +
                validate('logger') { |val| RedisQueuedLocks::Logging.valid_interface?(val) }
         | 
| 33 32 | 
             
                validate('uniq_identifier', :proc)
         | 
| 34 33 | 
             
              end
         | 
| 35 34 |  | 
| @@ -136,6 +135,7 @@ class RedisQueuedLocks::Client | |
| 136 135 | 
             
                  identity:,
         | 
| 137 136 | 
             
                  fail_fast:,
         | 
| 138 137 | 
             
                  metadata:,
         | 
| 138 | 
            +
                  logger: config[:logger],
         | 
| 139 139 | 
             
                  &block
         | 
| 140 140 | 
             
                )
         | 
| 141 141 | 
             
              end
         | 
| @@ -186,7 +186,8 @@ class RedisQueuedLocks::Client | |
| 186 186 | 
             
                RedisQueuedLocks::Acquier::ReleaseLock.release_lock(
         | 
| 187 187 | 
             
                  redis_client,
         | 
| 188 188 | 
             
                  lock_name,
         | 
| 189 | 
            -
                  config[:instrumenter]
         | 
| 189 | 
            +
                  config[:instrumenter],
         | 
| 190 | 
            +
                  config[:logger]
         | 
| 190 191 | 
             
                )
         | 
| 191 192 | 
             
              end
         | 
| 192 193 |  | 
| @@ -233,7 +234,12 @@ class RedisQueuedLocks::Client | |
| 233 234 | 
             
              # @api public
         | 
| 234 235 | 
             
              # @since 0.1.0
         | 
| 235 236 | 
             
              def extend_lock_ttl(lock_name, milliseconds)
         | 
| 236 | 
            -
                RedisQueuedLocks::Acquier::ExtendLockTTL.extend_lock_ttl( | 
| 237 | 
            +
                RedisQueuedLocks::Acquier::ExtendLockTTL.extend_lock_ttl(
         | 
| 238 | 
            +
                  redis_client,
         | 
| 239 | 
            +
                  lock_name,
         | 
| 240 | 
            +
                  milliseconds,
         | 
| 241 | 
            +
                  config[:logger]
         | 
| 242 | 
            +
                )
         | 
| 237 243 | 
             
              end
         | 
| 238 244 |  | 
| 239 245 | 
             
              # @option batch_size [Integer]
         | 
| @@ -246,7 +252,8 @@ class RedisQueuedLocks::Client | |
| 246 252 | 
             
                RedisQueuedLocks::Acquier::ReleaseAllLocks.release_all_locks(
         | 
| 247 253 | 
             
                  redis_client,
         | 
| 248 254 | 
             
                  batch_size,
         | 
| 249 | 
            -
                  config[:instrumenter]
         | 
| 255 | 
            +
                  config[:instrumenter],
         | 
| 256 | 
            +
                  config[:logger]
         | 
| 250 257 | 
             
                )
         | 
| 251 258 | 
             
              end
         | 
| 252 259 |  | 
| @@ -8,7 +8,7 @@ module RedisQueuedLocks::Instrument::ActiveSupport | |
| 8 8 | 
             
                # @param payload [Hash<String|Symbol,Any>]
         | 
| 9 9 | 
             
                # @return [void]
         | 
| 10 10 | 
             
                #
         | 
| 11 | 
            -
                # @api  | 
| 11 | 
            +
                # @api public
         | 
| 12 12 | 
             
                # @since 0.1.0
         | 
| 13 13 | 
             
                def notify(event, payload = {})
         | 
| 14 14 | 
             
                  ::ActiveSupport::Notifications.instrument(event, payload)
         | 
| @@ -25,10 +25,10 @@ module RedisQueuedLocks::Instrument | |
| 25 25 | 
             
                    m_obj = instrumenter.method(:notify)
         | 
| 26 26 | 
             
                    m_sig = m_obj.parameters
         | 
| 27 27 |  | 
| 28 | 
            -
                    f_prm = m_sig[0][0]
         | 
| 29 | 
            -
                    s_prm = m_sig[1][0]
         | 
| 30 | 
            -
             | 
| 31 28 | 
             
                    if m_sig.size == 2
         | 
| 29 | 
            +
                      f_prm = m_sig[0][0]
         | 
| 30 | 
            +
                      s_prm = m_sig[1][0]
         | 
| 31 | 
            +
             | 
| 32 32 | 
             
                      # rubocop:disable Layout/MultilineOperationIndentation
         | 
| 33 33 | 
             
                      # NOTE: check the signature vairants
         | 
| 34 34 | 
             
                      f_prm == :req && s_prm == :req ||
         | 
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # @api public
         | 
| 4 | 
            +
            # @since 0.1.0
         | 
| 5 | 
            +
            module RedisQueuedLocks::Logging::VoidLogger
         | 
| 6 | 
            +
              class << self
         | 
| 7 | 
            +
                # @api public
         | 
| 8 | 
            +
                # @since 0.1.0
         | 
| 9 | 
            +
                def warn(progname = nil, &block); end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                # @api public
         | 
| 12 | 
            +
                # @since 0.1.0
         | 
| 13 | 
            +
                def unknown(progname = nil, &block); end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                # @api public
         | 
| 16 | 
            +
                # @since 0.1.0
         | 
| 17 | 
            +
                def log(progname = nil, &block); end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                # @api public
         | 
| 20 | 
            +
                # @since 0.1.0
         | 
| 21 | 
            +
                def info(progname = nil, &block); end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                # @api public
         | 
| 24 | 
            +
                # @since 0.1.0
         | 
| 25 | 
            +
                def error(progname = nil, &block); end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                # @api public
         | 
| 28 | 
            +
                # @since 0.1.0
         | 
| 29 | 
            +
                def fatal(progname = nil, &block); end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                # @api public
         | 
| 32 | 
            +
                # @since 0.1.0
         | 
| 33 | 
            +
                def debug(progname = nil, &block); end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                # @api public
         | 
| 36 | 
            +
                # @since 0.1.0
         | 
| 37 | 
            +
                def add(*, &block); end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                # @api public
         | 
| 40 | 
            +
                # @since 0.1.0
         | 
| 41 | 
            +
                def <<(message); end
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
            end
         | 
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # @api public
         | 
| 4 | 
            +
            # @since 0.1.0
         | 
| 5 | 
            +
            module RedisQueuedLocks::Logging
         | 
| 6 | 
            +
              require_relative 'logging/void_logger'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              class << self
         | 
| 9 | 
            +
                # @param logger [#debug]
         | 
| 10 | 
            +
                # @return [Boolean]
         | 
| 11 | 
            +
                #
         | 
| 12 | 
            +
                # @api public
         | 
| 13 | 
            +
                # @since 0.1.0
         | 
| 14 | 
            +
                def valid_interface?(logger)
         | 
| 15 | 
            +
                  return true if logger.is_a?(::Logger)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  # NOTE: should provide `#debug` method.
         | 
| 18 | 
            +
                  return false unless logger.respond_to?(:debug)
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  # NOTE:
         | 
| 21 | 
            +
                  #   `#debug` method should have appropriated signature `(progname, &block)`
         | 
| 22 | 
            +
                  #   Required method signature (progname, &block):
         | 
| 23 | 
            +
                  #     => [[:opt, :progname], [:block, :block]]
         | 
| 24 | 
            +
                  #     => [[:req, :progname], [:block, :block]]
         | 
| 25 | 
            +
                  #     => [[:opt, :progname]]
         | 
| 26 | 
            +
                  #     => [[:req, :progname]]
         | 
| 27 | 
            +
                  #     => [[:rest], [:block, :block]]
         | 
| 28 | 
            +
                  #     => [[:rest]]
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  m_obj = logger.method(:debug)
         | 
| 31 | 
            +
                  m_sig = m_obj.parameters
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  if m_sig.size == 2
         | 
| 34 | 
            +
                    # => [[:opt, :progname], [:block, :block]]
         | 
| 35 | 
            +
                    # => [[:req, :progname], [:block, :block]]
         | 
| 36 | 
            +
                    # => [[:rest], [:block, :block]]
         | 
| 37 | 
            +
                    f_prm = m_sig[0][0]
         | 
| 38 | 
            +
                    s_prm = m_sig[1][0]
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                    # rubocop:disable Layout/MultilineOperationIndentation
         | 
| 41 | 
            +
                    f_prm == :opt && s_prm == :block ||
         | 
| 42 | 
            +
                    f_prm == :req && s_prm == :block ||
         | 
| 43 | 
            +
                    f_prm == :rest && s_prm == :block
         | 
| 44 | 
            +
                    # rubocop:enable Layout/MultilineOperationIndentation
         | 
| 45 | 
            +
                  elsif m_sig.size == 1
         | 
| 46 | 
            +
                    # => [[:opt, :progname]]
         | 
| 47 | 
            +
                    # => [[:req, :progname]]
         | 
| 48 | 
            +
                    # => [[:rest]]
         | 
| 49 | 
            +
                    prm = m_sig[0][0]
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                    prm == :opt || prm == :req || prm == :rest
         | 
| 52 | 
            +
                  else
         | 
| 53 | 
            +
                    false
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
            end
         | 
    
        data/lib/redis_queued_locks.rb
    CHANGED
    
    | @@ -4,6 +4,7 @@ require 'redis-client' | |
| 4 4 | 
             
            require 'qonfig'
         | 
| 5 5 | 
             
            require 'timeout'
         | 
| 6 6 | 
             
            require 'securerandom'
         | 
| 7 | 
            +
            require 'logger'
         | 
| 7 8 |  | 
| 8 9 | 
             
            # @api public
         | 
| 9 10 | 
             
            # @since 0.1.0
         | 
| @@ -11,6 +12,7 @@ module RedisQueuedLocks | |
| 11 12 | 
             
              require_relative 'redis_queued_locks/version'
         | 
| 12 13 | 
             
              require_relative 'redis_queued_locks/errors'
         | 
| 13 14 | 
             
              require_relative 'redis_queued_locks/utilities'
         | 
| 15 | 
            +
              require_relative 'redis_queued_locks/logging'
         | 
| 14 16 | 
             
              require_relative 'redis_queued_locks/data'
         | 
| 15 17 | 
             
              require_relative 'redis_queued_locks/debugger'
         | 
| 16 18 | 
             
              require_relative 'redis_queued_locks/resource'
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: redis_queued_locks
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.22
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Rustam Ibragimov
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024-03- | 
| 11 | 
            +
            date: 2024-03-21 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: redis-client
         | 
| @@ -79,6 +79,8 @@ files: | |
| 79 79 | 
             
            - lib/redis_queued_locks/instrument.rb
         | 
| 80 80 | 
             
            - lib/redis_queued_locks/instrument/active_support.rb
         | 
| 81 81 | 
             
            - lib/redis_queued_locks/instrument/void_notifier.rb
         | 
| 82 | 
            +
            - lib/redis_queued_locks/logging.rb
         | 
| 83 | 
            +
            - lib/redis_queued_locks/logging/void_logger.rb
         | 
| 82 84 | 
             
            - lib/redis_queued_locks/resource.rb
         | 
| 83 85 | 
             
            - lib/redis_queued_locks/utilities.rb
         | 
| 84 86 | 
             
            - lib/redis_queued_locks/version.rb
         |