[Mailman-Developers] Re: Two problems upgrading from 2.1.4 to 2.1.5

Greg Ward gward at python.net
Sun Nov 21 20:10:00 CET 2004


[moving thread to mailman-developers, since I think I found a bug
-- and sorry for the huge quote, but I think the change of audience
requires it]

On 21 November 2004, I said:
> I'm trying to upgrade from Mailman 2.1.4 to 2.1.5 on a Debian "testing"
> system, using "apt-get install mailman".  The upgrade seems to be
> falling down in two places at various times.  First variation:
> 
> """
> # apt-get install mailman
> Reading Package Lists... Done
> Building Dependency Tree... Done
> mailman is already the newest version.
> 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
> 1 not fully installed or removed.
> Need to get 0B of archives.
> After unpacking 0B of additional disk space will be used.
> Setting up mailman (2.1.5-3) ...
> Looking for enabled languages (this may take some time) ... done.
> Installing site language de ................................ done.
> Installing site language en ............................................ done.
> Upgrading from version 0x20103f0 to 0x20105f0
> getting rid of old source files
> Updating mailing list: mailman
> Updating the held requests database.
> - updating old private mbox file
>     Your installation seems up-to-date, great!
> - updating old public mbox file
> Fixing language templates: mailman
> 
> Updating mailing list: crew
> Resetting 2 BYBOUNCEs disabled addrs with no bounce info
> Traceback (most recent call last):
>   File "/usr/lib/mailman/bin/update", line 753, in ?
>     errors = main()
>   File "/usr/lib/mailman/bin/update", line 643, in main
>     errors = errors + dolist(listname)
>   File "/usr/lib/mailman/bin/update", line 218, in dolist
>     mlist.setDeliveryStatus(addr, ENABLED)
>   File "/var/lib/mailman/Mailman/OldStyleMemberships.py", line 338, in setDeliveryStatus
>     self.__assertIsMember(member)
>   File "/var/lib/mailman/Mailman/OldStyleMemberships.py", line 113, in __assertIsMember
>     raise Errors.NotAMemberError, member
> Mailman.Errors.NotAMemberError: timehorse,timehorse at unforgettable.com
> dpkg: error processing mailman (--configure):
>  subprocess post-installation script returned error exit status 1
> Errors were encountered while processing:
>  mailman
> E: Sub-process /usr/bin/dpkg returned an error code (1)
> """
> 
> When I saw this, I shrugged, figured I'd look in more detail later, and
> just tried again.  This time it's getting bogged down in the middle of
> updating the pending.pck file:
> 
> """
> # apt-get install mailman
> Reading Package Lists... Done
> Building Dependency Tree... Done
> mailman is already the newest version.
> 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
> 1 not fully installed or removed.
> Need to get 0B of archives.
> After unpacking 0B of additional disk space will be used.
> Setting up mailman (2.1.5-3) ...
> Looking for enabled languages (this may take some time) ... done.
> Installing site language de ................................ done.
> Installing site language en ............................................ done.
> Upgrading from version 0x20103f0 to 0x20105f0
> getting rid of old source files
> Updating mailing list: mailman
> [...]
> Updating Usenet watermarks
> - nothing to update here
> Updating Mailman 2.1.4 pending.pck database
> """
> 
> The [...] went by quite quickly.  After printing the last line, 'update'
> just sits there.  Interrupting it gives a useful traceback:
> 
> Traceback (most recent call last):
>   File "/usr/lib/mailman/bin/update", line 753, in ?
>     errors = main()
>   File "/usr/lib/mailman/bin/update", line 677, in main
>     update_pending()
>   File "/usr/lib/mailman/bin/update", line 572, in update_pending
>     mlist = MailList.MailList(listname)
>   File "/var/lib/mailman/Mailman/MailList.py", line 126, in __init__
>     self.Lock()
>   File "/var/lib/mailman/Mailman/MailList.py", line 159, in Lock
>     self.__lock.lock(timeout)
>   File "/var/lib/mailman/Mailman/LockFile.py", line 312, in lock
>     self.__sleep()
>   File "/var/lib/mailman/Mailman/LockFile.py", line 496, in __sleep
>     time.sleep(interval)
> KeyboardInterrupt
> 
> Hmmmm... so it looks like it's trying to get the lock on a list.  Not
> sure which one, but here's a clue:

OK, it looks like this is what happened:

  * the first failure (NotAMemberError) crashed update, and it
    did not clean up its locks

  * so when I ran update again, it hung trying to lock the list that
    it crashed on the last time through

Looking at the loop of setDeliveryStatus() calls in dolist() (see around
lines 215-220 in bin/update), it's pretty obvious how an exception from
setDeliveryStatus() can cause havoc.  One naive fix is to catch
MemberError from setDeliveryStatus():

--- update      2004-11-01 11:22:53.000000000 +0100
+++ update.hacked       2004-11-21 20:08:21.000000000 +0100
@@ -51,6 +51,7 @@
 from Mailman import MailList
 from Mailman import Message
 from Mailman import Pending
+from Mailman import Errors
 from Mailman.LockFile import TimeOutError
 from Mailman.i18n import _
 from Mailman.Queue.Switchboard import Switchboard
@@ -215,7 +216,11 @@
             print _(
                 'Resetting %(n)s BYBOUNCEs disabled addrs with no bounce info')
             for addr in noinfo.keys():
-                mlist.setDeliveryStatus(addr, ENABLED)
+               try:
+                   mlist.setDeliveryStatus(addr, ENABLED)
+               except Errors.MemberError, err:
+                   print "ERROR setting delivery status"
+                   print repr(err)

     # Update the held requests database
     print _("""Updating the held requests database.""")

(patch relative to bin/update from a Debian mailman_2.1.5-3
installation).  But I presume it would be cleaner to wrap a try/finally
around most of dolist().

Anyways, with this patch in place, I am able to run update successfully
-- ie. no hanging getting a lock.

        Greg
-- 
Greg Ward <gward at python.net>                         http://www.gerg.ca/
Jesus Saves -- but Moses gets the rebound, he shoots, he SCORES!


More information about the Mailman-Developers mailing list