Fix removal of roots and a few races related to directories going away during and after indexing. Index: FileSystemQueryable/DirectoryIndexableGenerator.cs =================================================================== RCS file: /cvs/gnome/beagle/beagled/FileSystemQueryable/DirectoryIndexableGenerator.cs,v retrieving revision 1.7 diff -u -B -p -r1.7 DirectoryIndexableGenerator.cs --- FileSystemQueryable/DirectoryIndexableGenerator.cs 10 Aug 2005 19:22:41 -0000 1.7 +++ FileSystemQueryable/DirectoryIndexableGenerator.cs 11 Aug 2005 22:07:08 -0000 @@ -61,7 +61,7 @@ namespace Beagle.Daemon.FileSystemQuerya FileInfo f = files.Current as FileInfo; Indexable indexable = null; try { - if (f.Exists) + if (f.Exists && this.directory.IsAttached) indexable = queryable.GetCrawlingFileIndexable (directory, f.Name); } catch (Exception ex) { Logger.Log.Debug ("Caught exception calling GetCrawlingFileIndexable on '{0}'", f.FullName); Index: FileSystemQueryable/DirectoryModel.cs =================================================================== RCS file: /cvs/gnome/beagle/beagled/FileSystemQueryable/DirectoryModel.cs,v retrieving revision 1.3 diff -u -B -p -r1.3 DirectoryModel.cs --- FileSystemQueryable/DirectoryModel.cs 10 Aug 2005 22:27:04 -0000 1.3 +++ FileSystemQueryable/DirectoryModel.cs 11 Aug 2005 22:07:08 -0000 @@ -140,6 +140,8 @@ namespace Beagle.Daemon.FileSystemQuerya public string FullName { get { + if (!IsAttached) + return "_HUH_NO_WAY_ARE_YOU_KIDDING_ME_"; lock (big_lock) { if (cached_full_name == null) { string directly_above; @@ -209,6 +211,10 @@ namespace Beagle.Daemon.FileSystemQuerya set { last_activity_time = value; } } + public bool IsAttached { + get { return parent != null || rooted_to != null; } + } + /////////////////////////////////////////////////////////// public void MarkAsClean () @@ -241,6 +247,15 @@ namespace Beagle.Daemon.FileSystemQuerya /////////////////////////////////////////////////////////// + private void Detatch_Recursively_Unlocked () + { + if (this.children != null) + foreach (DirectoryModel child in new ArrayList (this.children.Values)) + child.Detatch_Recursively_Unlocked (); + + this.Detatch_Unlocked (); + } + private void Detatch_Unlocked () { if (IsRoot) @@ -347,7 +362,7 @@ namespace Beagle.Daemon.FileSystemQuerya public void Remove () { lock (big_lock) - Detatch_Unlocked (); + Detatch_Recursively_Unlocked (); } /////////////////////////////////////////////////////////// Index: FileSystemQueryable/FileCrawlTask.cs =================================================================== RCS file: /cvs/gnome/beagle/beagled/FileSystemQueryable/FileCrawlTask.cs,v retrieving revision 1.2 diff -u -B -p -r1.2 FileCrawlTask.cs --- FileSystemQueryable/FileCrawlTask.cs 10 Aug 2005 19:22:41 -0000 1.2 +++ FileSystemQueryable/FileCrawlTask.cs 11 Aug 2005 22:07:08 -0000 @@ -86,6 +86,11 @@ namespace Beagle.Daemon.FileSystemQuerya return; } } + + if (!current_dir.IsAttached) { + Reschedule = true; + return; + } if (FileSystemQueryable.Debug) Logger.Log.Debug ("Starting crawl of '{0}'", current_dir.FullName); Index: FileSystemQueryable/FileSystemQueryable.cs =================================================================== RCS file: /cvs/gnome/beagle/beagled/FileSystemQueryable/FileSystemQueryable.cs,v retrieving revision 1.67 diff -u -B -p -r1.67 FileSystemQueryable.cs --- FileSystemQueryable/FileSystemQueryable.cs 11 Aug 2005 18:01:15 -0000 1.67 +++ FileSystemQueryable/FileSystemQueryable.cs 11 Aug 2005 22:07:10 -0000 @@ -350,6 +350,7 @@ namespace Beagle.Daemon.FileSystemQuerya if (Debug) Logger.Log.Debug ("Expired '{0}'", expired_path); dir_models_by_path.Remove (expired_path); + dir_models_by_id.Remove (unique_id); } public void AddDirectory (DirectoryModel parent, string name) @@ -546,8 +547,6 @@ namespace Beagle.Daemon.FileSystemQuerya ActivateFileCrawling (); } - // FIXME: We should ignore the ignore status and just handle - // the event, right? If it isn't in the index, no harm done. private void RemoveDirectory (DirectoryModel dir) { Uri uri; @@ -1084,6 +1083,10 @@ namespace Beagle.Daemon.FileSystemQuerya PendingInfo info; info = pending_info_cache [receipt.Uri] as PendingInfo; pending_info_cache.Remove (receipt.Uri); + + // The parent directory might have run away since we were indexed + if (info.Parent != null && !info.Parent.IsAttached) + return; Guid unique_id; unique_id = GuidFu.FromUri (receipt.Uri); Index: FileSystemQueryable/TreeCrawlTask.cs =================================================================== RCS file: /cvs/gnome/beagle/beagled/FileSystemQueryable/TreeCrawlTask.cs,v retrieving revision 1.3 diff -u -B -p -r1.3 TreeCrawlTask.cs --- FileSystemQueryable/TreeCrawlTask.cs 11 Aug 2005 18:01:15 -0000 1.3 +++ FileSystemQueryable/TreeCrawlTask.cs 11 Aug 2005 22:07:10 -0000 @@ -83,14 +83,16 @@ namespace Beagle.Daemon.FileSystemQuerya is_active = true; } - if (FileSystemQueryable.Debug) - Logger.Log.Debug ("Scanning '{0}' for subdirectories", dir.FullName); + if (dir.IsAttached) { + if (FileSystemQueryable.Debug) + Logger.Log.Debug ("Scanning '{0}' for subdirectories", dir.FullName); - try { - foreach (string name in DirectoryWalker.GetDirectoryNames (dir.FullName)) - handler (dir, name); - } catch (DirectoryNotFoundException ex) { - Logger.Log.Debug ("Couldn't scan '{0}' for subdirectories", dir.FullName); + try { + foreach (string name in DirectoryWalker.GetDirectoryNames (dir.FullName)) + handler (dir, name); + } catch (DirectoryNotFoundException ex) { + Logger.Log.Debug ("Couldn't scan '{0}' for subdirectories", dir.FullName); + } } lock (big_lock) {