Opened 14 years ago
Closed 14 years ago
#177 closed defect (fixed)
writing an incident flogfile tries to use characters not valid in a Windows filename (':')
Reported by: | davidsarah | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | 0.6.2 |
Component: | logging | Version: | 0.6.1 |
Keywords: | win32 error incident logging regression | Cc: |
Description
Ticket 1396 in Tahoe-LAFS is actually a foolscap bug:
While reporting the incident in #1395 on a Windows platform, the following error occurred:
[Failure instance: Traceback: <type 'exceptions.IOError'>: [Errno 22] invalid mode ('wb') or filename: u'C:\\tahoeclient\\logs\\incidents\\incident-2011-05-05--18:33:34Z-w2qn32q.flog'The problem (or at least one problem) is that '
:
' is not valid in a Windows filename. This MSDN article documents the Windows filename validity rules.Presumably we don't have any test of writing an incident flogfile. This may mean that incident reporting has always been broken on Windows (unless the flogfile naming changed?)
...
The problem is... apparently due to the time format here in
foolscap/logging/incident.py
:TIME_FORMAT = "%Y-%m-%d--%H:%M:%S"which is used indirectly by
incident_declared
to create the filename.
Change History (11)
comment:1 Changed 14 years ago by
comment:2 Changed 14 years ago by
I *think* there are tests of writing incident flogfiles (they'd be in source:foolscap/test/test_logging.py if so), I'll research it more later tonight. However we don't have a windows buildbot, so maybe these tests fail on windows and we've just never noticed.
Could somebody run make test
on windows and see what happens?
comment:3 follow-up: 4 Changed 14 years ago by
Yeah, "make test TEST=foolscap.test.test_logging.Incidents.test_basic
" will write an incident file under _trial_temp/logging/Incidents/basic/
, and it has colons in the filename.
comment:4 Changed 14 years ago by
Replying to warner:
Yeah, "
make test TEST=foolscap.test.test_logging.Incidents.test_basic
" will write an incident file under_trial_temp/logging/Incidents/basic/
, and it has colons in the filename.
Yep, that test fails under Windows:
$ c:/python27/python setup.py trial -s foolscap.test.test_logging.Incidents.test_basic [...] foolscap: 0.6.1 (c:\cygwin\home\david-sarah\tahoe\trunk\support\lib\site-packages\foolscap-0.6.1-py2.7.egg), [...] foolscap.test.test_logging Incidents test_basic ... [Failure instance: Traceback: <type 'exceptions.IOError'>: [Errno 22] invalid mod e ('wb') or filename: 'C:\\cygwin\\home\\David-Sarah\\tahoe\\trunk\\_trial_temp\\logging\\Incidents\ \basic\\incident-2011-05-07--22:51:14Z-jchlapq.flog' C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\twisted-10.2.0-py2.7-win32.egg\twis ted\internet\defer.py:133:maybeDeferred C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\twisted-10.2.0-py2.7-win32.egg\twis ted\internet\utils.py:191:runWithWarningsSuppressed C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\foolscap\t est\test_logging.py:241:test_basic C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\foolscap\l ogging\log.py:210:msg --- <exception caught here> --- C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\foolscap\l ogging\log.py:265:add_event C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\foolscap\l ogging\incident.py:35:event C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\foolscap\l ogging\log.py:278:declare_incident C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\foolscap\l ogging\incident.py:85:incident_declared ] [FAIL] =============================================================================== [FAIL] Traceback (most recent call last): File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\fo olscap\test\test_logging.py", line 243, in test_basic self.failUnless(l.get_active_incident_reporter()) twisted.trial.unittest.FailTest: None foolscap.test.test_logging.Incidents.test_basic ------------------------------------------------------------------------------- Ran 1 tests in 0.240s FAILED (failures=1)
comment:5 Changed 14 years ago by
I changed %H:%M:%S
to %H%M%S
at foolscap/logging/incident.py#59 and foolscap/logging/gatherer.py#L144. That fixed the test failures on Windows (XP SP3 under VirtualBox), apart from the following which look unrelated:
=============================================================================== [SKIPPED] new-style classes still broken foolscap.test.test_banana.ThereAndBackAgain.test_boundMethod_newstyle foolscap.test.test_banana.ThereAndBackAgain.test_classMethod_newstyle foolscap.test.test_banana.ThereAndBackAgain.test_class_newstyle foolscap.test.test_banana.ThereAndBackAgain.test_instance_newstyle =============================================================================== [FAIL] Traceback (most recent call last): File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\fo olscap\test\test_negotiate.py", line 586, in <lambda> d.addCallbacks(lambda res: self.fail("hey! this is supposed to fail"), twisted.trial.unittest.FailTest: hey! this is supposed to fail foolscap.test.test_negotiate.Crossfire.test1 foolscap.test.test_negotiate.CrossfireReverse.test1 =============================================================================== [ERROR] Traceback (most recent call last): File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\twisted-10.2.0-py2.7-win32. egg\twisted\trial\runner.py", line 575, in loadPackage module = modinfo.load() File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\twisted-10.2.0-py2.7-win32. egg\twisted\python\modules.py", line 383, in load return self.pathEntry.pythonPath.moduleLoader(self.name) File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\twisted-10.2.0-py2.7-win32. egg\twisted\python\reflect.py", line 464, in namedAny topLevelPackage = _importAndCheckStack(trialname) File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\fo olscap\test\test_appserver.py", line 9, in <module> from foolscap.appserver import cli, server, client File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\fo olscap\appserver\client.py", line 63, in <module> from twisted.internet.stdio import StandardIO File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\twisted-10.2.0-py2.7-win32. egg\twisted\internet\stdio.py", line 28, in <module> from twisted.internet._win32stdio import StandardIO File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\twisted-10.2.0-py2.7-win32. egg\twisted\internet\_win32stdio.py", line 7, in <module> import win32api exceptions.ImportError: No module named win32api foolscap.test.test_appserver =============================================================================== [ERROR] Traceback (most recent call last): File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\fo olscap\test\test_logging.py", line 1876, in _check self.compare_events(events, self._read_logfile(fn2)) File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\fo olscap\test\test_logging.py", line 219, in _read_logfile events.append(pickle.load(f)) File "C:\python27\lib\pickle.py", line 1378, in load return Unpickler(file).load() File "C:\python27\lib\pickle.py", line 858, in load dispatch[key](self) exceptions.KeyError: '\n' foolscap.test.test_logging.Filter.test_basic =============================================================================== [ERROR] Traceback (most recent call last): File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\fo olscap\test\test_logging.py", line 1305, in <lambda> d.addCallback(lambda res: gatherer.do_rotate()) File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\foolscap-0.6.1-py2.7.egg\fo olscap\logging\gatherer.py", line 204, in do_rotate d = utils.getProcessOutput(self.bzip, [new_name], env=os.environ) File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\twisted-10.2.0-py2.7-win32. egg\twisted\internet\utils.py", line 124, in getProcessOutput reactor) File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\twisted-10.2.0-py2.7-win32. egg\twisted\internet\utils.py", line 25, in _callProtocolWithDeferred reactor.spawnProcess(p, executable, (executable,)+tuple(args), env, path) File "C:\cygwin\home\David-Sarah\tahoe\trunk\support\Lib\site-packages\twisted-10.2.0-py2.7-win32. egg\twisted\internet\posixbase.py", line 335, in spawnProcess raise NotImplementedError, "spawnProcess not available since pywin32 is not installed." exceptions.NotImplementedError: spawnProcess not available since pywin32 is not installed. foolscap.test.test_logging.Gatherer.test_log_gatherer ------------------------------------------------------------------------------- Ran 452 tests in 127.593s FAILED (skips=4, failures=2, errors=3, successes=443)
comment:6 Changed 14 years ago by
I'm willing to change the incident filenames when we see we're running under windows, but I want to retain the readability benefit of the colons on other platforms. Foolscap itself doesn't ever try to parse those filenames: they're strictly for the benefit of humans who are looking at a directory full of Incident files and trying to decide which are worth examining.
I'll look into the other failures. Opening files in text mode probably explains some of them, but not all.
comment:7 Changed 14 years ago by
Patched in [3fd4331] (change filenames on windows, but not elsewhere).
comment:8 follow-up: 9 Changed 14 years ago by
Having the filenames differ depending on platform could lead to support problems for me. For example, someone doing support might ask a user to look for a file by a certain name, and the user might check (perhaps by "ls $NAME" so they don't even see that there is another file) and report that there is no file by that name. This is just one example--there might be other ways that this causes trouble. For example, scripts would have to be specifically written to search for both patterns or else they would appear to work on the author's platform but then silently fail when run by a user on a different platform.
Also, there is no unit test of this "if on windows" branch in the code, right? So if in the future someone writes a patch to foolscap which fails when the filename is of the other format there will be no unit test failure to let them know that their patch has a problem.
Why not eliminate the if statement and make the format be without colons on all platforms? That's uglier, but I would rather suffer that than have to maintain a divergence of behavior based on platform (especially an untested behavior).
comment:9 Changed 14 years ago by
Replying to zooko:
Having the filenames differ depending on platform could lead to support problems for me. [...] Why not eliminate the if statement and make the format be without colons on all platforms? That's uglier, but I would rather suffer that than have to maintain a divergence of behavior based on platform (especially an untested behavior).
+1. I'd really rather minimize platform-dependent behaviour, and the minor loss of readability (these filenames are not very readable anyway) from losing the ':'s on Unix does not seem like a big deal to me.
comment:11 Changed 14 years ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
Ok, ok, I'll compromise readability and use hyphens on all platforms. Fixed in [d4e12cc].
Non-windows users everywhere will curse window's limitations each time they glance at a flogfile or incident report filename and spend precious seconds trying to figure out which one might have occurred during the time of interest. To help them curse windows more productively, I've added "why I hate windows filenames" to an accumulation of frustration in the WhyIHateX wiki page.
The bug was probably introduced in changeset 77d2c68, 9 months ago (released in foolscap 0.6.0). See also 111#comment:6.