Class: Dalli::PipelinedDeleter

Inherits:
Object
  • Object
show all
Defined in:
lib/dalli/pipelined_deleter.rb

Overview

Contains logic for the pipelined delete operations implemented by the client. Efficiently deletes multiple keys by grouping requests by server and using quiet mode to minimize round trips.

Instance Method Summary collapse

Constructor Details

#initialize(ring, key_manager) ⇒ PipelinedDeleter

Returns a new instance of PipelinedDeleter.



10
11
12
13
# File 'lib/dalli/pipelined_deleter.rb', line 10

def initialize(ring, key_manager)
  @ring = ring
  @key_manager = key_manager
end

Instance Method Details

#process(keys, req_options = nil) ⇒ Integer

Deletes multiple keys from memcached.

req_options is applied to every delete in the batch (see Dalli::Client#delete for the supported meta-delete keys).

Parameters:

  • keys (Array<String>)

    keys to delete

Returns:

  • (Integer)

    the number of keys the server found and acted on. Only a key that did not exist decrements this count, so with req_options: {invalidate: true} it reports how many keys were tombstoned rather than removed. This is best-effort: a transient network error is retried automatically, and keys handled before the error are not recounted, so the result may under-report when a retry occurs. If a server remains unreachable after retrying, raises Dalli::NetworkError.



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/dalli/pipelined_deleter.rb', line 31

def process(keys, req_options = nil)
  return 0 if keys.empty?

  @ring.lock do
    groups = setup_requests(keys, req_options)
    finish_requests(groups)
  end
rescue Dalli::RetryableNetworkError => e
  Dalli.logger.debug { e.inspect }
  Dalli.logger.debug { 'retrying pipelined deletes because of network error' }
  retry
end