From 6b04a86e7ef99b62fe79fd15bd38956faf33e3dc Mon Sep 17 00:00:00 2001 From: Lucas Zawacki Date: Fri, 6 Mar 2015 16:47:07 -0300 Subject: [PATCH 1/2] Prevent slowdown on firefox when deleting lots of shape messages By creating a new collection called WhiteboardCleanStatus which is used to alert the clients that the server is cleaning shapes. When shapes are being cleaned they are not drawn and so things don't slow down on firefox or chrome --- .../app/client/views/whiteboard/slide.coffee | 3 ++ .../app/collections/collections.coffee | 2 + bigbluebutton-html5/app/lib/router.coffee | 37 ++++++++++--------- .../server/collection_methods/shapes.coffee | 24 ++++++------ bigbluebutton-html5/app/server/publish.coffee | 4 ++ .../app/server/redispubsub.coffee | 6 +++ bigbluebutton-html5/app/server/server.coffee | 1 + 7 files changed, 48 insertions(+), 29 deletions(-) diff --git a/bigbluebutton-html5/app/client/views/whiteboard/slide.coffee b/bigbluebutton-html5/app/client/views/whiteboard/slide.coffee index 677611fe77..24a7e8898c 100755 --- a/bigbluebutton-html5/app/client/views/whiteboard/slide.coffee +++ b/bigbluebutton-html5/app/client/views/whiteboard/slide.coffee @@ -26,6 +26,9 @@ Template.slide.rendered = -> wpm.scale(adjustedDimensions.width, adjustedDimensions.height) @manuallyDisplayShapes = -> + + return if Meteor.WhiteboardCleanStatus.findOne({in_progress: true})? + currentSlide = getCurrentSlideDoc() wpm = @whiteboardPaperModel shapes = Meteor.Shapes.find({whiteboardId: currentSlide?.slide?.id}).fetch() diff --git a/bigbluebutton-html5/app/collections/collections.coffee b/bigbluebutton-html5/app/collections/collections.coffee index 49987e25c0..200fe01e36 100755 --- a/bigbluebutton-html5/app/collections/collections.coffee +++ b/bigbluebutton-html5/app/collections/collections.coffee @@ -4,3 +4,5 @@ Meteor.Meetings = new Meteor.Collection("meetings") Meteor.Presentations = new Meteor.Collection("presentations") Meteor.Shapes = new Meteor.Collection("shapes") Meteor.Slides = new Meteor.Collection("slides") + +Meteor.WhiteboardCleanStatus = new Meteor.Collection("whiteboard-clean-status") \ No newline at end of file diff --git a/bigbluebutton-html5/app/lib/router.coffee b/bigbluebutton-html5/app/lib/router.coffee index 0639f52e42..0c22de573a 100755 --- a/bigbluebutton-html5/app/lib/router.coffee +++ b/bigbluebutton-html5/app/lib/router.coffee @@ -55,29 +55,30 @@ Meteor.subscribe 'meetings', meetingId, onReady: => Meteor.subscribe 'presentations', meetingId, onReady: => Meteor.subscribe 'users', meetingId, userId, authToken, onError: onErrorFunction, onReady: => - # done subscribing - onLoadComplete() + Meteor.subscribe 'whiteboard-clean-status', meetingId, onReady: => + # done subscribing + onLoadComplete() - handleLogourUrlError = () -> - alert "Error: could not find the logoutURL" - setInSession("logoutURL", document.location.hostname) - return - - # obtain the logoutURL - a = $.ajax({dataType: 'json', url: '/bigbluebutton/api/enter'}) - a.done (data) -> - if data.response.logoutURL? # for a meeting with 0 users - setInSession("logoutURL", data.response.logoutURL) + handleLogourUrlError = () -> + alert "Error: could not find the logoutURL" + setInSession("logoutURL", document.location.hostname) return - else - if data.response.logoutUrl? # for a running meeting - setInSession("logoutURL", data.response.logoutUrl) + + # obtain the logoutURL + a = $.ajax({dataType: 'json', url: '/bigbluebutton/api/enter'}) + a.done (data) -> + if data.response.logoutURL? # for a meeting with 0 users + setInSession("logoutURL", data.response.logoutURL) return else - handleLogourUrlError() + if data.response.logoutUrl? # for a running meeting + setInSession("logoutURL", data.response.logoutUrl) + return + else + handleLogourUrlError() - a.fail (data, textStatus, errorThrown) -> - handleLogourUrlError() + a.fail (data, textStatus, errorThrown) -> + handleLogourUrlError() @render('main') diff --git a/bigbluebutton-html5/app/server/collection_methods/shapes.coffee b/bigbluebutton-html5/app/server/collection_methods/shapes.coffee index 2f73effb9d..d4c0e1607e 100755 --- a/bigbluebutton-html5/app/server/collection_methods/shapes.coffee +++ b/bigbluebutton-html5/app/server/collection_methods/shapes.coffee @@ -67,15 +67,13 @@ @removeAllShapesFromSlide = (meetingId, whiteboardId) -> Meteor.log.info "removeAllShapesFromSlide__" + whiteboardId if meetingId? and whiteboardId? and Meteor.Shapes.find({meetingId: meetingId, whiteboardId: whiteboardId})? - shapesOnSlide = Meteor.Shapes.find({meetingId: meetingId, whiteboardId: whiteboardId}).fetch() - Meteor.log.info "number of shapes:" + shapesOnSlide.length - for s in shapesOnSlide - Meteor.log.info "shape=" + s.shape.id - id = Meteor.Shapes.findOne({meetingId: meetingId, whiteboardId: whiteboardId, "shape.id": s.shape.id}) - if id? - Meteor.Shapes.remove(id._id) - Meteor.log.info "----removed shape[" + s.shape.id + "] from " + whiteboardId - Meteor.log.info "remaining shapes on the slide:" + Meteor.Shapes.find({meetingId: meetingId, whiteboardId: whiteboardId}).fetch().length + Meteor.Shapes.remove {meetingId: meetingId, whiteboardId: whiteboardId}, -> + Meteor.log.info "clearing all shapes from slide" + + # After shapes are cleared, wait 1 second and set cleaning off + Meteor.setTimeout -> + Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {in_progress: false}}) + , 1000 @removeShapeFromSlide = (meetingId, whiteboardId, shapeId) -> shapeToRemove = Meteor.Shapes.findOne({meetingId: meetingId, whiteboardId: whiteboardId, "shape.id": shapeId}) @@ -88,9 +86,13 @@ # called on server start and meeting end @clearShapesCollection = (meetingId) -> if meetingId? - Meteor.Shapes.remove({meetingId: meetingId}, Meteor.log.info "cleared Shapes Collection (meetingId: #{meetingId}!") + Meteor.Shapes.remove {}, -> + Meteor.log.info "cleared Shapes Collection (meetingId: #{meetingId}!" + Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {in_progress: false}}) else - Meteor.Shapes.remove({}, Meteor.log.info "cleared Shapes Collection (all meetings)!") + Meteor.Shapes.remove {}, -> + Meteor.log.info "cleared Shapes Collection (all meetings)!" + Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {in_progress: false}}) # -------------------------------------------------------------------------------------------- # end Private methods on server diff --git a/bigbluebutton-html5/app/server/publish.coffee b/bigbluebutton-html5/app/server/publish.coffee index ef7510d74d..b1500de47f 100755 --- a/bigbluebutton-html5/app/server/publish.coffee +++ b/bigbluebutton-html5/app/server/publish.coffee @@ -70,3 +70,7 @@ Meteor.publish 'meetings', (meetingId) -> Meteor.publish 'presentations', (meetingId) -> Meteor.log.info "publishing presentations for #{meetingId}" Meteor.Presentations.find({meetingId: meetingId}) + +Meteor.publish 'whiteboard-clean-status', (meetingId) -> + Meteor.log.info "whiteboard clean status #{meetingId}" + Meteor.WhiteboardCleanStatus.find({meetingId: meetingId}) diff --git a/bigbluebutton-html5/app/server/redispubsub.coffee b/bigbluebutton-html5/app/server/redispubsub.coffee index 3d81454bb1..07bebcf6fe 100755 --- a/bigbluebutton-html5/app/server/redispubsub.coffee +++ b/bigbluebutton-html5/app/server/redispubsub.coffee @@ -219,6 +219,11 @@ class Meteor.RedisPubSub return if message.header.name is "get_whiteboard_shapes_reply" and message.payload.requester_id is "nodeJSapp" + + # Create a whiteboard clean status or find one for the current meeting + if not Meteor.WhiteboardCleanStatus.findOne({meetingId: meetingId})? + Meteor.WhiteboardCleanStatus.insert({meetingId: meetingId, in_progress: false}) + for shape in message.payload.shapes whiteboardId = shape.wb_id addShapeToCollection meetingId, whiteboardId, shape @@ -238,6 +243,7 @@ class Meteor.RedisPubSub if message.header.name is "whiteboard_cleared_message" whiteboardId = message.payload.whiteboard_id + Meteor.WhiteboardCleanStatus.update({meetingId: meetingId}, {$set: {'in_progress': true}}) removeAllShapesFromSlide meetingId, whiteboardId return diff --git a/bigbluebutton-html5/app/server/server.coffee b/bigbluebutton-html5/app/server/server.coffee index 125492a669..e85cf7dd06 100755 --- a/bigbluebutton-html5/app/server/server.coffee +++ b/bigbluebutton-html5/app/server/server.coffee @@ -2,6 +2,7 @@ Meteor.startup -> Meteor.log.info "server start" #remove all data + Meteor.WhiteboardCleanStatus.remove({}) clearUsersCollection() clearChatCollection() clearMeetingsCollection() From 8f89bfd427536caaeaf0eb5785f8103a03735430 Mon Sep 17 00:00:00 2001 From: Maxim Khlobystov Date: Mon, 8 Jun 2015 12:16:57 -0700 Subject: [PATCH 2/2] Suppressed the log messages from timesync (clock discrepancy and re-sync attempts). --- bigbluebutton-html5/app/client/globals.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/bigbluebutton-html5/app/client/globals.coffee b/bigbluebutton-html5/app/client/globals.coffee index b09fb66573..6b6071e4ef 100755 --- a/bigbluebutton-html5/app/client/globals.coffee +++ b/bigbluebutton-html5/app/client/globals.coffee @@ -351,6 +351,7 @@ Handlebars.registerHelper 'whiteboardSize', (section) -> else setInSession 'display_usersList', false setInSession 'display_menu', false + TimeSync.loggingEnabled = false # suppresses the log messages from timesync @onLoadComplete = -> document.title = "BigBlueButton #{BBB.getMeetingName() ? 'HTML5'}"