diff options
Diffstat (limited to 'internal/workers')
| -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) +}  | 
