Skip to content

Commit

Permalink
Merge pull request #93 from arturictus/lucas-aragno-hostname-registry
Browse files Browse the repository at this point in the history
hostname registry with redis ordered set
  • Loading branch information
arturictus authored Jul 21, 2023
2 parents f7f21ef + b7d77d0 commit 771c1e9
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 39 deletions.
36 changes: 18 additions & 18 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,24 +45,24 @@ jobs:
cache-version: 1
- name: Run tests
run: bundle exec rspec
- name: Code Coverage Summary
uses: irongut/[email protected]
with:
filename: coverage/coverage.xml
badge: true
fail_below_min: true
format: markdown
hide_branch_rate: false
hide_complexity: true
indicators: true
output: both
# thresholds: '60 80'
- name: Add Coverage PR Comment
uses: marocchino/sticky-pull-request-comment@v2
if: github.event_name == 'pull_request'
with:
recreate: true
path: code-coverage-results.md
# - name: Code Coverage Summary
# uses: irongut/[email protected]
# with:
# filename: coverage/coverage.xml
# badge: true
# fail_below_min: true
# format: markdown
# hide_branch_rate: false
# hide_complexity: true
# indicators: true
# output: both
# # thresholds: '60 80'
# - name: Add Coverage PR Comment
# uses: marocchino/sticky-pull-request-comment@v2
# if: github.event_name == 'pull_request'
# with:
# recreate: true
# path: code-coverage-results.md
test:
runs-on: ubuntu-latest
needs: rubocop
Expand Down
23 changes: 19 additions & 4 deletions lib/sidekiq_alive.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
require "sidekiq_alive/redis"

module SidekiqAlive
HOSTNAME_REGISTRY = "sidekiq-alive-hostnames"
class << self
def start
Sidekiq.configure_server do |sq_config|
Expand All @@ -28,6 +29,7 @@ def start
logger.info(startup_info)

register_current_instance

store_alive_key
# Passing the hostname argument it's only for debugging enqueued jobs
SidekiqAlive::Worker.perform_async(hostname)
Expand Down Expand Up @@ -63,11 +65,13 @@ def unregister_current_instance
# Delete any pending jobs for this instance
logger.info(shutdown_info)
purge_pending_jobs
redis.delete(current_instance_register_key)
redis.zrem(HOSTNAME_REGISTRY, current_instance_register_key)
end

def registered_instances
redis.match("#{config.registered_instance_key}::*")
# before we return we make sure we expire old keys
expire_old_keys
redis.zrange(HOSTNAME_REGISTRY, 0, -1)
end

def purge_pending_jobs
Expand Down Expand Up @@ -136,6 +140,7 @@ def startup_info
port: config.port,
ttl: config.time_to_live,
queue: current_queue,
register_set: HOSTNAME_REGISTRY,
liveness_key: current_lifeness_key,
register_key: current_instance_register_key,
}
Expand All @@ -144,11 +149,21 @@ def startup_info
end

def successful_startup_text
"Successfully started sidekiq-alive, registered with key: #{current_instance_register_key}"
"Successfully started sidekiq-alive, registered with key: "\
"#{current_instance_register_key} on set #{HOSTNAME_REGISTRY}"
end

def expire_old_keys
# we get every key that should be expired by now
keys_to_expire = redis.zrangebyscore(HOSTNAME_REGISTRY, 0, Time.now.to_i)
# then we remove it
keys_to_expire.each { |key| redis.zrem(HOSTNAME_REGISTRY, key) }
end

def register_instance(instance_name)
redis.set(instance_name, time: Time.now.to_i, ex: config.registration_ttl.to_i)
expiration = Time.now.to_i + config.registration_ttl.to_i
redis.zadd(HOSTNAME_REGISTRY, expiration, instance_name)
expire_old_keys
end
end
end
Expand Down
14 changes: 13 additions & 1 deletion lib/sidekiq_alive/redis/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,19 @@ def set(...)
raise(NotImplementedError)
end

def match(key)
def zadd(set_key, ex, key)
raise(NotImplementedError)
end

def zrange(set_key, start, stop)
raise(NotImplementedError)
end

def zrangebyscore(set_key, min, max)
raise(NotImplementedError)
end

def zrem(set_key, key)
raise(NotImplementedError)
end

Expand Down
16 changes: 14 additions & 2 deletions lib/sidekiq_alive/redis/redis_client_gem.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,20 @@ def get(key)
Sidekiq.redis { |redis| redis.call("GET", key) }
end

def match(key)
Sidekiq.redis { |redis| redis.scan("MATCH", key).map { |key| key } }
def zadd(set_key, ex, key)
Sidekiq.redis { |redis| redis.call("ZADD", set_key, ex, key) }
end

def zrange(set_key, start, stop)
Sidekiq.redis { |redis| redis.call("ZRANGE", set_key, start, stop) }
end

def zrangebyscore(set_key, min, max)
Sidekiq.redis { |redis| redis.call("ZRANGEBYSCORE", set_key, min, max) }
end

def zrem(set_key, key)
Sidekiq.redis { |redis| redis.call("ZREM", set_key, key) }
end

def delete(key)
Expand Down
24 changes: 14 additions & 10 deletions lib/sidekiq_alive/redis/redis_gem.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,20 @@ def get(key)
redis.get(key)
end

def match(key)
keys = []
cursor = 0

loop do
cursor, found_keys = redis.scan(cursor, match: key, count: 1000)
keys += found_keys if found_keys
break if cursor.to_i == 0
end
keys
def zadd(set_key, ex, key)
redis.zadd(set_key, ex, key)
end

def zrange(set_key, start, stop)
redis.zrange(set_key, start, stop)
end

def zrangebyscore(set_key, min, max)
redis.zrangebyscore(set_key, min, max)
end

def zrem(set_key, key)
redis.zrem(set_key, key)
end

def delete(key)
Expand Down
8 changes: 5 additions & 3 deletions spec/redis_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
redis.set("hello", time: time, ex: 60)
expect(redis.ttl("hello") > 1).to(be(true))
expect(redis.get("hello")).to(eq(time))
expect(redis.match("hello")).to(eq(["hello"]))
expect(redis.delete("hello")).to(eq(1))
expect(redis.get("hello")).to(be(nil))
redis.zadd("test_set", Time.now.to_i, "test-key-1")
redis.zadd("test_set", Time.now.to_i, "test-key-2")
expect(redis.zrange("test_set", 0, -1)).to(eq(["test-key-1", "test-key-2"]))
expect(redis.zrem("test_set", "test-key-1"))
expect(redis.zrange("test_set", 0, -1)).to(eq(["test-key-2"]))
end
end
1 change: 0 additions & 1 deletion spec/sidekiq_alive_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,6 @@

it "::registered_instances" do
SidekiqAlive.start

expect(SidekiqAlive.registered_instances.count).to(eq(1))
expect(SidekiqAlive.registered_instances.first).to(include("test-hostname"))
end
Expand Down

0 comments on commit 771c1e9

Please sign in to comment.