[Mailman-Developers] Database version updates drop nomail settings

Les Niles les@2pi.org
Sat, 9 Feb 2002 22:58:10 -0800


There's a small bug in 2.1alpha4 in updating a list's database to
the DATA_FILE_VERSION, causing "nomail" settings to not be
propagated forward:

MailList.CheckVersion() reloads the database, taking care to make
sure that the reload doesn't trigger a recursive call to
CheckVersion().  But if the list wasn't locked, CheckVersion() then
calls Lock(), and Lock() calls Load() again, this time generating a
recursive call to CheckVersion().  This recursion is only one deep
because now the list is locked, but even that is too much for
versions.CanonicalizeUserOptions() since it clears the old-style
"nomail" flag after setting the delivery status in the new
database.  

Here's a patch that fixes this.

  -les

---------------------------------------------------------------------

*** MailList.py.orig    Sun Jan  6 23:04:01 2002
--- MailList.py Sat Feb  9 22:42:36 2002
***************
*** 146,157 ****
      #
      # Lock management
      #
!     def Lock(self, timeout=0):
          self.__lock.lock(timeout)
          # Must reload our database for consistency.  Watch out for lists that
          # don't exist.
          try:
!             self.Load()
          except Exception:
              self.Unlock()
              raise
--- 146,157 ----
      #
      # Lock management
      #
!     def Lock(self, timeout=0, check_version=1):
          self.__lock.lock(timeout)
          # Must reload our database for consistency.  Watch out for lists that
          # don't exist.
          try:
!             self.Load(check_version)
          except Exception:
              self.Unlock()
              raise
***************
*** 557,563 ****
          # We must hold the list lock in order to update the schema
          waslocked = self.Locked()
          if not waslocked:
!             self.Lock()
          try:
              from versions import Update
              Update(self, stored_state)
--- 558,564 ----
          # We must hold the list lock in order to update the schema
          waslocked = self.Locked()
          if not waslocked:
!             self.Lock(check_version=0)
          try:
              from versions import Update
              Update(self, stored_state)