From acc95923da555b2bf17a5638e62e533218c5840a Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Mon, 13 Feb 2023 18:40:48 +0000 Subject: [performance] processing media and scheduled jobs improvements (#1482) * replace media workers with just runners.WorkerPool, move to state structure, use go-sched for global task scheduling * improved code comment * fix worker tryUntil function, update go-runners/go-sched * make preprocess functions package public, use these where possible to stop doubled up processing * remove separate emoji worker pool * limit calls to time.Now() during media preprocessing * use Processor{} to manage singular runtime of processing media * ensure workers get started when media manager is used * improved error setting in processing media, fix media test * port changes from processingmedia to processing emoji * finish code commenting * finish code commenting and comment-out client API + federator worker pools until concurrency worker pools replaced * linterrrrrrrrrrrrrrrr --------- Signed-off-by: kim --- internal/workers/workers.go | 90 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 internal/workers/workers.go (limited to 'internal/workers/workers.go') diff --git a/internal/workers/workers.go b/internal/workers/workers.go new file mode 100644 index 000000000..77b3065ce --- /dev/null +++ b/internal/workers/workers.go @@ -0,0 +1,90 @@ +/* +GoToSocial +Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ + +package workers + +import ( + "log" + "runtime" + + "codeberg.org/gruf/go-runners" + "codeberg.org/gruf/go-sched" +) + +type Workers struct { + // Main task scheduler instance. + Scheduler sched.Scheduler + + // Processor / federator worker pools. + // ClientAPI runners.WorkerPool + // Federator runners.WorkerPool + + // Media manager worker pools. + Media runners.WorkerPool + + // prevent pass-by-value. + _ nocopy +} + +// Start will start all of the contained worker pools (and global scheduler). +func (w *Workers) Start() { + // Get currently set GOMAXPROCS. + maxprocs := runtime.GOMAXPROCS(0) + + tryUntil("starting scheduler", 5, func() bool { + return w.Scheduler.Start(nil) + }) + + // tryUntil("starting client API workerpool", 5, func() bool { + // return w.ClientAPI.Start(4*maxprocs, 400*maxprocs) + // }) + + // tryUntil("starting federator workerpool", 5, func() bool { + // return w.Federator.Start(4*maxprocs, 400*maxprocs) + // }) + + tryUntil("starting media workerpool", 5, func() bool { + return w.Media.Start(8*maxprocs, 80*maxprocs) + }) +} + +// Stop will stop all of the contained worker pools (and global scheduler). +func (w *Workers) Stop() { + tryUntil("stopping scheduler", 5, w.Scheduler.Stop) + // tryUntil("stopping client API workerpool", 5, w.ClientAPI.Stop) + // tryUntil("stopping federator workerpool", 5, w.Federator.Stop) + tryUntil("stopping media workerpool", 5, w.Media.Stop) +} + +// nocopy when embedded will signal linter to +// error on pass-by-value of parent struct. +type nocopy struct{} + +func (*nocopy) Lock() {} + +func (*nocopy) Unlock() {} + +// tryUntil will attempt to call 'do' for 'count' attempts, before panicking with 'msg'. +func tryUntil(msg string, count int, do func() bool) { + for i := 0; i < count; i++ { + if do() { + return + } + } + log.Panicf("failed %s after %d tries", msg, count) +} -- cgit v1.2.3