[Zope-Checkins] SVN: Zope/branches/2.9/ - Collector #1939: When running as a service, Zope could

Sidnei da Silva sidnei at enfoldsystems.com
Wed Dec 21 07:29:35 EST 2005


Log message for revision 40951:
  
        - Collector #1939: When running as a service, Zope could
          potentially collect too much log output filling the NT Event
          Log. When that happened, a 'print' during exception handling
          would cause an IOError in the restart code causing the service
          not to restart automatically.
  
          Problem is that a service/pythonw.exe process *always* has an
          invalid sys.stdout.  But due to the magic of buffering, small
          print statements would not fail - but once the file actually
          got written to, the error happened.  Never a problem when
          debugging, as the process has a console, and hence a valid
          stdout.
  

Changed:
  U   Zope/branches/2.9/doc/CHANGES.txt
  U   Zope/branches/2.9/lib/python/nt_svcutils/service.py

-=-
Modified: Zope/branches/2.9/doc/CHANGES.txt
===================================================================
--- Zope/branches/2.9/doc/CHANGES.txt	2005-12-21 12:15:36 UTC (rev 40950)
+++ Zope/branches/2.9/doc/CHANGES.txt	2005-12-21 12:29:35 UTC (rev 40951)
@@ -23,10 +23,23 @@
    - Collector #1233: port ZOPE_CONFIG patch from Zope 2.7 to Zope 2.8
 
 
-  after Zope 2.9.0 beta 1 
+  after Zope 2.9.0 beta 1
 
     Bugs fixed
 
+      - Collector #1939: When running as a service, Zope could
+        potentially collect too much log output filling the NT Event
+        Log. When that happened, a 'print' during exception handling
+        would cause an IOError in the restart code causing the service
+        not to restart automatically.
+
+        Problem is that a service/pythonw.exe process *always* has an
+        invalid sys.stdout.  But due to the magic of buffering, small
+        "print" statements would not fail - but once the file actually
+        got written to, the error happened.  Never a problem when
+        debugging, as the process has a console, and hence a valid
+        stdout.
+
      - For content-type HTTP headers starting with 'text/' or 'application/'
        the 'charset' field is automatically if not specified by the
        application. The 'charset' is determined by the content-type header

Modified: Zope/branches/2.9/lib/python/nt_svcutils/service.py
===================================================================
--- Zope/branches/2.9/lib/python/nt_svcutils/service.py	2005-12-21 12:15:36 UTC (rev 40950)
+++ Zope/branches/2.9/lib/python/nt_svcutils/service.py	2005-12-21 12:29:35 UTC (rev 40951)
@@ -36,8 +36,10 @@
 # (except obviously via the event log entry)
 # Size of the blocks we read from the child process's output.
 CHILDCAPTURE_BLOCK_SIZE = 80
-# The number of BLOCKSIZE blocks we keep as process output.
-CHILDCAPTURE_MAX_BLOCKS = 200
+# The number of BLOCKSIZE blocks we keep as process output.  This gives
+# is 4k, which should be enough to see any tracebacks etc, but not so
+# large as to prematurely fill the event log.
+CHILDCAPTURE_MAX_BLOCKS = 50
 
 class Service(win32serviceutil.ServiceFramework):
     """Base class for a Windows Server to manage an external process.
@@ -108,7 +110,10 @@
         except win32api.error, details:
             # Failed to write a log entry - most likely problem is
             # that the event log is full.  We don't want this to kill us
-            print "FAILED to write INFO event", event, ":", details
+            try:
+                print "FAILED to write INFO event", event, ":", details
+            except IOError:
+                pass
 
     def _dolog(self, func, msg):
         try:
@@ -118,8 +123,13 @@
         except win32api.error, details:
             # Failed to write a log entry - most likely problem is
             # that the event log is full.  We don't want this to kill us
-            print "FAILED to write event log entry:", details
-            print msg
+            try:
+                print "FAILED to write event log entry:", details
+                print msg
+            except IOError:
+                # And if running as a service, its likely our sys.stdout
+                # is invalid
+                pass
 
     def info(self, s):
         self._dolog(servicemanager.LogInfoMsg, s)



More information about the Zope-Checkins mailing list