Class: Dalli::Protocol::ValueCompressor

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

Overview

Dalli::Protocol::ValueCompressor compartmentalizes the logic for managing compression and decompression of stored values. It manages interpreting relevant options from both client and request, determining whether to compress/decompress on store/retrieve, and processes bitflags as necessary.

Constant Summary collapse

DEFAULTS =
{
  compress: true,
  compressor: ::Dalli::Compressor,
  # min byte size to attempt compression
  compression_min_size: 4 * 1024 # 4K
}.freeze
OPTIONS =
DEFAULTS.keys.freeze
FLAG_COMPRESSED =

www.hjp.at/zettel/m/memcached_flags.rxml Looks like most clients use bit 1 to indicate gzip compression.

0x2

Instance Method Summary collapse

Constructor Details

#initialize(client_options) ⇒ ValueCompressor

Returns a new instance of ValueCompressor.



27
28
29
30
# File 'lib/dalli/protocol/value_compressor.rb', line 27

def initialize(client_options)
  @compression_options =
    DEFAULTS.merge(client_options.slice(*OPTIONS))
end

Instance Method Details

#compress_by_default?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/dalli/protocol/value_compressor.rb', line 51

def compress_by_default?
  @compression_options[:compress]
end

#compress_value?(value, req_options) ⇒ Boolean

Checks whether we should apply compression when serializing a value based on the specified options. Returns false unless the value is greater than the minimum compression size. Otherwise returns based on a method-level option if specified, falling back to the server default.

Returns:

  • (Boolean)


68
69
70
71
72
73
# File 'lib/dalli/protocol/value_compressor.rb', line 68

def compress_value?(value, req_options)
  return false unless value.bytesize >= compression_min_size
  return compress_by_default? unless req_options && !req_options[:compress].nil?

  req_options[:compress]
end

#compression_min_sizeObject



59
60
61
# File 'lib/dalli/protocol/value_compressor.rb', line 59

def compression_min_size
  @compression_options[:compression_min_size]
end

#compressorObject



55
56
57
# File 'lib/dalli/protocol/value_compressor.rb', line 55

def compressor
  @compression_options[:compressor]
end

#retrieve(value, bitflags) ⇒ Object



40
41
42
43
44
45
46
47
48
49
# File 'lib/dalli/protocol/value_compressor.rb', line 40

def retrieve(value, bitflags)
  compressed = bitflags.anybits?(FLAG_COMPRESSED)
  compressed ? compressor.decompress(value) : value

# TODO: We likely want to move this rescue into the Dalli::Compressor / Dalli::GzipCompressor
# itself, since not all compressors necessarily use Zlib.  For now keep it here, so the behavior
# of custom compressors doesn't change.
rescue Zlib::Error
  raise UnmarshalError, "Unable to uncompress value: #{$ERROR_INFO.message}"
end

#store(value, req_options, bitflags) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/dalli/protocol/value_compressor.rb', line 32

def store(value, req_options, bitflags)
  do_compress = compress_value?(value, req_options)
  store_value = do_compress ? compressor.compress(value) : value
  bitflags |= FLAG_COMPRESSED if do_compress

  [store_value, bitflags]
end