Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by [EMAIL PROTECTED]

http://bugzilla.ximian.com/show_bug.cgi?id=79893

--- shadow/79893        2006-11-10 11:39:20.000000000 -0500
+++ shadow/79893.tmp.9985       2006-11-10 11:39:20.000000000 -0500
@@ -0,0 +1,340 @@
+Bug#: 79893
+Product: Mono: Runtime
+Version: unspecified
+OS: other
+OS Details: RedHat EL 4
+Status: NEW   
+Resolution: 
+Severity: 008 One day
+Priority: Major
+Component: io-layer
+AssignedTo: [EMAIL PROTECTED]                            
+ReportedBy: [EMAIL PROTECTED]               
+QAContact: [EMAIL PROTECTED]
+TargetMilestone: ---
+URL: 
+Cc: 
+Summary: FSW not working properly
+
+Please fill in this template when reporting a bug, unless you know what 
+you are doing.
+Description of Problem:
+The FileSystemWatcher does not get all the events.
+Somtime it even ignore all event.
+It seems to be related to the number of files/directories allready in the 
+watched folder.
+The less files/directories there are in a watch folder, the better the FSW 
+performs.
+The strangest thing is that the problem seems to affect more than one 
+watch. If one watch has a lot of files/directories, there is a high 
+probability to not get events from it, and the next watch with no 
+files/directory will send no events at all.
+
+
+Steps to reproduce the problem:
+1. Compile and start the code I join to this report.
+2. Copy directories and files (50000 files in 340 directories) to a watch 
+folder, and check the output of the application
+3. Delete the folders and check the output
+
+Actual Results:
+(first number is number of events received, second number is number of 
+files/directories that raised an event)
+
+Copy the directories/files
+/home/user1/watch1/ Create: 25041 25041
+/home/user1/watch1/ Change: 329 215
+/home/user1/watch1/ Delete: 0 0
+/home/user1/watch1/ Rename: 0 0
+/home/user1/watch1/ Error: 0 0
+Delete the directories files
+/home/user1/watch1/ Create: 25041 25041
+/home/user1/watch1/ Change: 329 215
+/home/user1/watch1/ Delete: 0 0
+/home/user1/watch1/ Rename: 0 0
+/home/user1/watch1/ Error: 0 0
+
+Expected Results:
+Copy the directories/files
+/home/user1/watch1/ Create: 50340 50340
+/home/user1/watch1/ Change: 50340 50340
+/home/user1/watch1/ Delete: 0 0
+/home/user1/watch1/ Rename: 0 0
+/home/user1/watch1/ Error: 0 0
+Delete the directories files
+/home/user1/watch1/ Create: 50340 50340
+/home/user1/watch1/ Change: 50340 50340
+/home/user1/watch1/ Delete: 50340 50340
+/home/user1/watch1/ Rename: 0 0
+/home/user1/watch1/ Error: 0 0
+
+How often does this happen? 
+Every time, but the number of events received is different everytime.
+But never the good amount.
+
+Additional Information:
+Following is the code for the test application
+
+-----
+
+using System;
+using System.IO;
+using System.Threading;
+using System.Collections;
+
+namespace FSWtester
+{
+       class MainClass
+       {
+               public static void Main(string[] args)
+               {
+                       try
+                       {
+                               if(args.Length == 0)
+                               {
+                                       Console.WriteLine("FSWTester 
+directories");
+                                       return;
+                               }
+                               
+                               Thread[] threadArray = null;
+                               Processing processing = null;
+                               string[] directories = null;
+                               
+                               directories = new string[args.Length];
+                               for(int i = 0; i < directories.Length; i 
+++)
+                               {
+                                       directories[i] = args[i];
+                               }
+
+                               threadArray = new Thread
+[directories.Length];
+                               
+                               int minWorker, minIOC;
+                               ThreadPool.GetMinThreads(out minWorker, 
+out minIOC);
+                               Console.WriteLine(minWorker + " " + 
+minIOC);
+                               
+                               ThreadPool.GetMaxThreads(out minWorker, 
+out minIOC);
+                               Console.WriteLine(minWorker + " " + 
+minIOC);
+
+                               ThreadPool.SetMinThreads(10, 10);
+
+                               ThreadPool.GetMinThreads(out minWorker, 
+out minIOC);
+                               Console.WriteLine(minWorker + " " + 
+minIOC);
+                               
+                               for(int i = 0; i < threadArray.Length; i 
+++)
+                               {
+                                       processing = new Processing
+(directories[i]);
+                                       threadArray[i] = new Thread
+(processing.Watching);
+                       threadArray[i].Name = "Processing " + i.ToString
+("D2");
+                }
+                               for (int i = 0; i < threadArray.Length; 
+i++)
+                               {
+                                       threadArray[i].Start();
+                               }
+                               
+                               while(true)
+                               {
+                                       Thread.Sleep(new TimeSpan(0,0,5));
+                               }
+                       }
+                       catch(Exception ex)
+                       {
+                               Console.WriteLine("Exception! System 
+reports: " + ex.ToString());
+                       }
+               }
+               
+               public class Processing
+               {
+                       private FileSystemWatcher fSW = new 
+FileSystemWatcher();
+                       private int deleteCount = 0;
+                       private Hashtable hashtableDelete = new Hashtable
+();
+                       private int createCount = 0;
+                       private Hashtable hashtableCreate = new Hashtable
+();
+                       private int changeCount = 0;
+                       private Hashtable hashtableChange = new Hashtable
+();
+                       private int renameCount = 0;
+                       private Hashtable hashtableRename = new Hashtable
+();
+                       private int errorCount = 0;
+                       private string directory = string.Empty;
+
+                       public Processing(string directory)
+                       {
+                               this.directory = directory;
+                       }                       
+               
+                       public void Watching()
+                       {
+                               try
+                               {
+                                       //fSW.BeginInit();
+
+                                       Console.WriteLine("Monitoring 
+directory: " + directory);
+
+                                       try
+                                       {
+                                               fSW.Path = directory;
+                                       }
+                                       catch (System.Exception ex)
+                                       {
+                                               // directory to watch is 
+bad or offline
+                                               Console.WriteLine("Could 
+not start File System Watch on directory " + directory  + ". Directory 
+does not exist or is corrupted. System reports: " + ex.ToString());
+                                               return;
+                                       }
+                                       
+                                       fSW.IncludeSubdirectories = true;
+                               
+                                       fSW.NotifyFilter = 
+NotifyFilters.CreationTime | NotifyFilters.LastWrite | 
+NotifyFilters.FileName | NotifyFilters.DirectoryName;                  
+                       
+
+                                       fSW.InternalBufferSize = 
+125829120; // 120MB
+
+                                       fSW.Changed += new 
+FileSystemEventHandler(OnChanged);
+                                       fSW.Created += new 
+FileSystemEventHandler(OnCreated);
+                                       fSW.Deleted += new 
+FileSystemEventHandler(OnDeleted);
+                                       fSW.Renamed += new 
+RenamedEventHandler(OnRename);
+
+                                       fSW.Error       += new 
+ErrorEventHandler(OnError);
+                                       
+                                       fSW.EnableRaisingEvents = true;
+
+                                       Thread.CurrentThread.Priority = 
+System.Threading.ThreadPriority.AboveNormal;
+                                       //fSW.EndInit();
+                                       
+                                       while(true)
+                                       {
+                                               Thread.Sleep(new TimeSpan
+(0,0,5));
+                                               Console.WriteLine
+(directory + " Create: " + createCount + " " + hashtableCreate.Count);
+                                               Console.WriteLine
+(directory + " Change: " + changeCount + " " + hashtableChange.Count);
+                                               Console.WriteLine
+(directory + " Delete: " + deleteCount + " " + hashtableDelete.Count);
+                                               Console.WriteLine
+(directory + " Rename: " + renameCount + " " + hashtableRename.Count);
+                                               Console.WriteLine
+(directory + " Error : " + errorCount);
+                                               Console.WriteLine("-------
+");
+                                       }
+                               }
+                               catch(Exception ex)
+                               {
+                                       Console.WriteLine("Exception! 
+System reports: " + ex.ToString());
+                               }
+                       }
+                       
+                       public void OnCreated(object source, 
+FileSystemEventArgs e)
+                       {
+                               createCount ++;
+                               //Console.WriteLine("Create event for 
+file " + e.FullPath);
+                               if(hashtableCreate.ContainsKey(e.FullPath) 
+== false)
+                               {
+                                       hashtableCreate.Add(e.FullPath, 1);
+                               }
+                               else
+                               {
+                                       hashtableCreate[e.FullPath] = (int)
+hashtableCreate[e.FullPath] + 1; 
+                               }
+                       }
+
+                       public void OnChanged(object source, 
+FileSystemEventArgs e)
+                       {               
+                               changeCount ++; 
+                               //Console.WriteLine("Change event for 
+file " + e.FullPath);
+                               if(hashtableChange.ContainsKey(e.FullPath) 
+== false)
+                               {
+                                       hashtableChange.Add(e.FullPath, 1);
+                               }
+                               else
+                               {
+                                       hashtableChange[e.FullPath] = (int)
+hashtableChange[e.FullPath] + 1; 
+                               }
+                       }
+
+                       public void OnDeleted(object source, 
+FileSystemEventArgs e)
+                       {
+                               deleteCount ++;
+                               //Console.WriteLine("Delete event for 
+file " + e.FullPath);
+                               if(hashtableDelete.ContainsKey(e.FullPath) 
+== false)
+                               {
+                                       hashtableDelete.Add(e.FullPath, 1);
+                               }
+                               else
+                               {
+                                       hashtableDelete[e.FullPath] = (int)
+hashtableDelete[e.FullPath] + 1; 
+                               }
+                       }
+                       
+                       public void OnRename(object source, 
+RenamedEventArgs e)
+                       {
+                               renameCount ++;
+                               //Console.WriteLine("Rename event for 
+file " + e.FullPath);
+                               if(hashtableRename.ContainsKey(e.FullPath) 
+== false)
+                               {
+                                       hashtableRename.Add(e.FullPath, 1);
+                               }
+                               else
+                               {
+                                       hashtableRename[e.FullPath] = (int)
+hashtableRename[e.FullPath] + 1; 
+                               }
+                       }
+
+                       public void OnError(object source, ErrorEventArgs  
+e)
+                       {
+                               errorCount ++;
+                               //Console.WriteLine("Error event");
+                       }
+               }
+       }
+}
_______________________________________________
mono-bugs maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-bugs

Reply via email to