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
- #options ⇒ Object readonly private
- #options Additional options for the node (ssl).(Additionaloptions) ⇒ 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, options = {}) ⇒ Node
constructor
private
Creat the new node.
-
#insert(database, collection, documents, options = {}) ⇒ Message
private
Insert documents into the database.
-
#inspect ⇒ String
private
Get the node as a nice formatted string.
-
#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
Refresh information about the node, such as it’s status in the replica set and it’s known peers.
-
#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, options = {}) ⇒ 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.
220 221 222 223 224 225 226 227 228 229 |
# File 'lib/moped/node.rb', line 220 def initialize(address, = {}) @address = address @options = @timeout = [:timeout] || 5 @down_at = nil @refreshed_at = nil @primary = nil @secondary = nil resolve_address 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.
16 17 18 |
# File 'lib/moped/node.rb', line 16 def address @address end |
#address The address of the node.(Theaddressofthenode.) ⇒ Object (readonly)
16 |
# File 'lib/moped/node.rb', line 16 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout, :options |
#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.
16 17 18 |
# File 'lib/moped/node.rb', line 16 def down_at @down_at end |
#down_at The time the server node went down.(Thetimetheservernodewentdown.) ⇒ Object (readonly)
16 |
# File 'lib/moped/node.rb', line 16 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout, :options |
#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.
16 17 18 |
# File 'lib/moped/node.rb', line 16 def ip_address @ip_address end |
#ip_address The node's ip.(Thenode's ip.) ⇒ Object (readonly)
16 |
# File 'lib/moped/node.rb', line 16 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout, :options |
#options ⇒ 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.
16 17 18 |
# File 'lib/moped/node.rb', line 16 def @options end |
#options Additional options for the node (ssl).(Additionaloptions) ⇒ Object (readonly)
16 |
# File 'lib/moped/node.rb', line 16 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout, :options |
#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.
16 17 18 |
# File 'lib/moped/node.rb', line 16 def peers @peers end |
#peers Other peers in the replica set.(Otherpeers) ⇒ Object (readonly)
16 |
# File 'lib/moped/node.rb', line 16 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout, :options |
#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.
16 17 18 |
# File 'lib/moped/node.rb', line 16 def port @port end |
#port The connection port.(Theconnectionport.) ⇒ Object (readonly)
16 |
# File 'lib/moped/node.rb', line 16 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout, :options |
#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.
16 17 18 |
# File 'lib/moped/node.rb', line 16 def resolved_address @resolved_address end |
#resolved_address The host/port pair.(Thehost/portpair.) ⇒ Object (readonly)
16 |
# File 'lib/moped/node.rb', line 16 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout, :options |
#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.
16 17 18 |
# File 'lib/moped/node.rb', line 16 def timeout @timeout end |
#timeout The connection timeout.(Theconnectiontimeout.) ⇒ Object (readonly)
16 |
# File 'lib/moped/node.rb', line 16 attr_reader :address, :down_at, :ip_address, :peers, :port, :resolved_address, :timeout, :options |
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?
28 29 30 |
# File 'lib/moped/node.rb', line 28 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.
43 44 45 46 47 48 49 50 51 52 |
# File 'lib/moped/node.rb', line 43 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?
315 316 317 |
# File 'lib/moped/node.rb', line 315 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.
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/moped/node.rb', line 68 def command(database, cmd, = {}) operation = Protocol::Command.new(database, cmd, ) process(operation) do |reply| result = reply.documents.first if reply.command_failure? if reply. && auth.has_key?(database) login(database, *auth[database]) command(database, cmd, ) else raise Errors::OperationFailure.new(operation, result) end end 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.
90 91 92 93 |
# File 'lib/moped/node.rb', line 90 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?
103 104 105 |
# File 'lib/moped/node.rb', line 103 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.
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 154 155 156 157 158 159 |
# File 'lib/moped/node.rb', line 120 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::PotentialReconfiguration => e if e.reconfiguring_replica_set? raise Errors::ReplicaSetReconfigured end raise rescue Errors::DoNotDisconnect # 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.
172 173 174 175 176 177 |
# File 'lib/moped/node.rb', line 172 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.
193 194 195 196 197 |
# File 'lib/moped/node.rb', line 193 def get_more(database, collection, cursor_id, limit) reply = process(Protocol::GetMore.new(database, collection, cursor_id, limit)) raise Moped::Errors::CursorNotFound.new("GET MORE", cursor_id) if reply.cursor_not_found? reply 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.
207 208 209 |
# File 'lib/moped/node.rb', line 207 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.
243 244 245 |
# File 'lib/moped/node.rb', line 243 def insert(database, collection, documents, = {}) process(Protocol::Insert.new(database, collection, documents, )) end |
#inspect ⇒ String
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 node as a nice formatted string.
464 465 466 |
# File 'lib/moped/node.rb', line 464 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.
257 258 259 |
# File 'lib/moped/node.rb', line 257 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?
271 272 273 |
# File 'lib/moped/node.rb', line 271 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?
327 328 329 |
# File 'lib/moped/node.rb', line 327 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.
285 286 287 288 289 290 291 292 293 |
# File 'lib/moped/node.rb', line 285 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?
303 304 305 |
# File 'lib/moped/node.rb', line 303 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.
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 |
# File 'lib/moped/node.rb', line 346 def query(database, collection, selector, = {}) operation = Protocol::Query.new(database, collection, selector, ) process(operation) do |reply| if reply.query_failed? if reply. && auth.has_key?(database) # If we got here, most likely this is the case of Moped # authenticating successfully against the node originally, but the # node has been reset or gone down and come back up. The most # common case here is a rs.stepDown() which will reinitialize the # connection. In this case we need to requthenticate and try again, # otherwise we'll just raise the error to the user. login(database, *auth[database]) query(database, collection, selector, ) else raise Errors::QueryFailure.new(operation, reply.documents.first) end 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.
Refresh information about the node, such as it’s status in the replica set and it’s known peers.
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 |
# File 'lib/moped/node.rb', line 382 def refresh if resolve_address begin info = command("admin", ismaster: 1) @refreshed_at = Time.now primary = true if info["ismaster"] secondary = true if info["secondary"] generate_peers(info) @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." elsif !primary && !secondary # not primary or secondary so mark it as down, since it's probably # a recovering node withing the replica set down! end rescue Timeout::Error @peers = [] down! end 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.
422 423 424 |
# File 'lib/moped/node.rb', line 422 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?
434 435 436 |
# File 'lib/moped/node.rb', line 434 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.
452 453 454 |
# File 'lib/moped/node.rb', line 452 def update(database, collection, selector, change, = {}) process(Protocol::Update.new(database, collection, selector, change, )) end |