Skip to content

Commit e5d73f5

Browse files
authored
Dont broadcast message in compute_if_present to avoid race condition (#72)
1 parent 9e16e1d commit e5d73f5

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

.ruby-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.4.4
1+
3.4.5

lib/action_cable/subscription_adapter/solid_cable.rb

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ def initialize(event_loop)
5252
@critical = Concurrent::Semaphore.new(0)
5353

5454
@thread = Thread.new do
55+
Thread.current.name = "solid_cable_listener"
56+
Thread.current.report_on_exception = true
57+
5558
listen
5659
end
5760
end
@@ -103,6 +106,11 @@ def invoke_callback(*)
103106

104107
private
105108
attr_reader :event_loop, :thread
109+
attr_writer :last_id
110+
111+
def last_id
112+
@last_id ||= last_message_id
113+
end
106114

107115
def last_message_id
108116
::SolidCable::Message.maximum(:id) || 0
@@ -116,14 +124,18 @@ def broadcast_messages
116124
current_channels = channels.dup
117125

118126
::SolidCable::Message.
119-
broadcastable(current_channels.keys, current_channels.values.min).
127+
broadcastable(current_channels.keys, last_id).
120128
each do |message|
121-
channels.compute_if_present(message.channel) do |last_id|
122-
break if last_id >= message.id
129+
should_broadcast_message = false
130+
channels.compute_if_present(message.channel) do |channel_last_id|
131+
break if channel_last_id >= message.id
123132

124-
broadcast(message.channel, message.payload)
133+
should_broadcast_message = true
125134
message.id
126135
end
136+
137+
broadcast(message.channel, message.payload) if should_broadcast_message
138+
self.last_id = message.id
127139
end
128140
end
129141

0 commit comments

Comments
 (0)