wait until after transaction for track changes

This commit is contained in:
Seth Call 2020-11-03 13:50:35 -06:00
parent 3b5b3608b1
commit 695d95ecac
2 changed files with 32 additions and 9 deletions

View File

@ -353,19 +353,22 @@ SQL
end
def update_session_controller(music_session_id)
tracks_changed = false
active_music_session = ActiveMusicSession.find(music_session_id)
if active_music_session
music_session = active_music_session.music_session
if music_session.session_controller_id && !active_music_session.users.exists?(music_session.session_controller.id)
# find next in line, because the current 'session controller' is not part of the session
next_in_line(music_session, active_music_session)
tracks_changed = next_in_line(music_session, active_music_session)
end
end
tracks_changed
end
# determine who should be session controller after someone leaves
def next_in_line(music_session, active_music_session)
tracks_changed = false
session_users = active_music_session.users
# check friends 1st
@ -374,7 +377,7 @@ SQL
music_session.session_controller = session_friends[0]
if music_session.save
active_music_session.tick_track_changes
Notification.send_tracks_changed(active_music_session)
tracks_changed = true
return
end
end
@ -385,7 +388,7 @@ SQL
music_session.session_controller = invited[0]
if music_session.save
active_music_session.tick_track_changes
Notification.send_tracks_changed(active_music_session)
tracks_changed = true
return
end
end
@ -397,16 +400,17 @@ SQL
music_session.session_controller = earliest
if music_session.save
active_music_session.tick_track_changes
Notification.send_tracks_changed(active_music_session)
tracks_changed = true
return
end
end
music_session.creator
tracks_changed
end
def join_music_session(user, client_id, music_session, as_musician, tracks, audio_latency, client_role = nil, parent_client_id = nil, video_sources=nil)
connection = nil
tracks_changed = false
ConnectionManager.active_record_transaction do |connection_manager|
db_conn = connection_manager.pg_conn
@ -432,11 +436,15 @@ SQL
if connection.errors.any?
raise ActiveRecord::Rollback
else
update_session_controller(music_session.id)
tracks_changed = update_session_controller(music_session.id)
end
end
if tracks_changed
Notification.send_tracks_changed(music_session.active_music_session)
end
connection
end
@ -444,6 +452,7 @@ SQL
# if a blk is passed in, upon success, it will be called and you can issue notifications
# within the connection table lock
def leave_music_session(user, connection, music_session, &blk)
send_tracks_changed = false
ConnectionManager.active_record_transaction do |connection_manager|
conn = connection_manager.pg_conn
@ -469,7 +478,7 @@ SQL
if result.cmd_tuples == 1
@log.debug("disassociated music_session with connection for client_id=#{client_id}, user_id=#{user_id}")
update_session_controller(music_session.id)
send_tracks_changed = update_session_controller(music_session.id)
JamRuby::MusicSessionUserHistory.removed_music_session(user_id, music_session_id)
session_checks(conn, previous_music_session_id, user_id)
@ -484,6 +493,10 @@ SQL
end
end
end
if send_tracks_changed
Notification.send_tracks_changed(music_session.active_music_session)
end
end
def lock_connections(conn)

View File

@ -98,13 +98,15 @@ class MusicSessionManager < BaseManager
def participant_create(user, music_session_id, client_id, as_musician, tracks, audio_latency)
connection = nil
music_session = nil
active_music_session = nil
send_track_changed = false
ActiveRecord::Base.transaction do
active_music_session = ActiveMusicSession.find(music_session_id)
active_music_session.with_lock do # VRFS-1297
active_music_session.tick_track_changes
Notification.send_tracks_changed(active_music_session)
send_track_changed = true
connection = ConnectionManager.new.join_music_session(user, client_id, active_music_session, as_musician, tracks, audio_latency)
if connection.errors.any?
@ -114,6 +116,9 @@ class MusicSessionManager < BaseManager
end
end
if send_track_changed
Notification.send_tracks_changed(active_music_session)
end
unless connection.errors.any?
user.update_progression_field(:first_music_session_at)
@ -144,15 +149,20 @@ class MusicSessionManager < BaseManager
recordingId = nil
tracks_changed = false
active_music_session.with_lock do # VRFS-1297
ConnectionManager.new.leave_music_session(user, connection, active_music_session) do
active_music_session.tick_track_changes
Notification.send_tracks_changed(active_music_session)
tracks_changed = true
recording = active_music_session.stop_recording # stop any ongoing recording, if there is one
recordingId = recording.id unless recording.nil?
end
end
if tracks_changed
Notification.send_tracks_changed(active_music_session)
end
Notification.send_session_depart(active_music_session, connection.client_id, user, recordingId)
end