Skip to content

Commit

Permalink
subscriber: impl Clone for EnvFilter
Browse files Browse the repository at this point in the history
This is useful when using `EnvFilter` for multiple identical per-layer
filters, as well as with clap and similar libraries that have `Clone`
bounds.

We generally expect users to be cloning an `EnvFilter` before attaching it
to a subscriber, rather than cloning `EnvFilters` that are already
attached. Because of this, we reset all the accumulated dynamic state
when cloning. This means that some spans and callsites might be missed
when an already-attached `EnvFilter` is cloned, but the presence of the
dynamic state mean that detaching and attaching `EnvFilter`s to existing
subscribers (e.g. with `reload`) already doesn't work very well. This
isn't a new class of problem.

There was a previous implementation of this in #2398, that shared the
dynamic state between all cloned filters behind an `Arc`. I chose
not do go for that approach because it causes inconsistencies if the
cloned filters are attached to different subscribers.

Fixes: #2360
  • Loading branch information
Benjamin-L committed Apr 26, 2024
1 parent 908cc43 commit bf4acba
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions tracing-subscriber/src/filter/env/mod.rs
Expand Up @@ -204,6 +204,22 @@ pub struct EnvFilter {
regex: bool,
}

/// Creates an [`EnvFilter`] with the same directives as `self`. This does *not* clone any of the
/// dynamic state that [`EnvFilter`] acquires while attached to a subscriber.
impl Clone for EnvFilter {
fn clone(&self) -> EnvFilter {
EnvFilter {
statics: self.statics.clone(),
dynamics: self.dynamics.clone(),
has_dynamics: self.has_dynamics,
by_id: RwLock::new(Default::default()),
by_cs: RwLock::new(Default::default()),
scope: ThreadLocal::new(),
regex: self.regex,
}
}
}

type FieldMap<T> = HashMap<Field, T>;

/// Indicates that an error occurred while parsing a `EnvFilter` from an
Expand Down

0 comments on commit bf4acba

Please sign in to comment.