.gitignore: ignore zstandard-compressed files
- Add *.zst pattern to .gitignore - Prevents tracking of zstandard-compressed archives
This commit is contained in:
@@ -78,8 +78,8 @@ impl<D> Clone for Stage<D> {
|
||||
// ── Worker task ───────────────────────────────────────────────────────────────
|
||||
|
||||
enum WorkerTask<D> {
|
||||
Transform(D, SharedFn<D>, Sender<Result<D, PipelineError>>),
|
||||
Flat(D, SharedFlatFn<D>, Sender<Result<D, PipelineError>>, Sender<isize>),
|
||||
Transform(D, usize),
|
||||
Flat(D, usize),
|
||||
}
|
||||
|
||||
// ── Thread runners ────────────────────────────────────────────────────────────
|
||||
@@ -121,18 +121,27 @@ where
|
||||
/// - `Transform` : applique `f(data)` et envoie le résultat dans `result_tx`.
|
||||
/// - `Flat` : appelle `f(data, &push_tx, &delta_tx)` ; la fonction elle-même
|
||||
/// pousse ses items dans `push_tx` et envoie `N-1` dans `delta_tx`.
|
||||
fn transform_runner<DATA>(task_rx: Receiver<WorkerTask<DATA>>) -> thread::JoinHandle<()>
|
||||
fn transform_runner<DATA>(
|
||||
task_rx: Receiver<WorkerTask<DATA>>,
|
||||
stages: Vec<Stage<DATA>>,
|
||||
stage_txs: Vec<Sender<Result<DATA, PipelineError>>>,
|
||||
flat_delta_tx: Sender<isize>,
|
||||
) -> thread::JoinHandle<()>
|
||||
where
|
||||
DATA: Send + Sync + 'static,
|
||||
{
|
||||
thread::spawn(move || {
|
||||
while let Ok(task) = task_rx.recv() {
|
||||
match task {
|
||||
WorkerTask::Transform(data, f, result_tx) => {
|
||||
let _ = result_tx.send(f(data));
|
||||
WorkerTask::Transform(data, idx) => {
|
||||
if let Stage::Transform(f) = &stages[idx] {
|
||||
let _ = stage_txs[idx].send(f(data));
|
||||
}
|
||||
}
|
||||
WorkerTask::Flat(data, f, push_tx, delta_tx) => {
|
||||
f(data, &push_tx, &delta_tx);
|
||||
WorkerTask::Flat(data, idx) => {
|
||||
if let Stage::Flat(f) = &stages[idx] {
|
||||
f(data, &stage_txs[idx], &flat_delta_tx);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -223,23 +232,31 @@ where
|
||||
|
||||
let stages = self.pipeline.stages;
|
||||
|
||||
// ── Canal delta pour les flat stages ───────────────────────────────
|
||||
// Chaque flat worker envoie `N-1` ici après avoir poussé N items.
|
||||
// Le scheduler ajuste `in_flight` en conséquence.
|
||||
let (flat_delta_tx, flat_delta_rx) = bounded::<isize>(self.capacity);
|
||||
|
||||
// ── Worker pool ────────────────────────────────────────────────────
|
||||
let (worker_tx, worker_rx): (Sender<WorkerTask<DATA>>, Receiver<WorkerTask<DATA>>) =
|
||||
bounded(self.capacity);
|
||||
|
||||
for _ in 0..self.n_workers {
|
||||
self.handles.push(transform_runner(worker_rx.clone()));
|
||||
self.handles.push(transform_runner(
|
||||
worker_rx.clone(),
|
||||
stages.iter().map(Stage::clone).collect(),
|
||||
stage_txs.clone(),
|
||||
flat_delta_tx.clone(),
|
||||
));
|
||||
}
|
||||
// Le scheduler ne tient plus flat_delta_tx : les workers le détiennent.
|
||||
// On le drop ici pour que le canal se ferme quand les workers terminent.
|
||||
drop(flat_delta_tx);
|
||||
|
||||
// ── Sink thread ────────────────────────────────────────────────────
|
||||
let (sink_tx, sink_err_rx, sink_handle) = sink_runner(self.pipeline.sink, self.capacity);
|
||||
self.handles.push(sink_handle);
|
||||
|
||||
// ── Canal delta pour les flat stages ───────────────────────────────
|
||||
// Chaque flat worker envoie `N-1` ici après avoir poussé N items.
|
||||
// Le scheduler ajuste `in_flight` en conséquence.
|
||||
let (flat_delta_tx, flat_delta_rx) = bounded::<isize>(self.capacity);
|
||||
|
||||
// ── Boucle principale ──────────────────────────────────────────────
|
||||
//
|
||||
// `in_flight` (isize) = nb d'items qui doivent encore atteindre le sink.
|
||||
@@ -313,8 +330,8 @@ where
|
||||
in_flight += 1;
|
||||
dispatch(
|
||||
data, 0,
|
||||
&stages, &stage_txs, &worker_tx,
|
||||
&flat_delta_tx, &mut flat_workers_active,
|
||||
&stages, &worker_tx,
|
||||
&mut flat_workers_active,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -333,8 +350,8 @@ where
|
||||
} else {
|
||||
dispatch(
|
||||
data, stage + 1,
|
||||
&stages, &stage_txs, &worker_tx,
|
||||
&flat_delta_tx, &mut flat_workers_active,
|
||||
&stages, &worker_tx,
|
||||
&mut flat_workers_active,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -362,27 +379,16 @@ fn dispatch<DATA>(
|
||||
data: DATA,
|
||||
stage_idx: usize,
|
||||
stages: &[Stage<DATA>],
|
||||
stage_txs: &[Sender<Result<DATA, PipelineError>>],
|
||||
worker_tx: &Sender<WorkerTask<DATA>>,
|
||||
flat_delta_tx: &Sender<isize>,
|
||||
flat_workers_active: &mut usize,
|
||||
) {
|
||||
match &stages[stage_idx] {
|
||||
Stage::Transform(f) => {
|
||||
let _ = worker_tx.send(WorkerTask::Transform(
|
||||
data,
|
||||
Arc::clone(f),
|
||||
stage_txs[stage_idx].clone(),
|
||||
));
|
||||
Stage::Transform(_) => {
|
||||
let _ = worker_tx.send(WorkerTask::Transform(data, stage_idx));
|
||||
}
|
||||
Stage::Flat(f) => {
|
||||
Stage::Flat(_) => {
|
||||
*flat_workers_active += 1;
|
||||
let _ = worker_tx.send(WorkerTask::Flat(
|
||||
data,
|
||||
Arc::clone(f),
|
||||
stage_txs[stage_idx].clone(),
|
||||
flat_delta_tx.clone(),
|
||||
));
|
||||
let _ = worker_tx.send(WorkerTask::Flat(data, stage_idx));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user