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:
Ahmad Farhat
2021-01-12 17:36:51 -05:00
committed by GitHub
parent 9cd08dab54
commit 2b0a80c7eb
13 changed files with 102 additions and 15 deletions

View File

@ -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

View File

@ -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

View File

@ -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))