From 56c1bf11da2c4a8843750e4880db5dd8e95e4614 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Fri, 17 Jul 2026 15:16:26 -0700 Subject: [PATCH 1/4] return retry when EOFError exception is caught --- lib/splitclient-rb/sse/event_source/client.rb | 4 +-- spec/sse/event_source/client_spec.rb | 29 ++++++++++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 14c33914..f8a28ada 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -10,7 +10,7 @@ module SSE module EventSource class Client DEFAULT_READ_TIMEOUT = 70 - CONNECT_TIMEOUT = 30_000 + CONNECT_TIMEOUT = 30 OK_CODE = 200 KEEP_ALIVE_RESPONSE = "c\r\n:keepalive\n\n\r\n".freeze ERROR_EVENT_TYPE = 'error'.freeze @@ -108,7 +108,7 @@ def connect_stream(latch) return Constants::PUSH_RETRYABLE_ERROR rescue EOFError => e @config.logger.error("SSE read operation EOF Exception!: #{e.inspect}") - raise 'eof exception' + return Constants::PUSH_RETRYABLE_ERROR rescue Errno::EBADF, IOError => e @config.logger.error("SSE read operation EBADF or IOError: #{e.inspect}") return Constants::PUSH_RETRYABLE_ERROR diff --git a/spec/sse/event_source/client_spec.rb b/spec/sse/event_source/client_spec.rb index e2665fa4..ca14cc47 100644 --- a/spec/sse/event_source/client_spec.rb +++ b/spec/sse/event_source/client_spec.rb @@ -285,10 +285,6 @@ sse_client.send(:connect_stream, latch) expect(log.string).to include 'SSE read operation timed out!' - allow(sse_client).to receive(:read_first_event).and_raise(EOFError) - expect { sse_client.send(:connect_stream, latch) }.to raise_error(RuntimeError) - expect(log.string).to include 'SSE read operation EOF Exception!' - allow(sse_client).to receive(:read_first_event).and_raise(Errno::EBADF) sse_client.send(:connect_stream, latch) expect(log.string).to include 'SSE read operation EBADF or IOError' @@ -305,6 +301,31 @@ end end + it 'test retry with EofError exceptions' do + mock_server do |server| + server.setup_response('/') do |_, res| + send_stream_content(res, event_occupancy) + end + start_workers + + sse_client = subject.new(config, api_token, telemetry_runtime_producer, event_parser, notification_manager_keeper, notification_processor, push_status_queue) + + sse_client.instance_variable_set(:@uri, URI(server.base_uri)) + latch = Concurrent::CountDownLatch.new(1) + + allow(sse_client).to receive(:read_first_event).and_raise(EOFError) + sleep(1) + thr1 = Thread.new do + sse_client.send(:connect_stream, latch) + end + sleep(1) + allow(sse_client).to receive(:read_first_event).and_return(true) + expect(log.string).to include 'SSE read operation EOF Exception' + + stop_workers + end + end + it 'test retry with EAGAIN exceptions' do mock_server do |server| server.setup_response('/') do |_, res| From fd73afaf9e6ae8fd09e7d38458e8aa8a75b211fa Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Fri, 17 Jul 2026 15:33:54 -0700 Subject: [PATCH 2/4] removed raising eof exception --- lib/splitclient-rb/sse/event_source/client.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index f8a28ada..b66869a5 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -94,7 +94,7 @@ def connect_stream(latch) partial_data = @socket.readpartial(10_000) read_first_event(partial_data, latch) - raise 'eof exception' if partial_data == :eof + return Constants::PUSH_RETRYABLE_ERROR if partial_data == :eof rescue IO::WaitReadable => e @config.logger.debug("SSE client IO::WaitReadable transient error: #{e.inspect}") if @config.debug_enabled IO.select([@socket], nil, nil, @read_timeout) @@ -126,8 +126,6 @@ def connect_stream(latch) rescue Errno::EBADF @config.logger.debug("SSE socket is not connected (Errno::EBADF)") if @config.debug_enabled break - rescue RuntimeError - raise 'eof exception' rescue Exception => e @config.logger.debug("SSE socket is not connected: #{e.inspect}") if @config.debug_enabled break From 301c552f1943026b423152658d22f72ecd7f46cf Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Fri, 17 Jul 2026 16:14:35 -0700 Subject: [PATCH 3/4] added logging --- lib/splitclient-rb/sse/event_source/client.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index b66869a5..ec97acbe 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -94,7 +94,9 @@ def connect_stream(latch) partial_data = @socket.readpartial(10_000) read_first_event(partial_data, latch) - return Constants::PUSH_RETRYABLE_ERROR if partial_data == :eof + if partial_data == :eof + @config.logger.error("SSE recived EOF unexpectedly") + return Constants::PUSH_RETRYABLE_ERROR rescue IO::WaitReadable => e @config.logger.debug("SSE client IO::WaitReadable transient error: #{e.inspect}") if @config.debug_enabled IO.select([@socket], nil, nil, @read_timeout) From 700852f5cb5bf69c23e36a6e927a7b6b7cc85c07 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Fri, 17 Jul 2026 16:17:06 -0700 Subject: [PATCH 4/4] fixed if block --- lib/splitclient-rb/sse/event_source/client.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index ec97acbe..74c0cfc3 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -96,7 +96,8 @@ def connect_stream(latch) if partial_data == :eof @config.logger.error("SSE recived EOF unexpectedly") - return Constants::PUSH_RETRYABLE_ERROR + return Constants::PUSH_RETRYABLE_ERROR + end rescue IO::WaitReadable => e @config.logger.debug("SSE client IO::WaitReadable transient error: #{e.inspect}") if @config.debug_enabled IO.select([@socket], nil, nil, @read_timeout)