]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Cache some SQL queries
authorChocobozzz <me@florianbigard.com>
Fri, 27 Dec 2019 12:33:16 +0000 (13:33 +0100)
committerChocobozzz <me@florianbigard.com>
Fri, 27 Dec 2019 12:33:16 +0000 (13:33 +0100)
server/models/account/account.ts
server/models/activitypub/actor.ts

index a818a5a4dfd8b4d310184b456acdbe37e0e0f460..a757b7203a641d336420a90d9758130f04ee2bcc 100644 (file)
@@ -27,7 +27,7 @@ import { VideoCommentModel } from '../video/video-comment'
 import { UserModel } from './user'
 import { AvatarModel } from '../avatar/avatar'
 import { VideoPlaylistModel } from '../video/video-playlist'
-import { CONSTRAINTS_FIELDS, WEBSERVER } from '../../initializers/constants'
+import { CONSTRAINTS_FIELDS, SERVER_ACTOR_NAME, WEBSERVER } from '../../initializers/constants'
 import { FindOptions, IncludeOptions, Op, Transaction, WhereOptions } from 'sequelize'
 import { AccountBlocklistModel } from './account-blocklist'
 import { ServerBlocklistModel } from '../server/server-blocklist'
@@ -218,6 +218,8 @@ export class AccountModel extends Model<AccountModel> {
   })
   BlockedAccounts: AccountBlocklistModel[]
 
+  private static cache: { [ id: string ]: any } = {}
+
   @BeforeDestroy
   static async sendDeleteIfOwned (instance: AccountModel, options) {
     if (!instance.Actor) {
@@ -245,6 +247,11 @@ export class AccountModel extends Model<AccountModel> {
   }
 
   static loadLocalByName (name: string): Bluebird<MAccountDefault> {
+    // The server actor never change, so we can easily cache it
+    if (name === SERVER_ACTOR_NAME && AccountModel.cache[name]) {
+      return Bluebird.resolve(AccountModel.cache[name])
+    }
+
     const query = {
       where: {
         [ Op.or ]: [
@@ -272,6 +279,13 @@ export class AccountModel extends Model<AccountModel> {
     }
 
     return AccountModel.findOne(query)
+      .then(account => {
+        if (name === SERVER_ACTOR_NAME) {
+          AccountModel.cache[name] = account
+        }
+
+        return account
+      })
   }
 
   static loadByNameAndHost (name: string, host: string): Bluebird<MAccountDefault> {
index 71db44b2f8948163c46e45241f61dac6b806c8fc..58b52ffb1cdab772a736efe3dae7a0f2d3566b7a 100644 (file)
@@ -27,7 +27,7 @@ import {
   isActorPublicKeyValid
 } from '../../helpers/custom-validators/activitypub/actor'
 import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
-import { ACTIVITY_PUB, ACTIVITY_PUB_ACTOR_TYPES, CONSTRAINTS_FIELDS, WEBSERVER } from '../../initializers/constants'
+import { ACTIVITY_PUB, ACTIVITY_PUB_ACTOR_TYPES, CONSTRAINTS_FIELDS, SERVER_ACTOR_NAME, WEBSERVER } from '../../initializers/constants'
 import { AccountModel } from '../account/account'
 import { AvatarModel } from '../avatar/avatar'
 import { ServerModel } from '../server/server'
@@ -276,6 +276,8 @@ export class ActorModel extends Model<ActorModel> {
   })
   VideoChannel: VideoChannelModel
 
+  private static cache: { [ id: string ]: any } = {}
+
   static load (id: number): Bluebird<MActor> {
     return ActorModel.unscoped().findByPk(id)
   }
@@ -342,6 +344,11 @@ export class ActorModel extends Model<ActorModel> {
   }
 
   static loadLocalByName (preferredUsername: string, transaction?: Transaction): Bluebird<MActorFull> {
+    // The server actor never change, so we can easily cache it
+    if (preferredUsername === SERVER_ACTOR_NAME && ActorModel.cache[preferredUsername]) {
+      return Bluebird.resolve(ActorModel.cache[preferredUsername])
+    }
+
     const query = {
       where: {
         preferredUsername,
@@ -350,7 +357,15 @@ export class ActorModel extends Model<ActorModel> {
       transaction
     }
 
-    return ActorModel.scope(ScopeNames.FULL).findOne(query)
+    return ActorModel.scope(ScopeNames.FULL)
+                     .findOne(query)
+                     .then(actor => {
+                       if (preferredUsername === SERVER_ACTOR_NAME) {
+                         ActorModel.cache[ preferredUsername ] = actor
+                       }
+
+                       return actor
+                     })
   }
 
   static loadByNameAndHost (preferredUsername: string, host: string): Bluebird<MActorFull> {