diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/controllers/api/server/debug.ts | 6 | ||||
-rw-r--r-- | server/controllers/api/users/index.ts | 5 | ||||
-rw-r--r-- | server/lib/activitypub/inbox-manager.ts | 6 | ||||
-rw-r--r-- | server/tests/api/live/live-save-replay.ts | 29 | ||||
-rw-r--r-- | server/tests/api/live/live.ts | 30 |
5 files changed, 49 insertions, 27 deletions
diff --git a/server/controllers/api/server/debug.ts b/server/controllers/api/server/debug.ts index e12fc1dd4..7787186be 100644 --- a/server/controllers/api/server/debug.ts +++ b/server/controllers/api/server/debug.ts | |||
@@ -1,3 +1,4 @@ | |||
1 | import { InboxManager } from '@server/lib/activitypub/inbox-manager' | ||
1 | import * as express from 'express' | 2 | import * as express from 'express' |
2 | import { UserRight } from '../../../../shared/models/users' | 3 | import { UserRight } from '../../../../shared/models/users' |
3 | import { authenticate, ensureUserHasRight } from '../../../middlewares' | 4 | import { authenticate, ensureUserHasRight } from '../../../middlewares' |
@@ -20,6 +21,7 @@ export { | |||
20 | 21 | ||
21 | function getDebug (req: express.Request, res: express.Response) { | 22 | function getDebug (req: express.Request, res: express.Response) { |
22 | return res.json({ | 23 | return res.json({ |
23 | ip: req.ip | 24 | ip: req.ip, |
24 | }).end() | 25 | activityPubMessagesWaiting: InboxManager.Instance.getActivityPubMessagesWaiting() |
26 | }) | ||
25 | } | 27 | } |
diff --git a/server/controllers/api/users/index.ts b/server/controllers/api/users/index.ts index 5911d1a0f..fa0688a9e 100644 --- a/server/controllers/api/users/index.ts +++ b/server/controllers/api/users/index.ts | |||
@@ -307,7 +307,10 @@ async function removeUser (req: express.Request, res: express.Response) { | |||
307 | 307 | ||
308 | auditLogger.delete(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON())) | 308 | auditLogger.delete(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON())) |
309 | 309 | ||
310 | await user.destroy() | 310 | await sequelizeTypescript.transaction(async t => { |
311 | // Use a transaction to avoid inconsistencies with hooks (account/channel deletion & federation) | ||
312 | await user.destroy({ transaction: t }) | ||
313 | }) | ||
311 | 314 | ||
312 | Hooks.runAction('action:api.user.deleted', { user }) | 315 | Hooks.runAction('action:api.user.deleted', { user }) |
313 | 316 | ||
diff --git a/server/lib/activitypub/inbox-manager.ts b/server/lib/activitypub/inbox-manager.ts index 6d9bf7cf0..18ae49532 100644 --- a/server/lib/activitypub/inbox-manager.ts +++ b/server/lib/activitypub/inbox-manager.ts | |||
@@ -35,7 +35,7 @@ class InboxManager { | |||
35 | }) | 35 | }) |
36 | 36 | ||
37 | setInterval(() => { | 37 | setInterval(() => { |
38 | StatsManager.Instance.updateInboxStats(this.messagesProcessed, this.inboxQueue.length()) | 38 | StatsManager.Instance.updateInboxStats(this.messagesProcessed, this.getActivityPubMessagesWaiting()) |
39 | }, SCHEDULER_INTERVALS_MS.updateInboxStats) | 39 | }, SCHEDULER_INTERVALS_MS.updateInboxStats) |
40 | } | 40 | } |
41 | 41 | ||
@@ -44,6 +44,10 @@ class InboxManager { | |||
44 | .catch(err => logger.error('Cannot add options in inbox queue.', { options, err })) | 44 | .catch(err => logger.error('Cannot add options in inbox queue.', { options, err })) |
45 | } | 45 | } |
46 | 46 | ||
47 | getActivityPubMessagesWaiting () { | ||
48 | return this.inboxQueue.length() + this.inboxQueue.running() | ||
49 | } | ||
50 | |||
47 | static get Instance () { | 51 | static get Instance () { |
48 | return this.instance || (this.instance = new this()) | 52 | return this.instance || (this.instance = new this()) |
49 | } | 53 | } |
diff --git a/server/tests/api/live/live-save-replay.ts b/server/tests/api/live/live-save-replay.ts index 757e11845..6dd6fb44e 100644 --- a/server/tests/api/live/live-save-replay.ts +++ b/server/tests/api/live/live-save-replay.ts | |||
@@ -4,6 +4,7 @@ import 'mocha' | |||
4 | import * as chai from 'chai' | 4 | import * as chai from 'chai' |
5 | import { FfmpegCommand } from 'fluent-ffmpeg' | 5 | import { FfmpegCommand } from 'fluent-ffmpeg' |
6 | import { LiveVideoCreate, VideoDetails, VideoPrivacy, VideoState } from '@shared/models' | 6 | import { LiveVideoCreate, VideoDetails, VideoPrivacy, VideoState } from '@shared/models' |
7 | import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' | ||
7 | import { | 8 | import { |
8 | addVideoToBlacklist, | 9 | addVideoToBlacklist, |
9 | checkLiveCleanup, | 10 | checkLiveCleanup, |
@@ -23,9 +24,9 @@ import { | |||
23 | updateCustomSubConfig, | 24 | updateCustomSubConfig, |
24 | updateVideo, | 25 | updateVideo, |
25 | waitJobs, | 26 | waitJobs, |
27 | waitUntilLiveEnded, | ||
26 | waitUntilLivePublished | 28 | waitUntilLivePublished |
27 | } from '../../../../shared/extra-utils' | 29 | } from '../../../../shared/extra-utils' |
28 | import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' | ||
29 | 30 | ||
30 | const expect = chai.expect | 31 | const expect = chai.expect |
31 | 32 | ||
@@ -74,6 +75,12 @@ describe('Save replay setting', function () { | |||
74 | } | 75 | } |
75 | } | 76 | } |
76 | 77 | ||
78 | async function waitUntilLivePublishedOnAllServers (videoId: string) { | ||
79 | for (const server of servers) { | ||
80 | await waitUntilLivePublished(server.url, server.accessToken, videoId) | ||
81 | } | ||
82 | } | ||
83 | |||
77 | before(async function () { | 84 | before(async function () { |
78 | this.timeout(120000) | 85 | this.timeout(120000) |
79 | 86 | ||
@@ -125,10 +132,11 @@ describe('Save replay setting', function () { | |||
125 | }) | 132 | }) |
126 | 133 | ||
127 | it('Should correctly have updated the live and federated it when streaming in the live', async function () { | 134 | it('Should correctly have updated the live and federated it when streaming in the live', async function () { |
128 | this.timeout(20000) | 135 | this.timeout(30000) |
129 | 136 | ||
130 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | 137 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) |
131 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoUUID) | 138 | |
139 | await waitUntilLivePublishedOnAllServers(liveVideoUUID) | ||
132 | 140 | ||
133 | await waitJobs(servers) | 141 | await waitJobs(servers) |
134 | 142 | ||
@@ -141,6 +149,9 @@ describe('Save replay setting', function () { | |||
141 | 149 | ||
142 | await stopFfmpeg(ffmpegCommand) | 150 | await stopFfmpeg(ffmpegCommand) |
143 | 151 | ||
152 | for (const server of servers) { | ||
153 | await waitUntilLiveEnded(server.url, server.accessToken, liveVideoUUID) | ||
154 | } | ||
144 | await waitJobs(servers) | 155 | await waitJobs(servers) |
145 | 156 | ||
146 | // Live still exist, but cannot be played anymore | 157 | // Live still exist, but cannot be played anymore |
@@ -159,7 +170,8 @@ describe('Save replay setting', function () { | |||
159 | liveVideoUUID = await createLiveWrapper(false) | 170 | liveVideoUUID = await createLiveWrapper(false) |
160 | 171 | ||
161 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | 172 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) |
162 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoUUID) | 173 | |
174 | await waitUntilLivePublishedOnAllServers(liveVideoUUID) | ||
163 | 175 | ||
164 | await waitJobs(servers) | 176 | await waitJobs(servers) |
165 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) | 177 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) |
@@ -185,7 +197,8 @@ describe('Save replay setting', function () { | |||
185 | liveVideoUUID = await createLiveWrapper(false) | 197 | liveVideoUUID = await createLiveWrapper(false) |
186 | 198 | ||
187 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | 199 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) |
188 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoUUID) | 200 | |
201 | await waitUntilLivePublishedOnAllServers(liveVideoUUID) | ||
189 | 202 | ||
190 | await waitJobs(servers) | 203 | await waitJobs(servers) |
191 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) | 204 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) |
@@ -219,7 +232,7 @@ describe('Save replay setting', function () { | |||
219 | this.timeout(20000) | 232 | this.timeout(20000) |
220 | 233 | ||
221 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | 234 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) |
222 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoUUID) | 235 | await waitUntilLivePublishedOnAllServers(liveVideoUUID) |
223 | 236 | ||
224 | await waitJobs(servers) | 237 | await waitJobs(servers) |
225 | 238 | ||
@@ -262,7 +275,7 @@ describe('Save replay setting', function () { | |||
262 | liveVideoUUID = await createLiveWrapper(true) | 275 | liveVideoUUID = await createLiveWrapper(true) |
263 | 276 | ||
264 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | 277 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) |
265 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoUUID) | 278 | await waitUntilLivePublishedOnAllServers(liveVideoUUID) |
266 | 279 | ||
267 | await waitJobs(servers) | 280 | await waitJobs(servers) |
268 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) | 281 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) |
@@ -288,7 +301,7 @@ describe('Save replay setting', function () { | |||
288 | liveVideoUUID = await createLiveWrapper(true) | 301 | liveVideoUUID = await createLiveWrapper(true) |
289 | 302 | ||
290 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | 303 | ffmpegCommand = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) |
291 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoUUID) | 304 | await waitUntilLivePublishedOnAllServers(liveVideoUUID) |
292 | 305 | ||
293 | await waitJobs(servers) | 306 | await waitJobs(servers) |
294 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) | 307 | await checkVideosExist(liveVideoUUID, true, HttpStatusCode.OK_200) |
diff --git a/server/tests/api/live/live.ts b/server/tests/api/live/live.ts index ff822f84d..19976ba8a 100644 --- a/server/tests/api/live/live.ts +++ b/server/tests/api/live/live.ts | |||
@@ -50,6 +50,12 @@ const expect = chai.expect | |||
50 | describe('Test live', function () { | 50 | describe('Test live', function () { |
51 | let servers: ServerInfo[] = [] | 51 | let servers: ServerInfo[] = [] |
52 | 52 | ||
53 | async function waitUntilLivePublishedOnAllServers (videoId: string) { | ||
54 | for (const server of servers) { | ||
55 | await waitUntilLivePublished(server.url, server.accessToken, videoId) | ||
56 | } | ||
57 | } | ||
58 | |||
53 | before(async function () { | 59 | before(async function () { |
54 | this.timeout(120000) | 60 | this.timeout(120000) |
55 | 61 | ||
@@ -390,7 +396,7 @@ describe('Test live', function () { | |||
390 | liveVideoId = await createLiveWrapper(false) | 396 | liveVideoId = await createLiveWrapper(false) |
391 | 397 | ||
392 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoId) | 398 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoId) |
393 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoId) | 399 | await waitUntilLivePublishedOnAllServers(liveVideoId) |
394 | await waitJobs(servers) | 400 | await waitJobs(servers) |
395 | 401 | ||
396 | await testVideoResolutions(liveVideoId, [ 720 ]) | 402 | await testVideoResolutions(liveVideoId, [ 720 ]) |
@@ -406,7 +412,7 @@ describe('Test live', function () { | |||
406 | liveVideoId = await createLiveWrapper(false) | 412 | liveVideoId = await createLiveWrapper(false) |
407 | 413 | ||
408 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoId) | 414 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoId) |
409 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoId) | 415 | await waitUntilLivePublishedOnAllServers(liveVideoId) |
410 | await waitJobs(servers) | 416 | await waitJobs(servers) |
411 | 417 | ||
412 | await testVideoResolutions(liveVideoId, resolutions) | 418 | await testVideoResolutions(liveVideoId, resolutions) |
@@ -423,7 +429,7 @@ describe('Test live', function () { | |||
423 | liveVideoId = await createLiveWrapper(true) | 429 | liveVideoId = await createLiveWrapper(true) |
424 | 430 | ||
425 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoId, 'video_short2.webm') | 431 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoId, 'video_short2.webm') |
426 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoId) | 432 | await waitUntilLivePublishedOnAllServers(liveVideoId) |
427 | await waitJobs(servers) | 433 | await waitJobs(servers) |
428 | 434 | ||
429 | await testVideoResolutions(liveVideoId, resolutions) | 435 | await testVideoResolutions(liveVideoId, resolutions) |
@@ -433,7 +439,7 @@ describe('Test live', function () { | |||
433 | 439 | ||
434 | await waitJobs(servers) | 440 | await waitJobs(servers) |
435 | 441 | ||
436 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoId) | 442 | await waitUntilLivePublishedOnAllServers(liveVideoId) |
437 | 443 | ||
438 | const bitrateLimits = { | 444 | const bitrateLimits = { |
439 | 720: 5000 * 1000, // 60FPS | 445 | 720: 5000 * 1000, // 60FPS |
@@ -514,7 +520,7 @@ describe('Test live', function () { | |||
514 | liveVideoId = res.body.video.uuid | 520 | liveVideoId = res.body.video.uuid |
515 | 521 | ||
516 | command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoId) | 522 | command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoId) |
517 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoId) | 523 | await waitUntilLivePublishedOnAllServers(liveVideoId) |
518 | await waitJobs(servers) | 524 | await waitJobs(servers) |
519 | }) | 525 | }) |
520 | 526 | ||
@@ -602,10 +608,7 @@ describe('Test live', function () { | |||
602 | 608 | ||
603 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | 609 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) |
604 | 610 | ||
605 | for (const server of servers) { | 611 | await waitUntilLivePublishedOnAllServers(liveVideoUUID) |
606 | await waitUntilLivePublished(server.url, server.accessToken, liveVideoUUID) | ||
607 | } | ||
608 | |||
609 | await waitJobs(servers) | 612 | await waitJobs(servers) |
610 | 613 | ||
611 | for (const stateChanges of [ localStateChanges, remoteStateChanges ]) { | 614 | for (const stateChanges of [ localStateChanges, remoteStateChanges ]) { |
@@ -618,7 +621,6 @@ describe('Test live', function () { | |||
618 | for (const server of servers) { | 621 | for (const server of servers) { |
619 | await waitUntilLiveEnded(server.url, server.accessToken, liveVideoUUID) | 622 | await waitUntilLiveEnded(server.url, server.accessToken, liveVideoUUID) |
620 | } | 623 | } |
621 | |||
622 | await waitJobs(servers) | 624 | await waitJobs(servers) |
623 | 625 | ||
624 | for (const stateChanges of [ localStateChanges, remoteStateChanges ]) { | 626 | for (const stateChanges of [ localStateChanges, remoteStateChanges ]) { |
@@ -654,10 +656,7 @@ describe('Test live', function () { | |||
654 | 656 | ||
655 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | 657 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) |
656 | 658 | ||
657 | for (const server of servers) { | 659 | await waitUntilLivePublishedOnAllServers(liveVideoUUID) |
658 | await waitUntilLivePublished(server.url, server.accessToken, liveVideoUUID) | ||
659 | } | ||
660 | |||
661 | await waitJobs(servers) | 660 | await waitJobs(servers) |
662 | 661 | ||
663 | expect(localLastVideoViews).to.equal(0) | 662 | expect(localLastVideoViews).to.equal(0) |
@@ -691,7 +690,8 @@ describe('Test live', function () { | |||
691 | socket.emit('subscribe', { videoId }) | 690 | socket.emit('subscribe', { videoId }) |
692 | 691 | ||
693 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) | 692 | const command = await sendRTMPStreamInVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) |
694 | await waitUntilLivePublished(servers[0].url, servers[0].accessToken, liveVideoUUID) | 693 | |
694 | await waitUntilLivePublishedOnAllServers(liveVideoUUID) | ||
695 | await waitJobs(servers) | 695 | await waitJobs(servers) |
696 | 696 | ||
697 | expect(stateChanges).to.have.lengthOf(1) | 697 | expect(stateChanges).to.have.lengthOf(1) |