Fix a memory leak in PhabricatorGlobalLock
Fix a memory leak in PhabricatorGlobalLock

Summary:
We currently cache all connections in LiskDAO so we can roll back transactions when fixtured unit tests complete.

Since we establish a new connection wrapper each time we establish a global lock, this cache currently grows without bound.

Instead, pool global lock connections so we never have more than the largest number of locks we've held open at once (in PullLocalDaemon, always 1).

Another way to solve this is probably to add an "onclose" callback to `AphrontDatabaseConnection` so that it can notify any caches that it been closed. However, we currently allow a connection to be later reopened (which seeems reasonable) so we'd need a callback for that too. This is much simpler, and this use case is unusual, so I'd like to wait for more use cases before pursing a more complicated fix.

Test Plan:
Ran this in a loop:

    while (true) {
      for ($ii = 0; $ii < 100; $ii++) {
        $lock = PhabricatorGlobalLock::newLock('derp');
        $lock->lock();
        $lock->unlock();
      }
      $this->sleep(1);
    }

Previously it leaked ~100KB/sec, now has stable memory usage.

Reviewers: vrana, nh, btrahan

Reviewed By: vrana

CC: aran

Maniphest Tasks: T1636

Differential Revision: https://secure.phabricator.com/D3239

librewiki/phabricator,cjxgm/p.cjprods.org,hshackathons/phabricator-deprecated,kalbasit/phabricator,aik099/phabricator,vuamitom/phabricator,shl3807/phabricator,ryancford/phabricator,optimizely/phabricator,christopher-johnson/phabricator,wikimedia/phabricator-phabricator,huangjimmy/phabricator-1,tanglu-org/tracker-phabricator,UNCC-OpenProjects/Phabricator,folsom-labs/phabricator,kwoun1982/phabricator,denisdeejay/phabricator,hach-que/unearth-phabricator,shrimpma/phabricator,librewiki/phabricator,kalbasit/phabricator,aik099/phabricator,MicroWorldwide/phabricator,a20012251/phabricator,aswanderley/phabricator,leolujuyi/phabricator,shl3807/phabricator,gsinkovskiy/phabricator,ide/phabricator,Drooids/phabricator,vuamitom/phabricator,wangjun/phabricator,telerik/phabricator,a20012251/phabricator,dannysu/phabricator,kwoun1982/phabricator,kwoun1982/phabricator,Automatic/phabricator,cjxgm/p.cjprods.org,Symplicity/phabricator,phacility/phabricator,gsinkovskiy/phabricator,coursera/phabricator,eSpark/phabricator,ryancford/phabricator,wxstars/phabricator,wusuoyongxin/phabricator,sharpwhisper/phabricator,akkakks/phabricator,kalbasit/phabricator,denisdeejay/phabricator,codevlabs/phabricator,freebsd/phabricator,huangjimmy/phabricator-1,wxstars/phabricator,freebsd/phabricator,wikimedia/phabricator-phabricator,Drooids/phabricator,folsom-labs/phabricator,devurandom/phabricator,ryancford/phabricator,hach-que/phabricator,shrimpma/phabricator,hach-que/phabricator,Soluis/phabricator,wangjun/phabricator,telerik/phabricator,vinzent/phabricator,hach-que/unearth-phabricator,huangjimmy/phabricator-1,denisdeejay/phabricator,vuamitom/phabricator,aswanderley/phabricator,schlaile/phabricator,hach-que/phabricator,wusuoyongxin/phabricator,christopher-johnson/phabricator,zhihu/phabricator,coursera/phabricator,memsql/phabricator,schlaile/phabricator,uhd-urz/phabricator,UNCC-OpenProjects/Phabricator,dannysu/phabricator,parksangkil/phabricator,shrimpma/phabricator,folsom-labs/phabricator,hach-que/unearth-phabricator,apexstudios/phabricator,apexstudios/phabricator,eSpark/phabricator,memsql/phabricator,Soluis/phabricator,UNCC-OpenProjects/Phabricator,kalbasit/phabricator,vuamitom/phabricator,aswanderley/phabricator,zhihu/phabricator,akkakks/phabricator,kanarip/phabricator,sharpwhisper/phabricator,parksangkil/phabricator,hshackathons/phabricator-deprecated,r4nt/phabricator,kwoun1982/phabricator,kwoun1982/phabricator,hshackathons/phabricator-deprecated,hach-que/unearth-phabricator,wikimedia/phabricator-phabricator,r4nt/phabricator,Automattic/phabricator,Khan/phabricator,Automatic/phabricator,devurandom/phabricator,MicroWorldwide/phabricator,akkakks/phabricator,denisdeejay/phabricator,codevlabs/phabricator,huangjimmy/phabricator-1,tanglu-org/tracker-phabricator,uhd-urz/phabricator,aik099/phabricator,matthewrez/phabricator,optimizely/phabricator,optimizely/phabricator,phacility/phabricator,huaban/phabricator,christopher-johnson/phabricator,Drooids/phabricator,dannysu/phabricator,christopher-johnson/phabricator,benchling/phabricator,matthewrez/phabricator,eSpark/phabricator,folsom-labs/phabricator,sharpwhisper/phabricator,huaban/phabricator,hshackathons/phabricator-deprecated,NigelGreenway/phabricator,phacility/phabricator,vinzent/phabricator,MicroWorldwide/phabricator,akkakks/phabricator,a20012251/phabricator,Automatic/phabricator,wikimedia/phabricator,shl3807/phabricator,jwdeitch/phabricator,leolujuyi/phabricator,huaban/phabricator,memsql/phabricator,cjxgm/p.cjprods.org,benchling/phabricator,eSpark/phabricator,apexstudios/phabricator,codevlabs/phabricator,gsinkovskiy/phabricator,wikimedia/phabricator,aswanderley/phabricator,hach-que/unearth-phabricator,aik099/phabricator,Symplicity/phabricator,WuJiahu/phabricator,huangjimmy/phabricator-1,Soluis/phabricator,wusuoyongxin/phabricator,a20012251/phabricator,dannysu/phabricator,Automattic/phabricator,hshackathons/phabricator-deprecated,benchling/phabricator,leolujuyi/phabricator,devurandom/phabricator,zhihu/phabricator,a20012251/phabricator,wikimedia/phabricator-phabricator,devurandom/phabricator,UNCC-OpenProjects/Phabricator,kanarip/phabricator,zhihu/phabricator,memsql/phabricator,akkakks/phabricator,uhd-urz/phabricator,parksangkil/phabricator,ide/phabricator,wangjun/phabricator,freebsd/phabricator,ide/phabricator,parksangkil/phabricator,uhd-urz/phabricator,vinzent/phabricator,uhd-urz/phabricator,schlaile/phabricator,wxstars/phabricator,folsom-labs/phabricator,NigelGreenway/phabricator,vuamitom/phabricator,hach-que/phabricator,phacility/phabricator,WuJiahu/phabricator,r4nt/phabricator,sharpwhisper/phabricator,eSpark/phabricator,Soluis/phabricator,Symplicity/phabricator,leolujuyi/phabricator,jwdeitch/phabricator,Soluis/phabricator,WuJiahu/phabricator,librewiki/phabricator,sharpwhisper/phabricator,matthewrez/phabricator,christopher-johnson/phabricator,r4nt/phabricator,matthewrez/phabricator,Khan/phabricator,codevlabs/phabricator,Khan/phabricator,vinzent/phabricator,cjxgm/p.cjprods.org,codevlabs/phabricator,shl3807/phabricator,gsinkovskiy/phabricator,tanglu-org/tracker-phabricator,r4nt/phabricator,NigelGreenway/phabricator,Khan/phabricator,ryancford/phabricator,zhihu/phabricator,ide/phabricator,gsinkovskiy/phabricator,kanarip/phabricator,wxstars/phabricator,NigelGreenway/phabricator,wikimedia/phabricator,Drooids/phabricator,NigelGreenway/phabricator,memsql/phabricator,jwdeitch/phabricator,hach-que/phabricator,librewiki/phabricator,coursera/phabricator,huaban/phabricator,Automatic/phabricator,zhihu/phabricator,kanarip/phabricator,wusuoyongxin/phabricator,tanglu-org/tracker-phabricator,dannysu/phabricator,kanarip/phabricator,cjxgm/p.cjprods.org,jwdeitch/phabricator,librewiki/phabricator,devurandom/phabricator,WuJiahu/phabricator,freebsd/phabricator,telerik/phabricator,Automattic/phabricator,optimizely/phabricator,wikimedia/phabricator,coursera/phabricator,wangjun/phabricator,MicroWorldwide/phabricator,shrimpma/phabricator,Symplicity/phabricator,optimizely/phabricator,schlaile/phabricator,devurandom/phabricator,benchling/phabricator,vinzent/phabricator,tanglu-org/tracker-phabricator,aswanderley/phabricator,wikimedia/phabricator-phabricator