Skip to content

Commit

Permalink
try to speedup getrecordings, could reduce from 35s to 25s, but it's …
Browse files Browse the repository at this point in the history
…still not enough; need to better understand where's the bottleneck
  • Loading branch information
fcecagno committed Feb 3, 2016
1 parent 39af398 commit cbaee9d
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 44 deletions.
Expand Up @@ -94,8 +94,12 @@ public class RecordingServiceHelperImp implements RecordingServiceHelper {
public Recording getRecordingInfo(String id, String recordingDir, String playbackFormat) {
String path = recordingDir + File.separatorChar + playbackFormat;
File dir = new File(path);
return getRecordingInfo(dir);
}

public Recording getRecordingInfo(File dir) {
if (dir.isDirectory()) {
def recording = new XmlSlurper().parse(new File(path + File.separatorChar + id + File.separatorChar + "metadata.xml"));
def recording = new XmlSlurper().parse(new File(dir.getPath() + File.separatorChar + "metadata.xml"));
return getInfo(recording);
}
return null;
Expand Down
Expand Up @@ -354,7 +354,11 @@ public Meeting getNotEndedMeetingWithId(String meetingId) {

public HashMap<String,Recording> getRecordings(ArrayList<String> idList) {
//TODO: this method shouldn't be used
HashMap<String,Recording> recs= reorderRecordings(recordingService.getRecordings(idList));
log.debug("starting to fetch recordings");
ArrayList<Recording> recsList = recordingService.getRecordings(idList);
log.debug("got all recordings, without ordering");
HashMap<String,Recording> recs= reorderRecordings(recsList);
log.debug("returning ordered recordings");
return recs;
}

Expand Down
148 changes: 106 additions & 42 deletions bigbluebutton-web/src/java/org/bigbluebutton/api/RecordingService.java
Expand Up @@ -22,9 +22,18 @@
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.bigbluebutton.api.domain.Recording;
import org.slf4j.Logger;
Expand Down Expand Up @@ -58,18 +67,32 @@ public void startIngestAndProcessing(String meetingId) {
public ArrayList<Recording> getRecordings(ArrayList<String> meetingIds) {
ArrayList<Recording> recs = new ArrayList<Recording>();

List<File> allPublishedDirectories = new ArrayList<File>();
String[] publishedFormats = getPlaybackFormats(publishedDir);
for (int i = 0; i < publishedFormats.length; ++i) {
allPublishedDirectories.addAll(getDirectories(publishedDir + File.separatorChar + publishedFormats[i]));
}

List<File> allUnpublishedDirectories = new ArrayList<File>();
String[] unpublishedFormats = getPlaybackFormats(unpublishedDir);
for (int i = 0; i < unpublishedFormats.length; ++i) {
allUnpublishedDirectories.addAll(getDirectories(unpublishedDir + File.separatorChar + unpublishedFormats[i]));
}

if(meetingIds.isEmpty()){
meetingIds.addAll(getAllRecordingIds(publishedDir));
meetingIds.addAll(getAllRecordingIds(unpublishedDir));
meetingIds.addAll(getAllRecordingIds(allPublishedDirectories));
meetingIds.addAll(getAllRecordingIds(allUnpublishedDirectories));
}

log.debug("got all recording ids");

for(String meetingId : meetingIds){
ArrayList<Recording> published = getRecordingsForPath(meetingId, publishedDir);
List<Recording> published = getRecordingsForPath(meetingId, allPublishedDirectories);
if (!published.isEmpty()) {
recs.addAll(published);
}

ArrayList<Recording> unpublished = getRecordingsForPath(meetingId, unpublishedDir);
List<Recording> unpublished = getRecordingsForPath(meetingId, allUnpublishedDirectories);
if (!unpublished.isEmpty()) {
recs.addAll(unpublished);
}
Expand Down Expand Up @@ -100,9 +123,9 @@ public Map<String, Recording> filterRecordingsByMetadata(Map<String, Recording>
return resultRecordings;
}

public boolean existAnyRecording(ArrayList<String> idList){
ArrayList<String> publishList=getAllRecordingIds(publishedDir);
ArrayList<String> unpublishList=getAllRecordingIds(unpublishedDir);
public boolean existAnyRecording(List<String> idList){
List<String> publishList=getAllRecordingIds(publishedDir);
List<String> unpublishList=getAllRecordingIds(unpublishedDir);

for(String id:idList){
if(publishList.contains(id)||unpublishList.contains(id)){
Expand All @@ -112,36 +135,65 @@ public boolean existAnyRecording(ArrayList<String> idList){
return false;
}

private ArrayList<String> getAllRecordingIds(String path){
ArrayList<String> ids=new ArrayList<String>();

private List<String> getAllRecordingIds(String path){
String[] format = getPlaybackFormats(path);

return getAllRecordingIds(path, format);
}

private List<String> getAllRecordingIds(String path, String[] format) {
List<String> ids=new ArrayList<String>();

for (int i = 0; i < format.length; i++) {
File[] recordings = getDirectories(path + File.separatorChar + format[i]);
for (int f = 0; f < recordings.length; f++) {
if(!ids.contains(recordings[f].getName()))
ids.add(recordings[f].getName());
List<File> recordings = getDirectories(path + File.separatorChar + format[i]);
for (int f = 0; f < recordings.size(); f++) {
if(!ids.contains(recordings.get(f).getName()))
ids.add(recordings.get(f).getName());
}
}
return ids;
}

private ArrayList<Recording> getRecordingsForPath(String meetingId, String path) {
ArrayList<Recording> recs = new ArrayList<Recording>();
private Set<String> getAllRecordingIds(List<File> recs) {
Set<String> ids=new HashSet<String>();

Iterator<File> iterator = recs.iterator();
while (iterator.hasNext()) {
ids.add(iterator.next().getName());
}
return ids;
}

private List<Recording> getRecordingsForPath(String meetingId, String path) {
List<Recording> recs = new ArrayList<Recording>();

String[] format = getPlaybackFormats(path);
for (int i = 0; i < format.length; i++) {
File[] recordings = getDirectories(path + File.separatorChar + format[i]);
for (int f = 0; f < recordings.length; f++) {
if (recordings[f].getName().startsWith(meetingId)) {
Recording r = getRecordingInfo(path, recordings[f].getName(), format[i]);
List<File> recordings = getDirectories(path + File.separatorChar + format[i]);
for (int f = 0; f < recordings.size(); f++) {
if (recordings.get(f).getName().startsWith(meetingId)) {
Recording r = getRecordingInfo(path, recordings.get(f).getName(), format[i]);
if (r != null) recs.add(r);
}
}
}
return recs;
}

private List<Recording> getRecordingsForPath(String meetingId, List<File> recordings) {
List<Recording> recs = new ArrayList<Recording>();

Iterator<File> iterator = recordings.iterator();
while (iterator.hasNext()) {
File recording = iterator.next();
if (recording.getName().startsWith(meetingId)) {
Recording r = getRecordingInfo(recording);
if (r != null) recs.add(r);
}
}
return recs;
}

public Recording getRecordingInfo(String recordingId, String format) {
return getRecordingInfo(publishedDir, recordingId, format);
}
Expand All @@ -151,6 +203,11 @@ private Recording getRecordingInfo(String path, String recordingId, String forma
return rec;
}

private Recording getRecordingInfo(File dir) {
Recording rec = recordingServiceHelper.getRecordingInfo(dir);
return rec;
}

public void publish(String recordingId, boolean publish) {
if(publish)
publish(unpublishedDir, recordingId, publish);
Expand All @@ -161,9 +218,10 @@ public void publish(String recordingId, boolean publish) {
private void publish(String path, String recordingId, boolean publish) {
String[] format = getPlaybackFormats(path);
for (int i = 0; i < format.length; i++) {
File[] recordings = getDirectories(path + File.separatorChar + format[i]);
for (int f = 0; f < recordings.length; f++) {
if (recordings[f].getName().equalsIgnoreCase(recordingId)) {
List<File> recordings = getDirectories(path + File.separatorChar + format[i]);
for (int f = 0; f < recordings.size(); f++) {
File recording = recordings.get(f);
if (recording.getName().equalsIgnoreCase(recordingId)) {
Recording r = getRecordingInfo(path, recordingId, format[i]);
if (r != null) {
File dest;
Expand All @@ -173,11 +231,11 @@ private void publish(String path, String recordingId, boolean publish) {
dest = new File(unpublishedDir+ File.separatorChar + format[i]);
}
if(!dest.exists()) dest.mkdir();
boolean moved = recordings[f].renameTo(new File(dest, recordings[f].getName()));
boolean moved = recording.renameTo(new File(dest, recording.getName()));
if (moved) {
log.debug("Recording successfully moved!");
r.setPublished(publish);
recordingServiceHelper.writeRecordingInfo(dest.getAbsolutePath() + File.separatorChar + recordings[f].getName(), r);
recordingServiceHelper.writeRecordingInfo(dest.getAbsolutePath() + File.separatorChar + recording.getName(), r);
}
}
}
Expand All @@ -193,10 +251,10 @@ public void delete(String recordingId) {
private void deleteRecording(String id, String path) {
String[] format = getPlaybackFormats(path);
for (int i = 0; i < format.length; i++) {
File[] recordings = getDirectories(path + File.separatorChar + format[i]);
for (int f = 0; f < recordings.length; f++) {
if (recordings[f].getName().equals(id)) {
deleteDirectory(recordings[f]);
List<File> recordings = getDirectories(path + File.separatorChar + format[i]);
for (int f = 0; f < recordings.size(); f++) {
if (recordings.get(f).getName().equals(id)) {
deleteDirectory(recordings.get(f));
}
}
}
Expand All @@ -220,23 +278,29 @@ private void deleteDirectory(File directory) {
directory.delete();
}

private File[] getDirectories(String path) {

File dir = new File(path);
FileFilter fileFilter = new FileFilter() {
public boolean accept(File file) {
return file.isDirectory();
}
};
return dir.listFiles(fileFilter);
private List<File> getDirectories(String path) {
// Collection<File> files = FileUtils.listFilesAndDirs(new File(path), new NotFileFilter(TrueFileFilter.INSTANCE), DirectoryFileFilter.DIRECTORY);
log.debug("getting directories for {}", path);
List<File> files = new ArrayList<File>();
try {
DirectoryStream<Path> stream = Files.newDirectoryStream(FileSystems.getDefault().getPath(path));
Iterator<Path> iter = stream.iterator();
while (iter.hasNext()) {
Path next = iter.next();
files.add(next.toFile());
}
} catch (IOException e) {
e.printStackTrace();
}
return files;
}

private String[] getPlaybackFormats(String path) {
File[] dirs = getDirectories(path);
String[] formats = new String[dirs.length];
List<File> dirs = getDirectories(path);
String[] formats = new String[dirs.size()];

for (int i = 0; i < dirs.length; i++) {
formats[i] = dirs[i].getName();
for (int i = 0; i < dirs.size(); i++) {
formats[i] = dirs.get(i).getName();
}
return formats;
}
Expand Down
Expand Up @@ -19,9 +19,12 @@

package org.bigbluebutton.api;

import java.io.File;

import org.bigbluebutton.api.domain.Recording;

public interface RecordingServiceHelper {
public Recording getRecordingInfo(String id, String publishedDir, String playbackFormat);
public Recording getRecordingInfo(File dir);
public void writeRecordingInfo(String path, Recording info);
}

0 comments on commit cbaee9d

Please sign in to comment.