diff options
author | 2023-02-13 18:40:48 +0000 | |
---|---|---|
committer | 2023-02-13 18:40:48 +0000 | |
commit | acc95923da555b2bf17a5638e62e533218c5840a (patch) | |
tree | 7df5d0636137efa5b49298a8f0ced81d35767a5b /internal/workers/workers.go | |
parent | [docs] move federating with gotosocial documentation into single file (#1494) (diff) | |
download | gotosocial-acc95923da555b2bf17a5638e62e533218c5840a.tar.xz |
[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 <grufwub@gmail.com>
Diffstat (limited to 'internal/workers/workers.go')
-rw-r--r-- | internal/workers/workers.go | 90 |
1 files changed, 90 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. +*/ + +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) +} |