diff options
author | Andrew Gallant <jamslam@gmail.com> | 2017-10-22 10:26:50 -0400 |
---|---|---|
committer | Andrew Gallant <jamslam@gmail.com> | 2017-10-22 10:26:50 -0400 |
commit | 3f505931bdab2293b008bd245f97662c25b5e7f9 (patch) | |
tree | b62aad308fdb887802168f52f761d217d729cb03 | |
parent | 311ccb1f6b5a2bfe83ec0ceafd357c51501158fc (diff) |
ignore: partially revert symlink loop check optimization
This optimization wasn't tested too carefully, and it seems to result
in a massive amount of file handles open simultaneously. This is likely
a result of the parallel iterator, where many directories are being
traversed simultaneously.
-rw-r--r-- | ignore/src/dir.rs | 22 | ||||
-rw-r--r-- | ignore/src/walk.rs | 5 |
2 files changed, 4 insertions, 23 deletions
diff --git a/ignore/src/dir.rs b/ignore/src/dir.rs index 544440d0..6de66191 100644 --- a/ignore/src/dir.rs +++ b/ignore/src/dir.rs @@ -21,7 +21,6 @@ use std::sync::{Arc, RwLock}; use gitignore::{self, Gitignore, GitignoreBuilder}; use pathutil::{is_hidden, strip_prefix}; use overrides::{self, Override}; -use same_file::Handle; use types::{self, Types}; use {Error, Match, PartialErrorBuilder}; @@ -96,9 +95,6 @@ struct IgnoreInner { compiled: Arc<RwLock<HashMap<OsString, Ignore>>>, /// The path to the directory that this matcher was built from. dir: PathBuf, - /// An open handle to the directory, for checking symlink loops in the - /// parallel iterator. - handle: Arc<Option<Handle>>, /// An override matcher (default is empty). overrides: Arc<Override>, /// A file type matcher. @@ -135,11 +131,6 @@ impl Ignore { &self.0.dir } - /// Return a handle to the directory of this matcher. - pub fn handle(&self) -> Option<&Handle> { - (*self.0.handle).as_ref() - } - /// Return true if this matcher has no parent. pub fn is_root(&self) -> bool { self.0.parent.is_none() @@ -246,17 +237,9 @@ impl Ignore { errs.maybe_push(err); m }; - let handle = match Handle::from_path(dir) { - Ok(handle) => Some(handle), - Err(err) => { - errs.push(Error::from(err).with_path(dir)); - None - } - }; let ig = IgnoreInner { compiled: self.0.compiled.clone(), dir: dir.to_path_buf(), - handle: Arc::new(handle), overrides: self.0.overrides.clone(), types: self.0.types.clone(), parent: Some(self.clone()), @@ -467,14 +450,9 @@ impl IgnoreBuilder { } gi }; - let handle = match Handle::from_path(&self.dir) { - Ok(handle) => Some(handle), - Err(_) => None, - }; Ignore(Arc::new(IgnoreInner { compiled: Arc::new(RwLock::new(HashMap::new())), dir: self.dir.clone(), - handle: Arc::new(handle), overrides: self.overrides.clone(), types: self.types.clone(), parent: None, diff --git a/ignore/src/walk.rs b/ignore/src/walk.rs index 8f0a555a..cfcb9701 100644 --- a/ignore/src/walk.rs +++ b/ignore/src/walk.rs @@ -1312,7 +1312,10 @@ fn check_symlink_loop( Error::from(err).with_path(child_path).with_depth(child_depth) })?; for ig in ig_parent.parents().take_while(|ig| !ig.is_absolute_parent()) { - if ig.handle().map_or(true, |parent| parent == &hchild) { + let h = Handle::from_path(ig.path()).map_err(|err| { + Error::from(err).with_path(child_path).with_depth(child_depth) + })?; + if hchild == h { return Err(Error::Loop { ancestor: ig.path().to_path_buf(), child: child_path.to_path_buf(), |