[PATCH] repair: use context manager for lock management

Yuya Nishihara yuya at tcha.org
Mon Mar 27 08:53:03 EDT 2017


On Sun, 26 Mar 2017 15:28:02 -0400, Matt Harbison wrote:
> On Sun, 26 Mar 2017 13:34:10 -0400, Gregory Szorc  
> <gregory.szorc at gmail.com> wrote:
> > On Sun, Mar 26, 2017 at 4:20 AM, Yuya Nishihara <yuya at tcha.org> wrote:
> >> On Fri, 24 Mar 2017 23:34:28 -0400, Matt Harbison wrote:
> >> > # HG changeset patch
> >> > # User Matt Harbison <matt_harbison at yahoo.com>
> >> > # Date 1490327243 14400
> >> > #      Thu Mar 23 23:47:23 2017 -0400
> >> > # Node ID c053dc8a24afad24872397e5cd3f57411fc7d172
> >> > # Parent  d0c2db2d9f13dca534c598de050eb1919ef79059
> >> > repair: use context manager for lock management
> >>
> >> Sure. Queued this, thanks.
> >>
> >> > I found several other instances of acquiring the lock inside of the
> >> 'try', but
> >> > those finally blocks handle None references.  I also started switching
> >> some
> >> > trivial try/finally blocks to context managers, but didn't get them  
> >> all
> >> because
> >> > indenting over 3x for lock, wlock and transaction would have spilled
> >> over 80
> >> > characters.  That got me wondering if there should be a repo.rwlock(),
> >> to handle
> >> > locking and unlocking in the proper order.

Just nitpicking. The name "rwlock" would be misleading since both locks are
for writing.

> >> We have lockmod.release() helper. We also have util.ctxmanager(), but  
> >> IMHO
> >> it
> >> doesn't improve code readability that much.
> >>
> >> > It also looks like py27 supports supports multiple context managers  
> >> for
> >> a single
> >> > 'with' statement.  Should I hold off on the rest until py26 is  
> >> dropped?
> >>
> >
> > I think there is room for a helper context manager (like repo.rwlock())
> > that obtains multiple locks and/or a transaction. This would cut down on  
> > a
> > lot of excessive indentation while simultaneously ensuring we're doing  
> > the
> > correct thing with regards to locking and transaction semantics.
> 
> The excessive indentation is why I raised the issue.  I went looking for  
> how to use util.ctxmanager, and can't find a single usage instance in the  
> entire history.  I went back to the ML, and it seems like mpm ruled out  
> using it [1].  The referenced context manager series he mentioned taking  
> 80% of seems to be something else [2].

IIRC, that's because the scope of lock, wlock, txn, etc. is sometimes
different.

> I'm not sure if we want to revisit that decision, and even if so, I'm not  
> sure if we want to start using a crutch for py26 if we are close to  
> dumping it.  I only got off on this tangent when I noticed the  
> first-lock-inside-try construct while trying to figure out bookmark  
> pruning test failures on Windows.  So I don't have a strong opinion either  
> way.

I'm -1 for excessive indentation of large code block. I generally use 'with'
only when it improves readability.


More information about the Mercurial-devel mailing list