Method: Synapse::ServiceWatcher::BaseWatcher#backends

Defined in:
lib/synapse/service_watcher/base.rb

#backendsObject



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/synapse/service_watcher/base.rb', line 82

def backends
  filtered = backends_filtered_by_labels

  if @leader_election
    failure_warning = nil
    if filtered.empty?
      failure_warning = "synapse: service #{@name}: leader election failed: no backends to choose from"
    end

    all_backends_have_ids = filtered.all?{|b| b.key?('id') && b['id']}
    unless all_backends_have_ids
      failure_warning = "synapse: service #{@name}: leader election failed; not all backends include an id"
    end

    # no problems encountered, lets do the leader election
    if failure_warning.nil?
      smallest = filtered.sort_by{ |b| b['id']}.first
      log.debug "synapse: leader election chose one of #{filtered.count} backends " \
        "(#{smallest['host']}:#{smallest['port']} with id #{smallest['id']})"

      return [smallest]

    # we had some sort of problem, lets log about it
    elsif (Time.now - @leader_last_warn) > LEADER_WARN_INTERVAL
      @leader_last_warn = Time.now
      log.warn failure_warning
      return []
    end
  end

  return filtered
end