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?



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



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)


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

def active?
  @active.value
end

#aliasesObject



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

def aliases
  @aliases.value
end

#batch_any?Boolean

Returns:

  • (Boolean)


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



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



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

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

#failed!Object



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

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

#failed?(threshold = 1) ⇒ Boolean

Returns:

  • (Boolean)


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



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



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



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

def get_host
  @host
end

#has_peers?Boolean

Returns:

  • (Boolean)


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

def has_peers?
  @peers_count.value > 0
end

#has_rack(ns, rack_id) ⇒ Object



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



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

def hash
  @name.hash
end

#inactive!Object

Sets node as inactive



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

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

#increase_reference_count!Object



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

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

#inspectObject



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

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



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)


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

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

#referenced?Boolean

Returns:

  • (Boolean)


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



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

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

#refresh_partitions(peers) ⇒ Object



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

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

#refresh_peers(peers) ⇒ Object



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

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

#refresh_racksObject



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

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

#refresh_resetObject



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

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

#reset_failures!Object



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

def reset_failures!
  @failures.value = 0
end

#reset_reference_count!Object



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

def reset_reference_count!
  @reference_count.value = 0
end

#reset_responded!Object



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

def reset_responded!
  @responded.value = false
end

#responded!Object



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

def responded!
  @responded.value = true
end

#responded?Boolean

Returns:

  • (Boolean)


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

def responded?
  @responded.value == true
end

#restore_healthObject

Mark the node as healthy



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)


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



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)


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

def unhealthy?
  @health.value <= 0
end

#update_racks(parser) ⇒ Object



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