- pool/worker.rs: single-threaded consumer that BLMPOPs from Redis queues sequentially. K8s replicas provide HA — each pod runs one worker. - pool/redis.rs: RedisConsumer with BLMOVE atomic dequeue, ACK/NAK, and retry-with-json support. - pool/types.rs: HookTask, TaskType, PoolConfig (minimal — no pool metrics). - sync/lock.rs: Redis SET NX EX per-repo lock to prevent concurrent workers from processing the same repo. Lock conflicts are handled by requeueing without incrementing retry count. - hook/mod.rs: HookService.start_worker() spawns the background worker. - ssh/mod.rs / http/mod.rs: ReceiveSyncService RPUSHes to Redis queue. Both run_http and run_ssh call start_worker() to launch the consumer. - Lock conflicts (GitError::Locked) in the worker are requeued without incrementing retry_count so another worker can pick them up.
42 lines
1021 B
Rust
42 lines
1021 B
Rust
pub mod redis;
|
|
pub mod types;
|
|
pub mod worker;
|
|
|
|
pub use redis::RedisConsumer;
|
|
pub use types::{HookTask, PoolConfig, TaskType};
|
|
pub use worker::HookWorker;
|
|
|
|
use db::cache::AppCache;
|
|
use db::database::AppDatabase;
|
|
use deadpool_redis::cluster::Pool as RedisPool;
|
|
use slog::Logger;
|
|
use tokio_util::sync::CancellationToken;
|
|
|
|
/// Start the hook worker background task.
|
|
/// Returns a handle to the cancellation token so the caller can shut it down.
|
|
pub fn start_worker(
|
|
db: AppDatabase,
|
|
cache: AppCache,
|
|
redis_pool: RedisPool,
|
|
logger: Logger,
|
|
config: PoolConfig,
|
|
) -> CancellationToken {
|
|
let consumer = RedisConsumer::new(
|
|
redis_pool.clone(),
|
|
config.redis_list_prefix.clone(),
|
|
config.redis_block_timeout_secs,
|
|
logger.clone(),
|
|
);
|
|
|
|
let worker = HookWorker::new(db, cache, logger, consumer);
|
|
|
|
let cancel = CancellationToken::new();
|
|
let cancel_clone = cancel.clone();
|
|
|
|
tokio::spawn(async move {
|
|
worker.run(cancel_clone).await;
|
|
});
|
|
|
|
cancel
|
|
}
|