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")
 |