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: []