Class: Dalli::PipelinedGetter

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

Overview

Contains logic for the pipelined gets implemented by the client.

Constant Summary collapse

INTERLEAVE_THRESHOLD =

For large batches, interleave sends with response draining to prevent socket buffer deadlock. Only kicks in above this threshold.

10_000
CHUNK_SIZE =

Number of keys to send before draining responses during interleaved mode

10_000

Instance Method Summary collapse

Constructor Details

#initialize(ring, key_manager) ⇒ PipelinedGetter



15
16
17
18
# File 'lib/dalli/pipelined_getter.rb', line 15

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

Instance Method Details

#process(keys, &block) ⇒ Object

Yields, one at a time, keys and their values+attributes.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/dalli/pipelined_getter.rb', line 23

def process(keys, &block)
  return {} if keys.empty?

  @ring.lock do
    # Stores partial results collected during interleaved send phase
    @partial_results = {}
    servers = setup_requests(keys)
    start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)

    # First yield any partial results collected during interleaved send
    yield_partial_results(&block)

    servers = fetch_responses(servers, start_time, @ring.socket_timeout, &block) until servers.empty?
  end
rescue Dalli::RetryableNetworkError => e
  Dalli.logger.debug { e.inspect }
  Dalli.logger.debug { 'retrying pipelined gets because of timeout' }
  retry
end