[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