فهرست منبع

fix(server): loop on checksum generation (#662)

Thanh Pham 2 سال پیش
والد
کامیت
8f2e7b6f65
1فایلهای تغییر یافته به همراه23 افزوده شده و 6 حذف شده
  1. 23 6
      server/apps/microservices/src/processors/generate-checksum.processor.ts

+ 23 - 6
server/apps/microservices/src/processors/generate-checksum.processor.ts

@@ -5,7 +5,7 @@ import { Logger } from '@nestjs/common';
 import { InjectRepository } from '@nestjs/typeorm';
 import { createHash } from 'node:crypto';
 import fs from 'node:fs';
-import { IsNull, Repository } from 'typeorm';
+import { FindOptionsWhere, IsNull, MoreThan, QueryFailedError, Repository } from 'typeorm';
 
 // TODO: just temporary task to generate previous uploaded assets.
 @Processor(generateChecksumQueueName)
@@ -17,15 +17,23 @@ export class GenerateChecksumProcessor {
 
   @Process()
   async generateChecksum() {
-    let hasNext = true;
     const pageSize = 200;
+    let hasNext = true;
+    let lastErrAssetId: string | undefined = undefined;
 
     while (hasNext) {
+      const whereStat: FindOptionsWhere<AssetEntity> = {
+        checksum: IsNull(),
+      };
+
+      if (lastErrAssetId) {
+        whereStat.id = MoreThan(lastErrAssetId);
+      }
+
       const assets = await this.assetRepository.find({
-        where: {
-          checksum: IsNull()
-        },
+        where: whereStat,
         take: pageSize,
+        order: { id: 'ASC' }
       });
 
       if (!assets?.length) {
@@ -35,15 +43,24 @@ export class GenerateChecksumProcessor {
           try {
             await this.generateAssetChecksum(asset);
           } catch (err: any) {
-            Logger.error(`Error generate checksum ${err}`);
+            lastErrAssetId = asset.id;
+
+            if (err instanceof QueryFailedError && (err as any).constraint === 'UQ_userid_checksum') {
+              Logger.error(`${asset.originalPath} duplicated`);
+            } else {
+              Logger.error(`checksum generation ${err}`);
+            }
           }
         }
 
+        // break when reach to the last page
         if (assets.length < pageSize) {
           hasNext = false;
         }
       }
     }
+
+    Logger.log(`checksum generation done!`);
   }
 
   private async generateAssetChecksum(asset: AssetEntity) {