forked from mirror/codeberg-forgejo
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")
|