xcflushd 1.0.0 → 1.1.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
  SHA1:
3
- metadata.gz: 99f1cb623f33f531541f29169d019be6f8cc16cc
4
- data.tar.gz: 44ddf936023001785ab6f09a959bc56ad9ea401e
3
+ metadata.gz: 8ce36d38201d9c3738a277cddbbae9b1f7a79a05
4
+ data.tar.gz: bddd1d1f27f34ded85d5d8cebeeced9b292ac7f0
5
5
  SHA512:
6
- metadata.gz: 4c15f4195eec039d97a9a1626a920b245496460253428ccd3f0117d6bc8153ca30f37c2aebfcb43d1c73f123b71941398950eca58829257277271636babe4990
7
- data.tar.gz: 5a421824e1e674541a76206f183a7e5ca8af42e464eed2c537974a4ad522a5d2ee895b99a1b3f2f80eb6b11643ef6b4a28bcb5b949c8635b37a5f44ebc876a25
6
+ metadata.gz: d4f02d26ef2fb8cdf559b5741f6c514df6a63b5a071618cc7048138ee43003d5717de46cc57c60a93d0337b46066038a58d0c3521328a890470d219609b50a3c
7
+ data.tar.gz: 8f01cfd539c1e763288f9149efa16755b05edaeb22c5d29bdae7baac6df13e1a0310e20b11cc99ce831ad3fa4b81c44da5680ea398fcb2a54b028c2090765f09
data/.dockerignore ADDED
@@ -0,0 +1,2 @@
1
+ Dockerfile
2
+ .bundle
data/.rspec CHANGED
@@ -1,3 +1,4 @@
1
1
  --format documentation
2
2
  --color
3
+ --tty
3
4
  --order rand
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.3.1
1
+ jruby-9.1.8.0
data/.travis.yml CHANGED
@@ -2,4 +2,6 @@ sudo: false
2
2
  language: ruby
3
3
  rvm:
4
4
  - 2.3.1
5
- before_install: gem install bundler -v 1.12.5
5
+ - jruby-9.1.8.0
6
+ before_install:
7
+ - gem install bundler -v 1.14.6
data/CHANGELOG.md ADDED
@@ -0,0 +1,26 @@
1
+ ## [1.1.0] - 2017-05-02
2
+ - Switched from MRI to JRuby. our tests show that JRuby performs better than
3
+ MRI when there is a high number of calls to be made to 3scale's backend in a
4
+ flushing cycle. One of the reasons is that JRuby allows us to make several
5
+ calls to 3scale's backend in parallel as well as parse their XML responses.
6
+ - Updated dependencies: 3scale_client (2.11.0), gli (2.16.0), redis(3.3.3),
7
+ concurrent-ruby(1.0.5), simplecov (0.14.1), rubocop (0.48.1).
8
+ - Changed the timezone in the Dockerfile to UTC. This way, timestamps can be
9
+ easily translated from log files or other sources to whatever is needed.
10
+ - Increased the number of messages that the priority auth renewer can process
11
+ at the same time. We accomplished that by reducing the waiting times between
12
+ publishing attempts. Those waiting times were unnecessarily long.
13
+ - Fixed a bug that affected the way thread pools were being used. We were using
14
+ concurrent-ruby's ThreadPoolExecutor without specifying a max size for the
15
+ queue, and that type of pool only spawns a new thread when the queue is full.
16
+ That means that in practice, we specified a 'min:max' number of threads, but
17
+ only min were spawned. Now we are using FixedThreadPools and always take
18
+ the max number of threads for the input, ignoring the min.
19
+ - Added logging that shows the run time of each of the 5 phases of a
20
+ flushing cycle: 1- getting the reports from Redis, 2- reporting to 3scale,
21
+ 3- waiting to leave some time to the reports to take effect, 4- getting the
22
+ auths from 3scale, 5- renewing the auths in Redis. This is useful for
23
+ debugging purposes.
24
+ - Minor changes in the Dockerfile to make it run on CentOS / RHEL.
25
+ - Improved performance of the flushing phase that takes care of renewing
26
+ authorizations in Redis by using the hmset command.
data/Dockerfile CHANGED
@@ -7,7 +7,7 @@ ENV DEBIAN_FRONTEND=noninteractive
7
7
  ARG USER_NAME=user
8
8
  ARG USER_HOME="/home/${USER_NAME}"
9
9
  # Timezone
10
- ARG TZ="Europe/Madrid"
10
+ ARG TZ="UTC"
11
11
 
12
12
  RUN echo "Acquire::http {No-Cache=True;};" > /etc/apt/apt.conf.d/no-cache \
13
13
  && echo 'APT {Install-Recommends="false";Install-Suggests="false";};' > /etc/apt/apt.conf.d/no-recommends \
@@ -15,7 +15,7 @@ RUN echo "Acquire::http {No-Cache=True;};" > /etc/apt/apt.conf.d/no-cache \
15
15
  && rm -f /etc/cron.daily/apt \
16
16
  && rm -f /etc/cron.daily/dpkg \
17
17
  && rm -f /etc/cron.daily/passwd \
18
- && apt-get update -y -q && apt-get install -y -q apt-utils \
18
+ && apt-get update -y -q && apt-get install -y -q apt-utils tzdata \
19
19
  && apt-get dist-upgrade -y -q \
20
20
  && apt-get install -y -q sudo cron logrotate wget curl unzip ca-certificates \
21
21
  iputils-arping inetutils-ping inetutils-telnet net-tools nmap iotop tmux vim \
@@ -33,6 +33,8 @@ RUN echo "Acquire::http {No-Cache=True;};" > /etc/apt/apt.conf.d/no-cache \
33
33
  && chown -R ${USER_NAME}: ${USER_HOME} \
34
34
  && apt-get -y -q clean
35
35
 
36
+ RUN apt-get install -y -q openjdk-8-jre
37
+
36
38
  USER ${USER_NAME}
37
39
 
38
40
  ARG RBENV_ROOT="${USER_HOME}/.rbenv"
@@ -96,4 +98,5 @@ RUN chown -R ${USER_NAME}: ${APP_HOME}
96
98
  USER ${USER_NAME}
97
99
  RUN bundle install
98
100
 
99
- CMD bundle exec exe/xcflushd run
101
+ ARG JRUBY_EXEC="jruby -Xcompile.invokedynamic=true -J-XX:ReservedCodeCacheSize=256M -J-XX:+UseCodeCacheFlushing -J-Xmn512m -J-Xms2048m -J-Xmx2048m -J-server -J-Djruby.objectspace.enabled=false -J-Djruby.thread.pool.enabled=true -J-Djruby.thread.pool.ttl=600 -J-Djruby.compile.mode=FORCE --server --headless -S"
102
+ CMD ${JRUBY_EXEC} bundle exec exe/xcflushd run
data/Gemfile.lock CHANGED
@@ -1,40 +1,45 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- xcflushd (1.0.0)
5
- 3scale_client (~> 2.10)
6
- concurrent-ruby (= 1.0.2)
7
- daemons (= 1.2.4)
8
- gli (= 2.14.0)
9
- hiredis (= 0.6.1)
10
- net-http-persistent (= 2.9.4)
11
- redis (= 3.3.2)
4
+ xcflushd (1.1.0)
5
+ 3scale_client (~> 2.11)
6
+ concurrent-ruby (~> 1.0.5)
7
+ daemons (~> 1.2.4)
8
+ gli (~> 2.16.0)
9
+ hiredis (~> 0.6.1)
10
+ net-http-persistent (~> 2.9.4)
11
+ redis (~> 3.3.3)
12
12
 
13
13
  GEM
14
14
  remote: https://rubygems.org/
15
15
  specs:
16
- 3scale_client (2.10.0)
16
+ 3scale_client (2.11.0)
17
17
  nokogiri
18
18
  ast (2.3.0)
19
- concurrent-ruby (1.0.2)
19
+ concurrent-ruby (1.0.5)
20
+ concurrent-ruby (1.0.5-java)
20
21
  daemons (1.2.4)
21
- diff-lcs (1.2.5)
22
+ diff-lcs (1.3)
22
23
  docile (1.1.5)
23
24
  fakeredis (0.6.0)
24
25
  redis (~> 3.2)
25
- gli (2.14.0)
26
+ gli (2.16.0)
26
27
  hiredis (0.6.1)
27
- json (2.0.2)
28
+ hiredis (0.6.1-java)
29
+ json (2.1.0)
30
+ json (2.1.0-java)
28
31
  mini_portile2 (2.1.0)
29
32
  net-http-persistent (2.9.4)
30
- nokogiri (1.6.8.1)
33
+ nokogiri (1.7.1)
31
34
  mini_portile2 (~> 2.1.0)
32
- parser (2.3.3.1)
35
+ nokogiri (1.7.1-java)
36
+ parser (2.4.0.0)
33
37
  ast (~> 2.2)
34
38
  powerpack (0.1.1)
35
- rainbow (2.1.0)
39
+ rainbow (2.2.2)
40
+ rake
36
41
  rake (11.3.0)
37
- redis (3.3.2)
42
+ redis (3.3.3)
38
43
  rspec (3.5.0)
39
44
  rspec-core (~> 3.5.0)
40
45
  rspec-expectations (~> 3.5.0)
@@ -48,31 +53,32 @@ GEM
48
53
  diff-lcs (>= 1.2.0, < 2.0)
49
54
  rspec-support (~> 3.5.0)
50
55
  rspec-support (3.5.0)
51
- rubocop (0.46.0)
52
- parser (>= 2.3.1.1, < 3.0)
56
+ rubocop (0.48.1)
57
+ parser (>= 2.3.3.1, < 3.0)
53
58
  powerpack (~> 0.1)
54
59
  rainbow (>= 1.99.1, < 3.0)
55
60
  ruby-progressbar (~> 1.7)
56
61
  unicode-display_width (~> 1.0, >= 1.0.1)
57
62
  ruby-progressbar (1.8.1)
58
- simplecov (0.12.0)
63
+ simplecov (0.14.1)
59
64
  docile (~> 1.1.0)
60
65
  json (>= 1.8, < 3)
61
66
  simplecov-html (~> 0.10.0)
62
67
  simplecov-html (0.10.0)
63
- unicode-display_width (1.1.2)
68
+ unicode-display_width (1.2.1)
64
69
 
65
70
  PLATFORMS
71
+ java
66
72
  ruby
67
73
 
68
74
  DEPENDENCIES
69
- bundler (~> 1.13)
70
- fakeredis (~> 0.6.0)
75
+ bundler (~> 1.14)
76
+ fakeredis (~> 0.6)
71
77
  rake (~> 11.0)
72
- rspec (~> 3.0)
73
- rubocop (~> 0.46.0)
74
- simplecov (~> 0.12.0)
78
+ rspec (~> 3.5)
79
+ rubocop (~> 0.48)
80
+ simplecov (~> 0.14)
75
81
  xcflushd!
76
82
 
77
83
  BUNDLED WITH
78
- 1.13.6
84
+ 1.14.6
data/Makefile CHANGED
@@ -14,4 +14,4 @@ test: build
14
14
  docker run --rm -t xcflushd script/test
15
15
 
16
16
  bash: build
17
- docker run --rm -t -i -v $(PROJECT_PATH):$(DOCKER_PROJECT_PATH) xcflushd /bin/bash
17
+ docker run --rm -t -i -v $(PROJECT_PATH):$(DOCKER_PROJECT_PATH):z xcflushd /bin/bash
data/README.md CHANGED
@@ -63,27 +63,35 @@ $ make build
63
63
 
64
64
  Run:
65
65
  ```
66
- $ docker run --rm xcflushd bundle exec xcflushd help run
66
+ $ docker run --rm -it xcflushd script/launch help
67
67
  ```
68
68
 
69
- You can send the options as params in the `xcflushd` command:
69
+ You can send the options as params for `script/launch`:
70
70
  ```
71
- $ docker run --rm -it xcflushd bundle exec xcflushd run --auth-ttl 900 --provider-key my_provider_key --redis 127.0.0.1:6379 --frequency 300 --backend https://su1.3scale.net:443
71
+ $ docker run --rm -it xcflushd script/launch run --auth-ttl 900 --provider-key my_provider_key --redis 127.0.0.1:6379 --frequency 300 --backend https://su1.3scale.net:443
72
72
  ```
73
73
 
74
74
  Please note that the help command will also show you abbreviated flags you can
75
- use at your convenience.
75
+ use at your convenience. Also, `script/launch` sets all the JRuby flags
76
+ recommended for a production environment. If you'd like to set different ones,
77
+ you can run:
78
+ ```
79
+ $ docker run --rm -it xcflushd JRUBY_OPTS="..." jruby -S bundle exec xcflushd help
80
+ ```
76
81
 
77
82
  ### Locally
78
83
 
84
+ This instructions are for JRuby, the Ruby implementation that we recommend for
85
+ running xcflushd.
86
+
79
87
  Install the dependencies:
80
88
  ```
81
- $ bundle install
89
+ $ jruby -S bundle install
82
90
  ```
83
91
 
84
- Run the program:
92
+ Run the program with the recommended flags for production:
85
93
  ```
86
- $ bundle exec xcflushd help
94
+ $ script/launch help
87
95
  ```
88
96
 
89
97
  ### Openshift
data/exe/xcflushd CHANGED
@@ -31,10 +31,12 @@ command :run do |c|
31
31
  c.desc 'Reporting frequency (in seconds)'
32
32
  c.flag [:f, :frequency], required: true, type: Integer, must_match: POSITIVE_N_RE
33
33
 
34
- c.desc 'Number of threads for the main thread pool (min:max)'
34
+ c.desc 'Number of threads for the main thread pool (min:max). '\
35
+ 'min is not used, it is there just for backwards compatibility.'
35
36
  c.flag [:t, :threads], default_value: 'auto', type: PositiveMinMaxInt
36
37
 
37
- c.desc 'Number of threads for the priority auth renewer (min:max)'
38
+ c.desc 'Number of threads for the priority auth renewer (min:max). '\
39
+ 'min is not used, it is there just for backwards compatibility.'
38
40
  c.flag [:p, :'prio-threads'], default_value: 'auto', type: PositiveMinMaxInt
39
41
 
40
42
  c.desc 'Run this program as a background service'
@@ -1,5 +1,4 @@
1
1
  require 'concurrent'
2
- require 'xcflushd/threading'
3
2
 
4
3
  module Xcflushd
5
4
  class Flusher
@@ -9,21 +8,14 @@ module Xcflushd
9
8
 
10
9
  XcflushdError = Class.new(StandardError)
11
10
 
12
- def initialize(reporter, authorizer, storage, auth_ttl, error_handler, threads)
11
+ def initialize(reporter, authorizer, storage, auth_ttl, error_handler, logger, threads)
13
12
  @reporter = reporter
14
13
  @authorizer = authorizer
15
14
  @storage = storage
16
15
  @auth_ttl = auth_ttl
17
16
  @error_handler = error_handler
18
-
19
- min_threads, max_threads = if threads
20
- [threads.min, threads.max]
21
- else
22
- Threading.default_threads_value
23
- end
24
-
25
- @thread_pool = Concurrent::ThreadPoolExecutor.new(
26
- min_threads: min_threads, max_threads: max_threads)
17
+ @logger = logger
18
+ @thread_pool = Concurrent::FixedThreadPool.new(threads)
27
19
  end
28
20
 
29
21
  def shutdown
@@ -40,8 +32,11 @@ module Xcflushd
40
32
 
41
33
  # TODO: decide if we want to renew the authorizations every time.
42
34
  def flush
43
- reports_to_flush = reports
44
- report(reports_to_flush)
35
+ reports_to_flush = run_and_log_time('Getting the reports from Redis') do
36
+ reports
37
+ end
38
+
39
+ run_and_log_time('Reporting to 3scale') { report(reports_to_flush) }
45
40
 
46
41
  # Ideally, we would like to ensure that once we start checking
47
42
  # authorizations, they have taken into account the reports that we just
@@ -50,15 +45,21 @@ module Xcflushd
50
45
  # processed.
51
46
  # For now, let's just wait a few seconds. This will greatly mitigate the
52
47
  # problem.
53
- sleep(WAIT_TIME_REPORT_AUTH)
48
+ run_and_log_time('Giving reports some time to be processed') do
49
+ sleep(WAIT_TIME_REPORT_AUTH)
50
+ end
51
+
52
+ auths = run_and_log_time('Getting the auths from 3scale') do
53
+ authorizations(reports_to_flush)
54
+ end
54
55
 
55
- renew(authorizations(reports_to_flush))
56
+ run_and_log_time('Renewing the auths in Redis') { renew(auths) }
56
57
  end
57
58
 
58
59
  private
59
60
 
60
61
  attr_reader :reporter, :authorizer, :storage, :auth_ttl,
61
- :error_handler, :thread_pool
62
+ :error_handler, :logger, :thread_pool
62
63
 
63
64
  def reports
64
65
  storage.reports_to_flush
@@ -142,5 +143,11 @@ module Xcflushd
142
143
  end.to_h
143
144
  end
144
145
 
146
+ def run_and_log_time(action, &blk)
147
+ t = Time.now
148
+ res = blk.call
149
+ logger.debug("#{action} took #{(Time.now - t).round(3)} seconds")
150
+ res
151
+ end
145
152
  end
146
153
  end
@@ -1,5 +1,3 @@
1
- require 'xcflushd/threading'
2
-
3
1
  module Xcflushd
4
2
  # Apart from flushing all the cached reports and renewing the authorizations
5
3
  # periodically, we need to provide a mechanism to renew a specific auth at
@@ -22,9 +20,8 @@ module Xcflushd
22
20
  # status once it gets it from 3scale.
23
21
  class PriorityAuthRenewer
24
22
 
25
- # Number of times that a response is published
26
- TIMES_TO_PUBLISH = 5
27
- private_constant :TIMES_TO_PUBLISH
23
+ PUBLISH_WAIT_TIMES = [0.002, 0.005, 0.005, 0.01, 0.015].freeze
24
+ private_constant :PUBLISH_WAIT_TIMES
28
25
 
29
26
  # We need two separate Redis clients: one for subscribing to a channel and
30
27
  # the other one to publish to different channels. It is specified in the
@@ -47,15 +44,7 @@ module Xcflushd
47
44
  # ensure thread-safety.
48
45
  @current_auths = Concurrent::Map.new
49
46
 
50
- min_threads, max_threads = if threads
51
- [threads.min, threads.max]
52
- else
53
- Threading.default_threads_value
54
- end
55
-
56
- @thread_pool = Concurrent::ThreadPoolExecutor.new(
57
- min_threads: min_threads,
58
- max_threads: max_threads)
47
+ @thread_pool = Concurrent::FixedThreadPool.new(threads)
59
48
  end
60
49
 
61
50
  def shutdown
@@ -201,16 +190,18 @@ module Xcflushd
201
190
  # between the moment the requests performs the publish and the
202
191
  # subscribe actions. To mitigate the problem we can publish several
203
192
  # times during some ms. We will see if this is good enough.
204
- # Trade-off: publishing too much increases the Redis load. Waiting too
205
- # much makes the incoming request slow.
193
+ # Trade-off: Waiting long times between publishing attempts reduces the
194
+ # probability of triggering the problem described. However, it also makes
195
+ # incoming requests slow because tasks accumulate in the thread pool
196
+ # waiting.
206
197
  publish_failures = 0
207
- TIMES_TO_PUBLISH.times do |t|
198
+ PUBLISH_WAIT_TIMES.each do |wait_time|
208
199
  begin
209
200
  publish_auth(combination, authorization)
210
201
  rescue
211
202
  publish_failures += 1
212
203
  end
213
- sleep((1.0/50)*((t+1)**2))
204
+ sleep(wait_time)
214
205
  end
215
206
 
216
207
  if publish_failures > 0
@@ -2,6 +2,7 @@ require 'xcflushd'
2
2
  require 'redis'
3
3
  require '3scale_client'
4
4
  require 'xcflushd/3scale_client_ext'
5
+ require 'xcflushd/threading'
5
6
 
6
7
  module Xcflushd
7
8
  class Runner
@@ -27,7 +28,9 @@ module Xcflushd
27
28
 
28
29
  redis_host = opts[:redis].host
29
30
  redis_port = opts[:redis].port
30
- redis = Redis.new(host: redis_host, port: redis_port, driver: :hiredis)
31
+ redis_driver = RUBY_ENGINE == 'jruby' ? :ruby : :hiredis
32
+
33
+ redis = Redis.new(host: redis_host, port: redis_port, driver: redis_driver)
31
34
  storage = Storage.new(redis, @logger, StorageKeys)
32
35
 
33
36
  threescale = ThreeScale::Client.new(provider_key: opts[:provider_key],
@@ -39,19 +42,20 @@ module Xcflushd
39
42
  reporter = Reporter.new(threescale)
40
43
  authorizer = Authorizer.new(threescale)
41
44
 
42
- redis_pub = Redis.new(host: redis_host, port: redis_port, driver: :hiredis)
43
- redis_sub = Redis.new(host: redis_host, port: redis_port, driver: :hiredis)
45
+ redis_pub = Redis.new(host: redis_host, port: redis_port, driver: redis_driver)
46
+ redis_sub = Redis.new(host: redis_host, port: redis_port, driver: redis_driver)
44
47
 
45
48
  auth_ttl = opts[:auth_ttl]
46
49
 
47
50
  error_handler = FlusherErrorHandler.new(@logger, storage)
48
51
  @flusher = Flusher.new(reporter, authorizer, storage,
49
- auth_ttl, error_handler, opts[:threads])
52
+ auth_ttl, error_handler, @logger,
53
+ flusher_threads(opts[:threads]))
50
54
 
51
55
  @prio_auth_renewer = PriorityAuthRenewer.new(authorizer, storage,
52
56
  redis_pub, redis_sub,
53
57
  auth_ttl, @logger,
54
- opts[:prio_threads])
58
+ prio_threads(opts[:prio_threads]))
55
59
 
56
60
  @prio_auth_renewer_thread = start_priority_auth_renewer
57
61
 
@@ -60,6 +64,14 @@ module Xcflushd
60
64
 
61
65
  private
62
66
 
67
+ def flusher_threads(opts_threads)
68
+ opts_threads ? opts_threads.max : Threading.default_threads
69
+ end
70
+
71
+ def prio_threads(opts_prio_threads)
72
+ opts_prio_threads ? opts_prio_threads.max : Threading.default_threads
73
+ end
74
+
63
75
  def start_priority_auth_renewer
64
76
  Thread.new do
65
77
  loop do
@@ -74,9 +74,15 @@ module Xcflushd
74
74
  hash_key = hash_key(:auth, service_id, credentials)
75
75
 
76
76
  authorizations.each_slice(REDIS_BATCH_KEYS) do |authorizations_slice|
77
+ # Array with the hash key and all the sorted key-values
78
+ hmset_args = [hash_key]
79
+
77
80
  authorizations_slice.each do |metric, auth|
78
- storage.hset(hash_key, metric, auth_value(auth))
81
+ hmset_args << metric
82
+ hmset_args << auth_value(auth)
79
83
  end
84
+
85
+ storage.hmset(*hmset_args)
80
86
  end
81
87
 
82
88
  set_auth_validity(service_id, credentials, auth_ttl)
@@ -3,10 +3,8 @@ require 'concurrent'
3
3
 
4
4
  module Xcflushd
5
5
  module Threading
6
- def self.default_threads_value
7
- cpus = Concurrent.processor_count
8
- # default thread pool minimum is zero
9
- return 0, cpus * 4
6
+ def self.default_threads
7
+ Concurrent.processor_count * 4
10
8
  end
11
9
  end
12
10
  end
@@ -1,3 +1,3 @@
1
1
  module Xcflushd
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/xcflushd.rb CHANGED
@@ -9,3 +9,4 @@ require 'xcflushd/storage'
9
9
  require 'xcflushd/flusher_error_handler'
10
10
  require 'xcflushd/priority_auth_renewer'
11
11
  require 'xcflushd/version'
12
+ require 'xcflushd/threading'
data/script/launch ADDED
@@ -0,0 +1,4 @@
1
+ #!/bin/bash
2
+
3
+ export JRUBY_OPTS="-Xcompile.invokedynamic=true -J-XX:ReservedCodeCacheSize=256M -J-XX:+UseCodeCacheFlushing -J-Xmn512m -J-Xms2048m -J-Xmx2048m -J-server -J-Djruby.objectspace.enabled=false -J-Djruby.thread.pool.enabled=true -J-Djruby.thread.pool.ttl=600 -J-Djruby.compile.mode=FORCE --server --headless"
4
+ jruby -S bundle exec xcflushd $@
data/script/test CHANGED
@@ -4,6 +4,12 @@ SCRIPT_DIR=$(dirname "$(readlink -f $0)")
4
4
 
5
5
  pushd ${SCRIPT_DIR} > /dev/null
6
6
  export TEST_COVERAGE=1
7
+
8
+ # 'debug' is needed for test coverage, 'dev' makes the JVM boot fast at the
9
+ # expense of long-running code performance among other things recommended for
10
+ # development: https://github.com/jruby/jruby/wiki/Improving-startup-time
11
+ export JRUBY_OPTS="--debug --dev"
12
+
7
13
  bundle exec rake spec
8
14
  STATUS=$?
9
15
  popd > /dev/null
data/xcflushd.gemspec CHANGED
@@ -26,18 +26,18 @@ Gem::Specification.new do |spec|
26
26
 
27
27
  spec.required_ruby_version = '>= 2.1.0'
28
28
 
29
- spec.add_runtime_dependency "3scale_client", "~> 2.10"
30
- spec.add_runtime_dependency "gli", "= 2.14.0"
31
- spec.add_runtime_dependency "redis", "= 3.3.2"
32
- spec.add_runtime_dependency "hiredis", "= 0.6.1"
33
- spec.add_runtime_dependency "concurrent-ruby", "1.0.2"
34
- spec.add_runtime_dependency "net-http-persistent", "2.9.4"
35
- spec.add_runtime_dependency "daemons", "= 1.2.4"
29
+ spec.add_runtime_dependency "3scale_client", "~> 2.11"
30
+ spec.add_runtime_dependency "gli", "~> 2.16.0"
31
+ spec.add_runtime_dependency "redis", "~> 3.3.3"
32
+ spec.add_runtime_dependency "hiredis", "~> 0.6.1"
33
+ spec.add_runtime_dependency "concurrent-ruby", "~> 1.0.5"
34
+ spec.add_runtime_dependency "net-http-persistent", "~> 2.9.4"
35
+ spec.add_runtime_dependency "daemons", "~> 1.2.4"
36
36
 
37
- spec.add_development_dependency "bundler", "~> 1.13"
37
+ spec.add_development_dependency "bundler", "~> 1.14"
38
38
  spec.add_development_dependency "rake", "~> 11.0"
39
- spec.add_development_dependency "rspec", "~> 3.0"
40
- spec.add_development_dependency "fakeredis", "~> 0.6.0"
41
- spec.add_development_dependency "simplecov", "~> 0.12.0"
42
- spec.add_development_dependency "rubocop", "~> 0.46.0"
39
+ spec.add_development_dependency "rspec", "~> 3.5"
40
+ spec.add_development_dependency "fakeredis", "~> 0.6"
41
+ spec.add_development_dependency "simplecov", "~> 0.14"
42
+ spec.add_development_dependency "rubocop", "~> 0.48"
43
43
  end
metadata CHANGED
@@ -1,198 +1,198 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xcflushd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alejandro Martinez Ruiz
8
8
  - David Ortiz Lopez
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-03-30 00:00:00.000000000 Z
12
+ date: 2017-05-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: 3scale_client
16
15
  requirement: !ruby/object:Gem::Requirement
17
16
  requirements:
18
17
  - - "~>"
19
18
  - !ruby/object:Gem::Version
20
- version: '2.10'
21
- type: :runtime
19
+ version: '2.11'
20
+ name: 3scale_client
22
21
  prerelease: false
22
+ type: :runtime
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '2.10'
27
+ version: '2.11'
28
28
  - !ruby/object:Gem::Dependency
29
- name: gli
30
29
  requirement: !ruby/object:Gem::Requirement
31
30
  requirements:
32
- - - '='
31
+ - - "~>"
33
32
  - !ruby/object:Gem::Version
34
- version: 2.14.0
35
- type: :runtime
33
+ version: 2.16.0
34
+ name: gli
36
35
  prerelease: false
36
+ type: :runtime
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '='
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: 2.14.0
41
+ version: 2.16.0
42
42
  - !ruby/object:Gem::Dependency
43
- name: redis
44
43
  requirement: !ruby/object:Gem::Requirement
45
44
  requirements:
46
- - - '='
45
+ - - "~>"
47
46
  - !ruby/object:Gem::Version
48
- version: 3.3.2
49
- type: :runtime
47
+ version: 3.3.3
48
+ name: redis
50
49
  prerelease: false
50
+ type: :runtime
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '='
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: 3.3.2
55
+ version: 3.3.3
56
56
  - !ruby/object:Gem::Dependency
57
- name: hiredis
58
57
  requirement: !ruby/object:Gem::Requirement
59
58
  requirements:
60
- - - '='
59
+ - - "~>"
61
60
  - !ruby/object:Gem::Version
62
61
  version: 0.6.1
63
- type: :runtime
62
+ name: hiredis
64
63
  prerelease: false
64
+ type: :runtime
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - '='
67
+ - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: 0.6.1
70
70
  - !ruby/object:Gem::Dependency
71
- name: concurrent-ruby
72
71
  requirement: !ruby/object:Gem::Requirement
73
72
  requirements:
74
- - - '='
73
+ - - "~>"
75
74
  - !ruby/object:Gem::Version
76
- version: 1.0.2
77
- type: :runtime
75
+ version: 1.0.5
76
+ name: concurrent-ruby
78
77
  prerelease: false
78
+ type: :runtime
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - '='
81
+ - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: 1.0.2
83
+ version: 1.0.5
84
84
  - !ruby/object:Gem::Dependency
85
- name: net-http-persistent
86
85
  requirement: !ruby/object:Gem::Requirement
87
86
  requirements:
88
- - - '='
87
+ - - "~>"
89
88
  - !ruby/object:Gem::Version
90
89
  version: 2.9.4
91
- type: :runtime
90
+ name: net-http-persistent
92
91
  prerelease: false
92
+ type: :runtime
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '='
95
+ - - "~>"
96
96
  - !ruby/object:Gem::Version
97
97
  version: 2.9.4
98
98
  - !ruby/object:Gem::Dependency
99
- name: daemons
100
99
  requirement: !ruby/object:Gem::Requirement
101
100
  requirements:
102
- - - '='
101
+ - - "~>"
103
102
  - !ruby/object:Gem::Version
104
103
  version: 1.2.4
105
- type: :runtime
104
+ name: daemons
106
105
  prerelease: false
106
+ type: :runtime
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - '='
109
+ - - "~>"
110
110
  - !ruby/object:Gem::Version
111
111
  version: 1.2.4
112
112
  - !ruby/object:Gem::Dependency
113
- name: bundler
114
113
  requirement: !ruby/object:Gem::Requirement
115
114
  requirements:
116
115
  - - "~>"
117
116
  - !ruby/object:Gem::Version
118
- version: '1.13'
119
- type: :development
117
+ version: '1.14'
118
+ name: bundler
120
119
  prerelease: false
120
+ type: :development
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '1.13'
125
+ version: '1.14'
126
126
  - !ruby/object:Gem::Dependency
127
- name: rake
128
127
  requirement: !ruby/object:Gem::Requirement
129
128
  requirements:
130
129
  - - "~>"
131
130
  - !ruby/object:Gem::Version
132
131
  version: '11.0'
133
- type: :development
132
+ name: rake
134
133
  prerelease: false
134
+ type: :development
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
139
  version: '11.0'
140
140
  - !ruby/object:Gem::Dependency
141
- name: rspec
142
141
  requirement: !ruby/object:Gem::Requirement
143
142
  requirements:
144
143
  - - "~>"
145
144
  - !ruby/object:Gem::Version
146
- version: '3.0'
147
- type: :development
145
+ version: '3.5'
146
+ name: rspec
148
147
  prerelease: false
148
+ type: :development
149
149
  version_requirements: !ruby/object:Gem::Requirement
150
150
  requirements:
151
151
  - - "~>"
152
152
  - !ruby/object:Gem::Version
153
- version: '3.0'
153
+ version: '3.5'
154
154
  - !ruby/object:Gem::Dependency
155
- name: fakeredis
156
155
  requirement: !ruby/object:Gem::Requirement
157
156
  requirements:
158
157
  - - "~>"
159
158
  - !ruby/object:Gem::Version
160
- version: 0.6.0
161
- type: :development
159
+ version: '0.6'
160
+ name: fakeredis
162
161
  prerelease: false
162
+ type: :development
163
163
  version_requirements: !ruby/object:Gem::Requirement
164
164
  requirements:
165
165
  - - "~>"
166
166
  - !ruby/object:Gem::Version
167
- version: 0.6.0
167
+ version: '0.6'
168
168
  - !ruby/object:Gem::Dependency
169
- name: simplecov
170
169
  requirement: !ruby/object:Gem::Requirement
171
170
  requirements:
172
171
  - - "~>"
173
172
  - !ruby/object:Gem::Version
174
- version: 0.12.0
175
- type: :development
173
+ version: '0.14'
174
+ name: simplecov
176
175
  prerelease: false
176
+ type: :development
177
177
  version_requirements: !ruby/object:Gem::Requirement
178
178
  requirements:
179
179
  - - "~>"
180
180
  - !ruby/object:Gem::Version
181
- version: 0.12.0
181
+ version: '0.14'
182
182
  - !ruby/object:Gem::Dependency
183
- name: rubocop
184
183
  requirement: !ruby/object:Gem::Requirement
185
184
  requirements:
186
185
  - - "~>"
187
186
  - !ruby/object:Gem::Version
188
- version: 0.46.0
189
- type: :development
187
+ version: '0.48'
188
+ name: rubocop
190
189
  prerelease: false
190
+ type: :development
191
191
  version_requirements: !ruby/object:Gem::Requirement
192
192
  requirements:
193
193
  - - "~>"
194
194
  - !ruby/object:Gem::Version
195
- version: 0.46.0
195
+ version: '0.48'
196
196
  description: xcflushd is a daemon that connects to a Redis database containing 3scale's
197
197
  XC API Management data and flushes it to the 3scale service for cached reporting
198
198
  and authorizations. Check https://github.com/3scale/apicast-xc for an implementation
@@ -205,6 +205,7 @@ extensions: []
205
205
  extra_rdoc_files: []
206
206
  files:
207
207
  - ".codeclimate.yml"
208
+ - ".dockerignore"
208
209
  - ".gitignore"
209
210
  - ".rspec"
210
211
  - ".rubocop.yml"
@@ -212,6 +213,7 @@ files:
212
213
  - ".ruby-version"
213
214
  - ".simplecov"
214
215
  - ".travis.yml"
216
+ - CHANGELOG.md
215
217
  - Dockerfile
216
218
  - Gemfile
217
219
  - Gemfile.lock
@@ -240,13 +242,14 @@ files:
240
242
  - lib/xcflushd/storage_keys.rb
241
243
  - lib/xcflushd/threading.rb
242
244
  - lib/xcflushd/version.rb
245
+ - script/launch
243
246
  - script/test
244
247
  - xcflushd.gemspec
245
248
  homepage: https://github.com/3scale/xcflushd
246
249
  licenses:
247
250
  - Apache-2.0
248
251
  metadata: {}
249
- post_install_message:
252
+ post_install_message:
250
253
  rdoc_options: []
251
254
  require_paths:
252
255
  - lib
@@ -261,9 +264,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
264
  - !ruby/object:Gem::Version
262
265
  version: '0'
263
266
  requirements: []
264
- rubyforge_project:
265
- rubygems_version: 2.6.8
266
- signing_key:
267
+ rubyforge_project:
268
+ rubygems_version: 2.6.12
269
+ signing_key:
267
270
  specification_version: 4
268
271
  summary: Daemon for flushing XC reports to 3scale.
269
272
  test_files: []