From 8018a79418d8ef5ecce2d1fc2ac0e8698f33173e Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 21 Mar 2021 18:38:38 +0800 Subject: [PATCH] core: add trace to storage --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/service/server.ts | 2 +- packages/hydrooj/src/service/storage.ts | 93 ++++++++++++++++--------- 3 files changed, 64 insertions(+), 33 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index c5b186d0..207f227a 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.20.26", + "version": "2.20.27", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index bb7958f5..b668968c 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -319,7 +319,7 @@ export class HandlerCommon { } catch (e) { logger.warn(e.message); logger.info('%s %o', name, args); - logger.info('%s', e.stack); + if (!e.message.includes('Expected') || !e.message.includes('to match')) logger.info('%s', e.stack); } return res; } diff --git a/packages/hydrooj/src/service/storage.ts b/packages/hydrooj/src/service/storage.ts index b29df421..318ce369 100644 --- a/packages/hydrooj/src/service/storage.ts +++ b/packages/hydrooj/src/service/storage.ts @@ -26,6 +26,7 @@ interface MinioEndpointConfig { } function parseMainEndpointUrl(endpoint: string): MinioEndpointConfig { + if (!endpoint) throw new Error('Empty endpoint'); const url = new URL(endpoint); const result: Partial = {}; if (url.pathname !== '/') throw new Error('Main MinIO endpoint URL of a sub-directory is not supported.'); @@ -116,53 +117,83 @@ class StorageService { async put(target: string, file: string | Buffer | Readable, meta: ItemBucketMetadata = {}) { if (typeof file === 'string') file = createReadStream(file); - return await this.client.putObject(this.opts.bucket, target, file, meta); + try { + return await this.client.putObject(this.opts.bucket, target, file, meta); + } catch (e) { + e.stack = new Error().stack; + throw e; + } } async get(target: string, path?: string) { - if (path) return await this.client.fGetObject(this.opts.bucket, target, path); - return await this.client.getObject(this.opts.bucket, target); + try { + if (path) return await this.client.fGetObject(this.opts.bucket, target, path); + return await this.client.getObject(this.opts.bucket, target); + } catch (e) { + e.stack = new Error().stack; + throw e; + } } async del(target: string | string[]) { - if (typeof target === 'string') return await this.client.removeObject(this.opts.bucket, target); - return await this.client.removeObjects(this.opts.bucket, target); + try { + if (typeof target === 'string') return await this.client.removeObject(this.opts.bucket, target); + return await this.client.removeObjects(this.opts.bucket, target); + } catch (e) { + e.stack = new Error().stack; + throw e; + } } async list(target: string, recursive = true) { - const stream = this.client.listObjects(this.opts.bucket, target, recursive); - return await new Promise((resolve, reject) => { - const results: BucketItem[] = []; - stream.on('data', (result) => { - if (result.size) { - results.push({ - ...result, - prefix: target, - name: result.name.split(target)[1], - }); - } + try { + const stream = this.client.listObjects(this.opts.bucket, target, recursive); + return await new Promise((resolve, reject) => { + const results: BucketItem[] = []; + stream.on('data', (result) => { + if (result.size) { + results.push({ + ...result, + prefix: target, + name: result.name.split(target)[1], + }); + } + }); + stream.on('end', () => resolve(results)); + stream.on('error', reject); }); - stream.on('end', () => resolve(results)); - stream.on('error', reject); - }); + } catch (e) { + e.stack = new Error().stack; + throw e; + } } async getMeta(target: string) { - const result = await this.client.statObject(this.opts.bucket, target); - return { ...result.metaData, ...result }; + try { + const result = await this.client.statObject(this.opts.bucket, target); + return { ...result.metaData, ...result }; + } catch (e) { + e.stack = new Error().stack; + throw e; + } } async signDownloadLink(target: string, filename?: string, noExpire = false, useAlternativeEndpointFor?: 'user' | 'judge'): Promise { - const url = await this.client.presignedGetObject( - this.opts.bucket, - target, - noExpire ? 24 * 60 * 60 * 7 : 30 * 60, - filename - ? { 'response-content-disposition': `attachment; filename="${encodeRFC5987ValueChars(filename)}"` } - : {}, - ); - if (useAlternativeEndpointFor) return this.replaceWithAlternativeUrlFor[useAlternativeEndpointFor](url); - return url; + try { + const url = await this.client.presignedGetObject( + this.opts.bucket, + target, + noExpire ? 24 * 60 * 60 * 7 : 30 * 60, + filename + ? { 'response-content-disposition': `attachment; filename="${encodeRFC5987ValueChars(filename)}"` } + : {}, + ); + if (useAlternativeEndpointFor) return this.replaceWithAlternativeUrlFor[useAlternativeEndpointFor](url); + return url; + } catch (e) { + e.stack = new Error().stack; + throw e; + } } }