vendor/zasync/1.1

changeset 19:a9a4db6b257b z29-nux

Client zope2.9 ready
author janguenot
date Tue, 07 Feb 2006 15:30:35 +0000
parents 356b0497c8d5
children a6cd4a91d41e
files client/zasync/config.py client/zasync/schema.xml client/zasync/schema2.8.xml
diffstat 3 files changed, 417 insertions(+), 31 deletions(-) [+]
line diff
     1.1 --- a/client/zasync/config.py
     1.2 +++ b/client/zasync/config.py
     1.3 @@ -20,23 +20,29 @@
     1.4  
     1.5  specified_version = None
     1.6  
     1.7 +try:
     1.8 +    # Zope-2.9.x
     1.9 +    from Zope2.Startup.handlers import *
    1.10 +except ImportError:
    1.11 +    pass
    1.12 +    
    1.13  def root_handler(config):
    1.14      """Set up the environment and generally do almost everything;
    1.15      this was combined from datatypes and configs in Zope gradually as
    1.16      necessary elements emerged; it should probably be separated again
    1.17      at some point in the future."""
    1.18 -    
    1.19 +
    1.20      # This is in two parts: set up Zope, then set up zasync.  Unsurprisingly,
    1.21      # it takes a lot more to set up Zope.
    1.22 -    
    1.23 +
    1.24      # ...but first we'll set up logging
    1.25 -    import zLOG 
    1.26 +    import zLOG
    1.27      zLOG._call_initialize = 0
    1.28      config.eventlog()
    1.29      config.zasync()
    1.30      config.zasync_plugins.name="zasync.plugins"
    1.31      config.zasync_plugins()
    1.32 -    
    1.33 +
    1.34      ###############
    1.35      # Set up Zope #
    1.36      ###############
    1.37 @@ -45,9 +51,9 @@
    1.38      if config.environment:
    1.39          for k,v in config.environment.items():
    1.40              os.environ[k] = v
    1.41 -    
    1.42 +
    1.43      # set up Zope as minimally as possible while still getting it to work
    1.44 -    
    1.45 +
    1.46      # Add directories to the pythonpath; always insert instancehome/lib/python
    1.47      instancelib = os.path.join(config.instancehome, 'lib', 'python')
    1.48      if instancelib not in config.path:
    1.49 @@ -64,14 +70,14 @@
    1.50      instanceprod = os.path.join(config.instancehome, 'Products')
    1.51      if instanceprod not in config.products:
    1.52          config.products.append(instanceprod)
    1.53 -    
    1.54 +
    1.55      import Products
    1.56      L = []
    1.57      for d in config.products + Products.__path__:
    1.58          if d not in L:
    1.59              L.append(d)
    1.60      Products.__path__[:] = L
    1.61 -    
    1.62 +
    1.63      import App, App.config
    1.64      par = os.path.dirname
    1.65      config.softwarehome = par(par(os.path.abspath(App.__file__)))
    1.66 @@ -81,7 +87,7 @@
    1.67      if getattr(config, 'clienthome', None) is None:
    1.68          config.clienthome = os.path.join(config.instancehome, 'var')
    1.69      App.config.setConfiguration(config)
    1.70 -    
    1.71 +
    1.72      import AccessControl
    1.73      AccessControl.setImplementation(
    1.74          config.security_policy_implementation)
    1.75 @@ -94,10 +100,10 @@
    1.76          AccessControl.setDefaultBehaviors(
    1.77              not config.skip_ownership_checking,
    1.78              not config.skip_authentication_checking)
    1.79 -    
    1.80 +
    1.81      import OFS.Application
    1.82      OFS.Application.import_products()
    1.83 -    
    1.84 +
    1.85      try: # Zope 2.8
    1.86          from App import ZApplication
    1.87      except ImportError: # 2.7
    1.88 @@ -113,7 +119,7 @@
    1.89          from Zope import ClassFactory
    1.90  
    1.91      Globals.DatabaseVersion='3'
    1.92 -    
    1.93 +
    1.94      DB = config.dbtab.getDatabase('/', is_root=1)
    1.95      try: # Zope 2.7
    1.96          DB.setClassFactory(ClassFactory.ClassFactory)
    1.97 @@ -136,16 +142,16 @@
    1.98  
    1.99      # "Log off" as system user
   1.100      noSecurityManager()
   1.101 -    
   1.102 +
   1.103      #################
   1.104      # Set up zasync #
   1.105      #################
   1.106 -    
   1.107 +
   1.108      from zasync import client
   1.109 -    
   1.110 +
   1.111      client.DB = DB
   1.112      client.app = app
   1.113 -    
   1.114 +
   1.115      path = client.tool_path = tuple(filter(None, config.target.split('/')))
   1.116      config.target_path = path
   1.117      try:
   1.118 @@ -153,9 +159,9 @@
   1.119      except (AttributeError, LookupError):
   1.120          raise ZConfig.ConfigurationError(
   1.121              "target could not be found: %s" % config.target)
   1.122 -    
   1.123 +
   1.124      application._p_jar.close()
   1.125 -    
   1.126 +
   1.127      # configure retry behavior
   1.128      client.max_conflict_resolution_attempts = (
   1.129          max(config.max_conflict_resolution_attempts, 0))
   1.130 @@ -164,14 +170,14 @@
   1.131      client.retry_exponential_backoff = (
   1.132          max(config.retry_exponential_backoff, 1))
   1.133      client.max_total_retry = max(config.max_total_retry, 0)
   1.134 -    
   1.135 +
   1.136      # configure traceback verbosity
   1.137      client.verbose_traceback = config.verbose_traceback
   1.138 -    
   1.139 -    # load in plugins.  We don't want to calculate the callables until 
   1.140 +
   1.141 +    # load in plugins.  We don't want to calculate the callables until
   1.142      # this root handler because the python environment is not set up until here.
   1.143      for plugin in config.plugins:
   1.144 -        # based off of 
   1.145 +        # based off of
   1.146          # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/223972
   1.147          fullFuncName = plugin['handler']
   1.148          lastDot = fullFuncName.rfind(u".")
   1.149 @@ -229,9 +235,11 @@
   1.150                  raise ConfigurationError(dup_err % (mount_points[point],
   1.151                                                      name, point))
   1.152              mount_points[point] = name
   1.153 -    from DBTab.DBTab import DBTab
   1.154 +
   1.155 +    from Zope2.Startup.datatypes import DBTab
   1.156 +#    from DBTab.DBTab import DBTab
   1.157      section.dbtab = DBTab(mount_factories, mount_points)
   1.158 -    
   1.159 +
   1.160      s = sets.Set()
   1.161      for plugin in section.plugins:
   1.162          name = plugin['name']
   1.163 @@ -239,13 +247,13 @@
   1.164              raise ConfigurationError(
   1.165                  'plugin name duplicated: %s' % name)
   1.166              s.add(name)
   1.167 -    
   1.168 +
   1.169      return section
   1.170  
   1.171  _ident_re = "[_a-zA-Z][_a-zA-Z0-9]*"
   1.172  class DottedNameFunctionConversion(
   1.173      ZConfig.datatypes.RegularExpressionConversion):
   1.174 -    
   1.175 +
   1.176      def __init__(self):
   1.177          ZConfig.datatypes.RegularExpressionConversion.__init__(
   1.178              self, r"%s(?:\.%s)+" % (_ident_re, _ident_re))
   1.179 @@ -288,12 +296,15 @@
   1.180      # I don't think we can sniff the Zope version safely yet.  If I were not in
   1.181      # a rush, I might try, but an explicit version argument will do the trick.
   1.182      global specified_version
   1.183 -    if version < 2.7 or version >= 2.9:
   1.184 -        raise RuntimeError('zasync only supports Zope 2.7.x and Zope 2.8.x')
   1.185 +    if version < 2.7 or version > 2.9:
   1.186 +        raise RuntimeError('zasync only supports Zope 2.7.x, 2.8.x and 2.9.x')
   1.187 +
   1.188      mydir = os.path.dirname(__file__)
   1.189      specified_version = version
   1.190      if version < 2.8:
   1.191          schema = 'schema27.xml'
   1.192 +    elif version == 2.8:
   1.193 +        schema = 'schema28.xml'
   1.194      else:
   1.195          schema = 'schema.xml'
   1.196      try:
   1.197 @@ -305,5 +316,11 @@
   1.198          raise
   1.199      if conffile is None: conffile = sys.argv[1]
   1.200      conf, handler = ZConfig.loadConfig(schema, conffile)
   1.201 -    handler({'root_handler':root_handler})
   1.202 +    handlers = {'root_handler':root_handler}
   1.203 +    if version == 2.9:
   1.204 +        handlers['rest_output_encoding'] =  rest_output_encoding
   1.205 +        handlers['rest_input_encoding'] = rest_input_encoding
   1.206 +        handlers['rest_header_level'] = rest_header_level
   1.207 +        handlers['rest_language_code'] = rest_language_code
   1.208 +    handler(handlers)
   1.209      return conf
     2.1 --- a/client/zasync/schema.xml
     2.2 +++ b/client/zasync/schema.xml
     2.3 @@ -12,6 +12,9 @@
     2.4    <!-- end for Zope 2.8 -->
     2.5    <import package="ZODB"/>
     2.6    <import package="tempstorage" />
     2.7 +  
     2.8 +  <!-- for Zope 2.9 -->
     2.9 +  
    2.10  
    2.11    <sectiontype name="plugin" datatype="zasync.config.plugin">
    2.12      <description>
    2.13 @@ -103,7 +106,9 @@
    2.14                datatype=".mount_point">
    2.15        <description>
    2.16         The mount point is the slash-separated path to which this database
    2.17 -       will be mounted within the Zope application server.
    2.18 +       will be mounted within the Zope application server. If the path
    2.19 +       on the ZEO server is different from the path of the mount point then
    2.20 +       you can use a notation "path_on_client:path_on_zeo_server".
    2.21        </description>
    2.22      </multikey>
    2.23  
    2.24 @@ -116,7 +121,7 @@
    2.25      </key>
    2.26  
    2.27     <key name="class-factory" datatype=".importable_name"
    2.28 -        default="DBTab.ClassFactories.autoClassFactory">
    2.29 +        default="Zope2.Startup.datatypes.zopeClassFactory">
    2.30        <description>
    2.31         Change the class factory function a database uses on a
    2.32         per-database basis to support different class factory policy.
    2.33 @@ -134,6 +139,7 @@
    2.34  
    2.35    </sectiontype>
    2.36  
    2.37 +
    2.38    <!-- end sectiontype defs, begin section and key defs -->
    2.39  
    2.40    <section type="environment" attribute="environment" name="*">
    2.41 @@ -246,6 +252,45 @@
    2.42       <metadefault>off</metadefault>
    2.43    </key>
    2.44  
    2.45 +  <!-- For Zope-2.9 -->
    2.46 +
    2.47 +  <key name="rest-output-encoding" handler="rest_output_encoding">
    2.48 +    <description>
    2.49 +    Specifies the output encoding of re-StructuredText documents
    2.50 +    (e.g. 'utf-8', 'iso-8859' or any other valid encoding recognized
    2.51 +    by Python).  The default is your Python's default encoding.
    2.52 +    </description>
    2.53 +    <metadefault>unset</metadefault>
    2.54 +  </key>
    2.55 +  <key name="rest-input-encoding" handler="rest_input_encoding">
    2.56 +    <description>
    2.57 +      Specifies the input encoding of re-StructuredText documents
    2.58 +      (e.g. 'utf-8', 'iso-8859' or any other valid encoding recognized
    2.59 +      by Python).  The default is your Python's default encoding.
    2.60 +    </description>
    2.61 +    <metadefault>unset</metadefault>
    2.62 +  </key>
    2.63 +   <key name="rest-header-level" datatype="integer" default="3"
    2.64 +       handler="rest_header_level">
    2.65 +    <description>
    2.66 +     Set the default starting HTML header level for restructured text
    2.67 +     documents. The default is 3, which implies that top-level headers
    2.68 +     will be created with an H3 HTML tag.
    2.69 +    </description>
    2.70 +    <metadefault>3</metadefault>
    2.71 +  </key>
    2.72 +  <key name="rest-language-code" handler="rest_language_code" default="en">
    2.73 +    <description>
    2.74 +     Language code used for some internal translations inside of the docutils
    2.75 +     package and for DTD bibliographic elements mapping. See
    2.76 +     lib/python/docutils/languages/ for a list of supported language codes.
    2.77 +    </description>
    2.78 +    <metadefault>en</metadefault>
    2.79 +  </key>
    2.80 +
    2.81 +  <!-- End for Zope-2.9 -->
    2.82 +
    2.83 +
    2.84    <multisection type="ZODB.Database" name="+" attribute="databases">
    2.85      <description>
    2.86         Zope ZODB databases must have a name, and they are required to be
     3.1 new file mode 100644
     3.2 --- /dev/null
     3.3 +++ b/client/zasync/schema2.8.xml
     3.4 @@ -0,0 +1,324 @@
     3.5 +<schema handler="root_handler" prefix="Zope2.Startup.datatypes" 
     3.6 +        datatype="zasync.config.root_section">
     3.7 +  <description>
     3.8 +    ZAsync configuration schema.
     3.9 +    
    3.10 +    This schema describes the configuration options available to a site 
    3.11 +    administrator via the zasync.conf configuration file.
    3.12 +  </description>
    3.13 +  <!-- for Zope 2.8 -->
    3.14 +  <import package="ZConfig.components.logger" file="handlers.xml"/>
    3.15 +  <import package="ZConfig.components.logger" file="eventlog.xml"/>
    3.16 +  <!-- end for Zope 2.8 -->
    3.17 +  <import package="ZODB"/>
    3.18 +  <import package="tempstorage" />
    3.19 +
    3.20 +  <sectiontype name="plugin" datatype="zasync.config.plugin">
    3.21 +    <description>
    3.22 +    Register zasync plugins.
    3.23 +    </description>
    3.24 +    
    3.25 +    <key name="handler" required="yes" 
    3.26 +         datatype="zasync.config.DottedNameFunctionConversion">
    3.27 +      <description>
    3.28 +      The handler for the plugin.  The arguments to this callable
    3.29 +      are the signature that Zope calls should match.  If a description
    3.30 +      is not provided as a key to this configuration, the handler's
    3.31 +      docstring will be used, if any, as the description.
    3.32 +      </description>
    3.33 +    </key>
    3.34 +    
    3.35 +    <key name="timeout" datatype="time-interval">
    3.36 +      <description>
    3.37 +      The maximum timeout that this plugin allows/
    3.38 +      </description>
    3.39 +    </key>
    3.40 +    
    3.41 +    <key name="description" datatype="string">
    3.42 +      <description>
    3.43 +      The description of this plugin.  If not provided, handler's docstring
    3.44 +      is used, if any.
    3.45 +      </description>
    3.46 +    </key>
    3.47 +  
    3.48 +    <key name="retry" datatype="boolean" default="yes">
    3.49 +      <description>
    3.50 +      Whether the async call should be retried if zasync restarts while the
    3.51 +      call is accepted (in process).
    3.52 +      </description>
    3.53 +    </key>
    3.54 +  
    3.55 +    <key name="zope-aware" datatype="boolean" default="no">
    3.56 +      <description>
    3.57 +      Whether the async call needs to know about the path to the tool and the 
    3.58 +      zope deferred identifier.  If it does, any arguments from manager calls
    3.59 +      are prepended with a tuple (a single argument) of 
    3.60 +      (tool path, zope deferred id).
    3.61 +      </description>
    3.62 +    </key>
    3.63 +  </sectiontype>
    3.64 +
    3.65 +  <!-- for Zope 2.8 -->
    3.66 +  <sectiontype name="logger" datatype="zasync.config.LoggerFactory">
    3.67 +    <description>
    3.68 +      This "logger" type only applies to access and request ("trace")
    3.69 +      logging; event logging is handled by the "logging" package in
    3.70 +      the Python standard library.  The loghandler type used here is
    3.71 +      provided by the "ZConfig.components.logger" package.
    3.72 +    </description>
    3.73 +    <key name="level"
    3.74 +         datatype="ZConfig.components.logger.datatypes.logging_level"
    3.75 +         default="info"/>
    3.76 +    <key name="propagate" datatype="boolean" default="no"/>
    3.77 +    <multisection name="*"
    3.78 +                  type="ZConfig.logger.handler"
    3.79 +                  attribute="handlers"/>
    3.80 +  </sectiontype>
    3.81 +  <!-- end for Zope 2.8 -->
    3.82 +
    3.83 +  <sectiontype name="environment"
    3.84 +               datatype=".cgi_environment"
    3.85 +               keytype="identifier">
    3.86 +    <description>
    3.87 +     A section which allows you to define simple key-value pairs which
    3.88 +     will be used as environment variable settings during startup.  
    3.89 +    </description>
    3.90 +    <key name="+" attribute="environ">
    3.91 +      <description>
    3.92 +        Use any key/value pair, e.g. 'MY_PRODUCT_ENVVAR foo_bar'
    3.93 +      </description>
    3.94 +    </key>
    3.95 +  </sectiontype>
    3.96 +
    3.97 +  <sectiontype name="zodb_db" datatype=".ZopeDatabase"
    3.98 +               implements="ZODB.database" extends="zodb">
    3.99 +
   3.100 +    <description>
   3.101 +      We need to specialize the database configuration section for Zope
   3.102 +      only by including a (required) mount-point argument, which
   3.103 +      is a string.  A Zope ZODB database can have multiple mount points,
   3.104 +      so this is a multikey.
   3.105 +    </description>
   3.106 +    <multikey name="mount-point" required="yes" attribute="mount_points"
   3.107 +              datatype=".mount_point">
   3.108 +      <description>
   3.109 +       The mount point is the slash-separated path to which this database
   3.110 +       will be mounted within the Zope application server.
   3.111 +      </description>
   3.112 +    </multikey>
   3.113 +
   3.114 +    <key name="connection-class" datatype=".importable_name">
   3.115 +      <description>
   3.116 +       Change the connection class a database uses on a per-database basis to
   3.117 +       support different connection policies.  Use a Python dotted-path
   3.118 +       name to specify the connection class.
   3.119 +      </description>
   3.120 +    </key>
   3.121 +
   3.122 +   <key name="class-factory" datatype=".importable_name"
   3.123 +        default="DBTab.ClassFactories.autoClassFactory">
   3.124 +      <description>
   3.125 +       Change the class factory function a database uses on a
   3.126 +       per-database basis to support different class factory policy.
   3.127 +       Use a Python dotted-path name to specify the class factory function.
   3.128 +      </description>
   3.129 +    </key>
   3.130 +
   3.131 +    <key name="container-class" datatype=".python_dotted_path">
   3.132 +      <description>
   3.133 +       Change the contiainer class a (mounted) database uses on a
   3.134 +       per-database basis to support a different container than a plain
   3.135 +       Folder. Use a Python dotted-path name to specify the container class.
   3.136 +      </description>
   3.137 +    </key>
   3.138 +
   3.139 +  </sectiontype>
   3.140 +
   3.141 +  <!-- end sectiontype defs, begin section and key defs -->
   3.142 +
   3.143 +  <section type="environment" attribute="environment" name="*">
   3.144 +    <description>
   3.145 +     A section which allows a user to define arbitrary key-value pairs for
   3.146 +     use as environment variables during Zope's run cycle.  It
   3.147 +     is not recommended to set system-related environment variables such as
   3.148 +     PYTHONPATH within this section.
   3.149 +    </description>
   3.150 +  </section>
   3.151 +
   3.152 +  <key name="instancehome" datatype="existing-directory" required="yes">
   3.153 +    <description>
   3.154 +    The path to the data files, local product files, import directory,
   3.155 +    and Extensions directory used by Zope.
   3.156 +    </description>
   3.157 +  </key>
   3.158 +
   3.159 +  <key name="clienthome" datatype="existing-directory">
   3.160 +    <description>
   3.161 +      The directory used to store the default filestorage file used to
   3.162 +      back the ZODB database, as well as other files used by the
   3.163 +      Zope applications server during runtime.
   3.164 +    </description>
   3.165 +    <metadefault>$instancehome/var</metadefault>
   3.166 +  </key>
   3.167 +  
   3.168 +  <multikey name="products" datatype="existing-directory">
   3.169 +    <description>
   3.170 +    Name of a directory that contains additional Product packages.  This
   3.171 +    directive may be used as many times as needed to add additional
   3.172 +    collections of products.  Each directory identified will be
   3.173 +    added to the __path__ of the Products package.  All Products are
   3.174 +    initialized in ascending alphabetical order by product name.  If
   3.175 +    two products with the same name exist in two Products directories,
   3.176 +    the order in which the packages appear here defines the load
   3.177 +    order.  The master Products directory exists in Zope's software home,
   3.178 +    and cannot be removed from the products path (and should not be added
   3.179 +    to it here).
   3.180 +    </description>
   3.181 +  </multikey>
   3.182 +  
   3.183 +  <multikey name="path" datatype="existing-directory">
   3.184 +    <description>
   3.185 +    Name of a directory which should be inserted into the
   3.186 +    the beginning of Python's module search path.  This directive
   3.187 +    may be specified as many times as needed to insert additional
   3.188 +    directories.  The set of directories specified is inserted into the
   3.189 +    beginning of the module search path in the order which they are specified
   3.190 +    here.  Note that the processing of this directive may happen too late
   3.191 +    under some circumstances; it is recommended that you use the PYTHONPATH
   3.192 +    environment variable if using this directive doesn't work for you.
   3.193 +    </description>
   3.194 +  </multikey>
   3.195 +
   3.196 +  <key name="security-policy-implementation"
   3.197 +       datatype=".security_policy_implementation"
   3.198 +       default="C">
   3.199 +     <description>
   3.200 +     The default Zope "security policy" implementation is written in C.
   3.201 +     Set this key to "PYTHON" to use the Python implementation
   3.202 +     (useful for debugging purposes); set it to "C" to use the C
   3.203 +     implementation.
   3.204 +     </description>
   3.205 +     <metadefault>C</metadefault>
   3.206 +  </key>
   3.207 +
   3.208 +  <key name="skip-authentication-checking" datatype="boolean"
   3.209 +       default="off">
   3.210 +     <description>
   3.211 +     Set this directive to 'on' to cause Zope to prevent Zope from
   3.212 +     attempting to authenticate users during normal operation.
   3.213 +     Potentially dangerous from a security perspective.  Only works if
   3.214 +     security-policy-implementation is set to 'C'.
   3.215 +     </description>
   3.216 +     <metadefault>off</metadefault>
   3.217 +  </key>
   3.218 +
   3.219 +  <key name="skip-ownership-checking" datatype="boolean"
   3.220 +       default="off">
   3.221 +     <description>
   3.222 +     Set this directive to 'on' to cause Zope to ignore ownership checking
   3.223 +     when attempting to execute "through the web" code. By default, this
   3.224 +     directive is off in order to prevent 'trojan horse' security problems
   3.225 +     whereby a user with less privilege can cause a user with more
   3.226 +     privilege to execute code which the less privileged user has written.
   3.227 +     </description>
   3.228 +     <metadefault>off</metadefault>
   3.229 +  </key>
   3.230 +
   3.231 +  <!-- for 2.8 -->
   3.232 +  <key name="verbose-security" datatype="boolean"
   3.233 +       default="off">
   3.234 +     <description>
   3.235 +     Set this directive to 'on' to enable verbose security exceptions.
   3.236 +     This can help you track down the reason for Unauthorized exceptions,
   3.237 +     but it is not suitable for public sites because it may reveal
   3.238 +     unnecessary information about the structure of your site.  Only
   3.239 +     works if security-policy-implementation is set to 'PYTHON'.
   3.240 +     </description>
   3.241 +     <metadefault>off</metadefault>
   3.242 +  </key>
   3.243 +  <!-- end for 2.8 -->
   3.244 +
   3.245 +  <key name="verbose-traceback" datatype="boolean" default="off">
   3.246 +     <description>
   3.247 +     Set this directive to 'on' to cause zasync to produce very verbose
   3.248 +     tracebacks, including the locals and globals for every frame.
   3.249 +     </description>
   3.250 +     <metadefault>off</metadefault>
   3.251 +  </key>
   3.252 +
   3.253 +  <multisection type="ZODB.Database" name="+" attribute="databases">
   3.254 +    <description>
   3.255 +       Zope ZODB databases must have a name, and they are required to be
   3.256 +       referenced via the "zodb_db" database type because it is
   3.257 +       the only kind of database definition that implements
   3.258 +       the required mount-point argument.  There is another
   3.259 +       database sectiontype named "zodb", but it cannot be used
   3.260 +       in the context of a proper Zope configuration (due to
   3.261 +       lack of a mount-point).
   3.262 +    </description>
   3.263 +  </multisection>
   3.264 +
   3.265 +  <key name="target" datatype="string" default="/asynchronous_call_manager">
   3.266 +    <description>
   3.267 +    identify the path to the object that implements the asynchronous call 
   3.268 +    manager interface
   3.269 +    </description>
   3.270 +  </key>
   3.271 +  
   3.272 +  <key name="max-conflict-resolution-attempts" datatype="integer" default="5">
   3.273 +    <description>
   3.274 +    The number of times a transaction with a ConflictError should be retried
   3.275 +    </description>
   3.276 +  </key>
   3.277 +  
   3.278 +  <key name="initial-retry-delay" datatype="time-interval" default="5">
   3.279 +    <description>
   3.280 +    The initial delay in seconds between attempts to resolve an error in 
   3.281 +    finding the ZEO server or the target
   3.282 +    </description>
   3.283 +  </key>
   3.284 +  
   3.285 +  <key name="retry-exponential-backoff" datatype="float" default="1.1">
   3.286 +    <description>
   3.287 +    An exponential backoff of the retry delay.  Set to 1 for no exponential
   3.288 +    increase.  Values less than one are not allowed.
   3.289 +    </description>
   3.290 +  </key>
   3.291 +  
   3.292 +  <key name="max-total-retry" datatype="time-interval" default="1h">
   3.293 +    <description>
   3.294 +    The maximum total retry time since a failure in reaching the ZEO server
   3.295 +    or the target before zasync gives a up.  A value of 0 indicates that 
   3.296 +    zasync should never give up.  Value is in seconds.
   3.297 +    </description>
   3.298 +  </key>
   3.299 +  
   3.300 +  <multisection type="plugin" name="*" attribute="plugins">
   3.301 +    <description>
   3.302 +    Register zasync plugins.
   3.303 +    </description>
   3.304 +  </multisection>
   3.305 +
   3.306 +  <section type="eventlog" name="*" attribute="eventlog">
   3.307 +    <description>
   3.308 +      Describes the logging performed by Zope in the course of zasync
   3.309 +      calls.
   3.310 +    </description>
   3.311 +  </section>
   3.312 +
   3.313 +  <section type="logger" name="zasync">
   3.314 +     <description>
   3.315 +      Describes the logging performed to capture the zasync log messages
   3.316 +    </description>
   3.317 +  </section>
   3.318 +
   3.319 +  <section type="logger" name="plugins" attribute="zasync_plugins">
   3.320 +     <description>
   3.321 +      Describes the logging performed to capture the zasync plugins log,
   3.322 +      which collects log messages from the plugins, if they are log to the
   3.323 +      'plugin' log.  If messages are propagated, they are propagated
   3.324 +      to the zasync log.
   3.325 +    </description>
   3.326 +  </section>
   3.327 +
   3.328 +</schema>