32 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			32 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
// Copyright 2023 The Gitea Authors. All rights reserved.
 | 
						|
// SPDX-License-Identifier: MIT
 | 
						|
 | 
						|
// Package queue implements a specialized queue system for Gitea.
 | 
						|
//
 | 
						|
// There are two major kinds of concepts:
 | 
						|
//
 | 
						|
// * The "base queue": channel, level, redis:
 | 
						|
//   - They have the same abstraction, the same interface, and they are tested by the same testing code.
 | 
						|
//   - The dummy(immediate) queue is special, it's not a real queue, it's only used as a no-op queue or a testing queue.
 | 
						|
//
 | 
						|
// * The WorkerPoolQueue: it uses the "base queue" to provide "worker pool" function.
 | 
						|
//   - It calls the "handler" to process the data in the base queue.
 | 
						|
//   - Its "Push" function doesn't block forever,
 | 
						|
//     it will return an error if the queue is full after the timeout.
 | 
						|
//
 | 
						|
// A queue can be "simple" or "unique". A unique queue will try to avoid duplicate items.
 | 
						|
// Unique queue's "Has" function can be used to check whether an item is already in the queue,
 | 
						|
// although it's not 100% reliable due to there is no proper transaction support.
 | 
						|
// Simple queue's "Has" function always returns "has=false".
 | 
						|
//
 | 
						|
// The HandlerFuncT function is called by the WorkerPoolQueue to process the data in the base queue.
 | 
						|
// If the handler returns "unhandled" items, they will be re-queued to the base queue after a slight delay,
 | 
						|
// in case the item processor (eg: document indexer) is not available.
 | 
						|
package queue
 | 
						|
 | 
						|
import "code.gitea.io/gitea/modules/util"
 | 
						|
 | 
						|
type HandlerFuncT[T any] func(...T) (unhandled []T)
 | 
						|
 | 
						|
var ErrAlreadyInQueue = util.NewAlreadyExistErrorf("already in queue")
 |