| 
									
										
										
										
											2023-03-12 16:00:57 +01:00
										 |  |  | // GoToSocial | 
					
						
							|  |  |  | // Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | // SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // 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/>. | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | package workers | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"runtime" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-11 10:45:35 +01:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/config" | 
					
						
							| 
									
										
										
										
											2024-06-03 21:55:50 +00:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/log" | 
					
						
							| 
									
										
										
										
											2023-03-01 18:26:53 +00:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/messages" | 
					
						
							| 
									
										
										
										
											2023-11-04 20:21:20 +00:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/scheduler" | 
					
						
							| 
									
										
										
										
											2024-04-11 10:45:35 +01:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/transport/delivery" | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type Workers struct { | 
					
						
							|  |  |  | 	// Main task scheduler instance. | 
					
						
							| 
									
										
										
										
											2023-11-04 20:21:20 +00:00
										 |  |  | 	Scheduler scheduler.Scheduler | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-11 10:45:35 +01:00
										 |  |  | 	// Delivery provides a worker pool that | 
					
						
							|  |  |  | 	// handles outgoing ActivityPub deliveries. | 
					
						
							|  |  |  | 	// It contains an embedded (but accessible) | 
					
						
							|  |  |  | 	// indexed queue of Delivery{} objects. | 
					
						
							|  |  |  | 	Delivery delivery.WorkerPool | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 13:50:46 +01:00
										 |  |  | 	// Client provides a worker pool that handles | 
					
						
							|  |  |  | 	// incoming processing jobs from the client API. | 
					
						
							|  |  |  | 	Client MsgWorkerPool[*messages.FromClientAPI] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Federator provides a worker pool that handles | 
					
						
							|  |  |  | 	// incoming processing jobs from the fedi API. | 
					
						
							|  |  |  | 	Federator MsgWorkerPool[*messages.FromFediAPI] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Dereference provides a worker pool | 
					
						
							|  |  |  | 	// for asynchronous dereferencer jobs. | 
					
						
							|  |  |  | 	Dereference FnWorkerPool | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | 	// prevent pass-by-value. | 
					
						
							|  |  |  | 	_ nocopy | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 13:50:46 +01:00
										 |  |  | // StartScheduler starts the job scheduler. | 
					
						
							|  |  |  | func (w *Workers) StartScheduler() { | 
					
						
							| 
									
										
										
										
											2024-07-30 11:58:31 +00:00
										 |  |  | 	_ = w.Scheduler.Start() | 
					
						
							|  |  |  | 	// false = already running | 
					
						
							| 
									
										
										
										
											2024-06-03 21:55:50 +00:00
										 |  |  | 	log.Info(nil, "started scheduler") | 
					
						
							| 
									
										
										
										
											2024-04-26 13:50:46 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Start will start contained worker pools. | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | func (w *Workers) Start() { | 
					
						
							| 
									
										
										
										
											2024-06-03 21:55:50 +00:00
										 |  |  | 	var n int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | 	maxprocs := runtime.GOMAXPROCS(0) | 
					
						
							| 
									
										
										
										
											2024-06-03 21:55:50 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	n = deliveryWorkers(maxprocs) | 
					
						
							|  |  |  | 	w.Delivery.Start(n) | 
					
						
							|  |  |  | 	log.Infof(nil, "started %d delivery workers", n) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	n = 4 * maxprocs | 
					
						
							|  |  |  | 	w.Client.Start(n) | 
					
						
							|  |  |  | 	log.Infof(nil, "started %d client workers", n) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	n = 4 * maxprocs | 
					
						
							|  |  |  | 	w.Federator.Start(n) | 
					
						
							|  |  |  | 	log.Infof(nil, "started %d federator workers", n) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	n = 4 * maxprocs | 
					
						
							|  |  |  | 	w.Dereference.Start(n) | 
					
						
							|  |  |  | 	log.Infof(nil, "started %d dereference workers", n) | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-30 11:58:31 +00:00
										 |  |  | // Stop will stop all of the contained | 
					
						
							|  |  |  | // worker pools (and global scheduler). | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | func (w *Workers) Stop() { | 
					
						
							| 
									
										
										
										
											2024-07-30 11:58:31 +00:00
										 |  |  | 	_ = w.Scheduler.Stop() | 
					
						
							|  |  |  | 	// false = not running | 
					
						
							|  |  |  | 	log.Info(nil, "stopped scheduler") | 
					
						
							| 
									
										
										
										
											2024-06-03 21:55:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 13:50:46 +01:00
										 |  |  | 	w.Delivery.Stop() | 
					
						
							| 
									
										
										
										
											2024-06-03 21:55:50 +00:00
										 |  |  | 	log.Info(nil, "stopped delivery workers") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 13:50:46 +01:00
										 |  |  | 	w.Client.Stop() | 
					
						
							| 
									
										
										
										
											2024-06-03 21:55:50 +00:00
										 |  |  | 	log.Info(nil, "stopped client workers") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 13:50:46 +01:00
										 |  |  | 	w.Federator.Stop() | 
					
						
							| 
									
										
										
										
											2024-06-03 21:55:50 +00:00
										 |  |  | 	log.Info(nil, "stopped federator workers") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 13:50:46 +01:00
										 |  |  | 	w.Dereference.Stop() | 
					
						
							| 
									
										
										
										
											2024-06-03 21:55:50 +00:00
										 |  |  | 	log.Info(nil, "stopped dereference workers") | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // nocopy when embedded will signal linter to | 
					
						
							|  |  |  | // error on pass-by-value of parent struct. | 
					
						
							|  |  |  | type nocopy struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (*nocopy) Lock() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (*nocopy) Unlock() {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 13:50:46 +01:00
										 |  |  | func deliveryWorkers(maxprocs int) int { | 
					
						
							|  |  |  | 	n := config.GetAdvancedSenderMultiplier() | 
					
						
							|  |  |  | 	if n < 1 { | 
					
						
							|  |  |  | 		// clamp to 1 | 
					
						
							|  |  |  | 		return 1 | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-04-26 13:50:46 +01:00
										 |  |  | 	return n * maxprocs | 
					
						
							| 
									
										
										
										
											2023-02-13 18:40:48 +00:00
										 |  |  | } |