[Checkins] SVN: Products.CMFCore/branches/2.2/Products/CMFCore/ Fix slow debug-mode performance on Windows.

Ross Patterson me at rpatterson.net
Tue Mar 6 19:16:13 UTC 2012


Log message for revision 124529:
  Fix slow debug-mode performance on Windows.
  
  Merge trunk at 120174:
  
      - store debug mode behavior in 'use_dir_mtime' property instead of hardcoding 'win32' in several places
      - adjusted tests
  

Changed:
  U   Products.CMFCore/branches/2.2/Products/CMFCore/CHANGES.txt
  U   Products.CMFCore/branches/2.2/Products/CMFCore/DirectoryView.py
  U   Products.CMFCore/branches/2.2/Products/CMFCore/tests/base/testcase.py
  U   Products.CMFCore/branches/2.2/Products/CMFCore/tests/test_DirectoryView.py
  U   Products.CMFCore/branches/2.2/Products/CMFCore/tests/test_FSSecurity.py

-=-
Modified: Products.CMFCore/branches/2.2/Products/CMFCore/CHANGES.txt
===================================================================
--- Products.CMFCore/branches/2.2/Products/CMFCore/CHANGES.txt	2012-03-05 21:29:51 UTC (rev 124528)
+++ Products.CMFCore/branches/2.2/Products/CMFCore/CHANGES.txt	2012-03-06 19:16:10 UTC (rev 124529)
@@ -6,6 +6,10 @@
 
 - Avoid a shallow dependency on `Products.ZReST`. (Merged [122078])
 
+- Fix slow debug-mode performance on Windows.  (Merged [120174])
+  [rossp]
+
+
 2.2.5 (2011-11-01)
 ------------------
 

Modified: Products.CMFCore/branches/2.2/Products/CMFCore/DirectoryView.py
===================================================================
--- Products.CMFCore/branches/2.2/Products/CMFCore/DirectoryView.py	2012-03-05 21:29:51 UTC (rev 124528)
+++ Products.CMFCore/branches/2.2/Products/CMFCore/DirectoryView.py	2012-03-06 19:16:10 UTC (rev 124529)
@@ -103,6 +103,7 @@
 
 class DirectoryInformation:
     data = None
+    use_dir_mtime = True
     _v_last_read = 0
     _v_last_filelist = [] # Only used on Win32
 
@@ -111,6 +112,7 @@
         self._reg_key = reg_key
         self.ignore = base_ignore + tuple(ignore)
         if platform == 'win32':
+            self.use_dir_mtime = False
             self._walker = _walker(self.ignore)
         subdirs = []
         for entry in _filtered_listdir(self._filepath, ignore=self.ignore):
@@ -160,7 +162,7 @@
         filelist=[]
         try:
             mtime = os.stat(self._filepath)[8]
-            if platform == 'win32':
+            if not self.use_dir_mtime:
                 # some Windows directories don't change mtime
                 # when a file is added to or deleted from them :-(
                 # So keep a list of files as well, and see if that

Modified: Products.CMFCore/branches/2.2/Products/CMFCore/tests/base/testcase.py
===================================================================
--- Products.CMFCore/branches/2.2/Products/CMFCore/tests/base/testcase.py	2012-03-05 21:29:51 UTC (rev 124528)
+++ Products.CMFCore/branches/2.2/Products/CMFCore/tests/base/testcase.py	2012-03-06 19:16:10 UTC (rev 124529)
@@ -156,10 +156,13 @@
     # Base class for FSDV test, creates a fake skin
     # copy that can be edited.
 
-    def _writeFile(self, filename, stuff):
+    def _writeFile(self, filename, stuff, use_dir_mtime=False):
         # write some stuff to a file on disk
         # make sure the file's modification time has changed
         # also make sure the skin folder mod time has changed
+        if use_dir_mtime:
+            dir_mtime = stat(self.skin_path_name).st_mtime
+        thePath = join(self.skin_path_name, filename)
         try:
             dir_mtime = stat(self.skin_path_name)[8]
         except:  # XXX Why bare except?
@@ -175,24 +178,19 @@
             f.write(stuff)
             f.close()
             mtime2 = stat(thePath)[8]
-        self._addedOrRemoved(dir_mtime)
+        if use_dir_mtime:
+            self._addedOrRemoved(dir_mtime)
 
-    def _deleteFile(self,filename):
-        try:
-            dir_mtime = stat(self.skin_path_name)[8]
-        except:  # XXX Why bare except?
-            dir_mtime = 0
+    def _deleteFile(self, filename, use_dir_mtime=False):
+        if use_dir_mtime:
+            dir_mtime = stat(self.skin_path_name).st_mtime
         remove(join(self.skin_path_name, filename))
-        self._addedOrRemoved(dir_mtime)
+        if use_dir_mtime:
+            self._addedOrRemoved(dir_mtime)
 
     def _addedOrRemoved(self, old_mtime):
         # Called after adding/removing a file from self.skin_path_name.
 
-        if sys.platform == 'win32':
-            # Windows doesn't reliably update directory mod times, so
-            # DirectoryView has an expensive workaround.  The
-            # workaround does not rely on directory mod times.
-            return
         limit = time.time() + 60  # If it takes 60 seconds, give up.
         new_mtime = old_mtime
         while new_mtime == old_mtime:

Modified: Products.CMFCore/branches/2.2/Products/CMFCore/tests/test_DirectoryView.py
===================================================================
--- Products.CMFCore/branches/2.2/Products/CMFCore/tests/test_DirectoryView.py	2012-03-05 21:29:51 UTC (rev 124528)
+++ Products.CMFCore/branches/2.2/Products/CMFCore/tests/test_DirectoryView.py	2012-03-06 19:16:10 UTC (rev 124529)
@@ -292,6 +292,8 @@
 class DebugModeTests(WritableFSDVTest):
 
     def setUp( self ):
+        from Products.CMFCore.DirectoryView import _dirreg
+
         WritableFSDVTest.setUp(self)
         self.test1path = join(self.skin_path_name,'test1.py')
         self.test2path = join(self.skin_path_name,'test2.py')
@@ -309,6 +311,14 @@
         # add a new folder
         mkdir(self.test3path)
 
+        info = _dirreg.getDirectoryInfo(self.ob.fake_skin._dirpath)
+        info.reload()
+        self.use_dir_mtime = info.use_dir_mtime
+
+    def tearDown(self):
+        getConfiguration().debug_mode = self.saved_cfg_debug_mode
+        WritableFSDVTest.tearDown(self)
+
     def test_AddNewMethod( self ):
         # See if a method added to the skin folder can be found
         self.assertEqual(self.ob.fake_skin.test2(),'test2')
@@ -337,13 +347,15 @@
         self.failIf(hasattr(self.ob.fake_skin,'test2'))
 
         # add method back to the fake skin folder
-        self._writeFile(self.test2path, "return 'test2.2'")
+        self._writeFile(self.test2path, "return 'test2.2'",
+                        self.use_dir_mtime)
 
         # check
         self.assertEqual(self.ob.fake_skin.test2(),'test2.2')
 
         # edit method
-        self._writeFile(self.test2path, "return 'test2.3'")
+        self._writeFile(self.test2path, "return 'test2.3'",
+                        self.use_dir_mtime)
 
         # check
         self.assertEqual(self.ob.fake_skin.test2(),'test2.3')

Modified: Products.CMFCore/branches/2.2/Products/CMFCore/tests/test_FSSecurity.py
===================================================================
--- Products.CMFCore/branches/2.2/Products/CMFCore/tests/test_FSSecurity.py	2012-03-05 21:29:51 UTC (rev 124528)
+++ Products.CMFCore/branches/2.2/Products/CMFCore/tests/test_FSSecurity.py	2012-03-06 19:16:10 UTC (rev 124529)
@@ -102,13 +102,30 @@
 
 class DebugModeTests( FSSecurityBase ):
 
-    def test_addPRM( self ):
+class DebugModeTests(WritableFSDVTest, MetadataChecker):
+
+    def setUp(self):
+        from Products.CMFCore.DirectoryView import _dirreg
+
+        WritableFSDVTest.setUp(self)
+        self._registerDirectory(self)
+        info = _dirreg.getDirectoryInfo(self.ob.fake_skin._dirpath)
+        self.use_dir_mtime = info.use_dir_mtime
+        self.saved_cfg_debug_mode = getConfiguration().debug_mode
+        getConfiguration().debug_mode = True
+
+    def tearDown(self):
+        getConfiguration().debug_mode = self.saved_cfg_debug_mode
+        WritableFSDVTest.tearDown(self)
+
+    def test_addPRM(self):
         # Test adding of a .metadata
         # baseline
         self._checkSettings(self.ob.fake_skin.test5,'View',1,[])
         # add
         self._writeFile('test5.py.metadata',
-                        '[security]\nView = 1:Manager')
+                        '[security]\nView = 1:Manager',
+                        self.use_dir_mtime)
         # test
         self._checkSettings(self.ob.fake_skin.test5,'View',1,['Manager'])
 
@@ -120,7 +137,7 @@
                         '[security]\nView = 1:Manager')
         self._checkSettings(self.ob.fake_skin.test5,'View',1,['Manager'])
         # delete
-        self._deleteFile('test5.py.metadata')
+        self._deleteFile('test4.py.metadata', self.use_dir_mtime)
         # test
         self._checkSettings(self.ob.fake_skin.test5,'View',1,[])
 
@@ -139,7 +156,8 @@
                             'View',0,['Manager','Anonymous'])
         # edit
         self._writeFile('test5.py.metadata',
-                        '[security]\nView = 1:Manager')
+                        '[security]\nView = 1:Manager',
+                        self.use_dir_mtime)
         # test
         self._checkSettings(self.ob.fake_skin.test5,'View',1,['Manager'])
 
@@ -148,23 +166,19 @@
         # baseline
         self._writeFile('test5.py.metadata','[security]\nView = 0:Manager')
         # delete
-        self._deleteFile('test5.py.metadata')
-        self._checkSettings(self.ob.fake_skin.test5,'View',1,[])
-
-        # we need to wait a second here or the mtime will actually
-        # have the same value, no human makes two edits in less
-        # than a second ;-)
-        sleep(1)
-
+        self._deleteFile('test4.py.metadata', self.use_dir_mtime)
+        self._checkSettings(self.ob.fake_skin.test4, 'View', 1, [])
         # add back
         self._writeFile('test5.py.metadata',
-                        '[security]\nView = 0:Manager,Anonymous')
+                        '[security]\nView = 0:Manager,Anonymous',
+                        self.use_dir_mtime)
         self._checkSettings(self.ob.fake_skin.test5,
                             'View',0,['Manager','Anonymous'])
 
         # edit
         self._writeFile('test5.py.metadata',
-                        '[security]\nView = 1:Manager')
+                        '[security]\nView = 1:Manager',
+                        self.use_dir_mtime)
         # test
         self._checkSettings(self.ob.fake_skin.test5,'View',1,['Manager'])
 



More information about the checkins mailing list