semian 0.11.9 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a55808808dfd488dd16eaf8f20326f05c7abc82ea4ffe36b6f6f0e9f76075351
4
- data.tar.gz: 5650b7114198219130829324dee4ce139bc99eb886b1c0a54de3c5ee11a1a933
3
+ metadata.gz: da759d0f61fb02cfc01d7d26182f2d0b1a1be105f310bae112f07f1141c278b1
4
+ data.tar.gz: 782e6184ff4a169ccd16dea60c0d3bf22b885558c53eb455756516aa5c48addd
5
5
  SHA512:
6
- metadata.gz: 90c79812e0f790237543afb9ba080c7aed46dd2118df5d1610663e2d53908b6f5ef28aba6686cddddfdc0697a081712bc78c2b673ddc7c8e71f03ef9787908a0
7
- data.tar.gz: 5a29bdafa94979ce8ee2f292536ec4a31366af2e9194f02085746682d76f22762c30fad5113073b9a6b2c898649a6b00feb570641937d5361fd6b36b7fa28878
6
+ metadata.gz: d19b1bbbd06678f4287ff31aef7297a8036a0f7ab7743e62eb1c697378adddbe8ed182eb7f7c6855b98874a8b8a53a706b54fe6e75e1b06db3c3963d604a3e37
7
+ data.tar.gz: 3d661891b20e8ccd1aad67b26a192229133e91d7d1ccd340eb38515010c4dbdc7987d89c9cd293b2c3ec06068417a3d45ee5d5003e3e02a0c58a0ea6a98122f8
@@ -57,7 +57,7 @@ module Semian
57
57
  end
58
58
 
59
59
  def resource_exceptions
60
- []
60
+ raise NotImplementedError.new("Semian adapters must implement a `resource_exceptions` method")
61
61
  end
62
62
 
63
63
  def resource_already_acquired?
data/lib/semian/mysql2.rb CHANGED
@@ -101,6 +101,11 @@ module Semian
101
101
 
102
102
  private
103
103
 
104
+ EXCEPTIONS = [].freeze
105
+ def resource_exceptions
106
+ EXCEPTIONS
107
+ end
108
+
104
109
  def query_whitelisted?(sql, *)
105
110
  QUERY_WHITELIST =~ sql
106
111
  rescue ArgumentError
data/lib/semian/redis.rb CHANGED
@@ -138,7 +138,7 @@ module Semian
138
138
 
139
139
  def raise_if_out_of_memory(reply)
140
140
  return unless reply.is_a?(::Redis::CommandError)
141
- return unless reply.message =~ /OOM command not allowed when used memory > 'maxmemory'\.\s*\z/
141
+ return unless reply.message.start_with?("OOM ")
142
142
  raise ::Redis::OutOfMemoryError.new(reply.message)
143
143
  end
144
144
 
@@ -0,0 +1,111 @@
1
+ require 'semian/adapter'
2
+ require 'redis-client'
3
+
4
+ class RedisClient
5
+ ConnectionError.include(::Semian::AdapterError)
6
+
7
+ class SemianError < ConnectionError
8
+ def initialize(semian_identifier, *args)
9
+ super(*args)
10
+ @semian_identifier = semian_identifier
11
+ end
12
+ end
13
+
14
+ ResourceBusyError = Class.new(SemianError)
15
+ CircuitOpenError = Class.new(SemianError)
16
+
17
+ module SemianConfig
18
+ attr_reader :raw_semian_options
19
+
20
+ def initialize(semian: nil, **kwargs)
21
+ super(**kwargs)
22
+
23
+ @raw_semian_options = semian
24
+ end
25
+
26
+ def semian_identifier
27
+ @semian_identifier ||= begin
28
+ name = (semian_options && semian_options[:name]) || "#{host}:#{port}/#{db}"
29
+ :"redis_#{name}"
30
+ end
31
+ end
32
+
33
+ define_method(:semian_options, Semian::Adapter.instance_method(:semian_options))
34
+ end
35
+
36
+ Config.include(SemianConfig)
37
+ SentinelConfig.include(SemianConfig)
38
+ end
39
+
40
+ module Semian
41
+ module RedisClientCommon
42
+ def with_resource_timeout(temp_timeout)
43
+ connect_timeout = self.connect_timeout
44
+ read_timeout = self.read_timeout
45
+ write_timeout = self.write_timeout
46
+
47
+ begin
48
+ self.timeout = temp_timeout
49
+ yield
50
+ ensure
51
+ self.connect_timeout = connect_timeout
52
+ self.read_timeout = read_timeout
53
+ self.write_timeout = write_timeout
54
+ end
55
+ end
56
+
57
+ def semian_identifier
58
+ config.semian_identifier
59
+ end
60
+
61
+ private
62
+
63
+ def semian_options
64
+ config.semian_options
65
+ end
66
+
67
+ def raw_semian_options
68
+ config.raw_semian_options
69
+ end
70
+ end
71
+
72
+ module RedisClient
73
+ EXCEPTIONS = [::RedisClient::ConnectionError]
74
+
75
+ include Semian::Adapter
76
+ include RedisClientCommon
77
+
78
+ private
79
+
80
+ def resource_exceptions
81
+ EXCEPTIONS
82
+ end
83
+
84
+ def ensure_connected(retryable: true)
85
+ if block_given?
86
+ super do |connection|
87
+ acquire_semian_resource(adapter: :redis_client, scope: :query) do
88
+ yield connection
89
+ end
90
+ end
91
+ else
92
+ super
93
+ end
94
+ end
95
+
96
+ def connect
97
+ acquire_semian_resource(adapter: :redis_client, scope: :connection) do
98
+ super
99
+ end
100
+ end
101
+ end
102
+
103
+ module RedisClientPool
104
+ include RedisClientCommon
105
+ define_method(:semian_resource, Semian::Adapter.instance_method(:semian_resource))
106
+ define_method(:clear_semian_resource, Semian::Adapter.instance_method(:clear_semian_resource))
107
+ end
108
+ end
109
+
110
+ RedisClient.prepend(Semian::RedisClient)
111
+ RedisClient::Pooled.prepend(Semian::RedisClient)
@@ -1,3 +1,3 @@
1
1
  module Semian
2
- VERSION = '0.11.9'
2
+ VERSION = '0.12.0'
3
3
  end
data/lib/semian.rb CHANGED
@@ -190,6 +190,11 @@ module Semian
190
190
  end
191
191
  end
192
192
 
193
+ def destroy_all_resources
194
+ resources.values.each(&:destroy)
195
+ resources.clear
196
+ end
197
+
193
198
  # Unregister will not destroy the semian resource, but it will
194
199
  # remove it from the hash of registered resources, and decrease
195
200
  # the number of registered workers.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semian
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.9
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Francis
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2022-03-01 00:00:00.000000000 Z
13
+ date: 2022-04-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake-compiler
@@ -110,6 +110,20 @@ dependencies:
110
110
  - - ">="
111
111
  - !ruby/object:Gem::Version
112
112
  version: '0'
113
+ - !ruby/object:Gem::Dependency
114
+ name: redis-client
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: 0.2.0
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 0.2.0
113
127
  - !ruby/object:Gem::Dependency
114
128
  name: webrick
115
129
  requirement: !ruby/object:Gem::Requirement
@@ -225,6 +239,7 @@ files:
225
239
  - lib/semian/protected_resource.rb
226
240
  - lib/semian/rails.rb
227
241
  - lib/semian/redis.rb
242
+ - lib/semian/redis_client.rb
228
243
  - lib/semian/resource.rb
229
244
  - lib/semian/simple_integer.rb
230
245
  - lib/semian/simple_sliding_window.rb