Class: Sequel::ShardedSingleConnectionPool

Inherits:
ConnectionPool show all
Defined in:
lib/sequel/connection_pool/sharded_single.rb

Overview

A ShardedSingleConnectionPool is a single threaded connection pool that works with multiple shards/servers.

Constant Summary

Constants inherited from ConnectionPool

ConnectionPool::OPTS, ConnectionPool::POOL_CLASS_MAP

Instance Attribute Summary

Attributes inherited from ConnectionPool

#after_connect, #connect_sqls, #db

Instance Method Summary collapse

Methods included from ConnectionPool::ClassMethods

#get_pool

Constructor Details

#initialize(db, opts = OPTS) ⇒ ShardedSingleConnectionPool

The single threaded pool takes the following options:

:servers

A hash of servers to use. Keys should be symbols. If not present, will use a single :default server.

:servers_hash

The base hash to use for the servers. By default, Sequel uses Hash.new(:default). You can use a hash with a default proc that raises an error if you want to catch all cases where a nonexistent server is used.



14
15
16
17
18
19
20
# File 'lib/sequel/connection_pool/sharded_single.rb', line 14

def initialize(db, opts=OPTS)
  super
  @conns = {}
  @servers = opts.fetch(:servers_hash, Hash.new(:default))
  add_servers([:default])
  add_servers(opts[:servers].keys) if opts[:servers]
end

Instance Method Details

#add_servers(servers) ⇒ Object

Adds new servers to the connection pool. Primarily used in conjunction with primary/replica or sharded configurations. Allows for dynamic expansion of the potential replicas/shards at runtime. servers argument should be an array of symbols.



25
26
27
# File 'lib/sequel/connection_pool/sharded_single.rb', line 25

def add_servers(servers)
  servers.each{|s| @servers[s] = s}
end

#all_connectionsObject

Yield all of the currently established connections



30
31
32
# File 'lib/sequel/connection_pool/sharded_single.rb', line 30

def all_connections
  @conns.values.each{|c| yield c}
end

#conn(server = :default) ⇒ Object

The connection for the given server.



35
36
37
# File 'lib/sequel/connection_pool/sharded_single.rb', line 35

def conn(server=:default)
  @conns[@servers[server]]
end

#disconnect(opts = OPTS) ⇒ Object

Disconnects from the database. Once a connection is requested using #hold, the connection is reestablished. Options:

:server

Should be a symbol specifing the server to disconnect from, or an array of symbols to specify multiple servers.



43
44
45
46
47
48
# File 'lib/sequel/connection_pool/sharded_single.rb', line 43

def disconnect(opts=OPTS)
  (opts[:server] ? Array(opts[:server]) : servers).each do |s|
    raise Sequel::Error, "invalid server: #{s}" unless @servers.has_key?(s)
    disconnect_server(s)
  end
end

#freezeObject



50
51
52
53
# File 'lib/sequel/connection_pool/sharded_single.rb', line 50

def freeze
  @servers.freeze
  super
end

#hold(server = :default) ⇒ Object

Yields the connection to the supplied block for the given server. This method simulates the ConnectionPool#hold API.



57
58
59
60
61
62
63
# File 'lib/sequel/connection_pool/sharded_single.rb', line 57

def hold(server=:default)
  server = pick_server(server)
  yield(@conns[server] ||= make_new(server))
rescue Sequel::DatabaseDisconnectError, *@error_classes => e
  disconnect_server(server) if disconnect_error?(e)
  raise
end

#max_sizeObject

The ShardedSingleConnectionPool always has a maximum size of 1.



66
67
68
# File 'lib/sequel/connection_pool/sharded_single.rb', line 66

def max_size
  1
end

#pool_typeObject



91
92
93
# File 'lib/sequel/connection_pool/sharded_single.rb', line 91

def pool_type
  :sharded_single
end

#remove_servers(servers) ⇒ Object

Remove servers from the connection pool. Similar to disconnecting from all given servers, except that after it is used, future requests for the server will use the :default server instead.

Raises:



73
74
75
76
77
78
79
# File 'lib/sequel/connection_pool/sharded_single.rb', line 73

def remove_servers(servers)
  raise(Sequel::Error, "cannot remove default server") if servers.include?(:default)
  servers.each do |server|
    disconnect_server(server)
    @servers.delete(server)
  end
end

#serversObject

Return an array of symbols for servers in the connection pool.



82
83
84
# File 'lib/sequel/connection_pool/sharded_single.rb', line 82

def servers
  @servers.keys
end

#sizeObject

The number of different shards/servers this pool is connected to.



87
88
89
# File 'lib/sequel/connection_pool/sharded_single.rb', line 87

def size
  @conns.length
end