Class: Moped::Node Private
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Represents a client to a node in a server cluster.
Instance Attribute Summary collapse
- #address ⇒ Object readonly private
- #address The address of the node.(Theaddressofthenode.) ⇒ Object readonly
- #down_at ⇒ Object readonly private
- #down_at The time the server node went down.(Thetimetheservernodewentdown.) ⇒ Object readonly
- #ip_address ⇒ Object readonly private
- #ip_address The node's ip.(Thenode's ip.) ⇒ Object readonly
- #peers ⇒ Object readonly private
- #peers Other peers in the replica set.(Otherpeers) ⇒ Object readonly
- #port ⇒ Object readonly private
- #port The connection port.(Theconnectionport.) ⇒ Object readonly
- #resolved_address ⇒ Object readonly private
- #resolved_address The host/port pair.(Thehost/portpair.) ⇒ Object readonly
- #timeout ⇒ Object readonly private
- #timeout The connection timeout.(Theconnectiontimeout.) ⇒ Object readonly
Instance Method Summary collapse
-
#==(other) ⇒ true, false
(also: #eql?)
private
Is this node equal to another?.
-
#apply_auth(credentials) ⇒ Node
private
Apply the authentication details to this node.
-
#arbiter? ⇒ true, false
private
Is the node an arbiter?.
-
#command(database, cmd, options = {}) ⇒ Hash
private
Execute a command against a database.
-
#disconnect ⇒ nil
private
Force the node to disconnect from the server.
-
#down? ⇒ Time?
private
Is the node down?.
-
#ensure_connected ⇒ nil
private
Yields the block if a connection can be established, retrying when a connection error is raised.
-
#ensure_primary ⇒ nil
private
Set a flag on the node for the duration of provided block so that an exception is raised if the node is no longer the primary node.
-
#get_more(database, collection, cursor_id, limit) ⇒ Message
private
Execute a get more operation on the node.
-
#hash ⇒ Integer
private
Get the hash identifier for the node.
-
#initialize(address) ⇒ Node
constructor
private
Creat the new node.
-
#insert(database, collection, documents, options = {}) ⇒ Message
private
Insert documents into the database.
- #inspect ⇒ Object private
-
#kill_cursors(cursor_ids) ⇒ Message
private
Kill all provided cursors on the node.
-
#needs_refresh?(time) ⇒ true, false
private
Does the node need to be refreshed?.
-
#passive? ⇒ true, false
private
Is the node passive?.
-
#pipeline ⇒ nil
private
Execute a pipeline of commands, for example a safe mode persist.
-
#primary? ⇒ true, false
private
Is the node the replica set primary?.
-
#query(database, collection, selector, options = {}) ⇒ Message
private
Execute a query on the node.
-
#refresh ⇒ nil
private
Nil.
-
#remove(database, collection, selector, options = {}) ⇒ Message
private
Execute a remove command for the provided selector.
-
#secondary? ⇒ true, false
private
Is the node a replica set secondary?.
-
#update(database, collection, selector, change, options = {}) ⇒ Message
private
Execute an update command for the provided selector.
Constructor Details
#initialize(address) ⇒ Node
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Creat the new node.
210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
# File 'lib/moped/node.rb', line 210 def initialize(address) @address = address host, port = address.split(":") @ip_address = ::Socket.getaddrinfo(host, nil, ::Socket::AF_INET, ::Socket::SOCK_STREAM).first[3] @port = port.to_i @resolved_address = "#{@ip_address}:#{@port}" @timeout = 5 @down_at = nil @refreshed_at = nil @primary = nil @secondary = nil end |
Instance Attribute Details
#address ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
15 16 17 |
# File 'lib/moped/node.rb', line 15 def address @address end |
#address The address of the node.(Theaddressofthenode.) ⇒ Object (readonly)
15 |
# File 'lib/moped/node.rb', line 15 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout |
#down_at ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
15 16 17 |
# File 'lib/moped/node.rb', line 15 def down_at @down_at end |
#down_at The time the server node went down.(Thetimetheservernodewentdown.) ⇒ Object (readonly)
15 |
# File 'lib/moped/node.rb', line 15 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout |
#ip_address ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
15 16 17 |
# File 'lib/moped/node.rb', line 15 def ip_address @ip_address end |
#ip_address The node's ip.(Thenode's ip.) ⇒ Object (readonly)
15 |
# File 'lib/moped/node.rb', line 15 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout |
#peers ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
15 16 17 |
# File 'lib/moped/node.rb', line 15 def peers @peers end |
#peers Other peers in the replica set.(Otherpeers) ⇒ Object (readonly)
15 |
# File 'lib/moped/node.rb', line 15 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout |
#port ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
15 16 17 |
# File 'lib/moped/node.rb', line 15 def port @port end |
#port The connection port.(Theconnectionport.) ⇒ Object (readonly)
15 |
# File 'lib/moped/node.rb', line 15 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout |
#resolved_address ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
15 16 17 |
# File 'lib/moped/node.rb', line 15 def resolved_address @resolved_address end |
#resolved_address The host/port pair.(Thehost/portpair.) ⇒ Object (readonly)
15 |
# File 'lib/moped/node.rb', line 15 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout |
#timeout ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
15 16 17 |
# File 'lib/moped/node.rb', line 15 def timeout @timeout end |
#timeout The connection timeout.(Theconnectiontimeout.) ⇒ Object (readonly)
15 |
# File 'lib/moped/node.rb', line 15 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout |
Instance Method Details
#==(other) ⇒ true, false Also known as: eql?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Is this node equal to another?
27 28 29 |
# File 'lib/moped/node.rb', line 27 def ==(other) resolved_address == other.resolved_address end |
#apply_auth(credentials) ⇒ Node
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Apply the authentication details to this node.
42 43 44 45 46 47 48 49 50 51 |
# File 'lib/moped/node.rb', line 42 def apply_auth(credentials) unless auth == credentials logouts = auth.keys - credentials.keys logouts.each { |database| logout(database) } credentials.each do |database, (username, password)| login(database, username, password) unless auth[database] == [username, password] end end self end |
#arbiter? ⇒ true, false
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Is the node an arbiter?
309 310 311 |
# File 'lib/moped/node.rb', line 309 def arbiter? @arbiter end |
#command(database, cmd, options = {}) ⇒ Hash
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Execute a command against a database.
67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/moped/node.rb', line 67 def command(database, cmd, = {}) operation = Protocol::Command.new(database, cmd, ) process(operation) do |reply| result = reply.documents[0] raise Errors::OperationFailure.new( operation, result ) if result["ok"] != 1 || result["err"] || result["errmsg"] result end end |
#disconnect ⇒ nil
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Force the node to disconnect from the server.
84 85 86 87 |
# File 'lib/moped/node.rb', line 84 def disconnect auth.clear connection.disconnect end |
#down? ⇒ Time?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Is the node down?
97 98 99 |
# File 'lib/moped/node.rb', line 97 def down? @down_at end |
#ensure_connected ⇒ nil
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Yields the block if a connection can be established, retrying when a connection error is raised.
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/moped/node.rb', line 114 def ensure_connected # Don't run the reconnection login if we're already inside an # +ensure_connected+ block. return yield if Threaded.executing?(:connection) Threaded.begin(:connection) retry_on_failure = true begin connect unless connected? yield rescue Errors::ReplicaSetReconfigured # Someone else wrapped this in an #ensure_primary block, so let the # reconfiguration exception bubble up. raise rescue Errors::OperationFailure, Errors::AuthenticationFailure, Errors::QueryFailure # These exceptions are "expected" in the normal course of events, and # don't necessitate disconnecting. raise rescue Errors::ConnectionFailure disconnect if retry_on_failure # Maybe there was a hiccup -- try reconnecting one more time retry_on_failure = false retry else # Nope, we failed to connect twice. Flag the node as down and re-raise # the exception. down! raise end rescue # Looks like we got an unexpected error, so we'll clean up the connection # and re-raise the exception. disconnect raise $!.extend(Errors::SocketError) end ensure Threaded.end(:connection) end |
#ensure_primary ⇒ nil
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Set a flag on the node for the duration of provided block so that an exception is raised if the node is no longer the primary node.
166 167 168 169 170 171 |
# File 'lib/moped/node.rb', line 166 def ensure_primary Threaded.begin(:ensure_primary) yield ensure Threaded.end(:ensure_primary) end |
#get_more(database, collection, cursor_id, limit) ⇒ Message
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Execute a get more operation on the node.
186 187 188 |
# File 'lib/moped/node.rb', line 186 def get_more(database, collection, cursor_id, limit) process(Protocol::GetMore.new(database, collection, cursor_id, limit)) end |
#hash ⇒ Integer
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Get the hash identifier for the node.
198 199 200 |
# File 'lib/moped/node.rb', line 198 def hash resolved_address.hash end |
#insert(database, collection, documents, options = {}) ⇒ Message
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Insert documents into the database.
237 238 239 |
# File 'lib/moped/node.rb', line 237 def insert(database, collection, documents, = {}) process(Protocol::Insert.new(database, collection, documents, )) end |
#inspect ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
435 436 437 |
# File 'lib/moped/node.rb', line 435 def inspect "<#{self.class.name} resolved_address=#{@resolved_address.inspect}>" end |
#kill_cursors(cursor_ids) ⇒ Message
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Kill all provided cursors on the node.
251 252 253 |
# File 'lib/moped/node.rb', line 251 def kill_cursors(cursor_ids) process(Protocol::KillCursors.new(cursor_ids)) end |
#needs_refresh?(time) ⇒ true, false
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Does the node need to be refreshed?
265 266 267 |
# File 'lib/moped/node.rb', line 265 def needs_refresh?(time) !@refreshed_at || @refreshed_at < time end |
#passive? ⇒ true, false
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Is the node passive?
321 322 323 |
# File 'lib/moped/node.rb', line 321 def passive? @passive end |
#pipeline ⇒ nil
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Execute a pipeline of commands, for example a safe mode persist.
279 280 281 282 283 284 285 286 287 |
# File 'lib/moped/node.rb', line 279 def pipeline Threaded.begin(:pipeline) begin yield ensure Threaded.end(:pipeline) end flush unless Threaded.executing?(:pipeline) end |
#primary? ⇒ true, false
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Is the node the replica set primary?
297 298 299 |
# File 'lib/moped/node.rb', line 297 def primary? @primary end |
#query(database, collection, selector, options = {}) ⇒ Message
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Execute a query on the node.
340 341 342 343 344 345 346 347 348 349 |
# File 'lib/moped/node.rb', line 340 def query(database, collection, selector, = {}) operation = Protocol::Query.new(database, collection, selector, ) process operation do |reply| if reply.flags.include?(:query_failure) raise Errors::QueryFailure.new(operation, reply.documents.first) end reply end end |
#refresh ⇒ nil
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns nil.
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 |
# File 'lib/moped/node.rb', line 365 def refresh info = command("admin", ismaster: 1) @refreshed_at = Time.now primary = true if info["ismaster"] secondary = true if info["secondary"] peers = [] peers.push(info["primary"]) if info["primary"] peers.concat(info["hosts"]) if info["hosts"] peers.concat(info["passives"]) if info["passives"] peers.concat(info["arbiters"]) if info["arbiters"] @peers = peers.map { |peer| Node.new(peer) } @primary, @secondary = primary, secondary @arbiter = info["arbiterOnly"] @passive = info["passive"] if !primary && Threaded.executing?(:ensure_primary) raise Errors::ReplicaSetReconfigured, "#{inspect} is no longer the primary node." end end |
#remove(database, collection, selector, options = {}) ⇒ Message
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Execute a remove command for the provided selector.
401 402 403 |
# File 'lib/moped/node.rb', line 401 def remove(database, collection, selector, = {}) process(Protocol::Delete.new(database, collection, selector, )) end |
#secondary? ⇒ true, false
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Is the node a replica set secondary?
413 414 415 |
# File 'lib/moped/node.rb', line 413 def secondary? @secondary end |
#update(database, collection, selector, change, options = {}) ⇒ Message
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Execute an update command for the provided selector.
431 432 433 |
# File 'lib/moped/node.rb', line 431 def update(database, collection, selector, change, = {}) process(Protocol::Update.new(database, collection, selector, change, )) end |