[Zope-Checkins] CVS: ZODB3/ZEO - zeoctl.xml:1.1.16.1 zeoctl.py:1.1.16.1 zeopasswd.py:1.4.2.1 version.txt:1.10.2.1 start.py:1.60.32.1 simul.py:1.17.36.1 schema.xml:1.11.30.1 runzeo.py:1.16.12.1 monitor.py:1.4.2.1 mkzeoinst.py:1.18.24.1 __init__.py:1.20.2.1 StorageServer.py:1.101.2.5 DebugServer.py:1.2.2.1 ClientStorage.py:1.110.2.11

Jeremy Hylton jeremy at zope.com
Tue Dec 23 14:06:59 EST 2003


Update of /cvs-repository/ZODB3/ZEO
In directory cvs.zope.org:/tmp/cvs-serv26665/ZEO

Modified Files:
      Tag: ZODB3-mvcc-2-branch
	zeopasswd.py version.txt start.py simul.py schema.xml 
	runzeo.py monitor.py mkzeoinst.py __init__.py StorageServer.py 
	DebugServer.py ClientStorage.py 
Added Files:
      Tag: ZODB3-mvcc-2-branch
	zeoctl.xml zeoctl.py 
Log Message:
Merge the head to the mvcc branch.

This merge should be the final preparation for merging the branch to
the trunk.


=== Added File ZODB3/ZEO/zeoctl.xml ===
<schema>

  <description>
    This schema describes the configuration of the ZEO storage server
    controller.  It differs from the schema for the storage server
    only in that the "runner" section is required.
  </description>

  <!-- Use the storage types defined by ZODB. -->
  <import package="ZODB"/>

  <!-- Use the ZEO server information structure. -->
  <import package="ZEO"/>

  <import package="zLOG"/>

  <!-- runner control -->
  <import package="zdaemon"/>


  <section type="zeo" name="*" required="yes" attribute="zeo" />

  <section type="runner" name="*" required="yes" attribute="runner" />

  <multisection name="+" type="ZODB.storage"
                attribute="storages"
                required="yes" />

  <section name="*" type="eventlog" attribute="eventlog" required="no" />

</schema>


=== Added File ZODB3/ZEO/zeoctl.py ===
"""Wrapper script for zdctl.py that causes it to use the ZEO schema."""

import os

import ZEO
import zLOG
import zdaemon.zdctl


# Main program
def main(args=None):
    options = zdaemon.zdctl.ZDCtlOptions()
    options.schemadir = os.path.dirname(ZEO.__file__)
    options.schemafile = "zeoctl.xml"
    zdaemon.zdctl.main(args, options)


if __name__ == "__main__":
    main()


=== ZODB3/ZEO/zeopasswd.py 1.4 => 1.4.2.1 ===
--- ZODB3/ZEO/zeopasswd.py:1.4	Thu Oct  2 14:17:22 2003
+++ ZODB3/ZEO/zeopasswd.py	Tue Dec 23 14:05:57 2003
@@ -16,73 +16,107 @@
 
 usage: python zeopasswd.py [options] username [password]
 
--C/--configuration URL -- configuration file or URL
--d/--delete -- delete user instead of updating password
+Specify either a configuration file:
+
+    -C/--configuration -- ZConfig configuration file
+
+or the individual options:
+
+    -f/--filename -- authentication database filename
+    -p/--protocol -- authentication protocol name
+    -r/--realm -- authentication database realm
+
+Additional options:
+
+    -d/--delete -- delete user instead of updating password
 """
 
 import getopt
 import getpass
 import sys
+import os
 
 import ZConfig
 import ZEO
 
 def usage(msg):
-    print msg
     print __doc__
+    print msg
     sys.exit(2)
 
 def options(args):
     """Password-specific options loaded from regular ZEO config file."""
-
-    schema = ZConfig.loadSchema(os.path.join(os.path.dirname(ZEO.__file__),
-                                             "schema.xml"))
-
     try:
-        options, args = getopt.getopt(args, "C:", ["configure="])
+        opts, args = getopt.getopt(args, "dr:p:f:C:", ["configure=", 
+                                                          "protocol=", 
+                                                          "filename=",
+                                                          "realm"])
     except getopt.error, msg:
         usage(msg)
     config = None
-    delete = False
-    for k, v in options:
+    delete = 0
+    auth_protocol = None
+    auth_db = "" 
+    auth_realm = None
+    for k, v in opts:
         if k == '-C' or k == '--configure':
+            schemafile = os.path.join(os.path.dirname(ZEO.__file__),
+                                                     "schema.xml")
+            schema = ZConfig.loadSchema(schemafile)
             config, nil = ZConfig.loadConfig(schema, v)
         if k == '-d' or k == '--delete':
-            delete = True
-    if config is None:
-        usage("Must specifiy configuration file")
+            delete = 1
+        if k == '-p' or k == '--protocol':
+            auth_protocol = v
+        if k == '-f' or k == '--filename':
+            auth_db = v
+        if k == '-r' or k == '--realm':
+            auth_realm = v
+
+    if config is not None:
+        if auth_protocol or auth_db:
+            usage("Error: Conflicting options; use either -C *or* -p and -f")
+        auth_protocol = config.zeo.authentication_protocol
+        auth_db = config.zeo.authentication_database
+        auth_realm = config.zeo.authentication_realm
+    elif not (auth_protocol and auth_db):
+        usage("Error: Must specifiy configuration file or protocol and database")
 
     password = None
     if delete:
         if not args:
-            usage("Must specify username to delete")
+            usage("Error: Must specify a username to delete")
         elif len(args) > 1:
-            usage("Too many arguments")
+            usage("Error: Too many arguments")
         username = args[0]
     else:
         if not args:
-            usage("Must specify username")
+            usage("Error: Must specify a username")
         elif len(args) > 2:
-            usage("Too many arguments")
+            usage("Error: Too many arguments")
         elif len(args) == 1:
             username = args[0]
         else:
             username, password = args
 
-    return config.zeo, delete, username, password
+    return auth_protocol, auth_db, auth_realm, delete, username, password
 
-def main(args=None):
-    options, delete, username, password = options(args)
-    p = options.authentication_protocol
+def main(args=None, dbclass=None):
+    p, auth_db, auth_realm, delete, username, password = options(args)
     if p is None:
-        usage("ZEO configuration does not specify authentication-protocol")
+        usage("Error: configuration does not specify auth protocol")
     if p == "digest":
         from ZEO.auth.auth_digest import DigestDatabase as Database
     elif p == "srp":
         from ZEO.auth.auth_srp import SRPDatabase as Database
-    if options.authentication_database is None:
-        usage("ZEO configuration does not specify authentication-database")
-    db = Database(options.authentication_database)
+    elif dbclass:
+        # dbclass is used for testing tests.auth_plaintext, see testAuth.py
+        Database = dbclass
+    else:
+        raise ValueError, "Unknown database type %r" % p
+    if auth_db is None:
+        usage("Error: configuration does not specify auth database")
+    db = Database(auth_db, auth_realm)
     if delete:
         db.del_user(username)
     else:
@@ -92,4 +126,5 @@
     db.save()
 
 if __name__ == "__main__":
-    main(sys.argv)
+    main(sys.argv[1:])
+


=== ZODB3/ZEO/version.txt 1.10 => 1.10.2.1 ===
--- ZODB3/ZEO/version.txt:1.10	Thu Oct  2 14:17:22 2003
+++ ZODB3/ZEO/version.txt	Tue Dec 23 14:05:57 2003
@@ -1 +1 @@
-2.2c1
+2.3a0


=== ZODB3/ZEO/start.py 1.60 => 1.60.32.1 ===
--- ZODB3/ZEO/start.py:1.60	Mon Jan 20 13:05:50 2003
+++ ZODB3/ZEO/start.py	Tue Dec 23 14:05:57 2003
@@ -13,8 +13,6 @@
 ##############################################################################
 """Start the ZEO storage server."""
 
-from __future__ import nested_scopes
-
 import sys, os, getopt
 import types
 import errno


=== ZODB3/ZEO/simul.py 1.17 => 1.17.36.1 ===
--- ZODB3/ZEO/simul.py:1.17	Fri Jan  3 17:07:38 2003
+++ ZODB3/ZEO/simul.py	Tue Dec 23 14:05:57 2003
@@ -108,21 +108,21 @@
     struct_unpack = struct.unpack
     while 1:
         # Read a record and decode it
-        r = f_read(8)
-        if len(r) < 8:
+        r = f_read(10)
+        if len(r) < 10:
             break
-        offset += 8
-        ts, code = struct_unpack(">ii", r)
+        offset += 10
+        ts, code, lenoid = struct_unpack(">iiH", r)
         if ts == 0:
             # Must be a misaligned record caused by a crash
             ##print "Skipping 8 bytes at offset", offset-8
             continue
-        r = f_read(16)
-        if len(r) < 16:
+        r = f_read(8 + lenoid)
+        if len(r) < 8 + lenoid:
             break
-        offset += 16
+        offset += 8 + lenoid
         records += 1
-        oid, serial = struct_unpack(">8s8s", r)
+        serial, oid = struct_unpack(">8s%ds" % lenoid, r)
         # Decode the code
         dlen, version, code, current = (code & 0x7fffff00,
                                         code & 0x80,


=== ZODB3/ZEO/schema.xml 1.11 => 1.11.30.1 ===
--- ZODB3/ZEO/schema.xml:1.11	Wed Mar 26 14:40:15 2003
+++ ZODB3/ZEO/schema.xml	Tue Dec 23 14:05:57 2003
@@ -1,5 +1,8 @@
 <schema>
 
+  <!-- note that zeoctl.xml is a closely related schema which should
+       match this schema, but should require the "runner" section -->
+
   <description>
     This schema describes the configuration of the ZEO storage server
     process.
@@ -13,8 +16,13 @@
 
   <import package="zLOG"/>
 
+  <!-- runner control -->
+  <import package="zdaemon"/>
+
 
   <section type="zeo" name="*" required="yes" attribute="zeo" />
+
+  <section type="runner" name="*" required="no" attribute="runner" />
 
   <multisection name="+" type="ZODB.storage"
                 attribute="storages"


=== ZODB3/ZEO/runzeo.py 1.16 => 1.16.12.1 ===
--- ZODB3/ZEO/runzeo.py:1.16	Mon Jul 14 23:35:18 2003
+++ ZODB3/ZEO/runzeo.py	Tue Dec 23 14:05:57 2003
@@ -21,7 +21,7 @@
 -a/--address ADDRESS -- server address of the form PORT, HOST:PORT, or PATH
                         (a PATH must contain at least one "/")
 -f/--filename FILENAME -- filename for FileStorage
--t/--timeout TIMEOUT -- transaction timeout in secondes (default no timeout)
+-t/--timeout TIMEOUT -- transaction timeout in seconds (default no timeout)
 -h/--help -- print this usage message and exit
 -m/--monitor ADDRESS -- address of monitor server ([HOST:]PORT or PATH)
 
@@ -99,9 +99,9 @@
 class ZEOOptions(ZDOptions, ZEOOptionsMixin):
 
     logsectionname = "eventlog"
+    schemadir = os.path.dirname(ZEO.__file__)
 
     def __init__(self):
-        self.schemadir = os.path.dirname(ZEO.__file__)
         ZDOptions.__init__(self)
         self.add_zeo_options()
         self.add("storages", "storages",
@@ -196,7 +196,7 @@
             transaction_timeout=self.options.transaction_timeout,
             monitor_address=self.options.monitor_address,
             auth_protocol=self.options.auth_protocol,
-            auth_filename=self.options.auth_database,  # XXX option spelling
+            auth_database=self.options.auth_database,  # XXX option spelling
             auth_realm=self.options.auth_realm)
 
     def loop_forever(self):
@@ -286,9 +286,14 @@
     """Log a debugging message."""
     _log(msg, zLOG.DEBUG)
 
+# XXX It would be nice if a program that extended this one (like
+# runzrs) could change the label.
+
+_label = "RUNZEO:%d" % os.getpid()
+
 def _log(msg, severity=zLOG.INFO, error=None):
     """Internal: generic logging function."""
-    zLOG.LOG("RUNSVR", severity, msg, "", error)
+    zLOG.LOG(_label, severity, msg, "", error)
 
 
 # Main program


=== ZODB3/ZEO/monitor.py 1.4 => 1.4.2.1 ===


=== ZODB3/ZEO/mkzeoinst.py 1.18 => 1.18.24.1 ===
--- ZODB3/ZEO/mkzeoinst.py:1.18	Fri Apr  4 00:16:50 2003
+++ ZODB3/ZEO/mkzeoinst.py	Tue Dec 23 14:05:57 2003
@@ -20,11 +20,10 @@
 options (all of which have default values), create the following:
 
 <home>/etc/zeo.conf     -- ZEO config file
-<home>/etc/zeoctl.conf  -- zdctl+zdrun config file
 <home>/var/             -- Directory for data files: Data.fs etc.
 <home>/log/             -- Directory for log files: zeo.log and zeoctl.log
 <home>/bin/runzeo       -- the zeo server runner
-<home>/bin/zeoctl       -- start/stop script (a shim for zdctl.py)
+<home>/bin/zeoctl       -- start/stop script (a shim for zeoctl.py)
 
 The script will not overwrite existing files; instead, it will issue a
 warning if an existing file is found that differs from the file that
@@ -39,9 +38,10 @@
 import stat
 import getopt
 
-zeo_conf_template = """# ZEO configuration file
+zeo_conf_template = """\
+# ZEO configuration file
 
-%%define INSTANCE_HOME %(instance_home)s
+%%define INSTANCE %(instance_home)s
 
 <zeo>
   address %(port)d
@@ -52,52 +52,42 @@
 </zeo>
 
 <filestorage 1>
-  path $INSTANCE_HOME/var/Data.fs
+  path $INSTANCE/var/Data.fs
 </filestorage>
 
 <eventlog>
   level info
   <logfile>
-    path $INSTANCE_HOME/log/zeo.log
+    path $INSTANCE/log/zeo.log
   </logfile>
 </eventlog>
-"""
-
-runner_conf_template = """# %(package)sctl configuration file
-
-%%define INSTANCE_HOME %(instance_home)s
 
 <runner>
-  program $INSTANCE_HOME/bin/runzeo
-  socket-name $INSTANCE_HOME/etc/%(package)s.zdsock
+  program $INSTANCE/bin/runzeo
+  socket-name $INSTANCE/etc/%(package)s.zdsock
   daemon true
   forever false
   backoff-limit 10
   exit-codes 0, 2
-  directory $INSTANCE_HOME
+  directory $INSTANCE
   default-to-interactive true
   # user zope
   python %(python)s
   zdrun %(zope_home)s/zdaemon/zdrun.py
+
   # This logfile should match the one in the %(package)s.conf file.
   # It is used by zdctl's logtail command, zdrun/zdctl doesn't write it.
-  logfile $INSTANCE_HOME/log/%(package)s.log
+  logfile $INSTANCE/log/%(package)s.log
 </runner>
-
-<eventlog>
-  level info
-  <logfile>
-    path $INSTANCE_HOME/log/%(package)sctl.log
-  </logfile>
-</eventlog>
 """
 
-zdctl_template = """#!/bin/sh
-# %(PACKAGE)s instance start script
+zeoctl_template = """\
+#!/bin/sh
+# %(PACKAGE)s instance control script
 
 # The following two lines are for chkconfig.  On Red Hat Linux (and
 # some other systems), you can copy or symlink this script into
-# /etc/rc.d/init.d/ and then run chkconfig(8), to automatically start
+# /etc/rc.d/init.d/ and then use chkconfig(8) to automatically start
 # %(PACKAGE)s at boot time.
 
 # chkconfig: 345 90 10
@@ -105,33 +95,32 @@
 
 PYTHON="%(python)s"
 ZOPE_HOME="%(zope_home)s"
-INSTANCE_HOME="%(instance_home)s"
 
-CONFIG_FILE="$INSTANCE_HOME/etc/%(package)sctl.conf"
+CONFIG_FILE="%(instance_home)s/etc/%(package)s.conf"
 
 PYTHONPATH="$ZOPE_HOME"
 export PYTHONPATH
 
-ZDCTL="$ZOPE_HOME/zdaemon/zdctl.py"
+ZEOCTL="$ZOPE_HOME/ZEO/zeoctl.py"
 
-exec "$PYTHON" "$ZDCTL" -C "$CONFIG_FILE" ${1+"$@"}
+exec "$PYTHON" "$ZEOCTL" -C "$CONFIG_FILE" ${1+"$@"}
 """
 
-runzeo_template = """#!/bin/sh
+runzeo_template = """\
+#!/bin/sh
 # %(PACKAGE)s instance start script
 
 PYTHON="%(python)s"
 ZOPE_HOME="%(zope_home)s"
-INSTANCE_HOME="%(instance_home)s"
 
-CONFIG_FILE="$INSTANCE_HOME/etc/%(package)s.conf"
+CONFIG_FILE="%(instance_home)s/etc/%(package)s.conf"
 
 PYTHONPATH="$ZOPE_HOME"
 export PYTHONPATH
 
-ZEO_RUN="$ZOPE_HOME/ZEO/runzeo.py"
+RUNZEO="$ZOPE_HOME/ZEO/runzeo.py"
 
-exec "$PYTHON" "$ZEO_RUN" -C "$CONFIG_FILE" ${1+"$@"}
+exec "$PYTHON" "$RUNZEO" -C "$CONFIG_FILE" ${1+"$@"}
 """
 
 def main():
@@ -193,8 +182,7 @@
         makedir(home, "log")
         makedir(home, "bin")
         makefile(zeo_conf_template, home, "etc", "zeo.conf", **params)
-        makefile(runner_conf_template, home, "etc", "zeoctl.conf", **params)
-        makexfile(zdctl_template, home, "bin", "zeoctl", **params)
+        makexfile(zeoctl_template, home, "bin", "zeoctl", **params)
         makexfile(runzeo_template, home, "bin", "runzeo", **params)
 
 


=== ZODB3/ZEO/__init__.py 1.20 => 1.20.2.1 ===
--- ZODB3/ZEO/__init__.py:1.20	Thu Oct  2 14:17:22 2003
+++ ZODB3/ZEO/__init__.py	Tue Dec 23 14:05:57 2003
@@ -21,4 +21,4 @@
 
 """
 
-version = "2.2c1"
+version = "2.3a0"


=== ZODB3/ZEO/StorageServer.py 1.101.2.4 => 1.101.2.5 ===
--- ZODB3/ZEO/StorageServer.py:1.101.2.4	Tue Dec  2 02:10:29 2003
+++ ZODB3/ZEO/StorageServer.py	Tue Dec 23 14:05:57 2003
@@ -20,8 +20,6 @@
 exported for invocation by the server.
 """
 
-from __future__ import nested_scopes
-
 import asyncore
 import cPickle
 import os
@@ -425,7 +423,7 @@
             self.locked = 0
             self.timeout.end(self)
             self.stats.lock_time = None
-            self.log("Transaction released storage lock")
+            self.log("Transaction released storage lock", zLOG.BLATHER)
             # _handle_waiting() can start another transaction (by
             # restarting a waiting one) so must be done last
             self._handle_waiting()


=== ZODB3/ZEO/DebugServer.py 1.2 => 1.2.2.1 ===
--- ZODB3/ZEO/DebugServer.py:1.2	Thu Oct  2 14:17:22 2003
+++ ZODB3/ZEO/DebugServer.py	Tue Dec 23 14:05:57 2003
@@ -13,8 +13,6 @@
 ##############################################################################
 """A debugging version of the server that records network activity."""
 
-from __future__ import nested_scopes
-
 import struct
 import time
 


=== ZODB3/ZEO/ClientStorage.py 1.110.2.10 => 1.110.2.11 ===
--- ZODB3/ZEO/ClientStorage.py:1.110.2.10	Sun Dec 14 13:56:55 2003
+++ ZODB3/ZEO/ClientStorage.py	Tue Dec 23 14:05:57 2003
@@ -35,7 +35,7 @@
 from ZEO.zrpc.client import ConnectionManager
 
 from ZODB import POSException
-from ZODB.TimeStamp import TimeStamp
+from persistent.TimeStamp import TimeStamp
 from zLOG import LOG, PROBLEM, INFO, BLATHER, ERROR
 
 def log2(type, msg, subsys="ZCS:%d" % os.getpid()):
@@ -326,6 +326,9 @@
     def _wait(self, timeout=None):
         if timeout is not None:
             deadline = time.time() + timeout
+            log2(BLATHER, "Setting deadline to %f" % deadline)
+        else:
+            deadline = None
         # Wait for a connection to be established.
         self._rpc_mgr.connect(sync=1)
         # When a synchronous connect() call returns, there is
@@ -343,19 +346,22 @@
                     break
                 log2(INFO, "Waiting for cache verification to finish")
         else:
-            self._wait_sync()
+            self._wait_sync(deadline)
 
-    def _wait_sync(self):
+    def _wait_sync(self, deadline=None):
         # If there is no mainloop running, this code needs
         # to call poll() to cause asyncore to handle events.
         while 1:
             if self._ready.isSet():
                 break
+            if deadline and time.time() > deadline:
+                log2(PROBLEM, "Timed out waiting for connection")
+                break
             log2(INFO, "Waiting for cache verification to finish")
             if self._connection is None:
                 # If the connection was closed while we were
                 # waiting for it to become ready, start over.
-                return self._wait()
+                return self._wait(deadline - time.time())
             else:
                 self._connection.pending(30)
 




More information about the Zope-Checkins mailing list