forked from External/greenlight
GRN2-277: Optimize server recordings to make it useable for large deployments (#2411)
* First changes to server recordings * Update server recordings * Rubocop * Make sure to return nothing for empty searches * Made sure exactly the right amount of recordings are returned * Added test cases
This commit is contained in:
@ -56,12 +56,19 @@ class AdminsController < ApplicationController
|
||||
|
||||
# GET /admins/server_recordings
|
||||
def server_recordings
|
||||
server_rooms = rooms_list_for_recordings
|
||||
@search = params[:search] || ""
|
||||
|
||||
@search, @order_column, @order_direction, recs =
|
||||
all_recordings(server_rooms, params.permit(:search, :column, :direction), true, true)
|
||||
if @search.present?
|
||||
if @search.include? "@"
|
||||
user_email = @search
|
||||
else
|
||||
room_uid = @search
|
||||
end
|
||||
else
|
||||
@latest = true
|
||||
end
|
||||
|
||||
@pagy, @recordings = pagy_array(recs)
|
||||
@pagy, @recordings = pagy_array(recordings_to_show(user_email, room_uid))
|
||||
end
|
||||
|
||||
# GET /admins/rooms
|
||||
|
@ -56,12 +56,22 @@ module Populator
|
||||
end
|
||||
end
|
||||
|
||||
# Returns list of rooms needed to get the recordings on the server
|
||||
def rooms_list_for_recordings
|
||||
if Rails.configuration.loadbalanced_configuration
|
||||
Room.includes(:owner).where(users: { provider: @user_domain }).pluck(:bbb_id)
|
||||
# Returns the correct recordings based on the users inputs
|
||||
def recordings_to_show(user = nil, room = nil)
|
||||
if user.present?
|
||||
# Find user and get his recordings
|
||||
rooms = User.find_by(email: user)&.rooms&.pluck(:bbb_id)
|
||||
return all_recordings(rooms) if user.present?
|
||||
|
||||
[] # return no recs if room not found
|
||||
elsif room.present?
|
||||
# Find room and get its recordings
|
||||
room = Room.find_by(uid: room)&.bbb_id
|
||||
return all_recordings([room]) if room.present?
|
||||
|
||||
[]
|
||||
else
|
||||
Room.pluck(:bbb_id)
|
||||
latest_recordings
|
||||
end
|
||||
end
|
||||
|
||||
@ -75,4 +85,36 @@ module Populator
|
||||
|
||||
list.admins_search(@search).order(updated_at: :desc)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Returns exactly 1 page of the latest recordings
|
||||
def latest_recordings
|
||||
return_length = Rails.configuration.pagination_number
|
||||
recordings = []
|
||||
counter = 0
|
||||
|
||||
# Manually paginate through the rooms
|
||||
while recordings.length < return_length
|
||||
rooms = if Rails.configuration.loadbalanced_configuration
|
||||
Room.includes(:owner)
|
||||
.where(users: { provider: @user_domain })
|
||||
.order(last_session: :desc)
|
||||
.limit(return_length)
|
||||
.offset(counter * return_length)
|
||||
.pluck(:bbb_id)
|
||||
else
|
||||
Room.order(last_session: :desc)
|
||||
.limit(return_length)
|
||||
.offset(counter * return_length)
|
||||
.pluck(:bbb_id)
|
||||
end
|
||||
|
||||
break if rooms.blank?
|
||||
counter += 1
|
||||
recordings.push(*all_recordings(rooms))
|
||||
end
|
||||
|
||||
recordings[0..return_length]
|
||||
end
|
||||
end
|
||||
|
@ -37,7 +37,7 @@ module Recorder
|
||||
def all_recordings(room_bbb_ids, search_params = {}, ret_search_params = false, search_name = false)
|
||||
res = { recordings: [] }
|
||||
|
||||
until room_bbb_ids.empty?
|
||||
until room_bbb_ids.empty? || res[:recordings].length > Rails.configuration.pagination_number
|
||||
# bbb.get_recordings returns an object
|
||||
# take only the array portion of the object that is returned
|
||||
full_res = get_multiple_recordings(room_bbb_ids.pop(Rails.configuration.pagination_number))
|
||||
|
Reference in New Issue
Block a user