summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLauri Ojansivu <x@xet7.org>2019-02-28 22:39:02 +0200
committerLauri Ojansivu <x@xet7.org>2019-02-28 22:39:02 +0200
commit4b3795814018ceb16f6df4c5e6df146c89e2111a (patch)
treed197f95cfa14decaf1833fa76000de69d593f319
parent49229e1723de14cdc66dc6480624bba426d35e36 (diff)
parent3edff32bde9eda3c0ea8bf3960aa8eef1a3c5524 (diff)
downloadwekan-4b3795814018ceb16f6df4c5e6df146c89e2111a.tar.gz
wekan-4b3795814018ceb16f6df4c5e6df146c89e2111a.tar.bz2
wekan-4b3795814018ceb16f6df4c5e6df146c89e2111a.zip
Merge branch 'devel' into edge
-rw-r--r--.meteor/packages1
-rw-r--r--.meteor/versions1
-rw-r--r--CHANGELOG.md10
-rw-r--r--models/attachments.js4
-rw-r--r--models/checklistItems.js1
-rw-r--r--models/customFields.js6
-rw-r--r--models/integrations.js4
-rw-r--r--server/publications/boards.js49
8 files changed, 61 insertions, 15 deletions
diff --git a/.meteor/packages b/.meteor/packages
index 274a8d0d..964c070f 100644
--- a/.meteor/packages
+++ b/.meteor/packages
@@ -91,3 +91,4 @@ wekan:accounts-cas
wekan-scrollbar
mquandalle:perfect-scrollbar
mdg:meteor-apm-agent
+meteorhacks:unblock
diff --git a/.meteor/versions b/.meteor/versions
index e91115a2..71e2efac 100644
--- a/.meteor/versions
+++ b/.meteor/versions
@@ -94,6 +94,7 @@ meteorhacks:collection-utils@1.2.0
meteorhacks:meteorx@1.4.1
meteorhacks:picker@1.0.3
meteorhacks:subs-manager@1.6.4
+meteorhacks:unblock@1.1.0
meteorspark:util@0.2.0
minifier-css@1.2.16
minifier-js@2.2.2
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6d50c383..96ae292b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,13 @@
+# Upcoming Wekan release
+
+This release adds the following [performance improvements](https://github.com/wekan/wekan/pull/2214), thanks to justinr1234:
+
+- New indexes for queries that were missing an index;
+- Bulk querying documents to reduce the number of mongo queries when loading a board;
+- Ensure oplog is being used to query the database by providing a `sort` key when `limit` is used querying the `boards` collection.
+
+Thanks to above GitHub users for their contributions.
+
# v2.31 2019-02-28 Wekan release
This release fixes the following bugs related to [Template features](https://github.com/wekan/wekan/issues/2209), thanks to GitHub user andresmanelli:
diff --git a/models/attachments.js b/models/attachments.js
index 3da067de..f870861b 100644
--- a/models/attachments.js
+++ b/models/attachments.js
@@ -27,6 +27,10 @@ Attachments = new FS.Collection('attachments', {
if (Meteor.isServer) {
+ Meteor.startup(() => {
+ Attachments.files._ensureIndex({ cardId: 1 });
+ });
+
Attachments.allow({
insert(userId, doc) {
return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
diff --git a/models/checklistItems.js b/models/checklistItems.js
index 35b18ed7..30e57aec 100644
--- a/models/checklistItems.js
+++ b/models/checklistItems.js
@@ -189,6 +189,7 @@ function publishChekListUncompleted(userId, doc){
if (Meteor.isServer) {
Meteor.startup(() => {
ChecklistItems._collection._ensureIndex({ checklistId: 1 });
+ ChecklistItems._collection._ensureIndex({ cardId: 1 });
});
ChecklistItems.after.update((userId, doc, fieldNames) => {
diff --git a/models/customFields.js b/models/customFields.js
index 3e8aa250..b7ad5467 100644
--- a/models/customFields.js
+++ b/models/customFields.js
@@ -98,9 +98,9 @@ function customFieldCreation(userId, doc){
}
if (Meteor.isServer) {
- /*Meteor.startup(() => {
- CustomFields._collection._ensureIndex({ boardId: 1});
- });*/
+ Meteor.startup(() => {
+ CustomFields._collection._ensureIndex({ boardId: 1 });
+ });
CustomFields.after.insert((userId, doc) => {
customFieldCreation(userId, doc);
diff --git a/models/integrations.js b/models/integrations.js
index 1c473b57..65a7af63 100644
--- a/models/integrations.js
+++ b/models/integrations.js
@@ -88,6 +88,10 @@ Integrations.allow({
//INTEGRATIONS REST API
if (Meteor.isServer) {
+ Meteor.startup(() => {
+ Integrations._collection._ensureIndex({ boardId: 1 });
+ });
+
/**
* @operation get_all_integrations
* @summary Get all integrations in board
diff --git a/server/publications/boards.js b/server/publications/boards.js
index 71c53612..18c44d2b 100644
--- a/server/publications/boards.js
+++ b/server/publications/boards.js
@@ -60,6 +60,7 @@ Meteor.publish('archivedBoards', function() {
});
Meteor.publishRelations('board', function(boardId) {
+ this.unblock();
check(boardId, String);
const thisUserId = this.userId;
@@ -72,7 +73,8 @@ Meteor.publishRelations('board', function(boardId) {
{ permission: 'public' },
{ members: { $elemMatch: { userId: this.userId, isActive: true }}},
],
- }, { limit: 1 }), function(boardId, board) {
+ // Sort required to ensure oplog usage
+ }, { limit: 1, sort: { _id: 1 } }), function(boardId, board) {
this.cursor(Lists.find({ boardId }));
this.cursor(Swimlanes.find({ boardId }));
this.cursor(Integrations.find({ boardId }));
@@ -99,24 +101,47 @@ Meteor.publishRelations('board', function(boardId) {
//
// And in the meantime our code below works pretty well -- it's not even a
// hack!
+
+ // Gather queries and send in bulk
+ const cardComments = this.join(CardComments);
+ cardComments.selector = (_ids) => ({ cardId: _ids });
+ const attachments = this.join(Attachments);
+ attachments.selector = (_ids) => ({ cardId: _ids });
+ const checklists = this.join(Checklists);
+ checklists.selector = (_ids) => ({ cardId: _ids });
+ const checklistItems = this.join(ChecklistItems);
+ checklistItems.selector = (_ids) => ({ cardId: _ids });
+ const parentCards = this.join(Cards);
+ parentCards.selector = (_ids) => ({ parentId: _ids });
+ const boards = this.join(Boards);
+ const subCards = this.join(Cards);
+
this.cursor(Cards.find({ boardId }), function(cardId, card) {
if (card.type === 'cardType-linkedCard') {
const impCardId = card.linkedId;
- this.cursor(Cards.find({ _id: impCardId }));
- this.cursor(CardComments.find({ cardId: impCardId }));
- this.cursor(Attachments.find({ cardId: impCardId }));
- this.cursor(Checklists.find({ cardId: impCardId }));
- this.cursor(ChecklistItems.find({ cardId: impCardId }));
+ subCards.push(impCardId);
+ cardComments.push(impCardId);
+ attachments.push(impCardId);
+ checklists.push(impCardId);
+ checklistItems.push(impCardId);
} else if (card.type === 'cardType-linkedBoard') {
- this.cursor(Boards.find({ _id: card.linkedId}));
+ boards.push(card.linkedId);
}
- this.cursor(CardComments.find({ cardId }));
- this.cursor(Attachments.find({ cardId }));
- this.cursor(Checklists.find({ cardId }));
- this.cursor(ChecklistItems.find({ cardId }));
- this.cursor(Cards.find({ parentId: cardId }));
+ cardComments.push(cardId);
+ attachments.push(cardId);
+ checklists.push(cardId);
+ checklistItems.push(cardId);
+ parentCards.push(cardId);
});
+ // Send bulk queries for all found ids
+ subCards.send();
+ cardComments.send();
+ attachments.send();
+ checklists.send();
+ checklistItems.send();
+ boards.send();
+
if (board.members) {
// Board members. This publication also includes former board members that
// aren't members anymore but may have some activities attached to them in