redis-client 0.12.1 → 0.13.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0845ff9c4cbb2e63f1add455942b56eed1840abdd671e0d40aebb860bf6e8510'
4
- data.tar.gz: 2ac5ed7d4ff7762d715f17fa462a6f139c65ba0c0055f25718af968e941ff805
3
+ metadata.gz: e12fdb44add8ecb747b797c75a5991c973cb78519bbbce1f15a68bb80d1e2bb9
4
+ data.tar.gz: 0def4c2cc5a2f55ec9e9eb48a4ce5bfeadbef889c9695642126c011aebcd83b2
5
5
  SHA512:
6
- metadata.gz: 0e252e338aacc68a076fa2efe01d1bde4a74e25547c145670a979d0605ae022fc9a766e20ca765e7e2d4931298a7558fb154aed27d9d0c6ea5256238ac195d64
7
- data.tar.gz: 4f3f9da3836a2c0e587322aece7d7932b0968f2b9d99fa665d557e2647c3a9e8ac41fc82feb2317d3169d6ddc9349eefef82c579f4415e4c0749d6a9b78dec38
6
+ metadata.gz: 5b242cf54b503ae90c4642acdd8d59d8022639cb97de09a664afcbaec8730269fab79e298b0e4e2f74fe54f14ecc36e54adbb65b508d9aead715d0758921a2bd
7
+ data.tar.gz: e8b33e77e568ad63150b40e5a17d5ef528346868d802be80b4953d68986a89b93eaa1d24dcd80368c7b73bcab4ee9428d6d0ad99f300eb18ef43502783649686
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Unreleased
2
2
 
3
+ # 0.13.0
4
+
5
+ - Enable TCP keepalive on redis sockets. It sends a keep alive probe every 15 seconds for 2 minutes. #94.
6
+
7
+ # 0.12.2
8
+
9
+ - Cache calls to `Process.pid` on Ruby 3.1+. #91.
10
+
3
11
  # 0.12.1
4
12
 
5
13
  - Improve compatibility with `uri 0.12.0` (default in Ruby 3.2.0).
data/Gemfile.lock CHANGED
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- redis-client (0.12.1)
4
+ redis-client (0.13.0)
5
5
  connection_pool
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
10
  ast (2.4.2)
11
- benchmark-ips (2.10.0)
11
+ benchmark-ips (2.11.0)
12
12
  byebug (11.1.3)
13
13
  connection_pool (2.3.0)
14
14
  hiredis (0.6.3)
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ class RedisClient
4
+ module PIDCache
5
+ if !Process.respond_to?(:fork) # JRuby or TruffleRuby
6
+ @pid = Process.pid
7
+ singleton_class.attr_reader(:pid)
8
+ elsif Process.respond_to?(:_fork) # Ruby 3.1+
9
+ class << self
10
+ attr_reader :pid
11
+
12
+ def update!
13
+ @pid = Process.pid
14
+ end
15
+ end
16
+ update!
17
+
18
+ module CoreExt
19
+ def _fork
20
+ child_pid = super
21
+ PIDCache.update! if child_pid == 0
22
+ child_pid
23
+ end
24
+ end
25
+ Process.singleton_class.prepend(CoreExt)
26
+ else # Ruby 3.0 or older
27
+ class << self
28
+ def pid
29
+ Process.pid
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -52,6 +52,7 @@ class RedisClient
52
52
  end
53
53
  # disables Nagle's Algorithm, prevents multiple round trips with MULTI
54
54
  sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
55
+ enable_socket_keep_alive(sock)
55
56
  sock
56
57
  end
57
58
 
@@ -129,5 +130,36 @@ class RedisClient
129
130
  rescue SystemCallError, IOError, OpenSSL::SSL::SSLError => error
130
131
  raise ConnectionError, error.message
131
132
  end
133
+
134
+ private
135
+
136
+ KEEP_ALIVE_INTERVAL = 15 # Same as hiredis defaults
137
+ KEEP_ALIVE_TTL = 120 # Longer than hiredis defaults
138
+ KEEP_ALIVE_PROBES = (KEEP_ALIVE_TTL / KEEP_ALIVE_INTERVAL) - 1
139
+ private_constant :KEEP_ALIVE_INTERVAL
140
+ private_constant :KEEP_ALIVE_TTL
141
+ private_constant :KEEP_ALIVE_PROBES
142
+
143
+ if %i[SOL_SOCKET TCP_KEEPIDLE TCP_KEEPINTVL TCP_KEEPCNT].all? { |c| Socket.const_defined? c } # Linux
144
+ def enable_socket_keep_alive(socket)
145
+ socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
146
+ socket.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPIDLE, KEEP_ALIVE_INTERVAL)
147
+ socket.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPINTVL, KEEP_ALIVE_INTERVAL)
148
+ socket.setsockopt(Socket::SOL_TCP, Socket::TCP_KEEPCNT, KEEP_ALIVE_PROBES)
149
+ end
150
+ elsif %i[IPPROTO_TCP TCP_KEEPINTVL TCP_KEEPCNT].all? { |c| Socket.const_defined? c } # macOS
151
+ def enable_socket_keep_alive(socket)
152
+ socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
153
+ socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPINTVL, KEEP_ALIVE_INTERVAL)
154
+ socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPCNT, KEEP_ALIVE_PROBES)
155
+ end
156
+ elsif %i[SOL_SOCKET SO_KEEPALIVE].all? { |c| Socket.const_defined? c } # unknown POSIX
157
+ def enable_socket_keep_alive(socket)
158
+ socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
159
+ end
160
+ else # unknown
161
+ def enable_socket_keep_alive(_socket)
162
+ end
163
+ end
132
164
  end
133
165
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class RedisClient
4
- VERSION = "0.12.1"
4
+ VERSION = "0.13.0"
5
5
  end
data/lib/redis_client.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require "redis_client/version"
4
4
  require "redis_client/command_builder"
5
5
  require "redis_client/config"
6
+ require "redis_client/pid_cache"
6
7
  require "redis_client/sentinel_config"
7
8
  require "redis_client/middlewares"
8
9
 
@@ -67,7 +68,7 @@ class RedisClient
67
68
  @read_timeout = read_timeout
68
69
  @write_timeout = write_timeout
69
70
  @command_builder = config.command_builder
70
- @pid = Process.pid
71
+ @pid = PIDCache.pid
71
72
  end
72
73
 
73
74
  def timeout=(timeout)
@@ -609,7 +610,7 @@ class RedisClient
609
610
  end
610
611
 
611
612
  def ensure_connected(retryable: true)
612
- close if !config.inherit_socket && @pid != Process.pid
613
+ close if !config.inherit_socket && @pid != PIDCache.pid
613
614
 
614
615
  if @disable_reconnection
615
616
  if block_given?
@@ -658,7 +659,7 @@ class RedisClient
658
659
  end
659
660
 
660
661
  def connect
661
- @pid = Process.pid
662
+ @pid = PIDCache.pid
662
663
 
663
664
  connection = @middlewares.connect(config) do
664
665
  config.driver.new(
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.1
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-16 00:00:00.000000000 Z
11
+ date: 2023-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -45,6 +45,7 @@ files:
45
45
  - lib/redis_client/connection_mixin.rb
46
46
  - lib/redis_client/decorator.rb
47
47
  - lib/redis_client/middlewares.rb
48
+ - lib/redis_client/pid_cache.rb
48
49
  - lib/redis_client/pooled.rb
49
50
  - lib/redis_client/ruby_connection.rb
50
51
  - lib/redis_client/ruby_connection/buffered_io.rb
@@ -75,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
76
  - !ruby/object:Gem::Version
76
77
  version: '0'
77
78
  requirements: []
78
- rubygems_version: 3.4.1
79
+ rubygems_version: 3.4.6
79
80
  signing_key:
80
81
  specification_version: 4
81
82
  summary: Simple low-level client for Redis 6+