Skip to content

RuntimeError - grpc cannot be used before and after forking #259

@taman9333

Description

@taman9333

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'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions