redis-cluster-activesupport 0.2.0 → 1.0.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 +5 -5
- data/.github/workflows/ci.yml +37 -0
- data/.travis.yml +10 -2
- data/README.md +5 -28
- data/gemfiles/rails60.gemfile +4 -0
- data/gemfiles/rails60.gemfile.lock +71 -0
- data/gemfiles/rails61.gemfile +4 -0
- data/gemfiles/rails61.gemfile.lock +69 -0
- data/lib/active_support/cache/redis_cluster_store.rb +4 -37
- data/redis-cluster-activesupport.gemspec +4 -3
- metadata +30 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0c5866199404c1afb551f773eee43d2f6590732581a0f804813d9ef8ddca0ae5
|
4
|
+
data.tar.gz: 78e6603647d4e490b783354357ced8ce5dfcd42d4be7e3671e5bd2eecac09017
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbf4f992e5a52c00c512ace7ef29e7a39adbb87cb8df032c9497f1d50339ec399547a98b64e90ebfc9acfd0c8d7de8e2a0bb9ac31235b255eebe521dd3e5541c
|
7
|
+
data.tar.gz: ed4af5ebf896fac0452462c47f3aa37db61acdd5583ae82f4a6e58139fbf72e69c7d463a310ede8d95dbfc1d0af752bbb322181d753ce79e60bbe1de1f3f9660
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub. They are
|
2
|
+
# provided by a third-party and are governed by separate terms of service,
|
3
|
+
# privacy policy, and support documentation.
|
4
|
+
#
|
5
|
+
# This workflow will install a prebuilt Ruby version, install dependencies, and
|
6
|
+
# run tests and linters.
|
7
|
+
name: "redis-cluster-activesupport"
|
8
|
+
on:
|
9
|
+
push:
|
10
|
+
branches: [ master ]
|
11
|
+
pull_request:
|
12
|
+
branches: [ master ]
|
13
|
+
jobs:
|
14
|
+
test:
|
15
|
+
runs-on: ubuntu-latest
|
16
|
+
strategy:
|
17
|
+
matrix:
|
18
|
+
ruby-version: [ '3.2', '3.1', '3.0', '2.7', '2.6', 'jruby-9.3', 'jruby-9.4' ]
|
19
|
+
gemfile: [ 'rails60', 'rails61' ]
|
20
|
+
env:
|
21
|
+
RAILS_ENV: test
|
22
|
+
steps:
|
23
|
+
- name: Checkout code
|
24
|
+
uses: actions/checkout@v3
|
25
|
+
# Add or replace dependency steps here
|
26
|
+
- name: Install Ruby and gems
|
27
|
+
uses: ruby/setup-ruby@v1
|
28
|
+
with:
|
29
|
+
bundler-cache: true
|
30
|
+
ruby-version: ${{ matrix.ruby-version }}
|
31
|
+
env:
|
32
|
+
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
33
|
+
# Add or replace test runners here
|
34
|
+
- name: Run tests
|
35
|
+
run: bundle exec rspec
|
36
|
+
env:
|
37
|
+
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
# Redis cluster stores for ActiveSupport [](https://travis-ci.org/film42/redis-cluster-activesupport)
|
2
2
|
|
3
|
-
This gem
|
3
|
+
This gem was an extension to [redis-activesupport](https://github.com/redis-store/redis-activesupport) that adds support
|
4
4
|
for a few features required to use `redis-store` with redis cluster. Right now there isn't an official redis cluster
|
5
|
-
client in ruby, so it's become common to use a redis cluster proxy like [corvus](https://github.com/eleme/corvus). When
|
5
|
+
client in ruby, so it's become common to use a redis cluster proxy like [corvus](https://github.com/eleme/corvus) or Envoy. When
|
6
6
|
switching there are a few things you can't do with redis cluster that you can do with a single redis server. Most of
|
7
7
|
them revolve around issuing commands with multiple keys. In redis cluster, your keys are partitioned and live on
|
8
|
-
different physical servers, operations like `KEYS` are not possible.
|
9
|
-
|
8
|
+
different physical servers, operations like `KEYS` are not possible.
|
9
|
+
|
10
|
+
This is now leveraging Rails 6's built-in redis cache store with troubled commands removed.
|
10
11
|
|
11
12
|
## Usage
|
12
13
|
|
@@ -21,30 +22,6 @@ module MyProject
|
|
21
22
|
end
|
22
23
|
```
|
23
24
|
|
24
|
-
Additionally, there's a new configuration option: `:ignored_command_errors`. This is useful if you're using a redis
|
25
|
-
cluster proxy like corvus who will raise a `Redis::CommandError` with a message indicating the cluster is offline or
|
26
|
-
experiencing a partial outage. This extension allows you to whitelist certain `ignored_command_errors` that would
|
27
|
-
normally be raised by `redis-activesupport`. By default this gem whitelists the following errors:
|
28
|
-
|
29
|
-
```ruby
|
30
|
-
DEFAULT_IGNORED_COMMAND_ERRORS = ["ERR Proxy error"]
|
31
|
-
```
|
32
|
-
|
33
|
-
If you need additional errors added to the whitelist, you can do this through your own configuration or open a pull
|
34
|
-
request to add it to the default whitelist. NOTE: this list is turned into a `Set` to keep lookups fast, so feel free to
|
35
|
-
make this list as big as you need. Example:
|
36
|
-
|
37
|
-
```ruby
|
38
|
-
module MyProject
|
39
|
-
class Application < Rails::Application
|
40
|
-
config.cache_store = :redis_cluster_store, {:ignored_command_errors => ["Uh oh", "Please, stop", "Fire emoji"]}
|
41
|
-
end
|
42
|
-
end
|
43
|
-
```
|
44
|
-
|
45
|
-
With this change, your cache store will now silently fail once again so a redis cluster won't knock your rails apps
|
46
|
-
offline.
|
47
|
-
|
48
25
|
|
49
26
|
## Installation
|
50
27
|
|
@@ -0,0 +1,71 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
redis-cluster-activesupport (0.3.0)
|
5
|
+
activesupport (~> 6.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activesupport (6.0.6.1)
|
11
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
|
+
i18n (>= 0.7, < 2)
|
13
|
+
minitest (~> 5.1)
|
14
|
+
tzinfo (~> 1.1)
|
15
|
+
zeitwerk (~> 2.2, >= 2.2.2)
|
16
|
+
coderay (1.1.3)
|
17
|
+
concurrent-ruby (1.2.0)
|
18
|
+
diff-lcs (1.5.0)
|
19
|
+
fakeredis (0.8.0)
|
20
|
+
redis (~> 4.1)
|
21
|
+
ffi (1.15.5-java)
|
22
|
+
i18n (1.12.0)
|
23
|
+
concurrent-ruby (~> 1.0)
|
24
|
+
method_source (1.0.0)
|
25
|
+
minitest (5.17.0)
|
26
|
+
pry (0.14.2)
|
27
|
+
coderay (~> 1.1)
|
28
|
+
method_source (~> 1.0)
|
29
|
+
pry (0.14.2-java)
|
30
|
+
coderay (~> 1.1)
|
31
|
+
method_source (~> 1.0)
|
32
|
+
spoon (~> 0.0)
|
33
|
+
rake (10.5.0)
|
34
|
+
redis (4.8.0)
|
35
|
+
rspec (3.12.0)
|
36
|
+
rspec-core (~> 3.12.0)
|
37
|
+
rspec-expectations (~> 3.12.0)
|
38
|
+
rspec-mocks (~> 3.12.0)
|
39
|
+
rspec-core (3.12.1)
|
40
|
+
rspec-support (~> 3.12.0)
|
41
|
+
rspec-expectations (3.12.2)
|
42
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
43
|
+
rspec-support (~> 3.12.0)
|
44
|
+
rspec-mocks (3.12.3)
|
45
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
46
|
+
rspec-support (~> 3.12.0)
|
47
|
+
rspec-support (3.12.0)
|
48
|
+
spoon (0.0.6)
|
49
|
+
ffi
|
50
|
+
thread_safe (0.3.6)
|
51
|
+
thread_safe (0.3.6-java)
|
52
|
+
tzinfo (1.2.11)
|
53
|
+
thread_safe (~> 0.1)
|
54
|
+
zeitwerk (2.6.6)
|
55
|
+
|
56
|
+
PLATFORMS
|
57
|
+
universal-java-1.8
|
58
|
+
universal-java-11
|
59
|
+
x86_64-linux
|
60
|
+
|
61
|
+
DEPENDENCIES
|
62
|
+
activesupport (~> 6.0.0)
|
63
|
+
bundler
|
64
|
+
fakeredis
|
65
|
+
pry
|
66
|
+
rake (~> 10.0)
|
67
|
+
redis-cluster-activesupport!
|
68
|
+
rspec (~> 3.0)
|
69
|
+
|
70
|
+
BUNDLED WITH
|
71
|
+
2.4.6
|
@@ -0,0 +1,69 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
redis-cluster-activesupport (0.3.0)
|
5
|
+
activesupport (~> 6.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activesupport (6.1.7.2)
|
11
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
|
+
i18n (>= 1.6, < 2)
|
13
|
+
minitest (>= 5.1)
|
14
|
+
tzinfo (~> 2.0)
|
15
|
+
zeitwerk (~> 2.3)
|
16
|
+
coderay (1.1.3)
|
17
|
+
concurrent-ruby (1.2.0)
|
18
|
+
diff-lcs (1.5.0)
|
19
|
+
fakeredis (0.8.0)
|
20
|
+
redis (~> 4.1)
|
21
|
+
ffi (1.15.5-java)
|
22
|
+
i18n (1.12.0)
|
23
|
+
concurrent-ruby (~> 1.0)
|
24
|
+
method_source (1.0.0)
|
25
|
+
minitest (5.17.0)
|
26
|
+
pry (0.14.2)
|
27
|
+
coderay (~> 1.1)
|
28
|
+
method_source (~> 1.0)
|
29
|
+
pry (0.14.2-java)
|
30
|
+
coderay (~> 1.1)
|
31
|
+
method_source (~> 1.0)
|
32
|
+
spoon (~> 0.0)
|
33
|
+
rake (10.5.0)
|
34
|
+
redis (4.8.0)
|
35
|
+
rspec (3.12.0)
|
36
|
+
rspec-core (~> 3.12.0)
|
37
|
+
rspec-expectations (~> 3.12.0)
|
38
|
+
rspec-mocks (~> 3.12.0)
|
39
|
+
rspec-core (3.12.1)
|
40
|
+
rspec-support (~> 3.12.0)
|
41
|
+
rspec-expectations (3.12.2)
|
42
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
43
|
+
rspec-support (~> 3.12.0)
|
44
|
+
rspec-mocks (3.12.3)
|
45
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
46
|
+
rspec-support (~> 3.12.0)
|
47
|
+
rspec-support (3.12.0)
|
48
|
+
spoon (0.0.6)
|
49
|
+
ffi
|
50
|
+
tzinfo (2.0.6)
|
51
|
+
concurrent-ruby (~> 1.0)
|
52
|
+
zeitwerk (2.6.6)
|
53
|
+
|
54
|
+
PLATFORMS
|
55
|
+
universal-java-1.8
|
56
|
+
universal-java-11
|
57
|
+
x86_64-linux
|
58
|
+
|
59
|
+
DEPENDENCIES
|
60
|
+
activesupport (~> 6.1.0)
|
61
|
+
bundler
|
62
|
+
fakeredis
|
63
|
+
pry
|
64
|
+
rake (~> 10.0)
|
65
|
+
redis-cluster-activesupport!
|
66
|
+
rspec (~> 3.0)
|
67
|
+
|
68
|
+
BUNDLED WITH
|
69
|
+
2.4.6
|
@@ -1,26 +1,8 @@
|
|
1
|
-
require "
|
2
|
-
require "set"
|
1
|
+
require "active_support"
|
3
2
|
|
4
3
|
module ActiveSupport
|
5
4
|
module Cache
|
6
|
-
class RedisClusterStore <
|
7
|
-
attr_reader :ignored_command_errors
|
8
|
-
|
9
|
-
DEFAULT_IGNORED_COMMAND_ERRORS = ["ERR Proxy error"].freeze
|
10
|
-
|
11
|
-
def initialize(*)
|
12
|
-
super
|
13
|
-
@ignored_command_errors = ::Set.new(@options.fetch(:ignored_command_errors, DEFAULT_IGNORED_COMMAND_ERRORS))
|
14
|
-
end
|
15
|
-
|
16
|
-
def delete_entry(key, options)
|
17
|
-
super
|
18
|
-
rescue Redis::CommandError => error
|
19
|
-
raise unless ignored_command_errors.include?(error.message)
|
20
|
-
raise if raise_errors?
|
21
|
-
false
|
22
|
-
end
|
23
|
-
|
5
|
+
class RedisClusterStore < RedisCacheStore
|
24
6
|
def delete_matched(matcher, options = nil)
|
25
7
|
fail ::NotImplementedError, "Deleting keys with a matcher is not supported with redis cluster"
|
26
8
|
end
|
@@ -36,10 +18,11 @@ module ActiveSupport
|
|
36
18
|
instrument(:increment, key, :amount => amount) do
|
37
19
|
with do |c|
|
38
20
|
if ttl
|
39
|
-
c.pipelined do
|
21
|
+
new_value, _ = c.pipelined do
|
40
22
|
c.incrby normalized_key, amount
|
41
23
|
c.expire normalized_key, ttl
|
42
24
|
end
|
25
|
+
new_value
|
43
26
|
else
|
44
27
|
c.incrby normalized_key, amount
|
45
28
|
end
|
@@ -47,22 +30,6 @@ module ActiveSupport
|
|
47
30
|
end
|
48
31
|
end
|
49
32
|
|
50
|
-
def read_entry(key, options)
|
51
|
-
super
|
52
|
-
rescue Redis::CommandError => error
|
53
|
-
raise unless ignored_command_errors.include?(error.message)
|
54
|
-
raise if raise_errors?
|
55
|
-
nil
|
56
|
-
end
|
57
|
-
|
58
|
-
def write_entry(key, entry, options)
|
59
|
-
super
|
60
|
-
rescue Redis::CommandError => error
|
61
|
-
raise unless ignored_command_errors.include?(error.message)
|
62
|
-
raise if raise_errors?
|
63
|
-
false
|
64
|
-
end
|
65
|
-
|
66
33
|
private
|
67
34
|
|
68
35
|
def _expires_in(options)
|
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
5
5
|
spec.name = "redis-cluster-activesupport"
|
6
|
-
spec.version = "0.
|
6
|
+
spec.version = "1.0.0"
|
7
7
|
spec.authors = ["Garrett Thornburg"]
|
8
8
|
spec.email = ["film42@gmail.com"]
|
9
9
|
|
@@ -19,9 +19,10 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_dependency "
|
22
|
+
spec.add_dependency "activesupport", "~> 6.0"
|
23
|
+
spec.add_development_dependency "bundler"
|
24
|
+
spec.add_development_dependency "fakeredis"
|
23
25
|
spec.add_development_dependency "pry"
|
24
|
-
spec.add_development_dependency "bundler", "~> 1.15"
|
25
26
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
27
|
spec.add_development_dependency "rspec", "~> 3.0"
|
27
28
|
end
|
metadata
CHANGED
@@ -1,23 +1,37 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-cluster-activesupport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Garrett Thornburg
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '6.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|
18
32
|
- !ruby/object:Gem::Version
|
19
33
|
version: '0'
|
20
|
-
type: :
|
34
|
+
type: :development
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
@@ -25,7 +39,7 @@ dependencies:
|
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
42
|
+
name: fakeredis
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - ">="
|
@@ -39,19 +53,19 @@ dependencies:
|
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
56
|
+
name: pry
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- - "
|
59
|
+
- - ">="
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
61
|
+
version: '0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- - "
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rake
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,6 +101,7 @@ executables: []
|
|
87
101
|
extensions: []
|
88
102
|
extra_rdoc_files: []
|
89
103
|
files:
|
104
|
+
- ".github/workflows/ci.yml"
|
90
105
|
- ".gitignore"
|
91
106
|
- ".rspec"
|
92
107
|
- ".travis.yml"
|
@@ -96,6 +111,10 @@ files:
|
|
96
111
|
- Rakefile
|
97
112
|
- bin/console
|
98
113
|
- bin/setup
|
114
|
+
- gemfiles/rails60.gemfile
|
115
|
+
- gemfiles/rails60.gemfile.lock
|
116
|
+
- gemfiles/rails61.gemfile
|
117
|
+
- gemfiles/rails61.gemfile.lock
|
99
118
|
- lib/active_support/cache/redis_cluster_store.rb
|
100
119
|
- lib/redis/cluster/activesupport.rb
|
101
120
|
- redis-cluster-activesupport.gemspec
|
@@ -118,8 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
118
137
|
- !ruby/object:Gem::Version
|
119
138
|
version: '0'
|
120
139
|
requirements: []
|
121
|
-
|
122
|
-
rubygems_version: 2.6.13
|
140
|
+
rubygems_version: 3.1.6
|
123
141
|
signing_key:
|
124
142
|
specification_version: 4
|
125
143
|
summary: Extension to redis-activesupport for working with redis cluster
|