diff --git a/eden/mononoke/mononoke_types/src/path.rs b/eden/mononoke/mononoke_types/src/path.rs index 266ca84fbe..6812456ae5 100644 --- a/eden/mononoke/mononoke_types/src/path.rs +++ b/eden/mononoke/mononoke_types/src/path.rs @@ -19,6 +19,7 @@ use bytes::Bytes; use lazy_static::lazy_static; use quickcheck::{Arbitrary, Gen}; use rand::{seq::SliceRandom, Rng}; +use regex::Regex; use serde_derive::{Deserialize, Serialize}; use crate::bonsai_changeset::BonsaiChangeset; @@ -609,6 +610,11 @@ impl MPath { current: Some(self), } } + + pub fn matches_regex(&self, re: &Regex) -> bool { + let s: String = format!("{}", self); + re.is_match(&s) + } } impl AsRef<[MPathElement]> for MPath { diff --git a/eden/mononoke/repo_client/Cargo.toml b/eden/mononoke/repo_client/Cargo.toml index c20d9985b9..4715857d76 100644 --- a/eden/mononoke/repo_client/Cargo.toml +++ b/eden/mononoke/repo_client/Cargo.toml @@ -52,6 +52,7 @@ lazy_static = "1.0" maplit = "1.0" percent-encoding = "2.1" rand = { version = "0.7", features = ["small_rng"] } +regex = "1.3.7" serde_json = "1.0" slog = { version = "2.5", features = ["max_level_debug"] } thiserror = "1.0" diff --git a/eden/mononoke/repo_client/src/client/mod.rs b/eden/mononoke/repo_client/src/client/mod.rs index 26abe6e401..647ff5a131 100644 --- a/eden/mononoke/repo_client/src/client/mod.rs +++ b/eden/mononoke/repo_client/src/client/mod.rs @@ -59,6 +59,7 @@ use mercurial_types::{ use metaconfig_types::{RepoClientKnobs, RepoReadOnly}; use mononoke_repo::{MononokeRepo, SqlStreamingCloneConfig}; use rand::{self, Rng}; +use regex::Regex; use remotefilelog::{ create_getpack_v1_blob, create_getpack_v2_blob, get_unordered_file_history_for_multiple_nodes, GetpackBlobInfo, @@ -66,7 +67,7 @@ use remotefilelog::{ use revisionstore_types::Metadata; use scuba_ext::ScubaSampleBuilderExt; use serde_json::{self, json}; -use slog::{debug, info, o}; +use slog::{debug, error, info, o}; use stats::prelude::*; use std::collections::{BTreeMap, HashMap, HashSet}; use std::convert::TryInto; @@ -288,6 +289,7 @@ struct UndesiredPathLogger { ctx: CoreContext, repo_needs_logging: bool, path_prefix_to_log: Option, + path_regex_to_log: Option, } impl UndesiredPathLogger { @@ -302,10 +304,29 @@ impl UndesiredPathLogger { None }; + let path_regex_to_log = if repo_needs_logging + && !tunables.get_undesired_path_regex_to_log().is_empty() + { + Some( + Regex::new(tunables.get_undesired_path_regex_to_log().as_str()).map_err(|e| { + error!( + ctx.logger(), + "Error initializing undesired path regex for {}: {}", + repo.name(), + e + ); + e + })?, + ) + } else { + None + }; + Ok(Self { ctx, repo_needs_logging, path_prefix_to_log, + path_regex_to_log, }) } @@ -341,7 +362,17 @@ impl UndesiredPathLogger { fn should_log(&self, path: Option<&MPath>) -> bool { if self.repo_needs_logging { - MPath::is_prefix_of_opt(self.path_prefix_to_log.as_ref(), MPath::iter_opt(path)) + let op1 = match self.path_prefix_to_log.as_ref() { + None => false, + Some(prefix) => prefix.is_prefix_of(MPath::iter_opt(path)), + }; + + let op2 = match (path, self.path_regex_to_log.as_ref()) { + (Some(path), Some(re)) => path.matches_regex(re), + _ => false, + }; + + op1 || op2 } else { false } diff --git a/eden/mononoke/tunables/src/lib.rs b/eden/mononoke/tunables/src/lib.rs index 2ea470ca4e..afa3b45211 100644 --- a/eden/mononoke/tunables/src/lib.rs +++ b/eden/mononoke/tunables/src/lib.rs @@ -71,6 +71,7 @@ pub struct MononokeTunables { // in a particular repo undesired_path_repo_name_to_log: TunableString, undesired_path_prefix_to_log: TunableString, + undesired_path_regex_to_log: TunableString, pushrebase_disable_rebased_commit_validation: AtomicBool, filenodes_disabled: AtomicBool, skiplist_max_skips_without_yield: AtomicI64,