class GlobalUid::Base

Public Class Methods

alert(exception) click to toggle source
# File lib/global_uid/base.rb, line 72
def self.alert(exception)
  if GlobalUid.configuration.suppress_increment_exceptions?
    GlobalUid.configuration.notifier.call(exception)
  else
    raise exception
  end
end
disconnect!() click to toggle source
# File lib/global_uid/base.rb, line 29
def self.disconnect!
  servers.each(&:disconnect!) unless servers.nil?
  self.servers = nil
end
id_table_from_name(name) click to toggle source
# File lib/global_uid/base.rb, line 68
def self.id_table_from_name(name)
  "#{name}_ids".to_sym
end
init_server_info() click to toggle source
# File lib/global_uid/base.rb, line 18
def self.init_server_info
  GlobalUid.configuration.id_servers.map do |name|
    GlobalUid::Server.new(name,
      increment_by: GlobalUid.configuration.increment_by,
      connection_retry: GlobalUid.configuration.connection_retry,
      connection_timeout: GlobalUid.configuration.connection_timeout,
      query_timeout: GlobalUid.configuration.query_timeout
    )
  end.shuffle # so each process uses a random server
end
servers() click to toggle source
# File lib/global_uid/base.rb, line 9
def self.servers
  # Thread local storage is inheritted on `fork`, include the pid
  Thread.current["global_uid_servers_#{$$}"]
end
servers=(s) click to toggle source
# File lib/global_uid/base.rb, line 14
def self.servers=(s)
  Thread.current["global_uid_servers_#{$$}"] = s
end
with_servers() { |server| ... } click to toggle source
# File lib/global_uid/base.rb, line 34
def self.with_servers
  self.servers ||= init_server_info
  servers = self.servers.each(&:connect)

  if GlobalUid.configuration.connection_shuffling?
    servers.shuffle! # subsequent requests are made against different servers
  end

  errors = []
  servers.each do |server|
    begin
      yield server if server.active?
    rescue TimeoutException, Exception => e
      GlobalUid.configuration.notifier.call(e)
      errors << e
      server.disconnect!
      server.update_retry_at(1.minute)
    end
  end

  # in the case where all servers are gone, put everyone back in.
  if servers.all?(&:disconnected?)
    servers.each do |server|
      server.update_retry_at(0)
    end
    message = errors.empty? ? "" : "Errors hit: #{errors.map(&:to_s).join(', ')}"
    exception = NoServersAvailableException.new(message)
    GlobalUid.configuration.notifier.call(exception)
    raise exception
  end

  servers
end