Skip to content

Commit de8f975

Browse files
authored
Cleanup #broadcast_messages to avoid race conditions (#68)
1 parent 4f459ef commit de8f975

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

lib/action_cable/subscription_adapter/solid_cable.rb

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,22 @@ def last_message_id
109109
end
110110

111111
def channels
112-
@channels ||= Concurrent::Hash.new
112+
@channels ||= Concurrent::Map.new
113113
end
114114

115115
def broadcast_messages
116-
::SolidCable::Message.broadcastable(channels.keys, channels.values.min).
116+
current_channels = channels.dup
117+
118+
::SolidCable::Message.
119+
broadcastable(current_channels.keys, current_channels.values.min).
117120
each do |message|
118-
if channels[message.channel].present? && channels[message.channel] < message.id
119-
broadcast(message.channel, message.payload)
120-
channels[message.channel] = message.id
121+
channels.compute_if_present(message.channel) do |last_id|
122+
break if last_id >= message.id
123+
124+
broadcast(message.channel, message.payload)
125+
message.id
126+
end
121127
end
122-
end
123128
end
124129

125130
def with_polling_volume

0 commit comments

Comments
 (0)