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
more...

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.

[View source]

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?

[View source]

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

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

#active!Object

Sets node as active

[View source]

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

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

#active?Boolean

Checks if the node is active

Returns:

  • (Boolean)
[View source]

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

def active?
  @active.value
end

#aliasesObject

[View source]

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

def aliases
  @aliases.value
end

#batch_any?Boolean

Returns:

  • (Boolean)
[View source]

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

def batch_any?
  (@features & HAS_BATCH_ANY) != 0
end

#closeObject

Marks node as inactice and closes all cached connections

[View source]

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

def close
  inactive!
  close_connections
end

#decrease_healthObject

Decrease node Health as a result of bad connection or communication

[View source]

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

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

#failed!Object

[View source]

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

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

#failed?(threshold = 1) ⇒ Boolean

Returns:

  • (Boolean)
[View source]

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

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

#fill_connection_pool_up_to(min_connection_size) ⇒ Object

[View source]

89
90
91
92
93
94
95
96
97
98
# File 'lib/aerospike/node.rb', line 89

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

[View source]

102
103
104
105
106
107
108
109
110
# File 'lib/aerospike/node.rb', line 102

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

[View source]

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

def get_host
  @host
end

#has_peers?Boolean

Returns:

  • (Boolean)
[View source]

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

def has_peers?
  @peers_count.value > 0
end

#has_rack(ns, rack_id) ⇒ Object

[View source]

83
84
85
86
87
# File 'lib/aerospike/node.rb', line 83

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

#hashObject

[View source]

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

def hash
  @name.hash
end

#inactive!Object

Sets node as inactive

[View source]

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

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

#increase_reference_count!Object

[View source]

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

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

#inspectObject

[View source]

227
228
229
# File 'lib/aerospike/node.rb', line 227

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

#partition_query?Boolean

Returns:

  • (Boolean)
[View source]

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

[View source]

114
115
116
117
# File 'lib/aerospike/node.rb', line 114

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

#query_show?Boolean

Returns:

  • (Boolean)
[View source]

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

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

#referenced?Boolean

Returns:

  • (Boolean)
[View source]

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

def referenced?
  @reference_count.value > 0
end

#refresh_info(peers) ⇒ Object

Convenience wrappers for applying refresh operations to a node

[View source]

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

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

#refresh_partitions(peers) ⇒ Object

[View source]

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

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

#refresh_peers(peers) ⇒ Object

[View source]

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

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

#refresh_racksObject

[View source]

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

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

#refresh_resetObject

[View source]

251
252
253
# File 'lib/aerospike/node.rb', line 251

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

#reset_failures!Object

[View source]

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

def reset_failures!
  @failures.value = 0
end

#reset_reference_count!Object

[View source]

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

def reset_reference_count!
  @reference_count.value = 0
end

#reset_responded!Object

[View source]

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

def reset_responded!
  @responded.value = false
end

#responded!Object

[View source]

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

def responded!
  @responded.value = true
end

#responded?Boolean

Returns:

  • (Boolean)
[View source]

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

def responded?
  @responded.value == true
end

#restore_healthObject

Mark the node as healthy

[View source]

128
129
130
131
132
# File 'lib/aerospike/node.rb', line 128

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)
[View source]

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

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

#tend_connectionObject

Separate connection for refreshing

[View source]

120
121
122
123
124
125
# File 'lib/aerospike/node.rb', line 120

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)
[View source]

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

def unhealthy?
  @health.value <= 0
end

#update_racks(parser) ⇒ Object

[View source]

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

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