[ZODB-Dev] potential fix for ZEO bug

Jeremy Hylton jeremy@zope.com
Wed, 06 Mar 2002 02:00:22 -0500 (EST)


Chris,

Here's a patch that may fix the problem you reported.  Let me know if
it helps.  It's too late to check it in tonight.

Jeremy

Index: StorageServer.py
===================================================================
RCS file: /cvs-repository/StandaloneZODB/ZEO/StorageServer.py,v
retrieving revision 1.28.2.6
diff -c -c -r1.28.2.6 StorageServer.py
*** StorageServer.py	31 Oct 2001 19:53:22 -0000	1.28.2.6
--- StorageServer.py	6 Mar 2002 06:59:07 -0000
***************
*** 572,595 ****
          return 1
  
      def tpc_finish(self, id, user, description, ext):
!         t=self._transaction
!         if id != t.id: return
  
!         storage=self.__storage
!         r=storage.tpc_finish(t)
          
!         try: waiting=storage.__waiting
!         except: waiting=storage.__waiting=[]
          while waiting:
              f, args = waiting.pop(0)
!             if apply(f,args): break
  
!         self._transaction=None
          if self.__invalidated:
              self.__server.invalidate(self, self.__storage_id,
                                       self.__invalidated,
                                       self.get_size_info())
!             self.__invalidated=[]
  
  def init_storage(storage):
      if not hasattr(storage,'tpc_vote'): storage.tpc_vote=lambda *args: None
--- 572,609 ----
          return 1
  
      def tpc_finish(self, id, user, description, ext):
!         t = self._transaction
!         if id != t.id:
!             return
  
!         storage = self.__storage
!         r = storage.tpc_finish(t)
          
!         try:
!             waiting = storage.__waiting
!         except AttributeError:
!             waiting = []
          while waiting:
              f, args = waiting.pop(0)
!             try:
!                 if apply(f, args):
!                     break
!             except Disconnected:
!                 # A disconnected error isn't an unexpected error.
!                 # There should be no need to log it, because the
!                 # disconnect will have generated its own log event.
!                 pass
!             except:
!                 LOG('ZEO Server', ERROR,
!                     "Unexpected error handling queued tpc_begin()",
!                     error=sys.exc_info())
  
!         self._transaction = None
          if self.__invalidated:
              self.__server.invalidate(self, self.__storage_id,
                                       self.__invalidated,
                                       self.get_size_info())
!             self.__invalidated = []
  
  def init_storage(storage):
      if not hasattr(storage,'tpc_vote'): storage.tpc_vote=lambda *args: None