Class: Aerospike::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/aerospike/node.rb,
lib/aerospike/node/rebalance.rb,
lib/aerospike/node/generation.rb,
lib/aerospike/node/verify/name.rb,
lib/aerospike/node/refresh/info.rb,
lib/aerospike/node/refresh/peers.rb,
lib/aerospike/node/refresh/racks.rb,
lib/aerospike/node/refresh/reset.rb,
lib/aerospike/node/refresh/failed.rb,
lib/aerospike/node/refresh/friends.rb,
lib/aerospike/node/refresh/partitions.rb,
lib/aerospike/node/verify/cluster_name.rb,
lib/aerospike/node/verify/peers_generation.rb,
lib/aerospike/node/verify/partition_generation.rb,
lib/aerospike/node/verify/rebalance_generation.rb

Defined Under Namespace

Modules: Refresh, Verify Classes: Generation, Rebalance

Constant Summary collapse

PARTITIONS =
4096
FULL_HEALTH =
100
HAS_PARTITION_SCAN =
1 << 0
HAS_QUERY_SHOW =
1 << 1
HAS_BATCH_ANY =
1 << 2
HAS_PARTITION_QUERY =
1 << 3

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cluster, nv) ⇒ Node

Initialize server node with connection parameters.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/aerospike/node.rb', line 36

def initialize(cluster, nv)
  @cluster = cluster
  @name = nv.name
  @aliases = Atomic.new(nv.aliases)
  @host = nv.host
  @features = nv.features
  @cluster_name = nv.cluster_name

  # TODO: Re-use connection from node validator
  @tend_connection = nil

  # Assign host to first IP alias because the server identifies nodes
  # by IP address (not hostname).
  @host = nv.aliases[0]
  @health = Atomic.new(FULL_HEALTH)
  @peers_count = Atomic.new(0)
  @peers_generation = ::Aerospike::Node::Generation.new
  @partition_generation = ::Aerospike::Node::Generation.new
  @rebalance_generation = ::Aerospike::Node::Rebalance.new
  @reference_count = Atomic.new(0)
  @responded = Atomic.new(false)
  @active = Atomic.new(true)
  @failures = Atomic.new(0)

  @replica_index = Atomic.new(0)
  @racks = Atomic.new(nil)

  @connections = ::Aerospike::ConnectionPool.new(cluster, host)
end

Instance Attribute Details

#clusterObject (readonly)

Returns the value of attribute cluster.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def cluster
  @cluster
end

#cluster_nameObject (readonly)

Returns the value of attribute cluster_name.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def cluster_name
  @cluster_name
end

#connectionsObject (readonly)

Returns the value of attribute connections.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def connections
  @connections
end

#failuresObject (readonly)

Returns the value of attribute failures.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def failures
  @failures
end

#featuresObject (readonly)

Returns the value of attribute features.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def features
  @features
end

#hostObject (readonly)

Returns the value of attribute host.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def host
  @host
end

#nameObject (readonly)

Returns the value of attribute name.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def name
  @name
end

#partition_generationObject (readonly)

Returns the value of attribute partition_generation.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def partition_generation
  @partition_generation
end

#peers_countObject (readonly)

Returns the value of attribute peers_count.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def peers_count
  @peers_count
end

#peers_generationObject (readonly)

Returns the value of attribute peers_generation.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def peers_generation
  @peers_generation
end

#rebalance_generationObject (readonly)

Returns the value of attribute rebalance_generation.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def rebalance_generation
  @rebalance_generation
end

#reference_countObject (readonly)

Returns the value of attribute reference_count.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def reference_count
  @reference_count
end

#respondedObject (readonly)

Returns the value of attribute responded.



25
26
27
# File 'lib/aerospike/node.rb', line 25

def responded
  @responded
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



214
215
216
# File 'lib/aerospike/node.rb', line 214

def ==(other)
  other && other.is_a?(Node) && (@name == other.name)
end

#active!Object

Sets node as active



146
147
148
# File 'lib/aerospike/node.rb', line 146

def active!
  @active.update { |_| true }
end

#active?Boolean

Checks if the node is active

Returns:

  • (Boolean)


156
157
158
# File 'lib/aerospike/node.rb', line 156

def active?
  @active.value
end

#aliasesObject



200
201
202
# File 'lib/aerospike/node.rb', line 200

def aliases
  @aliases.value
end

#closeObject

Marks node as inactice and closes all cached connections



205
206
207
208
# File 'lib/aerospike/node.rb', line 205

def close
  inactive!
  close_connections
end

#decrease_healthObject

Decrease node Health as a result of bad connection or communication



131
132
133
# File 'lib/aerospike/node.rb', line 131

def decrease_health
  @health.update { |v| v - 1 }
end

#failed!Object



192
193
194
# File 'lib/aerospike/node.rb', line 192

def failed!
  @failures.update { |v| v + 1 }
end

#failed?(threshold = 1) ⇒ Boolean

Returns:

  • (Boolean)


188
189
190
# File 'lib/aerospike/node.rb', line 188

def failed?(threshold = 1)
  @failures.value >= threshold
end

#fill_connection_pool_up_to(min_connection_size) ⇒ Object



85
86
87
88
89
90
91
92
93
94
# File 'lib/aerospike/node.rb', line 85

def fill_connection_pool_up_to(min_connection_size)
  current_number_of_connections = @connections.length
  if min_connection_size > 0
    while current_number_of_connections < min_connection_size
      conn = @connections.create
      @connections.offer(conn)
      current_number_of_connections += 1
    end
  end
end

#get_connection(timeout) ⇒ Object

Get a connection to the node. If no cached connection is not available, a new connection will be created



98
99
100
101
102
103
104
105
106
# File 'lib/aerospike/node.rb', line 98

def get_connection(timeout)
  loop do
    conn = @connections.poll
    if conn.connected?
      conn.timeout = timeout.to_f
      return conn
    end
  end
end

#get_hostObject

Retrieves host for the node



141
142
143
# File 'lib/aerospike/node.rb', line 141

def get_host
  @host
end

#has_peers?Boolean

Returns:

  • (Boolean)


184
185
186
# File 'lib/aerospike/node.rb', line 184

def has_peers?
  @peers_count.value > 0
end

#has_rack(ns, rack_id) ⇒ Object



79
80
81
82
83
# File 'lib/aerospike/node.rb', line 79

def has_rack(ns, rack_id)
  racks = @racks.value
  return false if !racks
  racks[ns] == rack_id
end

#hashObject



219
220
221
# File 'lib/aerospike/node.rb', line 219

def hash
  @name.hash
end

#inactive!Object

Sets node as inactive



151
152
153
# File 'lib/aerospike/node.rb', line 151

def inactive!
  @active.update { |_| false }
end

#increase_reference_count!Object



160
161
162
# File 'lib/aerospike/node.rb', line 160

def increase_reference_count!
  @reference_count.update { |v| v + 1 }
end

#inspectObject



223
224
225
# File 'lib/aerospike/node.rb', line 223

def inspect
  "#<Aerospike::Node: @name=#{@name}, @host=#{@host}>"
end

#partition_query?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/aerospike/node.rb', line 66

def partition_query?
  (@features & HAS_PARTITION_QUERY) != 0
end

#put_connection(conn) ⇒ Object

Put back a connection to the cache. If cache is full, the connection will be closed and discarded



110
111
112
113
# File 'lib/aerospike/node.rb', line 110

def put_connection(conn)
  conn.close if !active?
  @connections.offer(conn)
end

#query_show?Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/aerospike/node.rb', line 70

def query_show?
  (@features & HAS_QUERY_SHOW) != 0
end

#referenced?Boolean

Returns:

  • (Boolean)


168
169
170
# File 'lib/aerospike/node.rb', line 168

def referenced?
  @reference_count.value > 0
end

#refresh_info(peers) ⇒ Object

Convenience wrappers for applying refresh operations to a node



231
232
233
# File 'lib/aerospike/node.rb', line 231

def refresh_info(peers)
  Node::Refresh::Info.(self, peers)
end

#refresh_partitions(peers) ⇒ Object



235
236
237
# File 'lib/aerospike/node.rb', line 235

def refresh_partitions(peers)
  Node::Refresh::Partitions.(self, peers)
end

#refresh_peers(peers) ⇒ Object



243
244
245
# File 'lib/aerospike/node.rb', line 243

def refresh_peers(peers)
  Node::Refresh::Peers.(self, peers)
end

#refresh_racksObject



239
240
241
# File 'lib/aerospike/node.rb', line 239

def refresh_racks()
  Node::Refresh::Racks.(self)
end

#refresh_resetObject



247
248
249
# File 'lib/aerospike/node.rb', line 247

def refresh_reset
  Node::Refresh::Reset.(self)
end

#reset_failures!Object



196
197
198
# File 'lib/aerospike/node.rb', line 196

def reset_failures!
  @failures.value = 0
end

#reset_reference_count!Object



164
165
166
# File 'lib/aerospike/node.rb', line 164

def reset_reference_count!
  @reference_count.value = 0
end

#reset_responded!Object



180
181
182
# File 'lib/aerospike/node.rb', line 180

def reset_responded!
  @responded.value = false
end

#responded!Object



172
173
174
# File 'lib/aerospike/node.rb', line 172

def responded!
  @responded.value = true
end

#responded?Boolean

Returns:

  • (Boolean)


176
177
178
# File 'lib/aerospike/node.rb', line 176

def responded?
  @responded.value == true
end

#restore_healthObject

Mark the node as healthy



124
125
126
127
128
# File 'lib/aerospike/node.rb', line 124

def restore_health
  # There can be cases where health is full, but active is false.
  # Once a node has been marked inactive, it stays inactive.
  @health.value = FULL_HEALTH
end

#supports_feature?(feature) ⇒ Boolean

Returns:

  • (Boolean)


210
211
212
# File 'lib/aerospike/node.rb', line 210

def supports_feature?(feature)
  @features.include?(feature.to_s)
end

#tend_connectionObject

Separate connection for refreshing



116
117
118
119
120
121
# File 'lib/aerospike/node.rb', line 116

def tend_connection
  if @tend_connection.nil? || @tend_connection.closed?
    @tend_connection = Cluster::CreateConnection.(cluster, host)
  end
  @tend_connection
end

#unhealthy?Boolean

Check if the node is unhealthy

Returns:

  • (Boolean)


136
137
138
# File 'lib/aerospike/node.rb', line 136

def unhealthy?
  @health.value <= 0
end

#update_racks(parser) ⇒ Object



74
75
76
77
# File 'lib/aerospike/node.rb', line 74

def update_racks(parser)
  new_racks = parser.update_racks
  @racks.value = new_racks if new_racks
end