-
-
Notifications
You must be signed in to change notification settings - Fork 97
Closed
Description
I am using Falcon in my Sinatra app & I am using mongodb & etcd.
However I have an issue, in preload.rb file I have initialized a singleton counter
require_relative '../services/counter_service'
CounterService.initialize_counter_range
and here is the counter_service.rb file
require 'securerandom'
require 'thread'
require 'etcdv3'
require_relative '../initializers/etcd'
class CounterService
RANGE_SIZE = 1000
class << self
def initialize_counter_range
self.counter_range = get_counter_range
self.counter = counter_range.first
end
def get_next_counter
current_counter = counter
if current_counter >= counter_range.last
puts "Worker process #{Process.pid} Exhausted counter"
self.counter_range = get_counter_range
self.counter = counter_range.first
current_counter = counter
end
self.counter += 1
current_counter
end
private
attr_accessor :counter_range, :counter
attr_reader :counter_mutex
def get_counter_range
loop do
current_value = EtcdClient.client.get(COUNTER_KEY).kvs.first&.value.to_i
new_value = current_value + RANGE_SIZE
txn = EtcdClient.client.transaction do |txn|
txn.compare = [
txn.value(COUNTER_KEY, :equal, current_value.to_s),
]
txn.success = [
txn.put(COUNTER_KEY, new_value.to_s)
]
end
if txn.succeeded
puts "Instance #{ENV['SERVICE_NAME']} obtained counter range #{current_value} to #{new_value - 1}"
return (current_value...new_value)
end
end
end
def counter_mutex
@counter_mutex ||= Mutex.new
end
end
end
I got this error after first counter range being exhausted & trying to get next counter
Worker process 32 Exhausted counter
RuntimeError - grpc cannot be used before and after forking:
/usr/local/bundle/gems/grpc-1.40.0/src/ruby/lib/grpc/generic/client_stub.rb:49:in `initialize'
/usr/local/bundle/gems/grpc-1.40.0/src/ruby/lib/grpc/generic/client_stub.rb:49:in `new'
/usr/local/bundle/gems/grpc-1.40.0/src/ruby/lib/grpc/generic/client_stub.rb:49:in `setup_channel'
/usr/local/bundle/gems/grpc-1.40.0/src/ruby/lib/grpc/generic/client_stub.rb:104:in `initialize'
/usr/local/bundle/gems/grpc-1.40.0/src/ruby/lib/grpc/generic/service.rb:158:in `initialize'
/usr/local/bundle/gems/etcdv3-0.11.6/lib/etcdv3/auth.rb:13:in `new'
/usr/local/bundle/gems/etcdv3-0.11.6/lib/etcdv3/auth.rb:13:in `initialize'
counter_service.rb:46:in `block in get_counter_range'
counter_service.rb:45:in `loop'
counter_service.rb:45:in `get_counter_range'
counter_service.rb:30:in `block in get_next_counter'
counter_service.rb:21:in `synchronize'
counter_service.rb:21:in `get_next_counter'
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels