Commit 7e1abb5c authored by nanahira's avatar nanahira

singleton

parent db5fa01b
Pipeline #17470 passed with stages
in 1 minute and 30 seconds
......@@ -10,12 +10,14 @@ import { ArchiveMirror } from '../entities/ArchiveMirror.entity';
import { PackageS3Service } from '../package-s3/package-s3.service';
import _ from 'lodash';
import delay from 'delay';
import { LockService } from 'src/lock/lock.service';
export interface Middleware {
url: string;
identifier: string;
maxSize?: number;
callback?: string;
callback?: boolean;
singleton?: boolean;
}
export interface UploadInfo {
......@@ -41,7 +43,8 @@ export class MirrorService extends ConsoleLogger {
private db: Connection,
private config: ConfigService,
private http: HttpService,
private packageS3: PackageS3Service
private packageS3: PackageS3Service,
private redlock: LockService
) {
super('mirror');
this.init().then();
......@@ -155,7 +158,7 @@ export class MirrorService extends ConsoleLogger {
return true;
}
private async uploadWithMiddleware(uploadInfo: UploadInfo, middleware: Middleware): Promise<UploadResult> {
private async uploadWithMiddlewareProcess(uploadInfo: UploadInfo, middleware: Middleware): Promise<UploadResult> {
try {
this.log(`Uploading ${uploadInfo.url} with middleware ${middleware.identifier}.`);
const { data } = await lastValueFrom(
......@@ -172,6 +175,13 @@ export class MirrorService extends ConsoleLogger {
}
}
private async uploadWithMiddleware(uploadInfo: UploadInfo, middleware: Middleware): Promise<UploadResult> {
if (!middleware.singleton) {
return this.uploadWithMiddlewareProcess(uploadInfo, middleware);
}
return this.redlock.using([`mirror:${middleware.identifier}`], 5000, () => this.uploadWithMiddlewareProcess(uploadInfo, middleware));
}
async uploadWithRandomMiddleware(uploadInfo: UploadInfo, middlewares = Array.from(this.middlewares.values())) {
if (!middlewares.length) {
return null;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment