@@ -12,14 +12,18 @@ module XymonClient
1212 # (port default to 1984)
1313 class Client
1414 attr_reader :servers
15+ attr_accessor :retry_count
16+ attr_accessor :retry_interval
1517
16- def initialize ( servers = [ ] )
18+ def initialize ( servers = [ ] , retry_count = 3 , retry_interval = 5 )
1719 @servers = \
1820 if servers . empty?
1921 XymonClient ::ServerDiscovery . find_from_file
2022 else
2123 _parse_servers ( servers )
2224 end
25+ @retry_count = retry_count
26+ @retry_interval = retry_interval
2327 end
2428
2529 def status ( host , service , status , message , lifetime = '30m' )
@@ -65,21 +69,40 @@ def ack(host, service, duration, message)
6569 unless XymonClient . valid_duration? ( duration )
6670 cookies = board ( host , service , [ 'cookie' ] )
6771 @servers . each do |server |
72+ next if cookies [ server ] . to_i == -1
6873 _send (
6974 server ,
7075 "xymondack #{ cookies [ server ] . to_i } #{ duration } #{ message } "
71- ) if cookies [ server ] . to_i != - 1
76+ )
7277 end
7378 end
7479
7580 private
7681
7782 def _send_to_all ( message )
78- @servers . each { |server | _send ( server , message ) }
83+ fail_srv = [ ]
84+ send_result = true
85+ @servers . each do |server |
86+ retry_count = 0
87+ begin
88+ _send ( server , message )
89+ rescue
90+ if retry_count < @retry_count || @retry_count == -1
91+ sleep @retry_interval
92+ retry_count += 1
93+ retry
94+ else
95+ send_result = false
96+ fail_srv << server
97+ end
98+ end
99+ end
100+ raise XymonClient ::SendFailure if fail_srv . count == @servers . count
101+ raise XymonClient ::PartialSendFailure , fail_srv \
102+ if ( 1 ..@servers . count - 1 ) . cover? ( fail_srv . count )
79103 end
80104
81105 def _send ( server , message )
82- # TODO: validate response from all servers ( and retry ?)
83106 socket = TCPSocket . open ( server [ :host ] , server [ :port ] )
84107 socket . puts message
85108 socket . close_write
0 commit comments