Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package rubygem-solid_cable for 
openSUSE:Factory checked in at 2026-07-15 16:34:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-solid_cable (Old)
 and      /work/SRC/openSUSE:Factory/.rubygem-solid_cable.new.1991 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rubygem-solid_cable"

Wed Jul 15 16:34:07 2026 rev:3 rq:1365333 version:4.0.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/rubygem-solid_cable/rubygem-solid_cable.changes  
2025-02-06 22:05:56.111377467 +0100
+++ 
/work/SRC/openSUSE:Factory/.rubygem-solid_cable.new.1991/rubygem-solid_cable.changes
        2026-07-15 16:51:29.970644281 +0200
@@ -1,0 +2,12 @@
+Mon Jul 13 11:11:14 UTC 2026 - Aleksei Burlakov <[email protected]>
+
+- New upstream release version 4.0.0:
+  * Upgrade ci to test against all ruby versions by @npezza93 in #76
+  * Drop ruby 3.1 support by @npezza93 in #77
+  * Retry if connection fails by @npezza93 in #75
+  * Eagerly initialize last_id to avoid skipping messages by @xrav3nz in #78
+  * Drop ruby 3.2 support by @npezza93
+  * Harden CI by @npezza93
+  * Add connection timeout error and not established to the list of retryable 
connection errors by @npezza93
+
+-------------------------------------------------------------------

Old:
----
  solid_cable-3.0.7.gem

New:
----
  solid_cable-4.0.0.gem

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ rubygem-solid_cable.spec ++++++
--- /var/tmp/diff_new_pack.FQvt5l/_old  2026-07-15 16:51:34.018781827 +0200
+++ /var/tmp/diff_new_pack.FQvt5l/_new  2026-07-15 16:51:34.022781963 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package rubygem-solid_cable
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -24,7 +24,7 @@
 #
 
 Name:           rubygem-solid_cable
-Version:        3.0.7
+Version:        4.0.0
 Release:        0
 %define mod_name solid_cable
 %define mod_full_name %{mod_name}-%{version}

++++++ solid_cable-3.0.7.gem -> solid_cable-4.0.0.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/README.md new/README.md
--- old/README.md       2025-01-25 22:55:45.000000000 +0100
+++ new/README.md       1980-01-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 # Solid Cable
 
-Solid Cable is a database-backed Action Cable adapter that keeps messages in a 
table and continously polls for updates. This makes it possible to drop the 
common dependency on Redis, if it isn't needed for any other purpose. Despite 
polling, the performance of Solid Cable is comparable to Redis in most 
situations. And in all circumstances, it makes it easier to deploy Rails when 
Redis is no longer a required dependency for Action Cable functionality.
+Solid Cable is a database-backed Action Cable adapter that keeps messages in a 
table and continuously polls for updates. This makes it possible to drop the 
common dependency on Redis, if it isn't needed for any other purpose. Despite 
polling, the performance of Solid Cable is comparable to Redis in most 
situations. And in all circumstances, it makes it easier to deploy Rails when 
Redis is no longer a required dependency for Action Cable functionality.
 
 > [!NOTE]
 > Solid Cable is tested to work with MySQL, SQLite, and PostgreSQL.
@@ -86,6 +86,8 @@
 - `silence_polling` - whether to silence Active Record logs emitted when 
polling (Defaults to true)
 - `use_skip_locked` - whether to use `FOR UPDATE SKIP LOCKED` when performing 
trimming. This will be automatically detected in the future, and for now, you'd 
only need to set this to `false` if your database doesn't support it. For 
MySQL, that'd be versions < 8, and for PostgreSQL, versions < 9.5. If you use 
SQLite, this has no effect, as writes are sequential. (Defaults to true)
 - `trim_batch_size` - the batch size to use when deleting old records 
(default: `100`)
+- `reconnect_attempts` - Supports a number of connection attempts or an array 
of
+  durations to wait between attempts. (Defaults to 1 retry attempt)
 
 
 ## Trimming
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Rakefile new/Rakefile
--- old/Rakefile        2025-01-25 22:55:45.000000000 +0100
+++ new/Rakefile        1980-01-02 01:00:00.000000000 +0100
@@ -1,5 +1,6 @@
-# frozen_string_literal: true
-
 require "bundler/setup"
 
+APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
+load "rails/tasks/engine.rake"
+
 require "bundler/gem_tasks"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/app/jobs/solid_cable/trim_job.rb 
new/app/jobs/solid_cable/trim_job.rb
--- old/app/jobs/solid_cable/trim_job.rb        2025-01-25 22:55:45.000000000 
+0100
+++ new/app/jobs/solid_cable/trim_job.rb        1980-01-02 01:00:00.000000000 
+0100
@@ -20,7 +20,8 @@
       def trim?
         expires_per_write = (1 / trim_batch_size.to_f) * 
::SolidCable.trim_chance
 
-        rand < (expires_per_write - expires_per_write.floor)
+        !::SolidCable.autotrim? ||
+          rand < (expires_per_write - expires_per_write.floor)
       end
   end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/app/models/solid_cable/message.rb 
new/app/models/solid_cable/message.rb
--- old/app/models/solid_cable/message.rb       2025-01-25 22:55:45.000000000 
+0100
+++ new/app/models/solid_cable/message.rb       1980-01-02 01:00:00.000000000 
+0100
@@ -7,7 +7,7 @@
     }
     scope :broadcastable, lambda { |channels, last_id|
       where(channel_hash: channel_hashes_for(channels)).
-        where(id: (last_id + 1)..).order(:id)
+        where(id: (last_id.to_i + 1)..).order(:id)
     }
 
     class << self
Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/action_cable/subscription_adapter/solid_cable.rb 
new/lib/action_cable/subscription_adapter/solid_cable.rb
--- old/lib/action_cable/subscription_adapter/solid_cable.rb    2025-01-25 
22:55:45.000000000 +0100
+++ new/lib/action_cable/subscription_adapter/solid_cable.rb    1980-01-02 
01:00:00.000000000 +0100
@@ -39,6 +39,11 @@
         end
 
         class Listener < ::ActionCable::SubscriptionAdapter::SubscriberMap
+          CONNECTION_ERRORS = [
+            ActiveRecord::ConnectionFailed,
+            ActiveRecord::ConnectionTimeoutError,
+            ActiveRecord::ConnectionNotEstablished
+          ]
           Stop = Class.new(Exception)
 
           def initialize(event_loop)
@@ -51,8 +56,18 @@
             # for specific sections of code, rather than acquired.
             @critical = Concurrent::Semaphore.new(0)
 
+            @reconnect_attempt = 0
+            @last_id = last_message_id
+
             @thread = Thread.new do
-              listen
+              Thread.current.name = "solid_cable_listener"
+              Thread.current.report_on_exception = true
+
+              begin
+                listen
+              rescue *CONNECTION_ERRORS
+                retry if retry_connecting?
+              end
             end
           end
 
@@ -89,7 +104,7 @@
           end
 
           def add_channel(channel, on_success)
-            channels.add(channel)
+            channels[channel] = last_message_id
             event_loop.post(&on_success) if on_success
           end
 
@@ -103,22 +118,33 @@
 
           private
             attr_reader :event_loop, :thread
-            attr_writer :last_id
+            attr_accessor :last_id, :reconnect_attempt
 
-            def last_id
-              @last_id ||= ::SolidCable::Message.maximum(:id) || 0
+            def last_message_id
+              ::SolidCable::Message.maximum(:id) || 0
             end
 
             def channels
-              @channels ||= Set.new
+              @channels ||= Concurrent::Map.new
             end
 
             def broadcast_messages
-              ::SolidCable::Message.broadcastable(channels, last_id).
+              current_channels = channels.dup
+
+              ::SolidCable::Message.
+                broadcastable(current_channels.keys, last_id).
                 each do |message|
-                broadcast(message.channel, message.payload)
-                self.last_id = message.id
-              end
+                  should_broadcast_message = false
+                  channels.compute_if_present(message.channel) do 
|channel_last_id|
+                    break if channel_last_id >= message.id
+
+                    should_broadcast_message = true
+                    message.id
+                  end
+
+                  broadcast(message.channel, message.payload) if 
should_broadcast_message
+                  self.last_id = message.id
+                end
             end
 
             def with_polling_volume
@@ -129,35 +155,20 @@
               end
             end
 
-            def wake_up
-              interrupt
+            def reconnect_attempts
+              @reconnect_attempts ||= ::SolidCable.reconnect_attempts
             end
 
-            SELF_PIPE_BLOCK_SIZE = 11
+            def retry_connecting?
+              self.reconnect_attempt += 1
 
-            def interrupt
-              self_pipe[:writer].write_nonblock(".")
-            rescue Errno::EAGAIN, Errno::EINTR
-              # Ignore writes that would block and retry
-              # if another signal arrived while writing
-              retry
-            end
+              return false if reconnect_attempt > reconnect_attempts.size
 
-            def interruptible_sleep(time)
-              if time > 0 && self_pipe[:reader].wait_readable(time)
-                loop { self_pipe[:reader].read_nonblock(SELF_PIPE_BLOCK_SIZE) }
-              end
-            rescue Errno::EAGAIN, Errno::EINTR
-            end
+              sleep_t = reconnect_attempts[reconnect_attempt - 1]
 
-            # Self-pipe for signal-handling 
(http://cr.yp.to/docs/selfpipe.html)
-            def self_pipe
-              @self_pipe ||= create_self_pipe
-            end
+              sleep(sleep_t) if sleep_t > 0
 
-            def create_self_pipe
-              reader, writer = IO.pipe
-              { reader: reader, writer: writer }
+              true
             end
         end
     end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/solid_cable/railtie.rb 
new/lib/solid_cable/railtie.rb
--- old/lib/solid_cable/railtie.rb      2025-01-25 22:55:45.000000000 +0100
+++ new/lib/solid_cable/railtie.rb      1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +0,0 @@
-# frozen_string_literal: true
-
-module SolidCable
-  class Railtie < ::Rails::Railtie
-  end
-end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/solid_cable/version.rb 
new/lib/solid_cable/version.rb
--- old/lib/solid_cable/version.rb      2025-01-25 22:55:45.000000000 +0100
+++ new/lib/solid_cable/version.rb      1980-01-02 01:00:00.000000000 +0100
@@ -1,5 +1,5 @@
 # frozen_string_literal: true
 
 module SolidCable
-  VERSION = "3.0.7"
+  VERSION = "4.0.0"
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/solid_cable.rb new/lib/solid_cable.rb
--- old/lib/solid_cable.rb      2025-01-25 22:55:45.000000000 +0100
+++ new/lib/solid_cable.rb      1980-01-02 01:00:00.000000000 +0100
@@ -48,6 +48,12 @@
       2
     end
 
+    def reconnect_attempts
+      attempts = cable_config.fetch(:reconnect_attempts, 1)
+      attempts = Array.new(attempts, 0) if attempts.is_a?(Integer)
+      attempts
+    end
+
     private
       def cable_config
         Rails.application.config_for("cable")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata        2025-01-25 22:55:45.000000000 +0100
+++ new/metadata        1980-01-02 01:00:00.000000000 +0100
@@ -1,14 +1,13 @@
 --- !ruby/object:Gem::Specification
 name: solid_cable
 version: !ruby/object:Gem::Version
-  version: 3.0.7
+  version: 4.0.0
 platform: ruby
 authors:
 - Nick Pezza
-autorequire:
 bindir: bin
 cert_chain: []
-date: 2025-01-25 00:00:00.000000000 Z
+date: 1980-01-02 00:00:00.000000000 Z
 dependencies:
 - !ruby/object:Gem::Dependency
   name: activerecord
@@ -66,6 +65,20 @@
     - - ">="
       - !ruby/object:Gem::Version
         version: '7.2'
+- !ruby/object:Gem::Dependency
+  name: minitest
+  requirement: !ruby/object:Gem::Requirement
+    requirements:
+    - - "~>"
+      - !ruby/object:Gem::Version
+        version: '5.0'
+  type: :development
+  prerelease: false
+  version_requirements: !ruby/object:Gem::Requirement
+    requirements:
+    - - "~>"
+      - !ruby/object:Gem::Version
+        version: '5.0'
 description: Database-backed Action Cable backend.
 email:
 - [email protected]
@@ -89,7 +102,6 @@
 - lib/generators/solid_cable/update/update_generator.rb
 - lib/solid_cable.rb
 - lib/solid_cable/engine.rb
-- lib/solid_cable/railtie.rb
 - lib/solid_cable/version.rb
 - lib/tasks/solid_cable_tasks.rake
 homepage: https://github.com/rails/solid_cable
@@ -99,7 +111,6 @@
   homepage_uri: https://github.com/rails/solid_cable
   source_code_uri: https://github.com/rails/solid_cable
   rubygems_mfa_required: 'true'
-post_install_message:
 rdoc_options: []
 require_paths:
 - lib
@@ -107,15 +118,14 @@
   requirements:
   - - ">="
     - !ruby/object:Gem::Version
-      version: 3.1.0
+      version: 3.3.0
 required_rubygems_version: !ruby/object:Gem::Requirement
   requirements:
   - - ">="
     - !ruby/object:Gem::Version
       version: '0'
 requirements: []
-rubygems_version: 3.5.18
-signing_key:
+rubygems_version: 4.0.10
 specification_version: 4
 summary: Database-backed Action Cable backend.
 test_files: []

Reply via email to