diff options
-rw-r--r-- | server/models/video/video-file.ts | 33 | ||||
-rw-r--r-- | server/tests/api/server/stats.ts | 58 |
2 files changed, 80 insertions, 11 deletions
diff --git a/server/models/video/video-file.ts b/server/models/video/video-file.ts index a130317f6..d48c9f5d4 100644 --- a/server/models/video/video-file.ts +++ b/server/models/video/video-file.ts | |||
@@ -269,10 +269,11 @@ export class VideoFileModel extends Model<VideoFileModel> { | |||
269 | } | 269 | } |
270 | 270 | ||
271 | static getStats () { | 271 | static getStats () { |
272 | const query: FindOptions = { | 272 | const webtorrentFilesQuery: FindOptions = { |
273 | include: [ | 273 | include: [ |
274 | { | 274 | { |
275 | attributes: [], | 275 | attributes: [], |
276 | required: true, | ||
276 | model: VideoModel.unscoped(), | 277 | model: VideoModel.unscoped(), |
277 | where: { | 278 | where: { |
278 | remote: false | 279 | remote: false |
@@ -281,10 +282,32 @@ export class VideoFileModel extends Model<VideoFileModel> { | |||
281 | ] | 282 | ] |
282 | } | 283 | } |
283 | 284 | ||
284 | return VideoFileModel.aggregate('size', 'SUM', query) | 285 | const hlsFilesQuery: FindOptions = { |
285 | .then(result => ({ | 286 | include: [ |
286 | totalLocalVideoFilesSize: parseAggregateResult(result) | 287 | { |
287 | })) | 288 | attributes: [], |
289 | required: true, | ||
290 | model: VideoStreamingPlaylistModel.unscoped(), | ||
291 | include: [ | ||
292 | { | ||
293 | attributes: [], | ||
294 | model: VideoModel.unscoped(), | ||
295 | required: true, | ||
296 | where: { | ||
297 | remote: false | ||
298 | } | ||
299 | } | ||
300 | ] | ||
301 | } | ||
302 | ] | ||
303 | } | ||
304 | |||
305 | return Promise.all([ | ||
306 | VideoFileModel.aggregate('size', 'SUM', webtorrentFilesQuery), | ||
307 | VideoFileModel.aggregate('size', 'SUM', hlsFilesQuery) | ||
308 | ]).then(([ webtorrentResult, hlsResult ]) => ({ | ||
309 | totalLocalVideoFilesSize: parseAggregateResult(webtorrentResult) + parseAggregateResult(hlsResult) | ||
310 | })) | ||
288 | } | 311 | } |
289 | 312 | ||
290 | // Redefine upsert because sequelize does not use an appropriate where clause in the update query with 2 unique indexes | 313 | // Redefine upsert because sequelize does not use an appropriate where clause in the update query with 2 unique indexes |
diff --git a/server/tests/api/server/stats.ts b/server/tests/api/server/stats.ts index 637525ff8..0e77712cf 100644 --- a/server/tests/api/server/stats.ts +++ b/server/tests/api/server/stats.ts | |||
@@ -1,24 +1,26 @@ | |||
1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ | 1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ |
2 | 2 | ||
3 | import * as chai from 'chai' | ||
4 | import 'mocha' | 3 | import 'mocha' |
5 | import { ServerStats } from '../../../../shared/models/server/server-stats.model' | 4 | import * as chai from 'chai' |
6 | import { | 5 | import { |
7 | cleanupTests, | 6 | cleanupTests, |
8 | createUser, | 7 | createUser, |
9 | doubleFollow, | 8 | doubleFollow, |
10 | flushAndRunMultipleServers, | 9 | flushAndRunMultipleServers, |
11 | follow, | 10 | follow, |
12 | ServerInfo, unfollow, | 11 | ServerInfo, |
12 | unfollow, | ||
13 | updateCustomSubConfig, | ||
13 | uploadVideo, | 14 | uploadVideo, |
15 | userLogin, | ||
14 | viewVideo, | 16 | viewVideo, |
15 | wait, | 17 | wait |
16 | userLogin | ||
17 | } from '../../../../shared/extra-utils' | 18 | } from '../../../../shared/extra-utils' |
18 | import { setAccessTokensToServers } from '../../../../shared/extra-utils/index' | 19 | import { setAccessTokensToServers } from '../../../../shared/extra-utils/index' |
20 | import { waitJobs } from '../../../../shared/extra-utils/server/jobs' | ||
19 | import { getStats } from '../../../../shared/extra-utils/server/stats' | 21 | import { getStats } from '../../../../shared/extra-utils/server/stats' |
20 | import { addVideoCommentThread } from '../../../../shared/extra-utils/videos/video-comments' | 22 | import { addVideoCommentThread } from '../../../../shared/extra-utils/videos/video-comments' |
21 | import { waitJobs } from '../../../../shared/extra-utils/server/jobs' | 23 | import { ServerStats } from '../../../../shared/models/server/server-stats.model' |
22 | 24 | ||
23 | const expect = chai.expect | 25 | const expect = chai.expect |
24 | 26 | ||
@@ -31,7 +33,9 @@ describe('Test stats (excluding redundancy)', function () { | |||
31 | 33 | ||
32 | before(async function () { | 34 | before(async function () { |
33 | this.timeout(60000) | 35 | this.timeout(60000) |
36 | |||
34 | servers = await flushAndRunMultipleServers(3) | 37 | servers = await flushAndRunMultipleServers(3) |
38 | |||
35 | await setAccessTokensToServers(servers) | 39 | await setAccessTokensToServers(servers) |
36 | 40 | ||
37 | await doubleFollow(servers[0], servers[1]) | 41 | await doubleFollow(servers[0], servers[1]) |
@@ -130,6 +134,48 @@ describe('Test stats (excluding redundancy)', function () { | |||
130 | } | 134 | } |
131 | }) | 135 | }) |
132 | 136 | ||
137 | it('Should correctly count video file sizes if transcoding is enabled', async function () { | ||
138 | this.timeout(20000) | ||
139 | |||
140 | await updateCustomSubConfig(servers[0].url, servers[0].accessToken, { | ||
141 | transcoding: { | ||
142 | enabled: true, | ||
143 | webtorrent: { | ||
144 | enabled: true | ||
145 | }, | ||
146 | hls: { | ||
147 | enabled: true | ||
148 | }, | ||
149 | resolutions: { | ||
150 | '0p': false, | ||
151 | '240p': false, | ||
152 | '360p': false, | ||
153 | '480p': false, | ||
154 | '720p': false, | ||
155 | '1080p': false, | ||
156 | '2160p': false | ||
157 | } | ||
158 | } | ||
159 | }) | ||
160 | |||
161 | await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video', fixture: 'video_short.webm' }) | ||
162 | |||
163 | await waitJobs(servers) | ||
164 | |||
165 | { | ||
166 | const res = await getStats(servers[1].url) | ||
167 | const data: ServerStats = res.body | ||
168 | expect(data.totalLocalVideoFilesSize).to.equal(0) | ||
169 | } | ||
170 | |||
171 | { | ||
172 | const res = await getStats(servers[0].url) | ||
173 | const data: ServerStats = res.body | ||
174 | expect(data.totalLocalVideoFilesSize).to.be.greaterThan(300000) | ||
175 | expect(data.totalLocalVideoFilesSize).to.be.lessThan(400000) | ||
176 | } | ||
177 | }) | ||
178 | |||
133 | after(async function () { | 179 | after(async function () { |
134 | await cleanupTests(servers) | 180 | await cleanupTests(servers) |
135 | }) | 181 | }) |