redis 4.1.0.beta1 → 4.1.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.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -2
  3. data/README.md +45 -0
  4. data/lib/redis.rb +497 -20
  5. data/lib/redis/client.rb +14 -6
  6. data/lib/redis/cluster.rb +1 -0
  7. data/lib/redis/cluster/command_loader.rb +2 -0
  8. data/lib/redis/cluster/node_loader.rb +2 -0
  9. data/lib/redis/cluster/option.rb +1 -0
  10. data/lib/redis/cluster/slot_loader.rb +2 -0
  11. data/lib/redis/distributed.rb +3 -4
  12. data/lib/redis/version.rb +1 -1
  13. metadata +20 -243
  14. data/.gitignore +0 -19
  15. data/.travis.yml +0 -61
  16. data/.travis/Gemfile +0 -18
  17. data/.yardopts +0 -3
  18. data/Gemfile +0 -8
  19. data/benchmarking/logging.rb +0 -71
  20. data/benchmarking/pipeline.rb +0 -51
  21. data/benchmarking/speed.rb +0 -21
  22. data/benchmarking/suite.rb +0 -24
  23. data/benchmarking/worker.rb +0 -71
  24. data/bin/build +0 -71
  25. data/bors.toml +0 -14
  26. data/examples/basic.rb +0 -15
  27. data/examples/consistency.rb +0 -114
  28. data/examples/dist_redis.rb +0 -43
  29. data/examples/incr-decr.rb +0 -17
  30. data/examples/list.rb +0 -26
  31. data/examples/pubsub.rb +0 -37
  32. data/examples/sentinel.rb +0 -41
  33. data/examples/sentinel/start +0 -49
  34. data/examples/sets.rb +0 -36
  35. data/examples/unicorn/config.ru +0 -3
  36. data/examples/unicorn/unicorn.rb +0 -20
  37. data/makefile +0 -74
  38. data/redis.gemspec +0 -42
  39. data/test/bitpos_test.rb +0 -63
  40. data/test/blocking_commands_test.rb +0 -40
  41. data/test/client_test.rb +0 -76
  42. data/test/cluster_abnormal_state_test.rb +0 -38
  43. data/test/cluster_blocking_commands_test.rb +0 -15
  44. data/test/cluster_client_internals_test.rb +0 -77
  45. data/test/cluster_client_key_hash_tags_test.rb +0 -88
  46. data/test/cluster_client_options_test.rb +0 -147
  47. data/test/cluster_client_pipelining_test.rb +0 -59
  48. data/test/cluster_client_replicas_test.rb +0 -36
  49. data/test/cluster_client_slots_test.rb +0 -94
  50. data/test/cluster_client_transactions_test.rb +0 -71
  51. data/test/cluster_commands_on_cluster_test.rb +0 -165
  52. data/test/cluster_commands_on_connection_test.rb +0 -40
  53. data/test/cluster_commands_on_geo_test.rb +0 -74
  54. data/test/cluster_commands_on_hashes_test.rb +0 -11
  55. data/test/cluster_commands_on_hyper_log_log_test.rb +0 -17
  56. data/test/cluster_commands_on_keys_test.rb +0 -134
  57. data/test/cluster_commands_on_lists_test.rb +0 -15
  58. data/test/cluster_commands_on_pub_sub_test.rb +0 -101
  59. data/test/cluster_commands_on_scripting_test.rb +0 -56
  60. data/test/cluster_commands_on_server_test.rb +0 -221
  61. data/test/cluster_commands_on_sets_test.rb +0 -39
  62. data/test/cluster_commands_on_sorted_sets_test.rb +0 -35
  63. data/test/cluster_commands_on_streams_test.rb +0 -196
  64. data/test/cluster_commands_on_strings_test.rb +0 -15
  65. data/test/cluster_commands_on_transactions_test.rb +0 -41
  66. data/test/cluster_commands_on_value_types_test.rb +0 -14
  67. data/test/command_map_test.rb +0 -28
  68. data/test/commands_on_geo_test.rb +0 -116
  69. data/test/commands_on_hashes_test.rb +0 -7
  70. data/test/commands_on_hyper_log_log_test.rb +0 -7
  71. data/test/commands_on_lists_test.rb +0 -7
  72. data/test/commands_on_sets_test.rb +0 -7
  73. data/test/commands_on_sorted_sets_test.rb +0 -7
  74. data/test/commands_on_strings_test.rb +0 -7
  75. data/test/commands_on_value_types_test.rb +0 -207
  76. data/test/connection_handling_test.rb +0 -275
  77. data/test/connection_test.rb +0 -57
  78. data/test/distributed_blocking_commands_test.rb +0 -52
  79. data/test/distributed_commands_on_hashes_test.rb +0 -21
  80. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -26
  81. data/test/distributed_commands_on_lists_test.rb +0 -19
  82. data/test/distributed_commands_on_sets_test.rb +0 -105
  83. data/test/distributed_commands_on_sorted_sets_test.rb +0 -59
  84. data/test/distributed_commands_on_strings_test.rb +0 -79
  85. data/test/distributed_commands_on_value_types_test.rb +0 -129
  86. data/test/distributed_commands_requiring_clustering_test.rb +0 -162
  87. data/test/distributed_connection_handling_test.rb +0 -21
  88. data/test/distributed_internals_test.rb +0 -68
  89. data/test/distributed_key_tags_test.rb +0 -50
  90. data/test/distributed_persistence_control_commands_test.rb +0 -24
  91. data/test/distributed_publish_subscribe_test.rb +0 -90
  92. data/test/distributed_remote_server_control_commands_test.rb +0 -64
  93. data/test/distributed_scripting_test.rb +0 -100
  94. data/test/distributed_sorting_test.rb +0 -18
  95. data/test/distributed_test.rb +0 -56
  96. data/test/distributed_transactions_test.rb +0 -30
  97. data/test/encoding_test.rb +0 -14
  98. data/test/error_replies_test.rb +0 -57
  99. data/test/fork_safety_test.rb +0 -60
  100. data/test/helper.rb +0 -344
  101. data/test/helper_test.rb +0 -22
  102. data/test/internals_test.rb +0 -395
  103. data/test/lint/blocking_commands.rb +0 -174
  104. data/test/lint/hashes.rb +0 -203
  105. data/test/lint/hyper_log_log.rb +0 -74
  106. data/test/lint/lists.rb +0 -159
  107. data/test/lint/sets.rb +0 -282
  108. data/test/lint/sorted_sets.rb +0 -497
  109. data/test/lint/strings.rb +0 -348
  110. data/test/lint/value_types.rb +0 -130
  111. data/test/persistence_control_commands_test.rb +0 -24
  112. data/test/pipelining_commands_test.rb +0 -246
  113. data/test/publish_subscribe_test.rb +0 -280
  114. data/test/remote_server_control_commands_test.rb +0 -175
  115. data/test/scanning_test.rb +0 -407
  116. data/test/scripting_test.rb +0 -76
  117. data/test/sentinel_command_test.rb +0 -78
  118. data/test/sentinel_test.rb +0 -253
  119. data/test/sorting_test.rb +0 -57
  120. data/test/ssl_test.rb +0 -69
  121. data/test/support/cluster/orchestrator.rb +0 -199
  122. data/test/support/connection/hiredis.rb +0 -1
  123. data/test/support/connection/ruby.rb +0 -1
  124. data/test/support/connection/synchrony.rb +0 -17
  125. data/test/support/redis_mock.rb +0 -130
  126. data/test/support/ssl/gen_certs.sh +0 -31
  127. data/test/support/ssl/trusted-ca.crt +0 -25
  128. data/test/support/ssl/trusted-ca.key +0 -27
  129. data/test/support/ssl/trusted-cert.crt +0 -81
  130. data/test/support/ssl/trusted-cert.key +0 -28
  131. data/test/support/ssl/untrusted-ca.crt +0 -26
  132. data/test/support/ssl/untrusted-ca.key +0 -27
  133. data/test/support/ssl/untrusted-cert.crt +0 -82
  134. data/test/support/ssl/untrusted-cert.key +0 -28
  135. data/test/support/wire/synchrony.rb +0 -24
  136. data/test/support/wire/thread.rb +0 -5
  137. data/test/synchrony_driver.rb +0 -85
  138. data/test/test.conf.erb +0 -9
  139. data/test/thread_safety_test.rb +0 -60
  140. data/test/transactions_test.rb +0 -272
  141. data/test/unknown_commands_test.rb +0 -12
  142. data/test/url_param_test.rb +0 -136
@@ -1,61 +0,0 @@
1
- language: ruby
2
- cache:
3
- directories:
4
- - tmp/cache
5
- before_install:
6
- - gem update --system 2.6.14
7
- - gem --version
8
-
9
- script: make
10
-
11
- rvm:
12
- - 2.2.2
13
- - 2.3.3
14
- - 2.4.1
15
- - 2.5.0
16
- - jruby-9.1.17.0
17
-
18
- gemfile: ".travis/Gemfile"
19
-
20
- sudo: false
21
-
22
- before_script:
23
- - if (ruby -e "exit RUBY_VERSION.to_f >= 2.4"); then export RUBYOPT="--enable-frozen-string-literal"; fi; echo $RUBYOPT
24
-
25
- env:
26
- global:
27
- - VERBOSE=true
28
- - TIMEOUT=9
29
- matrix:
30
- - DRIVER=ruby REDIS_BRANCH=3.0
31
- - DRIVER=ruby REDIS_BRANCH=3.2
32
- - DRIVER=hiredis REDIS_BRANCH=3.0
33
- - DRIVER=hiredis REDIS_BRANCH=3.2
34
- - DRIVER=synchrony REDIS_BRANCH=3.0
35
- - DRIVER=synchrony REDIS_BRANCH=3.2
36
- - DRIVER=ruby REDIS_BRANCH=4.0
37
-
38
- branches:
39
- only:
40
- - staging
41
- - trying
42
- - master
43
-
44
- matrix:
45
- exclude:
46
- # hiredis
47
- - rvm: jruby-9.1.17.0
48
- env: DRIVER=hiredis REDIS_BRANCH=3.0
49
- - rvm: jruby-9.1.17.0
50
- env: DRIVER=hiredis REDIS_BRANCH=3.2
51
-
52
- # synchrony
53
- - rvm: jruby-9.1.17.0
54
- env: DRIVER=synchrony REDIS_BRANCH=3.0
55
- - rvm: jruby-9.1.17.0
56
- env: DRIVER=synchrony REDIS_BRANCH=3.2
57
-
58
- notifications:
59
- irc:
60
- - irc.freenode.net#redis-rb
61
- email: false
@@ -1,18 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec :path => "../"
4
-
5
- # Using jruby-openssl 0.10.0, we get NPEs in jruby tests: https://github.com/redis/redis-rb/issues/756
6
- platform :jruby do
7
- gem 'jruby-openssl', '<0.10.0'
8
- end
9
-
10
- case ENV["DRIVER"]
11
- when "hiredis"
12
- gem "hiredis"
13
- when "synchrony"
14
- gem "hiredis"
15
- gem "em-synchrony"
16
- end
17
-
18
- gem 'test-unit', '>= 3.2.5'
data/.yardopts DELETED
@@ -1,3 +0,0 @@
1
- --exclude redis/connection
2
- --exclude redis/compat
3
- --markup markdown
data/Gemfile DELETED
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec
4
-
5
- # Using jruby-openssl 0.10.0, we get NPEs in jruby tests: https://github.com/redis/redis-rb/issues/756
6
- platform :jruby do
7
- gem 'jruby-openssl', '<0.10.0'
8
- end
@@ -1,71 +0,0 @@
1
- # Run with
2
- #
3
- # $ ruby -Ilib benchmarking/logging.rb
4
- #
5
-
6
- begin
7
- require "bench"
8
- rescue LoadError
9
- $stderr.puts "`gem install bench` and try again."
10
- exit 1
11
- end
12
-
13
- require "redis"
14
- require "logger"
15
-
16
- def log(level, namespace = nil)
17
- logger = (namespace || Kernel).const_get(:Logger).new("/dev/null")
18
- logger.level = (namespace || Logger).const_get(level)
19
- logger
20
- end
21
-
22
- def stress(redis)
23
- redis.flushdb
24
-
25
- n = (ARGV.shift || 2000).to_i
26
-
27
- n.times do |i|
28
- key = "foo:#{i}"
29
- redis.set key, i
30
- redis.get key
31
- end
32
- end
33
-
34
- default = Redis.new
35
-
36
- logging_redises = [
37
- Redis.new(:logger => log(:DEBUG)),
38
- Redis.new(:logger => log(:INFO)),
39
- ]
40
-
41
- begin
42
- require "log4r"
43
-
44
- logging_redises += [
45
- Redis.new(:logger => log(:DEBUG, Log4r)),
46
- Redis.new(:logger => log(:INFO, Log4r)),
47
- ]
48
- rescue LoadError
49
- $stderr.puts "Log4r not installed. `gem install log4r` if you want to compare it against Ruby's Logger (spoiler: it's much faster)."
50
- end
51
-
52
- benchmark "Default options (no logger)" do
53
- stress(default)
54
- end
55
-
56
- logging_redises.each do |redis|
57
- logger = redis._client.logger
58
-
59
- case logger
60
- when Logger
61
- level = Logger::SEV_LABEL[logger.level]
62
- when Log4r::Logger
63
- level = logger.levels[logger.level]
64
- end
65
-
66
- benchmark "#{logger.class} on #{level}" do
67
- stress(redis)
68
- end
69
- end
70
-
71
- run 10
@@ -1,51 +0,0 @@
1
- require "benchmark"
2
-
3
- $:.push File.join(File.dirname(__FILE__), 'lib')
4
-
5
- require 'redis'
6
-
7
- ITERATIONS = 10000
8
-
9
- @r = Redis.new
10
-
11
- Benchmark.bmbm do |benchmark|
12
- benchmark.report("set") do
13
- @r.flushdb
14
-
15
- ITERATIONS.times do |i|
16
- @r.set("foo#{i}", "Hello world!")
17
- @r.get("foo#{i}")
18
- end
19
- end
20
-
21
- benchmark.report("set (pipelined)") do
22
- @r.flushdb
23
-
24
- @r.pipelined do
25
- ITERATIONS.times do |i|
26
- @r.set("foo#{i}", "Hello world!")
27
- @r.get("foo#{i}")
28
- end
29
- end
30
- end
31
-
32
- benchmark.report("lpush+ltrim") do
33
- @r.flushdb
34
-
35
- ITERATIONS.times do |i|
36
- @r.lpush "lpush#{i}", i
37
- @r.ltrim "ltrim#{i}", 0, 30
38
- end
39
- end
40
-
41
- benchmark.report("lpush+ltrim (pipelined)") do
42
- @r.flushdb
43
-
44
- @r.pipelined do
45
- ITERATIONS.times do |i|
46
- @r.lpush "lpush#{i}", i
47
- @r.ltrim "ltrim#{i}", 0, 30
48
- end
49
- end
50
- end
51
- end
@@ -1,21 +0,0 @@
1
- # Run with
2
- #
3
- # $ ruby -Ilib benchmarking/speed.rb
4
- #
5
-
6
- require "benchmark"
7
- require "redis"
8
-
9
- r = Redis.new
10
- n = (ARGV.shift || 20000).to_i
11
-
12
- elapsed = Benchmark.realtime do
13
- # n sets, n gets
14
- n.times do |i|
15
- key = "foo#{i}"
16
- r[key] = key * 10
17
- r[key]
18
- end
19
- end
20
-
21
- puts '%.2f Kops' % (2 * n / 1000 / elapsed)
@@ -1,24 +0,0 @@
1
- require 'fileutils'
2
-
3
- def run_in_background(command)
4
- fork { system command }
5
- end
6
-
7
- def with_all_segments(&block)
8
- 0.upto(9) do |segment_number|
9
- block_size = 100000
10
- start_index = segment_number * block_size
11
- end_index = start_index + block_size - 1
12
- block.call(start_index, end_index)
13
- end
14
- end
15
-
16
- #with_all_segments do |start_index, end_index|
17
- # puts "Initializing keys from #{start_index} to #{end_index}"
18
- # system "ruby worker.rb initialize #{start_index} #{end_index} 0"
19
- #end
20
-
21
- with_all_segments do |start_index, end_index|
22
- run_in_background "ruby worker.rb write #{start_index} #{end_index} 10"
23
- run_in_background "ruby worker.rb read #{start_index} #{end_index} 1"
24
- end
@@ -1,71 +0,0 @@
1
- BENCHMARK_ROOT = File.dirname(__FILE__)
2
- REDIS_ROOT = File.join(BENCHMARK_ROOT, "..", "lib")
3
-
4
- $: << REDIS_ROOT
5
- require 'redis'
6
- require 'benchmark'
7
-
8
- def show_usage
9
- puts <<-EOL
10
- Usage: worker.rb [read:write] <start_index> <end_index> <sleep_msec>
11
- EOL
12
- end
13
-
14
- def shift_from_argv
15
- value = ARGV.shift
16
- unless value
17
- show_usage
18
- exit -1
19
- end
20
- value
21
- end
22
-
23
- operation = shift_from_argv.to_sym
24
- start_index = shift_from_argv.to_i
25
- end_index = shift_from_argv.to_i
26
- sleep_msec = shift_from_argv.to_i
27
- sleep_duration = sleep_msec/1000.0
28
-
29
- redis = Redis.new
30
-
31
- case operation
32
- when :initialize
33
-
34
- start_index.upto(end_index) do |i|
35
- redis[i] = 0
36
- end
37
-
38
- when :clear
39
-
40
- start_index.upto(end_index) do |i|
41
- redis.delete(i)
42
- end
43
-
44
- when :read, :write
45
-
46
- puts "Starting to #{operation} at segment #{end_index + 1}"
47
-
48
- loop do
49
- t1 = Time.now
50
- start_index.upto(end_index) do |i|
51
- case operation
52
- when :read
53
- redis.get(i)
54
- when :write
55
- redis.incr(i)
56
- else
57
- raise "Unknown operation: #{operation}"
58
- end
59
- sleep sleep_duration
60
- end
61
- t2 = Time.now
62
-
63
- requests_processed = end_index - start_index
64
- time = t2 - t1
65
- puts "#{t2.strftime("%H:%M")} [segment #{end_index + 1}] : Processed #{requests_processed} requests in #{time} seconds - #{(requests_processed/time).round} requests/sec"
66
- end
67
-
68
- else
69
- raise "Unknown operation: #{operation}"
70
- end
71
-
data/bin/build DELETED
@@ -1,71 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- TARBALL = ARGV[0]
4
-
5
- require 'digest/sha1'
6
- require 'fileutils'
7
-
8
- class Builder
9
- def initialize(redis_branch, tmp_dir)
10
- @redis_branch = redis_branch
11
- @tmp_dir = tmp_dir
12
- @build_dir = File.join(@tmp_dir, "cache", "redis-#{redis_branch}")
13
- end
14
-
15
- def run
16
- download_tarball
17
- if old_checkum != checksum
18
- build
19
- update_checksum
20
- end
21
- 0
22
- end
23
-
24
- def download_tarball
25
- command!('wget', tarball_url, '-O', tarball_path)
26
- end
27
-
28
- def tarball_path
29
- File.join(@tmp_dir, "redis-#{@redis_branch}.tar.gz")
30
- end
31
-
32
- def tarball_url
33
- "https://github.com/antirez/redis/archive/#{@redis_branch}.tar.gz"
34
- end
35
-
36
- def build
37
- FileUtils.rm_rf(@build_dir)
38
- FileUtils.mkdir_p(@build_dir)
39
- command!('tar', 'xf', tarball_path, '-C', File.expand_path('../', @build_dir))
40
- Dir.chdir(@build_dir) do
41
- command!('make')
42
- end
43
- end
44
-
45
- def update_checksum
46
- File.write(checksum_path, checksum)
47
- end
48
-
49
- def old_checkum
50
- File.read(checksum_path)
51
- rescue Errno::ENOENT
52
- nil
53
- end
54
-
55
- def checksum_path
56
- File.join(@build_dir, 'build.checksum')
57
- end
58
-
59
- def checksum
60
- @checksum ||= Digest::SHA1.file(tarball_path).hexdigest
61
- end
62
-
63
- def command!(*args)
64
- puts "$ #{args.join(' ')}"
65
- unless system(*args)
66
- raise "Command failed with status #{$?.exitstatus}"
67
- end
68
- end
69
- end
70
-
71
- exit Builder.new(ARGV[0], ARGV[1]).run
data/bors.toml DELETED
@@ -1,14 +0,0 @@
1
- # Gate on Travis CI
2
- status = ["continuous-integration/travis-ci/push"]
3
-
4
- # Set bors's timeout to 6 hours
5
- #
6
- # bors's timeout should always be twice a long as the test suite takes.
7
- # This is to allow Travis to fast-fail a test; if one of the builders
8
- # immediately reports a failure, then bors will move on to the next batch,
9
- # leaving the slower builders to work through the already-doomed run and
10
- # the next one.
11
- #
12
- # At the time it was written, a run had taken 3 hours.
13
- # bors's default timeout is 4 hours.
14
- timeout_sec = 14400
@@ -1,15 +0,0 @@
1
- require 'redis'
2
-
3
- r = Redis.new
4
-
5
- r.del('foo')
6
-
7
- puts
8
-
9
- p'set foo to "bar"'
10
- r['foo'] = 'bar'
11
-
12
- puts
13
-
14
- p 'value of foo'
15
- p r['foo']
@@ -1,114 +0,0 @@
1
- # This file implements a simple consistency test for Redis-rb (or any other
2
- # Redis environment if you pass a different client object) where a client
3
- # writes to the database using INCR in order to increment keys, but actively
4
- # remember the value the key should have. Before every write a read is performed
5
- # to check if the value in the database matches the value expected.
6
- #
7
- # In this way this program can check for lost writes, or acknowledged writes
8
- # that were executed.
9
- #
10
- # Copyright (C) 2013-2014 Salvatore Sanfilippo <antirez@gmail.com>
11
- #
12
- # Permission is hereby granted, free of charge, to any person obtaining
13
- # a copy of this software and associated documentation files (the
14
- # "Software"), to deal in the Software without restriction, including
15
- # without limitation the rights to use, copy, modify, merge, publish,
16
- # distribute, sublicense, and/or sell copies of the Software, and to
17
- # permit persons to whom the Software is furnished to do so, subject to
18
- # the following conditions:
19
- #
20
- # The above copyright notice and this permission notice shall be
21
- # included in all copies or substantial portions of the Software.
22
- #
23
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
-
31
- require 'redis'
32
-
33
- class ConsistencyTester
34
- def initialize(redis)
35
- @r = redis
36
- @working_set = 10000
37
- @keyspace = 100000
38
- @writes = 0
39
- @reads = 0
40
- @failed_writes = 0
41
- @failed_reads = 0
42
- @lost_writes = 0
43
- @not_ack_writes = 0
44
- @delay = 0
45
- @cached = {} # We take our view of data stored in the DB.
46
- @prefix = [Process.pid.to_s,Time.now.usec,@r.object_id,""].join("|")
47
- @errtime = {}
48
- end
49
-
50
- def genkey
51
- # Write more often to a small subset of keys
52
- ks = rand() > 0.5 ? @keyspace : @working_set
53
- @prefix+"key_"+rand(ks).to_s
54
- end
55
-
56
- def check_consistency(key,value)
57
- expected = @cached[key]
58
- return if !expected # We lack info about previous state.
59
- if expected > value
60
- @lost_writes += expected-value
61
- elsif expected < value
62
- @not_ack_writes += value-expected
63
- end
64
- end
65
-
66
- def puterr(msg)
67
- if !@errtime[msg] || Time.now.to_i != @errtime[msg]
68
- puts msg
69
- end
70
- @errtime[msg] = Time.now.to_i
71
- end
72
-
73
- def test
74
- last_report = Time.now.to_i
75
- while true
76
- # Read
77
- key = genkey
78
- begin
79
- val = @r.get(key)
80
- check_consistency(key,val.to_i)
81
- @reads += 1
82
- rescue => e
83
- puterr "Reading: #{e.class}: #{e.message} (#{e.backtrace.first})"
84
- @failed_reads += 1
85
- end
86
-
87
- # Write
88
- begin
89
- @cached[key] = @r.incr(key).to_i
90
- @writes += 1
91
- rescue => e
92
- puterr "Writing: #{e.class}: #{e.message} (#{e.backtrace.first})"
93
- @failed_writes += 1
94
- end
95
-
96
- # Report
97
- sleep @delay
98
- if Time.now.to_i != last_report
99
- report = "#{@reads} R (#{@failed_reads} err) | " +
100
- "#{@writes} W (#{@failed_writes} err) | "
101
- report += "#{@lost_writes} lost | " if @lost_writes > 0
102
- report += "#{@not_ack_writes} noack | " if @not_ack_writes > 0
103
- last_report = Time.now.to_i
104
- puts report
105
- end
106
- end
107
- end
108
- end
109
-
110
- Sentinels = [{:host => "127.0.0.1", :port => 26379},
111
- {:host => "127.0.0.1", :port => 26380}]
112
- r = Redis.new(:url => "redis://master1", :sentinels => Sentinels, :role => :master)
113
- tester = ConsistencyTester.new(r)
114
- tester.test