From 514e6e07be9bfcea9758019d01daf1730e52e1c3 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 9 Oct 2025 21:11:41 -0700 Subject: [PATCH 01/21] replace socketry with socket for sse client --- lib/splitclient-rb/sse/event_source/client.rb | 41 +++++++++++++++---- lib/splitclient-rb/version.rb | 2 +- splitclient-rb.gemspec | 1 - 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 022894d6..7d63ad74 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -1,7 +1,9 @@ # frozen_string_literal: false -require 'socketry' +require 'socket' +require 'openssl' require 'uri' +require 'timeout' module SplitIoClient module SSE @@ -41,7 +43,7 @@ def close(status = nil) end @connected.make_false - @socket&.close + @socket.close push_status(status) rescue StandardError => e @config.logger.error("SSEClient close Error: #{e.inspect}") @@ -83,14 +85,24 @@ def connect_thread(latch) def connect_stream(latch) return Constants::PUSH_NONRETRYABLE_ERROR unless socket_write(latch) - while connected? || @first_event.value begin - partial_data = @socket.readpartial(10_000, timeout: @read_timeout) - + partial_data = "" + Timeout::timeout @read_timeout do + partial_data = @socket.readpartial(10_000) + end read_first_event(partial_data, latch) raise 'eof exception' if partial_data == :eof + rescue Timeout::Error => e + @config.logger.error("SSE read operation timed out!: #{e.inspect}") if @config.debug_enabled + return nil + rescue EOFError + break + rescue Errno::EAGAIN => e + @config.logger.debug("SSE client transient error: #{e.inspect}") if @config.debug_enabled + IO.select([tcp_socket]) + retry rescue Errno::EBADF, IOError => e @config.logger.error(e.inspect) if @config.debug_enabled return nil @@ -109,7 +121,7 @@ def connect_stream(latch) def socket_write(latch) @first_event.make_true @socket = socket_connect - @socket.write(build_request(@uri)) + @socket.puts(build_request(@uri)) true rescue StandardError => e @config.logger.error("Error during connecting to #{@uri.host}. Error: #{e.inspect}") @@ -138,9 +150,22 @@ def read_first_event(data, latch) end def socket_connect - return Socketry::SSL::Socket.connect(@uri.host, @uri.port) if @uri.scheme.casecmp('https').zero? + tcp_socket = TCPSocket.new(@uri.host, @uri.port) + if @uri.scheme.casecmp('https').zero? + begin + ssl_context = OpenSSL::SSL::SSLContext.new + ssl_socket = OpenSSL::SSL::SSLSocket.new(tcp_socket, ssl_context) + ssl_socket.hostname = @uri.host + ssl_socket.connect + return ssl_socket.connect + rescue Exception => e + @config.logger.error("socket connect error: #{e.inspect}") + puts e.inspect + return nil + end + end - Socketry::TCP::Socket.connect(@uri.host, @uri.port) + tcp_socket end def process_data(partial_data) diff --git a/lib/splitclient-rb/version.rb b/lib/splitclient-rb/version.rb index 1afbdd0a..e7470b9c 100644 --- a/lib/splitclient-rb/version.rb +++ b/lib/splitclient-rb/version.rb @@ -1,3 +1,3 @@ module SplitIoClient - VERSION = '8.9.0' + VERSION = '8.10.0-rc1' end diff --git a/splitclient-rb.gemspec b/splitclient-rb.gemspec index 3c818df9..742c6d3f 100644 --- a/splitclient-rb.gemspec +++ b/splitclient-rb.gemspec @@ -59,6 +59,5 @@ Gem::Specification.new do |spec| spec.add_runtime_dependency 'lru_redux', '~> 1.1' spec.add_runtime_dependency 'net-http-persistent', '>= 2.9', '< 5.0' spec.add_runtime_dependency 'redis', '>= 4.0.0', '< 6.0' - spec.add_runtime_dependency 'socketry', '>= 0.4', '< 1.0' spec.add_runtime_dependency 'thread_safe', '~> 0.3' end From af9f0c0ae45fe9e2d104f880f668a986cbb7256d Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 9 Oct 2025 21:38:22 -0700 Subject: [PATCH 02/21] polish --- lib/splitclient-rb/sse/event_source/client.rb | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 7d63ad74..3d914e6a 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -38,7 +38,7 @@ def initialize(config, def close(status = nil) unless connected? - @config.logger.error('SSEClient already disconected.') if @config.debug_enabled + log_if_debug('SSEClient already disconected.', 3) return end @@ -76,10 +76,10 @@ def connected? def connect_thread(latch) @config.threads[:connect_stream] = Thread.new do - @config.logger.info('Starting connect_stream thread ...') if @config.debug_enabled + log_if_debug('Starting connect_stream thread ...', 2) new_status = connect_stream(latch) push_status(new_status) - @config.logger.info('connect_stream thread finished.') if @config.debug_enabled + log_if_debug('connect_stream thread finished.', 2) end end @@ -95,21 +95,21 @@ def connect_stream(latch) raise 'eof exception' if partial_data == :eof rescue Timeout::Error => e - @config.logger.error("SSE read operation timed out!: #{e.inspect}") if @config.debug_enabled + log_if_debug("SSE read operation timed out!: #{e.inspect}", 3) return nil rescue EOFError break rescue Errno::EAGAIN => e - @config.logger.debug("SSE client transient error: #{e.inspect}") if @config.debug_enabled + log_if_debug("SSE client transient error: #{e.inspect}", 1) IO.select([tcp_socket]) retry rescue Errno::EBADF, IOError => e - @config.logger.error(e.inspect) if @config.debug_enabled + log_if_debug(e.inspect, 3) return nil rescue StandardError => e return nil if ENV['SPLITCLIENT_ENV'] == 'test' - @config.logger.error("Error reading partial data: #{e.inspect}") if @config.debug_enabled + log_if_debug("Error reading partial data: #{e.inspect}", 3) return Constants::PUSH_RETRYABLE_ERROR end @@ -124,7 +124,7 @@ def socket_write(latch) @socket.puts(build_request(@uri)) true rescue StandardError => e - @config.logger.error("Error during connecting to #{@uri.host}. Error: #{e.inspect}") + log_if_debug("Error during connecting to #{@uri.host}. Error: #{e.inspect}", 3) latch.count_down false end @@ -171,7 +171,7 @@ def socket_connect def process_data(partial_data) return if partial_data.nil? || partial_data == KEEP_ALIVE_RESPONSE - @config.logger.debug("Event partial data: #{partial_data}") if @config.debug_enabled + log_if_debug("Event partial data: #{partial_data}", 1) events = @event_parser.parse(partial_data) events.each { |event| process_event(event) } rescue StandardError => e @@ -187,7 +187,7 @@ def build_request(uri) req << "SplitSDKMachineName: #{@config.machine_name}\r\n" req << "SplitSDKClientKey: #{@api_key.split(//).last(4).join}\r\n" unless @api_key.nil? req << "Cache-Control: no-cache\r\n\r\n" - @config.logger.debug("Request info: #{req}") if @config.debug_enabled + log_if_debug("Request info: #{req}", 1) req end @@ -225,6 +225,19 @@ def push_status(status) @config.logger.debug("Pushing new sse status: #{status}") @status_queue.push(status) end + + def log_if_debug(text, level) + if @config.debug_enabled + case level + when 1 + @config.logger.debug(text) + when 2 + @config.logger.info(text) + when 3 + @config.logger.error(text) + end + end + end end end end From fe4c0ff4910a364cb6f5f1cece45d59508d473b0 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Fri, 10 Oct 2025 10:11:33 -0700 Subject: [PATCH 03/21] polish --- lib/splitclient-rb/sse/event_source/client.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 3d914e6a..b58406fb 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -96,9 +96,9 @@ def connect_stream(latch) raise 'eof exception' if partial_data == :eof rescue Timeout::Error => e log_if_debug("SSE read operation timed out!: #{e.inspect}", 3) - return nil + return Constants::PUSH_RETRYABLE_ERROR rescue EOFError - break + raise 'eof exception' rescue Errno::EAGAIN => e log_if_debug("SSE client transient error: #{e.inspect}", 1) IO.select([tcp_socket]) @@ -233,7 +233,7 @@ def log_if_debug(text, level) @config.logger.debug(text) when 2 @config.logger.info(text) - when 3 + else @config.logger.error(text) end end From e4f1293c9612d1d95c382d0e075c8f6b1d07372a Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 5 Nov 2025 11:49:20 -0800 Subject: [PATCH 04/21] used connect_nonblock for socket --- lib/splitclient-rb/sse/event_source/client.rb | 16 +++++++++++++--- lib/splitclient-rb/version.rb | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index b58406fb..83e91701 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -156,11 +156,21 @@ def socket_connect ssl_context = OpenSSL::SSL::SSLContext.new ssl_socket = OpenSSL::SSL::SSLSocket.new(tcp_socket, ssl_context) ssl_socket.hostname = @uri.host - ssl_socket.connect - return ssl_socket.connect + + begin + ssl_socket.connect_nonblock + rescue IO::WaitReadable + IO.select([ssl_socket]) + retry + rescue IO::WaitWritable + IO.select(nil, [ssl_socket]) + retry + end + + return ssl_socket +# return ssl_socket.connect rescue Exception => e @config.logger.error("socket connect error: #{e.inspect}") - puts e.inspect return nil end end diff --git a/lib/splitclient-rb/version.rb b/lib/splitclient-rb/version.rb index e7470b9c..046f9d21 100644 --- a/lib/splitclient-rb/version.rb +++ b/lib/splitclient-rb/version.rb @@ -1,3 +1,3 @@ module SplitIoClient - VERSION = '8.10.0-rc1' + VERSION = '8.10.0-rc2' end From 0e0b8e9e9bc5efbb1f917f581fe0fa0f8e6e6c84 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 6 Nov 2025 11:37:59 -0800 Subject: [PATCH 05/21] added more logging --- lib/splitclient-rb/sse/event_source/client.rb | 8 ++++++-- lib/splitclient-rb/version.rb | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 83e91701..7a357a2b 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -97,16 +97,18 @@ def connect_stream(latch) rescue Timeout::Error => e log_if_debug("SSE read operation timed out!: #{e.inspect}", 3) return Constants::PUSH_RETRYABLE_ERROR - rescue EOFError + rescue EOFError => e + log_if_debug("SSE read operation EOF Exception!: #{e.inspect}", 3) raise 'eof exception' rescue Errno::EAGAIN => e log_if_debug("SSE client transient error: #{e.inspect}", 1) IO.select([tcp_socket]) retry rescue Errno::EBADF, IOError => e - log_if_debug(e.inspect, 3) + log_if_debug("SSE read operation EBADF or IOError: #{e.inspect}", 3) return nil rescue StandardError => e + log_if_debug("SSE read operation StandardError: #{e.inspect}", 3) return nil if ENV['SPLITCLIENT_ENV'] == 'test' log_if_debug("Error reading partial data: #{e.inspect}", 3) @@ -115,6 +117,8 @@ def connect_stream(latch) process_data(partial_data) end + log_if_debug("SSE read operation exited: #{connected}") + nil end diff --git a/lib/splitclient-rb/version.rb b/lib/splitclient-rb/version.rb index 046f9d21..e14904e2 100644 --- a/lib/splitclient-rb/version.rb +++ b/lib/splitclient-rb/version.rb @@ -1,3 +1,3 @@ module SplitIoClient - VERSION = '8.10.0-rc2' + VERSION = '8.10.0-rc3' end From d2da707e7b4282cad79023c9e352f313a2aca936 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 6 Nov 2025 14:15:05 -0800 Subject: [PATCH 06/21] added logging --- lib/splitclient-rb/sse/event_source/client.rb | 6 ++++-- lib/splitclient-rb/version.rb | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 7a357a2b..be9ac578 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -86,6 +86,7 @@ def connect_thread(latch) def connect_stream(latch) return Constants::PUSH_NONRETRYABLE_ERROR unless socket_write(latch) while connected? || @first_event.value + log_if_debug("Inside coonnect_stream while loop.", 3) begin partial_data = "" Timeout::timeout @read_timeout do @@ -117,7 +118,7 @@ def connect_stream(latch) process_data(partial_data) end - log_if_debug("SSE read operation exited: #{connected}") + log_if_debug("SSE read operation exited: #{connected?}", 3) nil end @@ -146,6 +147,7 @@ def read_first_event(data, latch) if response_code == OK_CODE && !error_event @connected.make_true + @config.logger.debug("SSE client first event Connected is true") @telemetry_runtime_producer.record_streaming_event(Telemetry::Domain::Constants::SSE_CONNECTION_ESTABLISHED, nil) push_status(Constants::PUSH_CONNECTED) end @@ -183,9 +185,9 @@ def socket_connect end def process_data(partial_data) + log_if_debug("Event partial data: #{partial_data}", 1) return if partial_data.nil? || partial_data == KEEP_ALIVE_RESPONSE - log_if_debug("Event partial data: #{partial_data}", 1) events = @event_parser.parse(partial_data) events.each { |event| process_event(event) } rescue StandardError => e diff --git a/lib/splitclient-rb/version.rb b/lib/splitclient-rb/version.rb index e14904e2..30095ee4 100644 --- a/lib/splitclient-rb/version.rb +++ b/lib/splitclient-rb/version.rb @@ -1,3 +1,3 @@ module SplitIoClient - VERSION = '8.10.0-rc3' + VERSION = '8.10.0-rc4' end From b41d641e1249363ccd5e6218f4972aa565eaca41 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 6 Nov 2025 22:00:40 -0800 Subject: [PATCH 07/21] replace timeout block with IO call --- lib/splitclient-rb/sse/event_source/client.rb | 55 +++++++++++-------- lib/splitclient-rb/version.rb | 2 +- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index be9ac578..6b6f87a8 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -87,32 +87,39 @@ def connect_stream(latch) return Constants::PUSH_NONRETRYABLE_ERROR unless socket_write(latch) while connected? || @first_event.value log_if_debug("Inside coonnect_stream while loop.", 3) - begin - partial_data = "" - Timeout::timeout @read_timeout do + if IO.select([@socket], nil, nil, @read_timeout) + begin partial_data = @socket.readpartial(10_000) - end - read_first_event(partial_data, latch) - - raise 'eof exception' if partial_data == :eof - rescue Timeout::Error => e - log_if_debug("SSE read operation timed out!: #{e.inspect}", 3) - return Constants::PUSH_RETRYABLE_ERROR - rescue EOFError => e - log_if_debug("SSE read operation EOF Exception!: #{e.inspect}", 3) - raise 'eof exception' - rescue Errno::EAGAIN => e - log_if_debug("SSE client transient error: #{e.inspect}", 1) - IO.select([tcp_socket]) - retry - rescue Errno::EBADF, IOError => e - log_if_debug("SSE read operation EBADF or IOError: #{e.inspect}", 3) - return nil - rescue StandardError => e - log_if_debug("SSE read operation StandardError: #{e.inspect}", 3) - return nil if ENV['SPLITCLIENT_ENV'] == 'test' + read_first_event(partial_data, latch) - log_if_debug("Error reading partial data: #{e.inspect}", 3) + raise 'eof exception' if partial_data == :eof + rescue IO::WaitReadable => e + log_if_debug("SSE client transient error: #{e.inspect}", 1) + IO.select([@socket], nil, nil, @read_timeout) + retry + rescue Errno::ETIMEDOUT => e + log_if_debug("SSE read operation timed out!: #{e.inspect}", 3) + return Constants::PUSH_RETRYABLE_ERROR + rescue EOFError => e + log_if_debug("SSE read operation EOF Exception!: #{e.inspect}", 3) + raise 'eof exception' + rescue Errno::EAGAIN => e + log_if_debug("SSE client transient error: #{e.inspect}", 1) + IO.select([@socket], nil, nil, @read_timeout) + retry + rescue Errno::EBADF, IOError => e + log_if_debug("SSE read operation EBADF or IOError: #{e.inspect}", 3) + return nil + rescue StandardError => e + log_if_debug("SSE read operation StandardError: #{e.inspect}", 3) + return nil if ENV['SPLITCLIENT_ENV'] == 'test' + + log_if_debug("Error reading partial data: #{e.inspect}", 3) + return Constants::PUSH_RETRYABLE_ERROR + end + else + # Timeout occurred, no data available + log_if_debug("SSE read operation timed out, no data available.", 3) return Constants::PUSH_RETRYABLE_ERROR end diff --git a/lib/splitclient-rb/version.rb b/lib/splitclient-rb/version.rb index 30095ee4..015056f0 100644 --- a/lib/splitclient-rb/version.rb +++ b/lib/splitclient-rb/version.rb @@ -1,3 +1,3 @@ module SplitIoClient - VERSION = '8.10.0-rc4' + VERSION = '8.10.0-rc5' end From 0d0ccdffe4b754bf0305f22aaaf139aa390fb70d Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Fri, 7 Nov 2025 11:10:59 -0800 Subject: [PATCH 08/21] added test --- lib/splitclient-rb/sse/event_source/client.rb | 9 ++---- spec/sse/event_source/client_spec.rb | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 6b6f87a8..14b54ccb 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -86,7 +86,6 @@ def connect_thread(latch) def connect_stream(latch) return Constants::PUSH_NONRETRYABLE_ERROR unless socket_write(latch) while connected? || @first_event.value - log_if_debug("Inside coonnect_stream while loop.", 3) if IO.select([@socket], nil, nil, @read_timeout) begin partial_data = @socket.readpartial(10_000) @@ -118,14 +117,13 @@ def connect_stream(latch) return Constants::PUSH_RETRYABLE_ERROR end else - # Timeout occurred, no data available - log_if_debug("SSE read operation timed out, no data available.", 3) + @config.logger.debug("SSE read operation timed out, no data available.") return Constants::PUSH_RETRYABLE_ERROR end process_data(partial_data) end - log_if_debug("SSE read operation exited: #{connected?}", 3) + log_if_debug("SSE read operation exited: #{connected?}", 1) nil end @@ -179,9 +177,8 @@ def socket_connect IO.select(nil, [ssl_socket]) retry end - return ssl_socket -# return ssl_socket.connect + rescue Exception => e @config.logger.error("socket connect error: #{e.inspect}") return nil diff --git a/spec/sse/event_source/client_spec.rb b/spec/sse/event_source/client_spec.rb index 1c199b09..213cc184 100644 --- a/spec/sse/event_source/client_spec.rb +++ b/spec/sse/event_source/client_spec.rb @@ -221,6 +221,36 @@ end end + it 'client timeout and reconnect' do + stub_request(:get, 'https://sdk.split.io/api/splitChanges?s=1.3&since=-1&rbSince=-1') + .with(headers: { 'Authorization' => 'Bearer client-spec-key' }) + .to_return(status: 200, body: '{"ff":{"d":[],"s":-1,"t":5564531221}, "rbs":{"d":[],"s":-1,"t":-1}}') + stub_request(:get, 'https://sdk.split.io/api/splitChanges?s=1.3&since=5564531221&rbSince=-1') + .with(headers: { 'Authorization' => 'Bearer client-spec-key' }) + .to_return(status: 200, body: '{"ff":{"d":[],"s":5564531221,"t":5564531221}, "rbs":{"d":[],"s":-1,"t":-1}}') + + mock_server do |server| + start_workers + server.setup_response('/') do |_, res| + send_stream_content(res, event_split_update) + end + + sse_client = subject.new(config, api_token, telemetry_runtime_producer, event_parser, notification_manager_keeper, notification_processor, push_status_queue, read_timeout: 0.1) + connected = sse_client.start(server.base_uri) + sleep 1 + expect(connected).to eq(true) + expect(sse_client.connected?).to eq(true) + expect(push_status_queue.pop(true)).to eq(SplitIoClient::Constants::PUSH_CONNECTED) + sleep 3 + expect(log.string).to include 'SSE read operation timed out, no data available' + expect(sse_client.connected?).to eq(true) + sse_client.close + expect(sse_client.connected?).to eq(false) + + stop_workers + end + end + it 'first event - when server return 400' do mock_server do |server| server.setup_response('/') do |_, res| From a746601791ae19061714127a2950af62c56a934d Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Fri, 7 Nov 2025 19:29:10 -0800 Subject: [PATCH 09/21] added tests --- lib/splitclient-rb/sse/event_source/client.rb | 44 +++++------- spec/sse/event_source/client_spec.rb | 67 +++++++++++++++++++ 2 files changed, 83 insertions(+), 28 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 14b54ccb..dacee06f 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -38,7 +38,7 @@ def initialize(config, def close(status = nil) unless connected? - log_if_debug('SSEClient already disconected.', 3) + @config.logger.debug('SSEClient already disconected.') return end @@ -76,10 +76,10 @@ def connected? def connect_thread(latch) @config.threads[:connect_stream] = Thread.new do - log_if_debug('Starting connect_stream thread ...', 2) + @config.logger.info('Starting connect_stream thread ...') new_status = connect_stream(latch) push_status(new_status) - log_if_debug('connect_stream thread finished.', 2) + @config.logger.info('connect_stream thread finished.') end end @@ -93,37 +93,38 @@ def connect_stream(latch) raise 'eof exception' if partial_data == :eof rescue IO::WaitReadable => e - log_if_debug("SSE client transient error: #{e.inspect}", 1) + @config.logger.debug("SSE client transient error: #{e.inspect}") IO.select([@socket], nil, nil, @read_timeout) retry rescue Errno::ETIMEDOUT => e - log_if_debug("SSE read operation timed out!: #{e.inspect}", 3) + @config.logger.error("SSE read operation timed out!: #{e.inspect}") return Constants::PUSH_RETRYABLE_ERROR rescue EOFError => e - log_if_debug("SSE read operation EOF Exception!: #{e.inspect}", 3) + @config.logger.error("SSE read operation EOF Exception!: #{e.inspect}") raise 'eof exception' rescue Errno::EAGAIN => e - log_if_debug("SSE client transient error: #{e.inspect}", 1) + puts "transient error" + @config.logger.debug("SSE client transient error: #{e.inspect}") IO.select([@socket], nil, nil, @read_timeout) retry rescue Errno::EBADF, IOError => e - log_if_debug("SSE read operation EBADF or IOError: #{e.inspect}", 3) + @config.logger.error("SSE read operation EBADF or IOError: #{e.inspect}") return nil rescue StandardError => e - log_if_debug("SSE read operation StandardError: #{e.inspect}", 3) + @config.logger.error("SSE read operation StandardError: #{e.inspect}") return nil if ENV['SPLITCLIENT_ENV'] == 'test' - log_if_debug("Error reading partial data: #{e.inspect}", 3) + @config.logger.error("Error reading partial data: #{e.inspect}") return Constants::PUSH_RETRYABLE_ERROR end else - @config.logger.debug("SSE read operation timed out, no data available.") + @config.logger.error("SSE read operation timed out, no data available.") return Constants::PUSH_RETRYABLE_ERROR end process_data(partial_data) end - log_if_debug("SSE read operation exited: #{connected?}", 1) + @config.logger.info("SSE read operation exited: #{connected?}") nil end @@ -134,7 +135,7 @@ def socket_write(latch) @socket.puts(build_request(@uri)) true rescue StandardError => e - log_if_debug("Error during connecting to #{@uri.host}. Error: #{e.inspect}", 3) + @config.logger.error("Error during connecting to #{@uri.host}. Error: #{e.inspect}") latch.count_down false end @@ -189,7 +190,7 @@ def socket_connect end def process_data(partial_data) - log_if_debug("Event partial data: #{partial_data}", 1) + @config.logger.debug("Event partial data: #{partial_data}") return if partial_data.nil? || partial_data == KEEP_ALIVE_RESPONSE events = @event_parser.parse(partial_data) @@ -207,7 +208,7 @@ def build_request(uri) req << "SplitSDKMachineName: #{@config.machine_name}\r\n" req << "SplitSDKClientKey: #{@api_key.split(//).last(4).join}\r\n" unless @api_key.nil? req << "Cache-Control: no-cache\r\n\r\n" - log_if_debug("Request info: #{req}", 1) + @config.logger.debug("Request info: #{req}") req end @@ -245,19 +246,6 @@ def push_status(status) @config.logger.debug("Pushing new sse status: #{status}") @status_queue.push(status) end - - def log_if_debug(text, level) - if @config.debug_enabled - case level - when 1 - @config.logger.debug(text) - when 2 - @config.logger.info(text) - else - @config.logger.error(text) - end - end - end end end end diff --git a/spec/sse/event_source/client_spec.rb b/spec/sse/event_source/client_spec.rb index 213cc184..9498632c 100644 --- a/spec/sse/event_source/client_spec.rb +++ b/spec/sse/event_source/client_spec.rb @@ -2,6 +2,7 @@ require 'spec_helper' require 'http_server_mock' +require 'rspec/mocks' describe SplitIoClient::SSE::EventSource::Client do subject { SplitIoClient::SSE::EventSource::Client } @@ -266,6 +267,72 @@ stop_workers end end + + it 'test exceptions' do + mock_server do |server| + server.setup_response('/') do |_, res| + send_stream_content(res, event_split_update) + 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(Errno::ETIMEDOUT) + 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' + + allow(sse_client).to receive(:read_first_event).and_raise(IOError) + sse_client.send(:connect_stream, latch) + expect(log.string).to include 'SSE read operation EBADF or IOError' + + allow(sse_client).to receive(:read_first_event).and_raise(StandardError) + sse_client.send(:connect_stream, latch) + expect(log.string).to include 'SSE read operation StandardError:' + + stop_workers + end + end + + it 'test retry with EAGAIN and IO::WaitReadable exceptions' do + mock_server do |server| + server.setup_response('/') do |_, res| + send_stream_content(res, event_split_update) + 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(Errno::EAGAIN) + thr1 = Thread.new do + sse_client.send(:connect_stream, latch) + end + allow(sse_client).to receive(:read_first_event).and_return(true) + expect(thr1.status).to eq('run') + + allow(sse_client).to receive(:read_first_event).and_raise(IO::WaitReadable) + thr2 = Thread.new do + sse_client.send(:connect_stream, latch) + end + allow(sse_client).to receive(:read_first_event).and_return(true) + expect(thr2.status).to eq('run') + + stop_workers + end + end end private From 70ef7d954ac02b55274267d8094a42d98951514b Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Tue, 11 Nov 2025 21:55:32 -0800 Subject: [PATCH 10/21] handled EBADF and IOError exceptions and added tests --- lib/splitclient-rb/sse/event_source/client.rb | 11 +++--- spec/sse/event_source/client_spec.rb | 39 +++++++++++++++---- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index dacee06f..4cf498fe 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -93,6 +93,10 @@ def connect_stream(latch) raise 'eof exception' if partial_data == :eof rescue IO::WaitReadable => e + @config.logger.debug("SSE client IO::WaitReadable transient error: #{e.inspect}") + IO.select([@socket], nil, nil, @read_timeout) + retry + rescue Errno::EAGAIN => e @config.logger.debug("SSE client transient error: #{e.inspect}") IO.select([@socket], nil, nil, @read_timeout) retry @@ -102,14 +106,9 @@ def connect_stream(latch) rescue EOFError => e @config.logger.error("SSE read operation EOF Exception!: #{e.inspect}") raise 'eof exception' - rescue Errno::EAGAIN => e - puts "transient error" - @config.logger.debug("SSE client transient error: #{e.inspect}") - IO.select([@socket], nil, nil, @read_timeout) - retry rescue Errno::EBADF, IOError => e @config.logger.error("SSE read operation EBADF or IOError: #{e.inspect}") - return nil + return Constants::PUSH_RETRYABLE_ERROR rescue StandardError => e @config.logger.error("SSE read operation StandardError: #{e.inspect}") return nil if ENV['SPLITCLIENT_ENV'] == 'test' diff --git a/spec/sse/event_source/client_spec.rb b/spec/sse/event_source/client_spec.rb index 9498632c..95e0a1f2 100644 --- a/spec/sse/event_source/client_spec.rb +++ b/spec/sse/event_source/client_spec.rb @@ -304,10 +304,10 @@ end end - it 'test retry with EAGAIN and IO::WaitReadable exceptions' do + it 'test retry with EAGAIN exceptions' do mock_server do |server| server.setup_response('/') do |_, res| - send_stream_content(res, event_split_update) + send_stream_content(res, event_occupancy) end start_workers @@ -317,18 +317,41 @@ latch = Concurrent::CountDownLatch.new(1) allow(sse_client).to receive(:read_first_event).and_raise(Errno::EAGAIN) + 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(thr1.status).to eq('run') - - allow(sse_client).to receive(:read_first_event).and_raise(IO::WaitReadable) + expect(log.string).to include 'SSE client transient error' + + stop_workers + end + end + + it 'test retry with IO::WaitReadable exceptions' do + log2 = StringIO.new + config2 = SplitIoClient::SplitConfig.new(logger: Logger.new(log2)) + + mock_server do |server| + server.setup_response('/') do |_, res| + send_stream_content(res, event_occupancy) + end + start_workers + + sse_client2 = subject.new(config2, api_token, telemetry_runtime_producer, event_parser, notification_manager_keeper, notification_processor, push_status_queue) + + sse_client2.instance_variable_set(:@uri, URI(server.base_uri)) + latch = Concurrent::CountDownLatch.new(1) + + allow(sse_client2).to receive(:read_first_event).and_raise(IO::EWOULDBLOCKWaitReadable) + sleep(1) thr2 = Thread.new do - sse_client.send(:connect_stream, latch) + sse_client2.send(:connect_stream, latch) end - allow(sse_client).to receive(:read_first_event).and_return(true) - expect(thr2.status).to eq('run') + sleep(1) + allow(sse_client2).to receive(:read_first_event).and_return(true) + expect(log2.string).to include 'SSE client IO::WaitReadable transient error' stop_workers end From a3ca3ecd5f296cbb6175a7b58c6c04464b904cc2 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 13 Nov 2025 21:29:52 -0800 Subject: [PATCH 11/21] Fixed closing sslsocket --- lib/splitclient-rb/sse/event_source/client.rb | 69 ++++++++++--------- lib/splitclient-rb/version.rb | 2 +- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 4cf498fe..ccc7cbf5 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -41,9 +41,12 @@ def close(status = nil) @config.logger.debug('SSEClient already disconected.') return end + @config.logger.debug("Closing SSEClient socket") @connected.make_false + @socket.sync_close = true @socket.close + @config.logger.debug("SSEClient socket state #{@socket.state}") push_status(status) rescue StandardError => e @config.logger.error("SSEClient close Error: #{e.inspect}") @@ -86,39 +89,43 @@ def connect_thread(latch) def connect_stream(latch) return Constants::PUSH_NONRETRYABLE_ERROR unless socket_write(latch) while connected? || @first_event.value - if IO.select([@socket], nil, nil, @read_timeout) - begin - partial_data = @socket.readpartial(10_000) - read_first_event(partial_data, latch) - - raise 'eof exception' if partial_data == :eof - rescue IO::WaitReadable => e - @config.logger.debug("SSE client IO::WaitReadable transient error: #{e.inspect}") - IO.select([@socket], nil, nil, @read_timeout) - retry - rescue Errno::EAGAIN => e - @config.logger.debug("SSE client transient error: #{e.inspect}") - IO.select([@socket], nil, nil, @read_timeout) - retry - rescue Errno::ETIMEDOUT => e - @config.logger.error("SSE read operation timed out!: #{e.inspect}") - return Constants::PUSH_RETRYABLE_ERROR - rescue EOFError => e - @config.logger.error("SSE read operation EOF Exception!: #{e.inspect}") - raise 'eof exception' - rescue Errno::EBADF, IOError => e - @config.logger.error("SSE read operation EBADF or IOError: #{e.inspect}") - return Constants::PUSH_RETRYABLE_ERROR - rescue StandardError => e - @config.logger.error("SSE read operation StandardError: #{e.inspect}") - return nil if ENV['SPLITCLIENT_ENV'] == 'test' - - @config.logger.error("Error reading partial data: #{e.inspect}") + begin + if IO.select([@socket], nil, nil, @read_timeout) + begin + partial_data = @socket.readpartial(10_000) + read_first_event(partial_data, latch) + + raise 'eof exception' if partial_data == :eof + rescue IO::WaitReadable => e + @config.logger.debug("SSE client IO::WaitReadable transient error: #{e.inspect}") + IO.select([@socket], nil, nil, @read_timeout) + retry + rescue Errno::EAGAIN => e + @config.logger.debug("SSE client transient error: #{e.inspect}") + IO.select([@socket], nil, nil, @read_timeout) + retry + rescue Errno::ETIMEDOUT => e + @config.logger.error("SSE read operation timed out!: #{e.inspect}") + return Constants::PUSH_RETRYABLE_ERROR + rescue EOFError => e + @config.logger.error("SSE read operation EOF Exception!: #{e.inspect}") + raise 'eof exception' + rescue Errno::EBADF, IOError => e + @config.logger.error("SSE read operation EBADF or IOError: #{e.inspect}") + return Constants::PUSH_RETRYABLE_ERROR + rescue StandardError => e + @config.logger.error("SSE read operation StandardError: #{e.inspect}") + return nil if ENV['SPLITCLIENT_ENV'] == 'test' + + @config.logger.error("Error reading partial data: #{e.inspect}") + return Constants::PUSH_RETRYABLE_ERROR + end + else + @config.logger.error("SSE read operation timed out, no data available.") return Constants::PUSH_RETRYABLE_ERROR end - else - @config.logger.error("SSE read operation timed out, no data available.") - return Constants::PUSH_RETRYABLE_ERROR + rescue Errno::EBADF + @config.logger.debug("SSE socket is not connected (Errno::EBADF)") end process_data(partial_data) diff --git a/lib/splitclient-rb/version.rb b/lib/splitclient-rb/version.rb index 015056f0..7fcee0f5 100644 --- a/lib/splitclient-rb/version.rb +++ b/lib/splitclient-rb/version.rb @@ -1,3 +1,3 @@ module SplitIoClient - VERSION = '8.10.0-rc5' + VERSION = '8.10.0-rc7' end From 45cf15dea996e832dea5446c6b0bca94ab19b828 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Fri, 14 Nov 2025 09:37:01 -0800 Subject: [PATCH 12/21] polish --- lib/splitclient-rb/sse/event_source/client.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index ccc7cbf5..7dddfa73 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -126,6 +126,8 @@ def connect_stream(latch) end rescue Errno::EBADF @config.logger.debug("SSE socket is not connected (Errno::EBADF)") + finally + break end process_data(partial_data) From 3efb7b758c8def30c9e5c79995dae2a9c57316f5 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Fri, 14 Nov 2025 10:35:13 -0800 Subject: [PATCH 13/21] polish --- lib/splitclient-rb/sse/event_source/client.rb | 12 ++++++++---- spec/sse/sse_handler_spec.rb | 1 - 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/splitclient-rb/sse/event_source/client.rb b/lib/splitclient-rb/sse/event_source/client.rb index 7dddfa73..08ac28ee 100644 --- a/lib/splitclient-rb/sse/event_source/client.rb +++ b/lib/splitclient-rb/sse/event_source/client.rb @@ -44,9 +44,9 @@ def close(status = nil) @config.logger.debug("Closing SSEClient socket") @connected.make_false - @socket.sync_close = true + @socket.sync_close = true if @socket.is_a? OpenSSL::SSL::SSLSocket @socket.close - @config.logger.debug("SSEClient socket state #{@socket.state}") + @config.logger.debug("SSEClient socket state #{@socket.state}") if @socket.is_a? OpenSSL::SSL::SSLSocket push_status(status) rescue StandardError => e @config.logger.error("SSEClient close Error: #{e.inspect}") @@ -60,7 +60,6 @@ def start(url) @uri = URI(url) latch = Concurrent::CountDownLatch.new(1) - connect_thread(latch) return false unless latch.wait(CONNECT_TIMEOUT) @@ -108,6 +107,7 @@ def connect_stream(latch) @config.logger.error("SSE read operation timed out!: #{e.inspect}") return Constants::PUSH_RETRYABLE_ERROR rescue EOFError => e + puts "SSE read operation EOF Exception!: #{e.inspect}" @config.logger.error("SSE read operation EOF Exception!: #{e.inspect}") raise 'eof exception' rescue Errno::EBADF, IOError => e @@ -126,7 +126,11 @@ def connect_stream(latch) end rescue Errno::EBADF @config.logger.debug("SSE socket is not connected (Errno::EBADF)") - finally + break + rescue RuntimeError + raise 'eof exception' + rescue Exception => e + @config.logger.debug("SSE socket is not connected: #{e.inspect}") break end diff --git a/spec/sse/sse_handler_spec.rb b/spec/sse/sse_handler_spec.rb index 099f7932..96fb6141 100644 --- a/spec/sse/sse_handler_spec.rb +++ b/spec/sse/sse_handler_spec.rb @@ -48,7 +48,6 @@ config.streaming_service_url = server.base_uri sse_handler = subject.new(config, splits_worker, segments_worker, sse_client) - connected = sse_handler.start('token-test', 'channel-test') expect(connected).to eq(true) expect(sse_handler.connected?).to eq(true) From 6a8854343652c6b433bbe3aeefe4cecf2af09a8a Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 26 Nov 2025 08:18:20 -0800 Subject: [PATCH 14/21] updated changes and version --- CHANGES.txt | 3 +++ lib/splitclient-rb/version.rb | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index f899ea72..a9e4fc42 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,5 +1,8 @@ CHANGES +8.10.0 (Nov 28, 2025) +- Replaced socketry gem used in streaming feature with built-in socket lib. + 8.9.0 (Oct 8, 2025) - Added new configuration for Fallback Treatments, which allows setting a treatment value and optional config to be returned in place of "control", either globally or by flag. Read more in our docs. diff --git a/lib/splitclient-rb/version.rb b/lib/splitclient-rb/version.rb index 7fcee0f5..d45f095e 100644 --- a/lib/splitclient-rb/version.rb +++ b/lib/splitclient-rb/version.rb @@ -1,3 +1,3 @@ module SplitIoClient - VERSION = '8.10.0-rc7' + VERSION = '8.10.0' end From c3c10d5c5534cdfa0df81cab9e552e73c05dbf61 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 26 Nov 2025 09:31:41 -0800 Subject: [PATCH 15/21] upgraded java to 17 --- .github/workflows/ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1da52c42..8f166353 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,6 +67,12 @@ jobs: -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} -Dsonar.projectVersion=${{ env.VERSION }} + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: 17 + distribution: "temurin" + - name: SonarQube Scan (Pull Request) if: matrix.version == '3.2.2' && github.event_name == 'pull_request' uses: SonarSource/sonarcloud-github-action@v1.9 From 0f079f203a217cf8e3749332961d70cafc70940a Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 26 Nov 2025 09:48:43 -0800 Subject: [PATCH 16/21] moved setup java to front --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8f166353..bd9fb8d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,6 +35,12 @@ jobs: with: fetch-depth: 0 + - name: Set up Java + uses: actions/setup-java@v2 + with: + java-version: 17 + distribution: "temurin" + - name: Setup Ruby ${{ matrix.version }} uses: ruby/setup-ruby@v1 with: @@ -67,12 +73,6 @@ jobs: -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} -Dsonar.projectVersion=${{ env.VERSION }} - - name: Set up Java - uses: actions/setup-java@v2 - with: - java-version: 17 - distribution: "temurin" - - name: SonarQube Scan (Pull Request) if: matrix.version == '3.2.2' && github.event_name == 'pull_request' uses: SonarSource/sonarcloud-github-action@v1.9 From 5b030958cc71b0ed04eb50d778eac789cb008d63 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 26 Nov 2025 10:06:02 -0800 Subject: [PATCH 17/21] set hava to 17 for sonar --- sonar-project.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/sonar-project.properties b/sonar-project.properties index d98bd22f..ae9b0918 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,4 +2,5 @@ sonar.projectKey=ruby-client sonar.projectKey=ruby-client sonar.sources=lib sonar.tests=spec +sonar.java.source=17 sonar.ruby.coverage.reportPaths=coverage/.resultset.sonarqube.json From 7d422e66928ab8b61332f2e07ef6632d68e9db87 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 26 Nov 2025 11:19:39 -0800 Subject: [PATCH 18/21] upgraded sonar action --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd9fb8d4..8cdeaa0f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -63,7 +63,7 @@ jobs: - name: SonarQube Scan (Push) if: matrix.version == '3.2.2' && github.event_name == 'push' - uses: SonarSource/sonarcloud-github-action@v1.9 + uses: SonarSource/sonarcloud-github-action@v5.0.0 env: SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -75,7 +75,7 @@ jobs: - name: SonarQube Scan (Pull Request) if: matrix.version == '3.2.2' && github.event_name == 'pull_request' - uses: SonarSource/sonarcloud-github-action@v1.9 + uses: SonarSource/sonarcloud-github-action@v5.0.0 env: SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 0727c0243bf138eff4fb6551bb1e7c03b40be5e2 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 26 Nov 2025 12:17:58 -0800 Subject: [PATCH 19/21] update sonar java --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8cdeaa0f..347d1b34 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -82,6 +82,7 @@ jobs: with: projectBaseDir: . args: > + -Dsonar.java.source=17 -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} -Dsonar.projectVersion=${{ env.VERSION }} -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} From 08609b84104c1b08996930f36541dfc765bf57d0 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 26 Nov 2025 12:35:38 -0800 Subject: [PATCH 20/21] testing sonar --- .github/workflows/ci.yml | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 347d1b34..8981eb4b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,6 +49,22 @@ jobs: - name: Install dependencies run: bundle install + - name: SonarQube Scan (Pull Request) + if: matrix.version == '3.2.2' && github.event_name == 'pull_request' + uses: SonarSource/sonarcloud-github-action@v5.0.0 + env: + SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + projectBaseDir: . + args: > + -Dsonar.java.source=17 + -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} + -Dsonar.projectVersion=${{ env.VERSION }} + -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} + -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} + -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} + - name: Run tests run: bundle exec rake @@ -73,18 +89,3 @@ jobs: -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} -Dsonar.projectVersion=${{ env.VERSION }} - - name: SonarQube Scan (Pull Request) - if: matrix.version == '3.2.2' && github.event_name == 'pull_request' - uses: SonarSource/sonarcloud-github-action@v5.0.0 - env: - SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - projectBaseDir: . - args: > - -Dsonar.java.source=17 - -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} - -Dsonar.projectVersion=${{ env.VERSION }} - -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} - -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} - -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} From 1b0dab444f75f76311c5a64bbad0cf5de37a1e02 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 26 Nov 2025 12:37:14 -0800 Subject: [PATCH 21/21] revert --- .github/workflows/ci.yml | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8981eb4b..347d1b34 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,22 +49,6 @@ jobs: - name: Install dependencies run: bundle install - - name: SonarQube Scan (Pull Request) - if: matrix.version == '3.2.2' && github.event_name == 'pull_request' - uses: SonarSource/sonarcloud-github-action@v5.0.0 - env: - SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - projectBaseDir: . - args: > - -Dsonar.java.source=17 - -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} - -Dsonar.projectVersion=${{ env.VERSION }} - -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} - -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} - -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} - - name: Run tests run: bundle exec rake @@ -89,3 +73,18 @@ jobs: -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} -Dsonar.projectVersion=${{ env.VERSION }} + - name: SonarQube Scan (Pull Request) + if: matrix.version == '3.2.2' && github.event_name == 'pull_request' + uses: SonarSource/sonarcloud-github-action@v5.0.0 + env: + SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + projectBaseDir: . + args: > + -Dsonar.java.source=17 + -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} + -Dsonar.projectVersion=${{ env.VERSION }} + -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} + -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} + -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }}