[PATCH 3/3] UIDMaps: correctly protect from concurrent writes

Nicolas Sebrecht nicolas.s-dev at laposte.net
Tue Jul 5 23:09:49 UTC 2016


On Tue, Jul 05, 2016 at 11:38:14PM +0200, Łukasz Żarnowiecki wrote:
> > --- a/offlineimap/folder/UIDMaps.py
> > +++ b/offlineimap/folder/UIDMaps.py
> > @@ -78,10 +78,19 @@ class MappedIMAPFolder(IMAPFolder):
> >  
> >      def _savemaps(self):
> >          mapfilename = self._getmapfilename()
> > -        with open(mapfilename + ".tmp", 'wt') as mapfilefd:
> > -            for (key, value) in self.diskl2r.items():
> > -                mapfilefd.write("%d:%d\n"% (key, value))
> > -        os.rename(mapfilename + '.tmp', mapfilename)
> > +        mapfilenamelock = "%s.lock"% mapfilename
> > +        with open(mapfilenamelock, 'w') as mapfilelock:
> > +            # The "account" lock already prevents from multiple access by
> > +            # different processes. However, we still need to protect for
> > +            # multiple access from different threads.
> > +            try:
> > +                fnctl.lockf(mapfilelock, fnctl.LOCK_EX) # Blocks until acquired.
> > +            except NameError:
> > +                pass # Windows...
> > +            with open(mapfilename, 'wt') as mapfilefd:
> > +                for (key, value) in self.diskl2r.items():
> 
> Not necessary parenthesis.

Yep. Thanks for your reviews!

-- 
Nicolas Sebrecht



More information about the OfflineIMAP-project mailing list