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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cluster, nv) ⇒ Node

Initialize server node with connection parameters.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/aerospike/node.rb', line 31

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

#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?



190
191
192
# File 'lib/aerospike/node.rb', line 190

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

#active!Object

Sets node as active



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

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

#active?Boolean

Checks if the node is active

Returns:

  • (Boolean)


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

def active?
  @active.value
end

#aliasesObject



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

def aliases
  @aliases.value
end

#closeObject

Marks node as inactice and closes all cached connections



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

def close
  inactive!
  close_connections
end

#decrease_healthObject

Decrease node Health as a result of bad connection or communication



107
108
109
# File 'lib/aerospike/node.rb', line 107

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

#failed!Object



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

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

#failed?(threshold = 1) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#get_connection(timeout) ⇒ Object

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



74
75
76
77
78
79
80
81
82
# File 'lib/aerospike/node.rb', line 74

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



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

def get_host
  @host
end

#has_peers?Boolean

Returns:

  • (Boolean)


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

def has_peers?
  @peers_count.value > 0
end

#has_rack(ns, rack_id) ⇒ Object



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

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

#hashObject



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

def hash
  @name.hash
end

#inactive!Object

Sets node as inactive



127
128
129
# File 'lib/aerospike/node.rb', line 127

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

#increase_reference_count!Object



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

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

#inspectObject



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

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

#put_connection(conn) ⇒ Object

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



86
87
88
89
# File 'lib/aerospike/node.rb', line 86

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

#referenced?Boolean

Returns:

  • (Boolean)


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

def referenced?
  @reference_count.value > 0
end

#refresh_info(peers) ⇒ Object

Convenience wrappers for applying refresh operations to a node



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

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

#refresh_partitions(peers) ⇒ Object



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

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

#refresh_peers(peers) ⇒ Object



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

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

#refresh_racksObject



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

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

#refresh_resetObject



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

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

#reset_failures!Object



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

def reset_failures!
  @failures.value = 0
end

#reset_reference_count!Object



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

def reset_reference_count!
  @reference_count.value = 0
end

#reset_responded!Object



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

def reset_responded!
  @responded.value = false
end

#responded!Object



148
149
150
# File 'lib/aerospike/node.rb', line 148

def responded!
  @responded.value = true
end

#responded?Boolean

Returns:

  • (Boolean)


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

def responded?
  @responded.value == true
end

#restore_healthObject

Mark the node as healthy



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

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)


186
187
188
# File 'lib/aerospike/node.rb', line 186

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

#tend_connectionObject

Separate connection for refreshing



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

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)


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

def unhealthy?
  @health.value <= 0
end

#update_racks(parser) ⇒ Object



61
62
63
64
# File 'lib/aerospike/node.rb', line 61

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