Skip to content

Commit ccdf15f

Browse files
authored
Merge pull request #1226 from supercaracal/support-transaction-for-cluster-client
Support transactions for cluster client
2 parents c888c74 + dda95f8 commit ccdf15f

File tree

5 files changed

+53
-6
lines changed

5 files changed

+53
-6
lines changed

cluster/lib/redis/cluster.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ def initialize(errors, error_message = 'Command errors were replied on any node'
3838
class AmbiguousNodeError < BaseError
3939
end
4040

41+
class TransactionConsistencyError < BaseError
42+
end
43+
4144
def connection
4245
raise NotImplementedError, "Redis::Cluster doesn't implement #connection"
4346
end

cluster/lib/redis/cluster/client.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ class Client < RedisClient::Cluster
99
RedisClient::Cluster::InitialSetupError => Redis::Cluster::InitialSetupError,
1010
RedisClient::Cluster::OrchestrationCommandNotSupported => Redis::Cluster::OrchestrationCommandNotSupported,
1111
RedisClient::Cluster::AmbiguousNodeError => Redis::Cluster::AmbiguousNodeError,
12-
RedisClient::Cluster::ErrorCollection => Redis::Cluster::CommandErrorCollection
12+
RedisClient::Cluster::ErrorCollection => Redis::Cluster::CommandErrorCollection,
13+
RedisClient::Cluster::Transaction::ConsistencyError => Redis::Cluster::TransactionConsistencyError
1314
).freeze
1415

1516
class << self

cluster/redis-clustering.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,5 @@ Gem::Specification.new do |s|
4747
s.required_ruby_version = '>= 2.7.0'
4848

4949
s.add_runtime_dependency('redis', s.version)
50-
s.add_runtime_dependency('redis-cluster-client', '>= 0.6.1')
50+
s.add_runtime_dependency('redis-cluster-client', '>= 0.7.0')
5151
end

cluster/test/client_transactions_test.rb

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,46 @@
66
class TestClusterClientTransactions < Minitest::Test
77
include Helper::Cluster
88

9-
def test_cluster_client_does_not_support_transaction
10-
assert_raises(Redis::Cluster::AmbiguousNodeError) do
11-
redis.multi { |r| r.set('key', 'foo') }
9+
def test_cluster_client_does_support_transaction_by_single_key
10+
actual = redis.multi do |r|
11+
r.set('counter', '0')
12+
r.incr('counter')
13+
r.incr('counter')
14+
end
15+
16+
assert_equal(['OK', 1, 2], actual)
17+
assert_equal('2', redis.get('counter'))
18+
end
19+
20+
def test_cluster_client_does_support_transaction_by_hashtag
21+
actual = redis.multi do |r|
22+
r.mset('{key}1', 1, '{key}2', 2)
23+
r.mset('{key}3', 3, '{key}4', 4)
24+
end
25+
26+
assert_equal(%w[OK OK], actual)
27+
assert_equal(%w[1 2 3 4], redis.mget('{key}1', '{key}2', '{key}3', '{key}4'))
28+
end
29+
30+
def test_cluster_client_does_not_support_transaction_by_multiple_keys
31+
assert_raises(Redis::Cluster::TransactionConsistencyError) do
32+
redis.multi do |r|
33+
r.set('key1', 1)
34+
r.set('key2', 2)
35+
r.set('key3', 3)
36+
r.set('key4', 4)
37+
end
38+
end
39+
40+
assert_raises(Redis::Cluster::TransactionConsistencyError) do
41+
redis.multi do |r|
42+
r.mset('key1', 1, 'key2', 2)
43+
r.mset('key3', 3, 'key4', 4)
44+
end
45+
end
46+
47+
(1..4).each do |i|
48+
assert_nil(redis.get("key#{i}"))
1249
end
1350
end
1451
end

cluster/test/commands_on_transactions_test.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,15 @@ def test_exec
2020
end
2121

2222
def test_multi
23-
assert_raises(Redis::Cluster::AmbiguousNodeError) do
23+
assert_raises(LocalJumpError) do
2424
redis.multi
2525
end
26+
27+
assert_raises(ArgumentError) do
28+
redis.multi {}
29+
end
30+
31+
assert_equal([1], redis.multi { |r| r.incr('counter') })
2632
end
2733

2834
def test_unwatch

0 commit comments

Comments
 (0)