[Zope-Checkins] SVN: Zope/trunk/ merging ajung-fast-listen branch

Andreas Jung andreas at andreas-jung.com
Tue Aug 29 12:29:33 EDT 2006


Log message for revision 69861:
  merging ajung-fast-listen branch
  

Changed:
  U   Zope/trunk/doc/CHANGES.txt
  U   Zope/trunk/lib/python/ZServer/HTTPServer.py
  U   Zope/trunk/lib/python/ZServer/component.xml
  U   Zope/trunk/lib/python/ZServer/datatypes.py
  U   Zope/trunk/lib/python/Zope2/Startup/__init__.py
  U   Zope/trunk/skel/etc/zope.conf.in

-=-
Modified: Zope/trunk/doc/CHANGES.txt
===================================================================
--- Zope/trunk/doc/CHANGES.txt	2006-08-29 15:51:39 UTC (rev 69860)
+++ Zope/trunk/doc/CHANGES.txt	2006-08-29 16:29:33 UTC (rev 69861)
@@ -27,6 +27,11 @@
 
     Features added
 
+      - added 'fast_listen' directive to http-server and webdav-source-server
+        sections in etc/zope.conf in order to defer the opening of the sockets
+        until the late startup phase. This in in particular useful when running
+        Zope behind a loadbalancer (patch by Patrick Gerken).
+
     Bugs Fixed
 
       - Collector #2155: Fix wrong parameter being passed to

Modified: Zope/trunk/lib/python/ZServer/HTTPServer.py
===================================================================
--- Zope/trunk/lib/python/ZServer/HTTPServer.py	2006-08-29 15:51:39 UTC (rev 69860)
+++ Zope/trunk/lib/python/ZServer/HTTPServer.py	2006-08-29 16:29:33 UTC (rev 69861)
@@ -428,8 +428,10 @@
     channel_class = zhttp_channel
     shutup=0
 
-    def __init__ (self, ip, port, resolver=None, logger_object=None):
+    def __init__ (self, ip, port, resolver=None, logger_object=None,
+                  fast_listen=True):
         self.shutup=1
+        self.fast_listen = fast_listen
         http_server.__init__(self, ip, port, resolver, logger_object)
         self.shutup=0
         self.log_info('%s server started at %s\n'
@@ -460,8 +462,13 @@
 
     def listen(self, num):
         # override asyncore limits for nt's listen queue size
-        self.accepting = 1
-        return self.socket.listen (num)
 
+        if self.fast_listen:
+            self.accepting = 1
+            return self.socket.listen (num)
+        else:
+            return 0
+
+
 class zwebdav_server(zhttp_server):
     server_protocol = 'WebDAV'

Modified: Zope/trunk/lib/python/ZServer/component.xml
===================================================================
--- Zope/trunk/lib/python/ZServer/component.xml	2006-08-29 15:51:39 UTC (rev 69860)
+++ Zope/trunk/lib/python/ZServer/component.xml	2006-08-29 16:29:33 UTC (rev 69861)
@@ -19,6 +19,12 @@
          receive WebDAV source responses to GET requests.
        </description>
      </key>
+     <key name="fast_listen" datatype="boolean" default="on">
+       <description>
+         Defines wether the http server should listen to requests immediatelly
+         or only after zope is ready to run
+       </description>
+     </key>
      <key name="use-wsgi" datatype="boolean" default="off" />
   </sectiontype>
 

Modified: Zope/trunk/lib/python/ZServer/datatypes.py
===================================================================
--- Zope/trunk/lib/python/ZServer/datatypes.py	2006-08-29 15:51:39 UTC (rev 69860)
+++ Zope/trunk/lib/python/ZServer/datatypes.py	2006-08-29 16:29:33 UTC (rev 69861)
@@ -70,6 +70,7 @@
         self.force_connection_close = section.force_connection_close
         # webdav-source-server sections won't have webdav_source_clients:
         webdav_clients = getattr(section, "webdav_source_clients", None)
+        self.fast_listen = getattr(section, 'fast_listen')
         self.webdav_source_clients = webdav_clients
         self.use_wsgi = section.use_wsgi
 
@@ -81,6 +82,7 @@
             handler.set_webdav_source_clients(self.webdav_source_clients)
         server = self.server_class(ip=self.ip, port=self.port,
                                    resolver=self.dnsresolver,
+                                   fast_listen=self.fast_listen,
                                    logger_object=access_logger)
         server.install_handler(handler)
         return server

Modified: Zope/trunk/lib/python/Zope2/Startup/__init__.py
===================================================================
--- Zope/trunk/lib/python/Zope2/Startup/__init__.py	2006-08-29 15:51:39 UTC (rev 69860)
+++ Zope/trunk/lib/python/Zope2/Startup/__init__.py	2006-08-29 16:29:33 UTC (rev 69861)
@@ -100,6 +100,7 @@
         self.makePidFile()
         self.setupInterpreter()
         self.startZope()
+        self.serverListen()
         from App.config import getConfiguration
         config = getConfiguration()
         if not config.twisted_servers:
@@ -211,6 +212,18 @@
         ZServer.setNumberOfThreads(self.cfg.zserver_threads)
         ZServer.CONNECTION_LIMIT = self.cfg.max_listen_sockets
 
+
+    def serverListen(self):
+
+    	for server in self.cfg.servers:
+
+            if hasattr(server, 'fast_listen'):
+                # This one has the delayed listening feature
+                if not server.fast_listen:
+                    server.fast_listen = True
+                    server.listen(1024) # same value as defined in medusa.http_server.py  
+
+
     def setupServers(self):
         socket_err = (
             'There was a problem starting a server of type "%s". '

Modified: Zope/trunk/skel/etc/zope.conf.in
===================================================================
--- Zope/trunk/skel/etc/zope.conf.in	2006-08-29 15:51:39 UTC (rev 69860)
+++ Zope/trunk/skel/etc/zope.conf.in	2006-08-29 16:29:33 UTC (rev 69861)
@@ -903,9 +903,16 @@
 <http-server>
   # valid keys are "address" and "force-connection-close"
   address 8080
+
   # force-connection-close on
+  #
   # You can also use the WSGI interface between ZServer and ZPublisher:
   # use-wsgi on
+  #
+  # To defer the opening of the HTTP socket until the end of the 
+  # startup phase: 
+  # fast_listen false
+  #
 </http-server>
 
 # Examples:



More information about the Zope-Checkins mailing list