[ZODB-Dev] RFC: compatibility of ZEO clients and servers running different Python versions

Jim Fulton jim at zope.com
Tue Apr 20 11:47:58 EDT 2010


Starting with Python 2.5, Python exception classes became new-style
types, which led to changes in the way Exception pickles were
constructed.  This primarily affects the ZEO protocol. Changes were
made in ZODB 3.8 and later to accomidate this change.

I realized recently that, while the changes made to ZODB cause ZEO to
work with newer Python versions when clients and servers run the same
version, there's still a problem when clients and servers run
different Python versions.  A Python 2.4 client doesn't work properly
with Python 2.5 or 2.6 servers. Also, if a server is running on Python
2.5 or 2.6, it won't work with clients older that ZODB 3.8, regardless
of which Python version they use.

Fortunately, clients running Python 2.5 or 2.6 will work with servers
running 2.4, so there is a way to upgrade clients and servers without
taking them all down at once.

I've been pretty proud of the fact that modern ZEO servers work with
ZEO clients as old as ZODB 3.2.  (We've had clients that old in
production here at ZC until very recently.)  I'm a bit disappointed
that will lose compatibility with older clients.

Yesterday, I worked out an alternate exception pickling strategy that
would support ZEO clients as old as 3.3:

  http://svn.zope.org/?rev=111149&view=rev

It does this at the cost of making pickling a little more brittle
because different exception classes would have slightly different
__reduce__ methods.

Because of the complexity of the solution, I'm, sadly, inclined to
leave things as they are:

- Can't use Python 2.4 clients with Python 2.5 or 2.6 servers
- Can use Python 2.6 clients with 2.4 servers.
- Can't use Python 2.5 or 2.6 servers with clients running ZODB 3.7 or
  earlier.

I wonder what other people think.

Jim

-- 
Jim Fulton


More information about the ZODB-Dev mailing list