# Sisyphus Tasks
Utilities for long-running, resilient tasks.
This library contains code I wrote, found useful, and want to keep using. It aims to provide systems
The general idiom is focused on spawning long-lived worker loops, which use channels to communicate.
### Understanding this crate
### High Level Example
```rust
pub struct MyWorker{
pipe: Pipe<WorkItem>,
}
impl Boulder for MyWorker {
fn spawn(self) -> JoinHandle<Fall<Self>> {
tokio::spawn(async move {
// pipe gives refs to items
while let Some(item) = self.pipe.next().await {
// worker does work on each item as it becomes available
self.do_work_on(item);
// do some async work too :)
self.async_work_as_well(item).await;
}
});
}
}
let task = MyWorker::new(a_pipe).run_forever();
```
### Current Utils:
- Sisyphus
- A scaffolding system for spawning long-lived, recoverable tasks
- A `Boulder` is a looping, fallible task
- `Boulder` logic is defined in a `Boulder::spawn()` method that returns a
`JoinHandle`
- A `Fall` is an error in that task.
- `Fall::Recoverable` - errors that the task believes it can recover
- `Fall::Unrecoverable` - errors that the task believes it cannot recover
- The `Boulder::run_until_panic` method handles restarting on recoverable
`Fall` s, and reporting unrecoverable errors
- `Boulder` s may define custom recovery or cleanup logic
- `Boulder` s may also panic. In that case, no `Fall` is generated, and the
- panic is propagated upward
- `Sisyphus` manages a `Boulder` loop. He exposes an interface to observe its
status and abort the work
- Pipe
- An inbound and an outbound channel
- Enforce process-once semantics
- Prevents data loss on worker error
- Designed for relatively linear data-processing pipelines
- e.g. retrieval -> metrics -> indexing -> other handling
- Convenience methods for running synchronous and asynchronous `for_each` on channel contents
### Future Utils:
- Abstraction layers for instantiating complex pipes from lists of Sisyphuses
- Pipes should allow sync & async transforms (inbound `T`, outbound `U`)
### Copyright Note
Some code descends from utilities written for [Nomad](https://github.com/nomad-xyz/rust/tree/prestwich/monitor/agent-utils). It is used and reproduced under its license terms.